diff options
| author | Adam <Adam@anope.org> | 2011-08-19 04:18:13 -0400 |
|---|---|---|
| committer | Adam <Adam@anope.org> | 2011-09-10 01:52:59 -0400 |
| commit | 4fcb371bc8813cd647b7769a64d586e3a57d684d (patch) | |
| tree | 836584fe2392b5ea21115111dbd470dbf04ce47b /modules/protocol | |
| parent | 6401d93b8e0ec5b6f68bd507dffa360b4d60d335 (diff) | |
Track what "level" channel status modes are, which allows us to have chanserv/mode determine if a status mode can be set by users better
Diffstat (limited to 'modules/protocol')
| -rw-r--r-- | modules/protocol/bahamut.cpp | 4 | ||||
| -rw-r--r-- | modules/protocol/inspircd11.cpp | 13 | ||||
| -rw-r--r-- | modules/protocol/inspircd12.cpp | 13 | ||||
| -rw-r--r-- | modules/protocol/inspircd20.cpp | 19 | ||||
| -rw-r--r-- | modules/protocol/plexus.cpp | 10 | ||||
| -rw-r--r-- | modules/protocol/ratbox.cpp | 4 | ||||
| -rw-r--r-- | modules/protocol/unreal.cpp | 10 |
7 files changed, 49 insertions, 24 deletions
diff --git a/modules/protocol/bahamut.cpp b/modules/protocol/bahamut.cpp index 796e021e1..9aae47086 100644 --- a/modules/protocol/bahamut.cpp +++ b/modules/protocol/bahamut.cpp @@ -537,8 +537,8 @@ class ProtoBahamut : public Module ModeManager::AddChannelMode(new ChannelModeList(CMODE_BAN, 'b')); /* v/h/o/a/q */ - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, 'v', '+')); - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, 'o', '@')); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, 'v', '+', 0)); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, 'o', '@', 1)); /* Add channel modes */ ModeManager::AddChannelMode(new ChannelMode(CMODE_BLOCKCOLOR, 'c')); diff --git a/modules/protocol/inspircd11.cpp b/modules/protocol/inspircd11.cpp index a5f8e1d86..2a1b4e435 100644 --- a/modules/protocol/inspircd11.cpp +++ b/modules/protocol/inspircd11.cpp @@ -524,26 +524,29 @@ class InspircdIRCdMessage : public IRCdMessage { Anope::string modes(capab.begin() + 8, capab.begin() + capab.find(')')); Anope::string chars(capab.begin() + capab.find(')') + 1, capab.end()); + unsigned short level = modes.length() - 1; for (size_t t = 0, end = modes.length(); t < end; ++t) { switch (modes[t]) { case 'q': - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OWNER, 'q', '~')); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OWNER, 'q', '~', level--)); continue; case 'a': - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_PROTECT, 'a', '&')); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_PROTECT, 'a', '&', level--)); continue; case 'o': - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, 'o', '@')); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, 'o', '@', level--)); continue; case 'h': - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_HALFOP, 'h', '%')); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_HALFOP, 'h', '%', level--)); continue; case 'v': - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, 'v', '+')); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, 'v', '+', level--)); continue; + default: + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_END, modes[t], chars[t], level--)); } } } diff --git a/modules/protocol/inspircd12.cpp b/modules/protocol/inspircd12.cpp index a2e0e0920..6175e2f52 100644 --- a/modules/protocol/inspircd12.cpp +++ b/modules/protocol/inspircd12.cpp @@ -656,26 +656,29 @@ class Inspircd12IRCdMessage : public InspircdIRCdMessage { Anope::string modes(capab.begin() + 8, capab.begin() + capab.find(')')); Anope::string chars(capab.begin() + capab.find(')') + 1, capab.end()); + unsigned short level = modes.length() - 1; for (size_t t = 0, end = modes.length(); t < end; ++t) { switch (modes[t]) { case 'q': - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OWNER, 'q', chars[t])); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OWNER, 'q', chars[t], level--)); continue; case 'a': - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_PROTECT, 'a', chars[t])); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_PROTECT, 'a', chars[t], level--)); continue; case 'o': - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, 'o', chars[t])); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, 'o', chars[t], level--)); continue; case 'h': - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_HALFOP, 'h', chars[t])); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_HALFOP, 'h', chars[t], level--)); continue; case 'v': - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, 'v', chars[t])); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, 'v', chars[t], level--)); continue; + default: + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_END, modes[t], chars[t], level--)); } } } diff --git a/modules/protocol/inspircd20.cpp b/modules/protocol/inspircd20.cpp index f210525c5..852f0c4e0 100644 --- a/modules/protocol/inspircd20.cpp +++ b/modules/protocol/inspircd20.cpp @@ -688,6 +688,25 @@ class Inspircd20IRCdMessage : public InspircdIRCdMessage 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()); + unsigned 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 = debug_cast<ChannelModeStatus *>(cm); + cms->Level = level--; + } + } } } else if (params[0].equals_cs("END")) diff --git a/modules/protocol/plexus.cpp b/modules/protocol/plexus.cpp index fa5f88f5a..8bc3e21b9 100644 --- a/modules/protocol/plexus.cpp +++ b/modules/protocol/plexus.cpp @@ -631,11 +631,11 @@ class ProtoPlexus : public Module ModeManager::AddChannelMode(new ChannelModeParam(CMODE_LIMIT, 'l')); /* v/h/o/a/q */ - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, 'v', '+')); - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_HALFOP, 'h', '%')); - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, 'o', '@')); - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_PROTECT, 'a', '&')); - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OWNER, 'q', '~')); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, 'v', '+', 0)); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_HALFOP, 'h', '%', 1)); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, 'o', '@', 2)); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_PROTECT, 'a', '&', 3)); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OWNER, 'q', '~', 4)); /* Add channel modes */ ModeManager::AddChannelMode(new ChannelMode(CMODE_BANDWIDTH, 'B')); diff --git a/modules/protocol/ratbox.cpp b/modules/protocol/ratbox.cpp index c47189736..d4208760e 100644 --- a/modules/protocol/ratbox.cpp +++ b/modules/protocol/ratbox.cpp @@ -565,8 +565,8 @@ class ProtoRatbox : public Module ModeManager::AddChannelMode(new ChannelModeList(CMODE_INVITEOVERRIDE, 'I')); /* v/h/o/a/q */ - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, 'v', '+')); - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, 'o', '@')); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, 'v', '+', 0)); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, 'o', '@', 1)); /* Add channel modes */ ModeManager::AddChannelMode(new ChannelMode(CMODE_INVITE, 'i')); diff --git a/modules/protocol/unreal.cpp b/modules/protocol/unreal.cpp index 38b9da82b..cbb23dcc5 100644 --- a/modules/protocol/unreal.cpp +++ b/modules/protocol/unreal.cpp @@ -1065,12 +1065,12 @@ class ProtoUnreal : public Module void AddModes() { - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, 'v', '+')); - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_HALFOP, 'h', '%')); - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, 'o', '@')); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, 'v', '+', 0)); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_HALFOP, 'h', '%', 1)); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, 'o', '@', 2)); /* Unreal sends +q as * and +a as ~ */ - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_PROTECT, 'a', '~')); - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OWNER, 'q', '*')); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_PROTECT, 'a', '~', 3)); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OWNER, 'q', '*', 4)); /* Add user modes */ ModeManager::AddUserMode(new UserMode(UMODE_SERV_ADMIN, 'A')); |
