diff options
author | Adam <Adam@anope.org> | 2010-06-26 21:12:31 -0400 |
---|---|---|
committer | Adam <Adam@anope.org> | 2010-06-26 21:12:31 -0400 |
commit | 36c646c7d2d4d0f057081c765f9048fc7ae751bf (patch) | |
tree | 9a5810343c197e6abd0048ebfa5e7b12b7d2b3e3 | |
parent | 4e31757f1467b36034e1dcef10d78533ff302d57 (diff) |
Added support for InspIRCd 2.0s dynamic modes.
Note that this changes the maximum length of an acceptable
IRC message from 512 to 1024 because InspIRCd sends messages
longer than 512 characters.
-rw-r--r-- | include/modes.h | 4 | ||||
-rw-r--r-- | src/modes.cpp | 4 | ||||
-rw-r--r-- | src/process.cpp | 2 | ||||
-rw-r--r-- | src/protocol/inspircd11.cpp | 2 | ||||
-rw-r--r-- | src/protocol/inspircd12.cpp | 5 | ||||
-rw-r--r-- | src/protocol/inspircd20.cpp | 507 | ||||
-rw-r--r-- | src/protocol/ratbox.cpp | 2 | ||||
-rw-r--r-- | src/protocol/unreal32.cpp | 2 |
8 files changed, 247 insertions, 281 deletions
diff --git a/include/modes.h b/include/modes.h index 0764d8f8e..e4b683572 100644 --- a/include/modes.h +++ b/include/modes.h @@ -273,10 +273,10 @@ class CoreExport ChannelModeExcept : public ChannelModeList /** Channel mode +I */ -class CoreExport ChannelModeInvite : public ChannelModeList +class CoreExport ChannelModeInvex : public ChannelModeList { public: - ChannelModeInvite(char modeChar) : ChannelModeList(CMODE_INVITEOVERRIDE, "CMODE_INVITEOVERRIDE", modeChar) { } + ChannelModeInvex(char modeChar) : ChannelModeList(CMODE_INVITEOVERRIDE, "CMODE_INVITEOVERRIDE", modeChar) { } void AddMask(Channel *chan, const char *mask); diff --git a/src/modes.cpp b/src/modes.cpp index dce375488..506f9e483 100644 --- a/src/modes.cpp +++ b/src/modes.cpp @@ -360,7 +360,7 @@ void ChannelModeExcept::DelMask(Channel *chan, const char *mask) * @param chan The channel * @param mask The invex */ -void ChannelModeInvite::AddMask(Channel *chan, const char *mask) +void ChannelModeInvex::AddMask(Channel *chan, const char *mask) { Entry *invite; @@ -387,7 +387,7 @@ void ChannelModeInvite::AddMask(Channel *chan, const char *mask) * @param chan The channel * @param mask The index */ -void ChannelModeInvite::DelMask(Channel *chan, const char *mask) +void ChannelModeInvex::DelMask(Channel *chan, const char *mask) { Entry *invite; diff --git a/src/process.cpp b/src/process.cpp index 15e0cdad5..07f1ff451 100644 --- a/src/process.cpp +++ b/src/process.cpp @@ -304,7 +304,7 @@ void process(const std::string &buffer) int retVal = 0; char source[64] = ""; char cmd[64] = ""; - char buf[512] = ""; /* Longest legal IRC command line */ + char buf[1024] = ""; // XXX InspIRCd 2.0 can send messages longer than 512 characters to servers... how disappointing. char *s; int ac; /* Parameters for the command */ const char **av; diff --git a/src/protocol/inspircd11.cpp b/src/protocol/inspircd11.cpp index a5deafec7..a06e0f22c 100644 --- a/src/protocol/inspircd11.cpp +++ b/src/protocol/inspircd11.cpp @@ -913,7 +913,7 @@ int anope_event_capab(const char *source, int ac, const char **av) ModeManager::AddChannelMode(new ChannelModeExcept('e')); continue; case 'I': - ModeManager::AddChannelMode(new ChannelModeInvite('I')); + ModeManager::AddChannelMode(new ChannelModeInvex('I')); continue; default: ModeManager::AddChannelMode(new ChannelModeList(CMODE_END, "", modebuf[t])); diff --git a/src/protocol/inspircd12.cpp b/src/protocol/inspircd12.cpp index aa7d6a019..9b742e64e 100644 --- a/src/protocol/inspircd12.cpp +++ b/src/protocol/inspircd12.cpp @@ -1009,7 +1009,7 @@ int anope_event_capab(const char *source, int ac, const char **av) ModeManager::AddChannelMode(new ChannelModeExcept('e')); continue; case 'I': - ModeManager::AddChannelMode(new ChannelModeInvite('I')); + ModeManager::AddChannelMode(new ChannelModeInvex('I')); continue; /* InspIRCd sends q and a here if they have no prefixes */ case 'q': @@ -1162,9 +1162,6 @@ int anope_event_capab(const char *source, int ac, const char **av) case 'h': ModeManager::AddUserMode(new UserMode(UMODE_HELPOP, "UMODE_HELPOP", 'h')); continue; - case 's': - ModeManager::AddUserMode(new UserMode(UMODE_STRIPCOLOR, "UMODE_STRIPCOLOR", 'S')); - continue; case 'B': ModeManager::AddUserMode(new UserMode(UMODE_BOT, "UMODE_BOT", 'B')); continue; diff --git a/src/protocol/inspircd20.cpp b/src/protocol/inspircd20.cpp index 7974fade0..6b808e630 100644 --- a/src/protocol/inspircd20.cpp +++ b/src/protocol/inspircd20.cpp @@ -76,14 +76,9 @@ IRCDVar myIrcd[] = { }; static int has_servicesmod = 0; -static int has_globopsmod = 0; static int has_svsholdmod = 0; static int has_chghostmod = 0; static int has_chgidentmod = 0; -static int has_messagefloodmod = 0; -static int has_banexceptionmod = 0; -static int has_inviteexceptionmod = 0; -static int has_hidechansmod = 0; /* Previously introduced user during burst */ static User *prev_u_intro = NULL; @@ -247,6 +242,9 @@ class InspIRCdProto : public IRCDProto void SendConnect() { + send_cmd(NULL, "CAPAB START 1202"); + send_cmd(NULL, "CAPAB CAPABILITIES :PROTOCOL=1202"); + send_cmd(NULL, "CAPAB END"); Me = new Server(NULL, Config.ServerName, 0, Config.ServerDesc, TS6SID); inspircd_cmd_pass(uplink_server->password); SendServer(Me); @@ -328,10 +326,7 @@ class InspIRCdProto : public IRCDProto void SendGlobopsInternal(BotInfo *source, const char *buf) { - if (has_globopsmod) - send_cmd(source ? source->uid : TS6SID, "SNONOTICE g :%s", buf); - else - send_cmd(source ? source->uid : TS6SID, "SNONOTICE A :%s", buf); + send_cmd(source ? source->uid : TS6SID, "SNONOTICE g :%s", buf); } void SendAccountLogin(User *u, NickCore *account) @@ -942,50 +937,220 @@ int anope_event_metadata(const char *source, int ac, const char **av) int anope_event_capab(const char *source, int ac, const char **av) { - if (strcasecmp(av[0], "START") == 0) { + if (strcasecmp(av[0], "START") == 0) + { + if (ac < 2 || atoi(av[1]) < 1202) + { + send_cmd(NULL, "ERROR :Protocol mismatch, no or invalid protocol version given in CAPAB START"); + quitmsg = "Protocol mismatch, no or invalid protocol version given in CAPAB START"; + quitting = 1; + return MOD_STOP; + } + /* reset CAPAB */ has_servicesmod = 0; - has_globopsmod = 0; has_svsholdmod = 0; has_chghostmod = 0; has_chgidentmod = 0; - has_messagefloodmod = 0; - has_banexceptionmod = 0; - has_inviteexceptionmod = 0; - has_hidechansmod = 0; - - } else if (strcasecmp(av[0], "MODULES") == 0) { - if (strstr(av[1], "m_globops.so")) { - has_globopsmod = 1; - } - if (strstr(av[1], "m_services_account.so")) { - has_servicesmod = 1; - } - if (strstr(av[1], "m_svshold.so")) { - has_svsholdmod = 1; - } - if (strstr(av[1], "m_chghost.so")) { - has_chghostmod = 1; - } - if (strstr(av[1], "m_chgident.so")) { - has_chgidentmod = 1; - } - if (strstr(av[1], "m_messageflood.so")) { - has_messagefloodmod = 1; - } - if (strstr(av[1], "m_banexception.so")) { - has_banexceptionmod = 1; + } + else if (strcasecmp(av[0], "CHANMODES") == 0) + { + spacesepstream ssep(av[1]); + std::string capab; + + while (ssep.GetToken(capab)) + { + std::string modename = capab.substr(0, capab.find('=')); + std::string modechar = capab.substr(capab.find('=') + 1); + ChannelMode *cm = NULL; + + if (modename == "admin") + cm = new ChannelModeStatus(CMODE_PROTECT, "CMODE_PROTECT", modechar[1], modechar[0]); + else if (modename == "allowinvite") + cm = new ChannelMode(CMODE_ALLINVITE, "CMODE_ALLINVITE", modechar[0]); + else if (modename == "auditorium") + cm = new ChannelMode(CMODE_AUDITORIUM, "CMODE_AUDITORIUM", modechar[0]); + else if (modename == "autoop") + continue; // XXX Not currently tracked + else if (modename == "ban") + cm = new ChannelModeBan(modechar[0]); + else if (modename == "banexception") + cm = new ChannelModeExcept(modechar[0]); + else if (modename == "blockcaps") + cm = new ChannelMode(CMODE_BLOCKCAPS, "CMODE_BLOCKCAPS", modechar[0]); + else if (modename == "blockcolor") + cm = new ChannelMode(CMODE_BLOCKCOLOR, "CMODE_BLOCKCOLOR", modechar[0]); + else if (modename == "c_registered") + cm = new ChannelModeRegistered(modechar[0]); + else if (modename == "censor") + cm = new ChannelMode(CMODE_FILTER, "CMODE_FILTER", modechar[0]); + else if (modename == "delayjoin") + cm = new ChannelMode(CMODE_DELAYEDJOIN, "CMODE_DELAYEDJOIN", modechar[0]); + else if (modename == "delaymsg") + continue; + else if (modename == "exemptchanops") + continue; // XXX + else if (modename == "filter") + continue; // XXX + else if (modename == "flood") + cm = new ChannelModeFlood(modechar[0], true); + else if (modename == "founder") + cm = new ChannelModeStatus(CMODE_OWNER, "CMODE_OWNER", modechar[1], modechar[0]); + else if (modename == "halfop") + cm = new ChannelModeStatus(CMODE_HALFOP, "CMODE_HALFOP", modechar[1], modechar[0]); + else if (modename == "halfvoice") + continue; // XXX - halfvoice? wtf + else if (modename == "history") + continue; // XXX + else if (modename == "invex") + cm = new ChannelModeInvex(modechar[0]); + else if (modename == "inviteonly") + cm = new ChannelMode(CMODE_INVITE, "CMODE_INVITE", modechar[0]); + else if (modename == "joinflood") + cm = new ChannelModeParam(CMODE_JOINFLOOD, "CMODE_JOINFLOOD", modechar[0], true); + else if (modename == "key") + cm = new ChannelModeKey(modechar[0]); + else if (modename == "kicknorejoin") + cm = new ChannelModeParam(CMODE_NOREJOIN, "CMODE_NOREJOIN", modechar[0], true); + else if (modename == "limit") + cm = new ChannelModeParam(CMODE_LIMIT, "CMODE_LIMIT", modechar[0], true); + else if (modename == "moderated") + cm = new ChannelMode(CMODE_MODERATED, "CMODE_MODERATED", modechar[0]); + else if (modename == "namebase") + continue; // XXX + else if (modename == "nickflood") + cm = new ChannelModeParam(CMODE_NICKFLOOD, "CMODE_NICKFLOOD", modechar[0], true); + else if (modename == "noctcp") + cm = new ChannelMode(CMODE_NOCTCP, "CMODE_NOCTCP", modechar[0]); + else if (modename == "noextmsg") + cm = new ChannelMode(CMODE_NOEXTERNAL, "CMODE_NOEXTERNAL", modechar[0]); + else if (modename == "nokick") + cm = new ChannelMode(CMODE_NOKICK, "CMODE_NOKICK", modechar[0]); + else if (modename == "noknock") + cm = new ChannelMode(CMODE_NOKNOCK, "CMODE_NOKNOCK", modechar[0]); + else if (modename == "nonick") + cm = new ChannelMode(CMODE_NONICK, "CMODE_NONICK", modechar[0]); + else if (modename == "nonotice") + cm = new ChannelMode(CMODE_NONOTICE, "CMODE_NONOTICE", modechar[0]); + else if (modename == "official-join") + continue; // XXX + else if (modename == "op") + cm = new ChannelModeStatus(CMODE_OP, "CMODE_OP", modechar[1], modechar[0]); + else if (modename == "operonly") + cm = new ChannelModeOper(modechar[0]); + else if (modename == "operprefix") + continue; // XXX + else if (modename == "permanent") + cm = new ChannelMode(CMODE_PERM, "CMODE_PERM", modechar[0]); + else if (modename == "private") + cm = new ChannelMode(CMODE_PRIVATE, "CMODE_PRIVATE", modechar[0]); + else if (modename == "redirect") + cm = new ChannelModeParam(CMODE_REDIRECT, "CMODE_REDIRECT", modechar[0], true); + else if (modename == "reginvite") + cm = new ChannelMode(CMODE_REGISTEREDONLY, "CMODE_REGISTEREDONLY", modechar[0]); + else if (modename == "regmoderated") + cm = new ChannelMode(CMODE_REGMODERATED, "CMODE_REGMODERATED", modechar[0]); + else if (modename == "secret") + cm = new ChannelMode(CMODE_SECRET, "CMODE_SECRET", modechar[0]); + else if (modename == "sslonly") + cm = new ChannelMode(CMODE_SSL, "CMODE_SSL", modechar[0]); + else if (modename == "stripcolor") + cm = new ChannelMode(CMODE_STRIPCOLOR, "CMODE_STRIPCOLOR", modechar[0]); + else if (modename == "topiclock") + cm = new ChannelMode(CMODE_TOPIC, "CMODE_TOPIC", modechar[0]); + else if (modename == "voice") + cm = new ChannelModeStatus(CMODE_VOICE, "CMODE_VOICE", modechar[1], modechar[0]); + + if (cm) + ModeManager::AddChannelMode(cm); + else + Alog() << "Unrecognized mode string in CAPAB CHANMODES: " << capab; } - if (strstr(av[1], "m_inviteexception.so")) { - has_inviteexceptionmod = 1; + } + else if (strcasecmp(av[0], "USERMODES") == 0) + { + spacesepstream ssep(av[1]); + std::string capab; + + while (ssep.GetToken(capab)) + { + std::string modename = capab.substr(0, capab.find('=')); + std::string modechar = capab.substr(capab.find('=') + 1); + UserMode *um = NULL; + + if (modename == "bot") + um = new UserMode(UMODE_BOT, "UMODE_BOT", modechar[0]); + else if (modename == "callerid") + um = new UserMode(UMODE_CALLERID, "UMODE_CALLERID", modechar[0]); + else if (modename == "cloak") + um = new UserMode(UMODE_CLOAK, "UMODE_CLOAK", modechar[0]); + else if (modename == "deaf") + um = new UserMode(UMODE_DEAF, "UMODE_DEAF", modechar[0]); + else if (modename == "deaf_commonchan") + um = new UserMode(UMODE_COMMONCHANS, "UMODE_COMMONCHANS", modechar[0]); + else if (modename == "helpop") + um = new UserMode(UMODE_HELPOP, "UMODE_HELPOP", modechar[0]); + else if (modename == "hidechans") + um = new UserMode(UMODE_PRIV, "UMODE_PRIV", modechar[0]); + else if (modename == "hideoper") + um = new UserMode(UMODE_HIDEOPER, "UMODE_HIDEOPER", modechar[0]); + else if (modename == "invisible") + um = new UserMode(UMODE_INVIS, "UMODE_INVIS", modechar[0]); + else if (modename == "oper") + um = new UserMode(UMODE_OPER, "UMODE_OPER", modechar[0]); + else if (modename == "regdeaf") + um = new UserMode(UMODE_REGPRIV, "UMODE_REGPRIV", modechar[0]); + else if (modename == "servprotect") + um = new UserMode(UMODE_PROTECTED, "UMODE_PROTECTED", modechar[0]); + else if (modename == "showwhois") + um = new UserMode(UMODE_WHOIS, "UMODE_WHOIS", modechar[0]); + else if (modename == "snomask") + continue; // XXX + else if (modename == "u_censor") + um = new UserMode(UMODE_FILTER, "UMODE_FILTER", modechar[0]); + else if (modename == "u_registered") + um = new UserMode(UMODE_REGISTERED, "UMODE_REGISTERED", modechar[0]); + else if (modename == "u_stripcolor") + um = new UserMode(UMODE_STRIPCOLOR, "UMODE_STRIPCOLOR", modechar[0]); + else if (modename == "wallops") + um = new UserMode(UMODE_WALLOPS, "UMODE_WALLOPS", modechar[0]); + + if (um) + ModeManager::AddUserMode(um); + else + Alog() << "Unrecognized mode string in CAPAB USERMODES: " << capab; } - if (strstr(av[1], "m_hidechans.so")) { - has_hidechansmod = 1; + } + else if (strcasecmp(av[0], "MODULES") == 0) + { + spacesepstream ssep(av[1]); + std::string module; + + while (ssep.GetToken(module)) + { + if (module == "m_svshold.so") + has_svsholdmod = 1; } - if (strstr(av[1], "m_servprotect.so")) { - ircd->pseudoclient_mode = "+Ik"; + } + else if (strcasecmp(av[0], "MODSUPPORT") == 0) + { + spacesepstream ssep(av[1]); + std::string module; + + while (ssep.GetToken(module)) + { + if (module == "m_services_account.so") + has_servicesmod = 1; + else if (module == "m_chghost.so") + has_chghostmod = 1; + else if (module == "m_chgident.so") + has_chgidentmod = 1; + else if (module == "m_servprotect.so") + ircd->pseudoclient_mode = "+Ik"; } - } else if (strcasecmp(av[0], "CAPABILITIES") == 0) { + } + else if (strcasecmp(av[0], "CAPABILITIES") == 0) + { spacesepstream ssep(av[1]); std::string capab; while (ssep.GetToken(capab)) @@ -999,151 +1164,34 @@ int anope_event_capab(const char *source, int ac, const char **av) sep.GetToken(modebuf); for (size_t t = 0; t < modebuf.size(); ++t) { - switch (modebuf[t]) - { - case 'b': - ModeManager::AddChannelMode(new ChannelModeBan('b')); - continue; - case 'e': - ModeManager::AddChannelMode(new ChannelModeExcept('e')); - continue; - case 'I': - ModeManager::AddChannelMode(new ChannelModeInvite('I')); - continue; - /* InspIRCd sends q and a here if they have no prefixes */ - case 'q': - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OWNER, "CMODE_OWNER", 'q', '@')); - continue; - case 'a': - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_PROTECT , "CMODE_PROTECT", 'a', '@')); - continue; - // XXX list modes needs a bit of a rewrite, we need to be able to support +g here - default: - ModeManager::AddChannelMode(new ChannelModeList(CMODE_END, "", modebuf[t])); - } + if (ModeManager::FindChannelModeByChar(modebuf[t])) + continue; + // XXX list modes needs a bit of a rewrite + ModeManager::AddChannelMode(new ChannelModeList(CMODE_END, "", modebuf[t])); } sep.GetToken(modebuf); for (size_t t = 0; t < modebuf.size(); ++t) { - switch (modebuf[t]) - { - case 'k': - ModeManager::AddChannelMode(new ChannelModeKey('k')); - continue; - default: - ModeManager::AddChannelMode(new ChannelModeParam(CMODE_END, "", modebuf[t])); - } + if (ModeManager::FindChannelModeByChar(modebuf[t])) + continue; + ModeManager::AddChannelMode(new ChannelModeParam(CMODE_END, "", modebuf[t])); } sep.GetToken(modebuf); for (size_t t = 0; t < modebuf.size(); ++t) { - switch (modebuf[t]) - { - case 'F': - ModeManager::AddChannelMode(new ChannelModeParam(CMODE_NICKFLOOD, "CMODE_NICKFLOOD", 'F', true)); - continue; - case 'J': - ModeManager::AddChannelMode(new ChannelModeParam(CMODE_NOREJOIN, "CMODE_NOREJOIN", 'J', true)); - continue; - case 'L': - ModeManager::AddChannelMode(new ChannelModeParam(CMODE_REDIRECT, "CMODE_REDIRECT", 'L', true)); - continue; - case 'f': - ModeManager::AddChannelMode(new ChannelModeFlood('f', true)); - continue; - case 'j': - ModeManager::AddChannelMode(new ChannelModeParam(CMODE_JOINFLOOD, "CMODE_JOINFLOOD", 'j', true)); - continue; - case 'l': - ModeManager::AddChannelMode(new ChannelModeParam(CMODE_LIMIT, "CMODE_LIMIT", 'l', true)); - continue; - default: - ModeManager::AddChannelMode(new ChannelModeParam(CMODE_END, "", modebuf[t], true)); - } + if (ModeManager::FindChannelModeByChar(modebuf[t])) + continue; + ModeManager::AddChannelMode(new ChannelModeParam(CMODE_END, "", modebuf[t], true)); } sep.GetToken(modebuf); for (size_t t = 0; t < modebuf.size(); ++t) { - switch (modebuf[t]) - { - case 'A': - ModeManager::AddChannelMode(new ChannelMode(CMODE_ALLINVITE, "CMODE_ALLINVITE", 'A')); - continue; - case 'B': - ModeManager::AddChannelMode(new ChannelMode(CMODE_BLOCKCAPS, "CMODE_BLOCKCAPS", 'B')); - continue; - case 'C': - ModeManager::AddChannelMode(new ChannelMode(CMODE_NOCTCP, "CMODE_NOCTCP", 'C')); - continue; - case 'D': - ModeManager::AddChannelMode(new ChannelMode(CMODE_DELAYEDJOIN, "CMODE_DELAYEDJOIN", 'D')); - continue; - case 'G': - ModeManager::AddChannelMode(new ChannelMode(CMODE_FILTER, "CMODE_FILTER", 'G')); - continue; - case 'K': - ModeManager::AddChannelMode(new ChannelMode(CMODE_NOKNOCK, "CMODE_NOKNOCK", 'K')); - continue; - case 'M': - ModeManager::AddChannelMode(new ChannelMode(CMODE_REGMODERATED, "CMODE_REGMODERATED", 'M')); - continue; - case 'N': - ModeManager::AddChannelMode(new ChannelMode(CMODE_NONICK, "CMODE_NONICK", 'N')); - continue; - case 'O': - ModeManager::AddChannelMode(new ChannelModeOper('O')); - continue; - case 'P': - ModeManager::AddChannelMode(new ChannelMode(CMODE_PERM, "CMODE_PERM", 'P')); - continue; - case 'Q': - ModeManager::AddChannelMode(new ChannelMode(CMODE_NOKICK, "CMODE_NOKICK", 'Q')); - continue; - case 'R': - ModeManager::AddChannelMode(new ChannelMode(CMODE_REGISTEREDONLY, "CMODE_REGISTEREDONLY", 'R')); - continue; - case 'S': - ModeManager::AddChannelMode(new ChannelMode(CMODE_STRIPCOLOR, "CMODE_STRIPCOLOR", 'S')); - continue; - case 'T': - ModeManager::AddChannelMode(new ChannelMode(CMODE_NONOTICE, "CMODE_NONOTICE", 'T')); - continue; - case 'c': - ModeManager::AddChannelMode(new ChannelMode(CMODE_BLOCKCOLOR, "CMODE_BLOCKCOLOR", 'c')); - continue; - case 'i': - ModeManager::AddChannelMode(new ChannelMode(CMODE_INVITE, "CMODE_INVITE", 'i')); - continue; - case 'm': - ModeManager::AddChannelMode(new ChannelMode(CMODE_MODERATED, "CMODE_MODERATED", 'm')); - continue; - case 'n': - ModeManager::AddChannelMode(new ChannelMode(CMODE_NOEXTERNAL, "CMODE_NOEXTERNAL", 'n')); - continue; - case 'p': - ModeManager::AddChannelMode(new ChannelMode(CMODE_PRIVATE, "CMODE_PRIVATE", 'p')); - continue; - case 'r': - ModeManager::AddChannelMode(new ChannelModeRegistered('r')); - continue; - case 's': - ModeManager::AddChannelMode(new ChannelMode(CMODE_SECRET, "CMODE_SECRET", 's')); - continue; - case 't': - ModeManager::AddChannelMode(new ChannelMode(CMODE_TOPIC, "CMODE_TOPIC", 't')); - continue; - case 'u': - ModeManager::AddChannelMode(new ChannelMode(CMODE_AUDITORIUM, "CMODE_AUDITORIUM", 'u')); - continue; - case 'z': - ModeManager::AddChannelMode(new ChannelMode(CMODE_SSL, "CMODE_SSL", 'z')); - continue; - default: - ModeManager::AddChannelMode(new ChannelMode(CMODE_END, "", modebuf[t])); - } + if (ModeManager::FindChannelModeByChar(modebuf[t])); + continue; + ModeManager::AddChannelMode(new ChannelMode(CMODE_END, "", modebuf[t])); } } else if (capab.find("USERMODES") != std::string::npos) @@ -1152,99 +1200,22 @@ int anope_event_capab(const char *source, int ac, const char **av) commasepstream sep(modes); std::string modebuf; - while (sep.GetToken(modebuf)) + sep.GetToken(modebuf); + sep.GetToken(modebuf); + + if (sep.GetToken(modebuf)) { for (size_t t = 0; t < modebuf.size(); ++t) { - switch (modebuf[t]) - { - case 'h': - ModeManager::AddUserMode(new UserMode(UMODE_HELPOP, "UMODE_HELPOP", 'h')); - continue; - case 's': - ModeManager::AddUserMode(new UserMode(UMODE_STRIPCOLOR, "UMODE_STRIPCOLOR", 'S')); - continue; - case 'B': - ModeManager::AddUserMode(new UserMode(UMODE_BOT, "UMODE_BOT", 'B')); - continue; - case 'G': - ModeManager::AddUserMode(new UserMode(UMODE_FILTER, "UMODE_FILTER", 'G')); - continue; - case 'H': - ModeManager::AddUserMode(new UserMode(UMODE_HIDEOPER, "UMODE_HIDEOPER", 'H')); - continue; - case 'I': - ModeManager::AddUserMode(new UserMode(UMODE_PRIV, "UMODE_PRIV", 'I')); - continue; - case 'Q': - ModeManager::AddUserMode(new UserMode(UMODE_HIDDEN, "UMODE_HIDDEN", 'Q')); - continue; - case 'R': - ModeManager::AddUserMode(new UserMode(UMODE_REGPRIV, "UMODE_REGPRIV", 'R')); - continue; - case 'S': - ModeManager::AddUserMode(new UserMode(UMODE_STRIPCOLOR, "UMODE_STRIPCOLOR", 'S')); - continue; - case 'W': - ModeManager::AddUserMode(new UserMode(UMODE_WHOIS, "UMODE_WHOIS", 'W')); - continue; - case 'c': - ModeManager::AddUserMode(new UserMode(UMODE_COMMONCHANS, "UMODE_COMMONCHANS", 'c')); - continue; - case 'g': - ModeManager::AddUserMode(new UserMode(UMODE_CALLERID, "UMODE_CALLERID", 'g')); - continue; - case 'i': - ModeManager::AddUserMode(new UserMode(UMODE_INVIS, "UMODE_INVIS", 'i')); - continue; - case 'k': - ModeManager::AddUserMode(new UserMode(UMODE_PROTECTED, "UMODE_PROTECTED", 'k')); - continue; - case 'o': - ModeManager::AddUserMode(new UserMode(UMODE_OPER, "UMODE_OPER", 'o')); - continue; - case 'r': - ModeManager::AddUserMode(new UserMode(UMODE_REGISTERED, "UMODE_REGISTERED", 'r')); - continue; - case 'w': - ModeManager::AddUserMode(new UserMode(UMODE_WALLOPS, "UMODE_WALLOPS", 'w')); - continue; - case 'x': - ModeManager::AddUserMode(new UserMode(UMODE_CLOAK, "UMODE_CLOAK", 'x')); - continue; - case 'd': - ModeManager::AddUserMode(new UserMode(UMODE_DEAF, "UMODE_DEAF", 'd')); - continue; - default: - ModeManager::AddUserMode(new UserMode(UMODE_END, "", modebuf[t])); - } + ModeManager::AddUserMode(new UserModeParam(UMODE_END, "", modebuf[t])); } } - } - else if (capab.find("PREFIX=(") != std::string::npos) - { - std::string modes(capab.begin() + 8, capab.begin() + capab.find(")")); - std::string chars(capab.begin() + capab.find(")") + 1, capab.end()); - - for (size_t t = 0; t < modes.size(); ++t) + + if (sep.GetToken(modebuf)) { - switch (modes[t]) + for (size_t t = 0; t < modebuf.size(); ++t) { - case 'q': - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OWNER, "CMODE_OWNER", 'q', chars[t])); - continue; - case 'a': - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_PROTECT, "CMODE_PROTECT", 'a', chars[t])); - continue; - case 'o': - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, "CMODE_OP", 'o', chars[t])); - continue; - case 'h': - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_HALFOP, "CMODE_HALFOP", 'h', chars[t])); - continue; - case 'v': - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, "CMODE_VOICE", 'v', chars[t])); - continue; + ModeManager::AddUserMode(new UserMode(UMODE_END, "", modebuf[t])); } } } @@ -1254,20 +1225,18 @@ int anope_event_capab(const char *source, int ac, const char **av) ircd->maxmodes = atoi(maxmodes.c_str()); } } - } else if (strcasecmp(av[0], "END") == 0) { - if (!has_globopsmod) { - send_cmd(NULL, "ERROR :m_globops is not loaded. This is required by Anope"); - quitmsg = "Remote server does not have the m_globops module loaded, and this is required."; - quitting = 1; - return MOD_STOP; - } - if (!has_servicesmod) { + } + else if (strcasecmp(av[0], "END") == 0) + { + if (!has_servicesmod) + { send_cmd(NULL, "ERROR :m_services_account.so is not loaded. This is required by Anope"); quitmsg = "ERROR: Remote server does not have the m_services_account module loaded, and this is required."; quitting = 1; return MOD_STOP; } - if (!has_hidechansmod) { + if (!ModeManager::FindUserModeByName(UMODE_PRIV)) + { send_cmd(NULL, "ERROR :m_hidechans.so is not loaded. This is required by Anope"); quitmsg = "ERROR: Remote server does not have the m_hidechans module loaded, and this is required."; quitting = 1; diff --git a/src/protocol/ratbox.cpp b/src/protocol/ratbox.cpp index 41759e79b..6ffb91164 100644 --- a/src/protocol/ratbox.cpp +++ b/src/protocol/ratbox.cpp @@ -846,7 +846,7 @@ static void AddModes() /* b/e/I */ ModeManager::AddChannelMode(new ChannelModeBan('b')); ModeManager::AddChannelMode(new ChannelModeExcept('e')); - ModeManager::AddChannelMode(new ChannelModeInvite('I')); + ModeManager::AddChannelMode(new ChannelModeInvex('I')); /* v/h/o/a/q */ ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, "CMODE_VOICE", 'v', '+')); diff --git a/src/protocol/unreal32.cpp b/src/protocol/unreal32.cpp index 99a156f00..2a8cc6b39 100644 --- a/src/protocol/unreal32.cpp +++ b/src/protocol/unreal32.cpp @@ -449,7 +449,7 @@ int anope_event_capab(const char *source, int ac, const char **av) ModeManager::AddChannelMode(new ChannelModeExcept('e')); continue; case 'I': - ModeManager::AddChannelMode(new ChannelModeInvite('I')); + ModeManager::AddChannelMode(new ChannelModeInvex('I')); continue; default: ModeManager::AddChannelMode(new ChannelModeList(CMODE_END, "", modebuf[t])); |