From 5b62f9e21d4c76c0d47b4be89dd443bbd1eb0348 Mon Sep 17 00:00:00 2001
From: Randy Sommerfeld <cyan@synchro.net>
Date: Mon, 30 Oct 2023 08:19:59 +0700
Subject: [PATCH] Shore up mode synchronization a bit

---
 exec/load/ircd/server.js | 22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

diff --git a/exec/load/ircd/server.js b/exec/load/ircd/server.js
index 55a9082df0..f0807ee7cc 100644
--- a/exec/load/ircd/server.js
+++ b/exec/load/ircd/server.js
@@ -426,7 +426,7 @@ function Server_Work(cmdline) {
 			));
 			break;
 		}
-		if (parseInt(p[0]) == j)
+		if (parseInt(p[0]) == p[0])
 			p.shift();
 		if (p[0][0] == "#") {
 			/* Setting a channel mode */
@@ -439,13 +439,18 @@ function Server_Work(cmdline) {
 				));
 				break;
 			}
-			if (!j)
-				j = tmp.created;
 			p.shift();
 			origin.set_chanmode(tmp,p);
 			break;
 		}
 		/* Setting a user mode */
+		if (typeof origin.setusermode !== 'function') {
+			umode_notice(USERMODE_OPER,"Notice",format(
+				"Server %s sent non-channel MODE from invalid origin.",
+				this.nick
+			));
+			break;
+		}
 		tmp = origin.setusermode(p[1]);
 		if (tmp) {
 			this.bcast_to_servers_raw(format(
@@ -1475,6 +1480,17 @@ function IRCClient_server_chan_info(sni_chan) {
 	var modecounter=0;
 	var modestr="+";
 	var modeargs="";
+	for (i in MODE) {
+		if (MODE[i].state && (sni_chan.mode & i))
+			modestr += MODE[i].modechar;
+	}
+	if (modestr != "+") {
+		this.ircout(format("MODE %s %s",
+			sni_chan.nam,
+			modestr
+		));
+	}
+	modestr = "+";
 	for (i in sni_chan.modelist[CHANMODE_BAN]) {
 		modecounter++;
 		modestr += "b";
-- 
GitLab