diff --git a/exec/load/ircd/server.js b/exec/load/ircd/server.js index 0ec273e1b7c5414eea90cd22d8afcc3b0a043e42..59824e32a3db65e3465b1cf85ffa5c933f462214 100644 --- a/exec/load/ircd/server.js +++ b/exec/load/ircd/server.js @@ -420,26 +420,47 @@ function Server_Work(cmdline) { )); break; case "MODE": - if (typeof p[1] === undefined) + if (typeof p[1] === undefined) { + umode_notice(USERMODE_OPER,"Notice",format( + "Origin %s sent MODE without enough arguments.", + this.nick + )); break; - if (p[0][0] != "#") { /* Setting a user mode */ - tmp = origin.setusermode(p[1]); - if (tmp) { - this.bcast_to_servers_raw(format( - ":%s MODE %s %s", - origin.nick, - origin.nick, - tmp + } + /* Detect TS-style MODE and stuff the real TS in j */ + j = parseInt(p[0]); + if (p[0] == j) { + if (!this.hub) + j = Epoch(); + p.shift(); + } + if (p[0][0] == "#") { + /* Setting a channel mode */ + tmp = Channels[p[0].toUpperCase()]; + if (!tmp) { + umode_notice(USERMODE_OPER,"Notice",format( + "Origin %s sent MODE with invalid channel %s", + this.nick, + p[0] )); + break; } + if (!j) + j = tmp.created; + p.shift(); + origin.set_chanmode(tmp,p,j); break; } - /* Setting a channel mode */ - tmp = Channels[p[0].toUpperCase()]; - if (!tmp) - break; - p.shift(); - origin.set_chanmode(tmp,p,parseInt(p[1])); + /* Setting a user mode */ + tmp = origin.setusermode(p[1]); + if (tmp) { + this.bcast_to_servers_raw(format( + ":%s MODE %s %s", + origin.nick, + origin.nick, + tmp + )); + } break; case "MOTD": if (!p[0] || origin.server)