From 55734bd65ea3bf394cded568a8bc02206fa6d790 Mon Sep 17 00:00:00 2001
From: Randy Sommerfeld <cyan@synchro.net>
Date: Tue, 15 Jun 2021 10:34:14 +0700
Subject: [PATCH] Fix mode desync on server SJOIN. Thanks to Retros for finding
 where this was coming from!

---
 exec/load/ircd/server.js | 27 +++++++++++++++++++++++++--
 1 file changed, 25 insertions(+), 2 deletions(-)

diff --git a/exec/load/ircd/server.js b/exec/load/ircd/server.js
index 9f57d23ac4..19499ae65c 100644
--- a/exec/load/ircd/server.js
+++ b/exec/load/ircd/server.js
@@ -922,7 +922,7 @@ function Server_Work(cmdline) {
 					), false /*bcast*/);
 				}
 
-				if (tmp.created >= parseInt(p[0])) { /* We have TS superiority */
+				if (tmp.created >= parseInt(p[0])) { /* They have TS superiority */
 					if (k.isop)
 						tmp.modelist[CHANMODE_OP][n.id] = n.id;
 					if (k.isvoice)
@@ -936,7 +936,30 @@ function Server_Work(cmdline) {
 							n.nick
 						), false /*bcast*/);
 					}
+				} else { /* We have TS superiority */
+					if (k.isop) {
+						k.isop = false;
+						this.rawout(format(":%s MODE %s -o %s",
+							ServerName,
+							tmp.nam,
+							k.nick
+						));
+					}
+					if (k.isvoice) {
+						k.isvoice = false;
+						this.rawout(format(":%s MODE %s -v %s",
+							ServerName,
+							tmp.nam,
+							k.nick
+						));
+					}
 				}
+
+				j[i] = format("%s%s%s",
+					k.isop ? "@" : "",
+					k.isvoice ? "+" : "",
+					k.nick
+				);
 			}
 
 			if (tmp.created > parseInt(p[0]))
@@ -948,7 +971,7 @@ function Server_Work(cmdline) {
 					tmp.created,
 					tmp.nam,
 					tmp.chanmode(true /* pass args */),
-					p[p.length-1]
+					j.join(" ")
 				)
 			);
 		} else { /* User single SJOIN */
-- 
GitLab