summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/modes.h4
-rw-r--r--src/modes.cpp4
-rw-r--r--src/process.cpp2
-rw-r--r--src/protocol/inspircd11.cpp2
-rw-r--r--src/protocol/inspircd12.cpp5
-rw-r--r--src/protocol/inspircd20.cpp507
-rw-r--r--src/protocol/ratbox.cpp2
-rw-r--r--src/protocol/unreal32.cpp2
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]));