1
0
mirror of https://github.com/anope/anope.git synced 2026-06-25 07:16:39 +02:00

Parse 1205-style mode lists for CAPAB CHANMODES/USERMODES.

This commit is contained in:
Peter Powell
2019-06-04 21:22:35 +01:00
committed by P. Powell
parent bae8987ec1
commit c35029fa2f
3 changed files with 223 additions and 228 deletions
+2 -2
View File
@@ -192,7 +192,7 @@ class CoreExport ChannelModeStatus : public ChannelMode
/* The "level" of the mode, used to compare with other modes.
* Used so we know op > halfop > voice etc.
*/
short level;
unsigned level;
/** constructor
* @param name The mode name
@@ -200,7 +200,7 @@ class CoreExport ChannelModeStatus : public ChannelMode
* @param msymbol The symbol for the mode, eg @ %
* @param mlevel A level for the mode, which is usually determined by the PREFIX capab
*/
ChannelModeStatus(const Anope::string &name, char mc, char msymbol, short mlevel);
ChannelModeStatus(const Anope::string &name, char mc, char msymbol, unsigned mlevel);
};
/** A virtual mode. This mode doesn't natively exist on the IRCd (like extbans),
+220 -225
View File
@@ -766,7 +766,69 @@ struct IRCDMessageAway : Message::Away
struct IRCDMessageCapab : Message::Capab
{
std::map<char, Anope::string> chmodes, umodes;
struct ModeInfo
{
// The letter assigned to the mode (e.g. o).
char letter;
// If a prefix mode then the rank of the prefix.
unsigned level;
// The name of the mode.
Anope::string name;
// If a prefix mode then the symbol associated with the prefix.
char symbol;
// The type of mode.
Anope::string type;
ModeInfo() : letter(0), level(0), symbol(0) { }
};
static bool ParseMode(const Anope::string& token, ModeInfo& mode)
{
// list:ban=b param-set:limit=l param:key=k prefix:30000:op=@o simple:noextmsg=n
// A C A C A C A B C A C
Anope::string::size_type a = token.find(':');
if (a == Anope::string::npos)
return false;
// If the mode is a prefix mode then it also has a rank.
mode.type = token.substr(0, a);
if (mode.type == "prefix")
{
Anope::string::size_type b = token.find(':', a + 1);
if (b == Anope::string::npos)
return false;
const Anope::string modelevel = token.substr(a + 1, b - a - 1);
mode.level = modelevel.is_pos_number_only() ? convertTo<unsigned>(modelevel) : 0;
a = b;
}
Anope::string::size_type c = token.find('=', a + 1);
if (c == Anope::string::npos)
return false;
mode.name = token.substr(a + 1, c - a - 1);
switch (token.length() - c)
{
case 2:
mode.letter = token[c + 1];
break;
case 3:
mode.symbol = token[c + 1];
mode.letter = token[c + 2];
break;
default:
return false;
}
Log(LOG_DEBUG) << "Parsed mode: " << "type=" << mode.type << " name=" << mode.name << " level="
<< mode.level << " symbol=" << mode.symbol << " letter=" << mode.letter;
return true;
}
IRCDMessageCapab(Module *creator) : Message::Capab(creator, "CAPAB") { SetFlag(IRCDMESSAGE_SOFT_LIMIT); }
@@ -787,8 +849,6 @@ struct IRCDMessageCapab : Message::Capab
}
/* reset CAPAB */
chmodes.clear();
umodes.clear();
Servers::Capab.insert("SERVERS");
Servers::Capab.insert("TOPICLOCK");
IRCD->CanSVSHold = false;
@@ -801,133 +861,142 @@ struct IRCDMessageCapab : Message::Capab
while (ssep.GetToken(capab))
{
Anope::string modename = capab.substr(0, capab.find('='));
Anope::string modechar = capab.substr(capab.find('=') + 1);
ChannelMode *cm = NULL;
ModeInfo mode;
if (!ParseMode(capab, mode))
continue;
if (modename.equals_cs("admin"))
cm = new ChannelModeStatus("PROTECT", modechar.length() > 1 ? modechar[1] : modechar[0], modechar.length() > 1 ? modechar[0] : 0, 3);
else if (modename.equals_cs("allowinvite"))
ChannelMode *cm = NULL;
if (mode.name.equals_cs("admin"))
cm = new ChannelModeStatus("PROTECT", mode.letter, mode.symbol, mode.level);
else if (mode.name.equals_cs("allowinvite"))
{
cm = new ChannelMode("ALLINVITE", modechar[0]);
cm = new ChannelMode("ALLINVITE", mode.letter);
ModeManager::AddChannelMode(new InspIRCdExtban::EntryMatcher("INVITEBAN", "BAN", 'A'));
}
else if (modename.equals_cs("auditorium"))
cm = new ChannelMode("AUDITORIUM", modechar[0]);
else if (modename.equals_cs("autoop"))
cm = new InspIRCdAutoOpMode(modechar[0]);
else if (modename.equals_cs("ban"))
cm = new ChannelModeList("BAN", modechar[0]);
else if (modename.equals_cs("banexception"))
cm = new ChannelModeList("EXCEPT", modechar[0]);
else if (modename.equals_cs("blockcaps"))
else if (mode.name.equals_cs("auditorium"))
cm = new ChannelMode("AUDITORIUM", mode.letter);
else if (mode.name.equals_cs("autoop"))
cm = new InspIRCdAutoOpMode(mode.letter);
else if (mode.name.equals_cs("ban"))
cm = new ChannelModeList("BAN", mode.letter);
else if (mode.name.equals_cs("banexception"))
cm = new ChannelModeList("EXCEPT", mode.letter);
else if (mode.name.equals_cs("blockcaps"))
{
cm = new ChannelMode("BLOCKCAPS", modechar[0]);
cm = new ChannelMode("BLOCKCAPS", mode.letter);
ModeManager::AddChannelMode(new InspIRCdExtban::EntryMatcher("BLOCKCAPSBAN", "BAN", 'B'));
}
else if (modename.equals_cs("blockcolor"))
else if (mode.name.equals_cs("blockcolor"))
{
cm = new ChannelMode("BLOCKCOLOR", modechar[0]);
cm = new ChannelMode("BLOCKCOLOR", mode.letter);
ModeManager::AddChannelMode(new InspIRCdExtban::EntryMatcher("BLOCKCOLORBAN", "BAN", 'c'));
}
else if (modename.equals_cs("c_registered"))
cm = new ChannelModeNoone("REGISTERED", modechar[0]);
else if (modename.equals_cs("censor"))
cm = new ChannelMode("CENSOR", modechar[0]);
else if (modename.equals_cs("delayjoin"))
cm = new ChannelMode("DELAYEDJOIN", modechar[0]);
else if (modename.equals_cs("delaymsg"))
cm = new SimpleNumberParamMode("DELAYMSG", modechar[0]);
else if (modename.equals_cs("filter"))
cm = new ChannelModeList("FILTER", modechar[0]);
else if (modename.equals_cs("flood"))
cm = new ChannelModeFlood(modechar[0]);
else if (modename.equals_cs("founder"))
cm = new ChannelModeStatus("OWNER", modechar.length() > 1 ? modechar[1] : modechar[0], modechar.length() > 1 ? modechar[0] : 0, 4);
else if (modename.equals_cs("halfop"))
cm = new ChannelModeStatus("HALFOP", modechar.length() > 1 ? modechar[1] : modechar[0], modechar.length() > 1 ? modechar[0] : 0, 1);
else if (modename.equals_cs("history"))
cm = new ChannelModeHistory(modechar[0]);
else if (modename.equals_cs("invex"))
cm = new ChannelModeList("INVITEOVERRIDE", modechar[0]);
else if (modename.equals_cs("inviteonly"))
cm = new ChannelMode("INVITE", modechar[0]);
else if (modename.equals_cs("joinflood"))
cm = new ColonDelimitedParamMode("JOINFLOOD", modechar[0]);
else if (modename.equals_cs("key"))
cm = new ChannelModeKey(modechar[0]);
else if (modename.equals_cs("kicknorejoin"))
cm = new SimpleNumberParamMode("NOREJOIN", modechar[0]);
else if (modename.equals_cs("limit"))
cm = new ChannelModeParam("LIMIT", modechar[0], true);
else if (modename.equals_cs("moderated"))
cm = new ChannelMode("MODERATED", modechar[0]);
else if (modename.equals_cs("nickflood"))
cm = new ColonDelimitedParamMode("NICKFLOOD", modechar[0]);
else if (modename.equals_cs("noctcp"))
else if (mode.name.equals_cs("c_registered"))
cm = new ChannelModeNoone("REGISTERED", mode.letter);
else if (mode.name.equals_cs("censor"))
cm = new ChannelMode("CENSOR", mode.letter);
else if (mode.name.equals_cs("delayjoin"))
cm = new ChannelMode("DELAYEDJOIN", mode.letter);
else if (mode.name.equals_cs("delaymsg"))
cm = new SimpleNumberParamMode("DELAYMSG", mode.letter);
else if (mode.name.equals_cs("filter"))
cm = new ChannelModeList("FILTER", mode.letter);
else if (mode.name.equals_cs("flood"))
cm = new ChannelModeFlood(mode.letter);
else if (mode.name.equals_cs("founder"))
cm = new ChannelModeStatus("OWNER", mode.letter, mode.symbol, mode.level);
else if (mode.name.equals_cs("halfop"))
cm = new ChannelModeStatus("HALFOP", mode.letter, mode.symbol, mode.level);
else if (mode.name.equals_cs("history"))
cm = new ChannelModeHistory(mode.letter);
else if (mode.name.equals_cs("invex"))
cm = new ChannelModeList("INVITEOVERRIDE", mode.letter);
else if (mode.name.equals_cs("inviteonly"))
cm = new ChannelMode("INVITE", mode.letter);
else if (mode.name.equals_cs("joinflood"))
cm = new ColonDelimitedParamMode("JOINFLOOD", mode.letter);
else if (mode.name.equals_cs("key"))
cm = new ChannelModeKey(mode.letter);
else if (mode.name.equals_cs("kicknorejoin"))
cm = new SimpleNumberParamMode("NOREJOIN", mode.letter);
else if (mode.name.equals_cs("limit"))
cm = new ChannelModeParam("LIMIT", mode.letter, true);
else if (mode.name.equals_cs("moderated"))
cm = new ChannelMode("MODERATED", mode.letter);
else if (mode.name.equals_cs("nickflood"))
cm = new ColonDelimitedParamMode("NICKFLOOD", mode.letter);
else if (mode.name.equals_cs("noctcp"))
{
cm = new ChannelMode("NOCTCP", modechar[0]);
cm = new ChannelMode("NOCTCP", mode.letter);
ModeManager::AddChannelMode(new InspIRCdExtban::EntryMatcher("NOCTCPBAN", "BAN", 'C'));
}
else if (modename.equals_cs("noextmsg"))
cm = new ChannelMode("NOEXTERNAL", modechar[0]);
else if (modename.equals_cs("nokick"))
else if (mode.name.equals_cs("noextmsg"))
cm = new ChannelMode("NOEXTERNAL", mode.letter);
else if (mode.name.equals_cs("nokick"))
{
cm = new ChannelMode("NOKICK", modechar[0]);
cm = new ChannelMode("NOKICK", mode.letter);
ModeManager::AddChannelMode(new InspIRCdExtban::EntryMatcher("NOKICKBAN", "BAN", 'Q'));
}
else if (modename.equals_cs("noknock"))
cm = new ChannelMode("NOKNOCK", modechar[0]);
else if (modename.equals_cs("nonick"))
else if (mode.name.equals_cs("noknock"))
cm = new ChannelMode("NOKNOCK", mode.letter);
else if (mode.name.equals_cs("nonick"))
{
cm = new ChannelMode("NONICK", modechar[0]);
cm = new ChannelMode("NONICK", mode.letter);
ModeManager::AddChannelMode(new InspIRCdExtban::EntryMatcher("NONICKBAN", "BAN", 'N'));
}
else if (modename.equals_cs("nonotice"))
else if (mode.name.equals_cs("nonotice"))
{
cm = new ChannelMode("NONOTICE", modechar[0]);
cm = new ChannelMode("NONOTICE", mode.letter);
ModeManager::AddChannelMode(new InspIRCdExtban::EntryMatcher("NONOTICEBAN", "BAN", 'T'));
}
else if (modename.equals_cs("official-join"))
cm = new ChannelModeStatus("OFFICIALJOIN", modechar.length() > 1 ? modechar[1] : modechar[0], modechar.length() > 1 ? modechar[0] : 0, 2);
else if (modename.equals_cs("op"))
cm = new ChannelModeStatus("OP", modechar.length() > 1 ? modechar[1] : modechar[0], modechar.length() > 1 ? modechar[0] : 0, 2);
else if (modename.equals_cs("operonly"))
cm = new ChannelModeOperOnly("OPERONLY", modechar[0]);
else if (modename.equals_cs("operprefix"))
cm = new ChannelModeStatus("OPERPREFIX", modechar.length() > 1 ? modechar[1] : modechar[0], modechar.length() > 1 ? modechar[0] : 0, 2);
else if (modename.equals_cs("permanent"))
cm = new ChannelMode("PERM", modechar[0]);
else if (modename.equals_cs("private"))
cm = new ChannelMode("PRIVATE", modechar[0]);
else if (modename.equals_cs("redirect"))
cm = new ChannelModeRedirect(modechar[0]);
else if (modename.equals_cs("reginvite"))
cm = new ChannelMode("REGISTEREDONLY", modechar[0]);
else if (modename.equals_cs("regmoderated"))
cm = new ChannelMode("REGMODERATED", modechar[0]);
else if (modename.equals_cs("secret"))
cm = new ChannelMode("SECRET", modechar[0]);
else if (modename.equals_cs("sslonly"))
else if (mode.name.equals_cs("official-join"))
cm = new ChannelModeStatus("OFFICIALJOIN", mode.letter, mode.symbol, mode.level);
else if (mode.name.equals_cs("op"))
cm = new ChannelModeStatus("OP", mode.letter, mode.symbol, mode.level);
else if (mode.name.equals_cs("operonly"))
cm = new ChannelModeOperOnly("OPERONLY", mode.letter);
else if (mode.name.equals_cs("operprefix"))
cm = new ChannelModeStatus("OPERPREFIX", mode.letter, mode.symbol, mode.level);
else if (mode.name.equals_cs("permanent"))
cm = new ChannelMode("PERM", mode.letter);
else if (mode.name.equals_cs("private"))
cm = new ChannelMode("PRIVATE", mode.letter);
else if (mode.name.equals_cs("redirect"))
cm = new ChannelModeRedirect(mode.letter);
else if (mode.name.equals_cs("reginvite"))
cm = new ChannelMode("REGISTEREDONLY", mode.letter);
else if (mode.name.equals_cs("regmoderated"))
cm = new ChannelMode("REGMODERATED", mode.letter);
else if (mode.name.equals_cs("secret"))
cm = new ChannelMode("SECRET", mode.letter);
else if (mode.name.equals_cs("sslonly"))
{
cm = new ChannelMode("SSL", modechar[0]);
cm = new ChannelMode("SSL", mode.letter);
ModeManager::AddChannelMode(new InspIRCdExtban::FinerprintMatcher("SSLBAN", "BAN", 'z'));
}
else if (modename.equals_cs("stripcolor"))
else if (mode.name.equals_cs("stripcolor"))
{
cm = new ChannelMode("STRIPCOLOR", modechar[0]);
cm = new ChannelMode("STRIPCOLOR", mode.letter);
ModeManager::AddChannelMode(new InspIRCdExtban::EntryMatcher("STRIPCOLORBAN", "BAN", 'S'));
}
else if (modename.equals_cs("topiclock"))
cm = new ChannelMode("TOPIC", modechar[0]);
else if (modename.equals_cs("voice"))
cm = new ChannelModeStatus("VOICE", modechar.length() > 1 ? modechar[1] : modechar[0], modechar.length() > 1 ? modechar[0] : 0, 0);
/* Unknown status mode, (customprefix) - add it */
else if (modechar.length() == 2)
cm = new ChannelModeStatus(modename.upper(), modechar[1], modechar[0], -1);
/* Unknown non status mode, add it to our list for later */
else if (mode.name.equals_cs("topiclock"))
cm = new ChannelMode("TOPIC", mode.letter);
else if (mode.name.equals_cs("voice"))
cm = new ChannelModeStatus("VOICE", mode.letter, mode.symbol, mode.level);
// Handle unknown modes.
else if (mode.type.equals_cs("list"))
cm = new ChannelModeList(mode.name.upper(), mode.letter);
else if (mode.type.equals_cs("param-set"))
cm = new ChannelModeParam(mode.name.upper(), mode.letter, true);
else if (mode.type.equals_cs("param"))
cm = new ChannelModeParam(mode.name.upper(), mode.letter, false);
else if (mode.type.equals_cs("prefix"))
cm = new ChannelModeStatus(mode.name.upper(), mode.letter, mode.symbol, mode.level);
else if (mode.type.equals_cs("simple"))
cm = new ChannelMode(mode.name.upper(), mode.letter);
else
chmodes[modechar[0]] = modename.upper();
Log(LOG_DEBUG) << "Unknown channel mode: " << capab;
if (cm)
ModeManager::AddChannelMode(cm);
@@ -940,54 +1009,61 @@ struct IRCDMessageCapab : Message::Capab
while (ssep.GetToken(capab))
{
Anope::string modename = capab.substr(0, capab.find('='));
Anope::string modechar = capab.substr(capab.find('=') + 1);
UserMode *um = NULL;
ModeInfo mode;
if (!ParseMode(capab, mode))
continue;
if (modename.equals_cs("bot"))
UserMode *um = NULL;
if (mode.name.equals_cs("bot"))
{
um = new UserMode("BOT", modechar[0]);
IRCD->DefaultPseudoclientModes += modechar;
um = new UserMode("BOT", mode.letter);
IRCD->DefaultPseudoclientModes += mode.letter;
}
else if (modename.equals_cs("callerid"))
um = new UserMode("CALLERID", modechar[0]);
else if (modename.equals_cs("cloak"))
um = new UserMode("CLOAK", modechar[0]);
else if (modename.equals_cs("deaf"))
um = new UserMode("DEAF", modechar[0]);
else if (modename.equals_cs("deaf_commonchan"))
um = new UserMode("COMMONCHANS", modechar[0]);
else if (modename.equals_cs("helpop"))
um = new UserModeOperOnly("HELPOP", modechar[0]);
else if (modename.equals_cs("hidechans"))
um = new UserMode("PRIV", modechar[0]);
else if (modename.equals_cs("hideoper"))
um = new UserModeOperOnly("HIDEOPER", modechar[0]);
else if (modename.equals_cs("invisible"))
um = new UserMode("INVIS", modechar[0]);
else if (modename.equals_cs("invis-oper"))
um = new UserModeOperOnly("INVISIBLE_OPER", modechar[0]);
else if (modename.equals_cs("oper"))
um = new UserModeOperOnly("OPER", modechar[0]);
else if (modename.equals_cs("regdeaf"))
um = new UserMode("REGPRIV", modechar[0]);
else if (modename.equals_cs("servprotect"))
else if (mode.name.equals_cs("callerid"))
um = new UserMode("CALLERID", mode.letter);
else if (mode.name.equals_cs("cloak"))
um = new UserMode("CLOAK", mode.letter);
else if (mode.name.equals_cs("deaf"))
um = new UserMode("DEAF", mode.letter);
else if (mode.name.equals_cs("deaf_commonchan"))
um = new UserMode("COMMONCHANS", mode.letter);
else if (mode.name.equals_cs("helpop"))
um = new UserModeOperOnly("HELPOP", mode.letter);
else if (mode.name.equals_cs("hidechans"))
um = new UserMode("PRIV", mode.letter);
else if (mode.name.equals_cs("hideoper"))
um = new UserModeOperOnly("HIDEOPER", mode.letter);
else if (mode.name.equals_cs("invisible"))
um = new UserMode("INVIS", mode.letter);
else if (mode.name.equals_cs("invis-oper"))
um = new UserModeOperOnly("INVISIBLE_OPER", mode.letter);
else if (mode.name.equals_cs("oper"))
um = new UserModeOperOnly("OPER", mode.letter);
else if (mode.name.equals_cs("regdeaf"))
um = new UserMode("REGPRIV", mode.letter);
else if (mode.name.equals_cs("servprotect"))
{
um = new UserModeNoone("PROTECTED", modechar[0]);
IRCD->DefaultPseudoclientModes += modechar;
um = new UserModeNoone("PROTECTED", mode.letter);
IRCD->DefaultPseudoclientModes += mode.letter;
}
else if (modename.equals_cs("showwhois"))
um = new UserMode("WHOIS", modechar[0]);
else if (modename.equals_cs("u_censor"))
um = new UserMode("CENSOR", modechar[0]);
else if (modename.equals_cs("u_registered"))
um = new UserModeNoone("REGISTERED", modechar[0]);
else if (modename.equals_cs("u_stripcolor"))
um = new UserMode("STRIPCOLOR", modechar[0]);
else if (modename.equals_cs("wallops"))
um = new UserMode("WALLOPS", modechar[0]);
else if (mode.name.equals_cs("showwhois"))
um = new UserMode("WHOIS", mode.letter);
else if (mode.name.equals_cs("u_censor"))
um = new UserMode("CENSOR", mode.letter);
else if (mode.name.equals_cs("u_registered"))
um = new UserModeNoone("REGISTERED", mode.letter);
else if (mode.name.equals_cs("u_stripcolor"))
um = new UserMode("STRIPCOLOR", mode.letter);
else if (mode.name.equals_cs("wallops"))
um = new UserMode("WALLOPS", mode.letter);
// Handle unknown modes.
else if (mode.type.equals_cs("param-set"))
um = new UserModeParam(mode.name.upper(), mode.letter);
else if (mode.type.equals_cs("simple"))
um = new UserMode(mode.name.upper(), mode.letter);
else
umodes[modechar[0]] = modename.upper();
Log(LOG_DEBUG) << "Unknown user mode: " << capab;
if (um)
ModeManager::AddUserMode(um);
@@ -1048,89 +1124,11 @@ struct IRCDMessageCapab : Message::Capab
Anope::string capab;
while (ssep.GetToken(capab))
{
if (capab.find("CHANMODES") != Anope::string::npos)
{
Anope::string modes(capab.begin() + 10, capab.end());
commasepstream sep(modes, true);
Anope::string modebuf;
sep.GetToken(modebuf);
for (size_t t = 0, end = modebuf.length(); t < end; ++t)
{
if (ModeManager::FindChannelModeByChar(modebuf[t]))
continue;
ModeManager::AddChannelMode(new ChannelModeList(chmodes[modebuf[t]], modebuf[t]));
}
sep.GetToken(modebuf);
for (size_t t = 0, end = modebuf.length(); t < end; ++t)
{
if (ModeManager::FindChannelModeByChar(modebuf[t]))
continue;
ModeManager::AddChannelMode(new ChannelModeParam(chmodes[modebuf[t]], modebuf[t]));
}
sep.GetToken(modebuf);
for (size_t t = 0, end = modebuf.length(); t < end; ++t)
{
if (ModeManager::FindChannelModeByChar(modebuf[t]))
continue;
ModeManager::AddChannelMode(new ChannelModeParam(chmodes[modebuf[t]], modebuf[t], true));
}
sep.GetToken(modebuf);
for (size_t t = 0, end = modebuf.length(); t < end; ++t)
{
if (ModeManager::FindChannelModeByChar(modebuf[t]))
continue;
ModeManager::AddChannelMode(new ChannelMode(chmodes[modebuf[t]], modebuf[t]));
}
}
else if (capab.find("USERMODES") != Anope::string::npos)
{
Anope::string modes(capab.begin() + 10, capab.end());
commasepstream sep(modes, true);
Anope::string modebuf;
sep.GetToken(modebuf);
sep.GetToken(modebuf);
if (sep.GetToken(modebuf))
for (size_t t = 0, end = modebuf.length(); t < end; ++t)
ModeManager::AddUserMode(new UserModeParam(umodes[modebuf[t]], modebuf[t]));
if (sep.GetToken(modebuf))
for (size_t t = 0, end = modebuf.length(); t < end; ++t)
ModeManager::AddUserMode(new UserMode(umodes[modebuf[t]], modebuf[t]));
}
else if (capab.find("MAXMODES=") != Anope::string::npos)
if (capab.find("MAXMODES=") != Anope::string::npos)
{
Anope::string maxmodes(capab.begin() + 9, capab.end());
IRCD->MaxModes = maxmodes.is_pos_number_only() ? convertTo<unsigned>(maxmodes) : 3;
}
else if (capab.find("PREFIX=") != Anope::string::npos)
{
Anope::string modes(capab.begin() + 8, capab.begin() + capab.find(')'));
Anope::string chars(capab.begin() + capab.find(')') + 1, capab.end());
short level = modes.length() - 1;
for (size_t t = 0, end = modes.length(); t < end; ++t)
{
ChannelMode *cm = ModeManager::FindChannelModeByChar(modes[t]);
if (cm == NULL || cm->type != MODE_STATUS)
{
Log() << "CAPAB PREFIX gave unknown channel status mode " << modes[t];
continue;
}
ChannelModeStatus *cms = anope_dynamic_static_cast<ChannelModeStatus *>(cm);
cms->level = level--;
Log(LOG_DEBUG) << cms->name << " is now level " << cms->level;
}
ModeManager::RebuildStatusModes();
}
else if (capab == "GLOBOPS=1")
Servers::Capab.insert("GLOBOPS");
}
@@ -1157,9 +1155,6 @@ struct IRCDMessageCapab : Message::Capab
Log() << "CHGHOST missing, Usage disabled until module is loaded.";
if (!Servers::Capab.count("CHGIDENT"))
Log() << "CHGIDENT missing, Usage disabled until module is loaded.";
chmodes.clear();
umodes.clear();
}
Message::Capab::Run(source, params);
+1 -1
View File
@@ -186,7 +186,7 @@ ChannelModeParam::ChannelModeParam(const Anope::string &cm, char mch, bool ma) :
this->type = MODE_PARAM;
}
ChannelModeStatus::ChannelModeStatus(const Anope::string &mname, char modeChar, char msymbol, short mlevel) : ChannelMode(mname, modeChar), symbol(msymbol), level(mlevel)
ChannelModeStatus::ChannelModeStatus(const Anope::string &mname, char modeChar, char msymbol, unsigned mlevel) : ChannelMode(mname, modeChar), symbol(msymbol), level(mlevel)
{
this->type = MODE_STATUS;
}