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/inspircd20.cpp | |
| 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/inspircd20.cpp')
| -rw-r--r-- | modules/protocol/inspircd20.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
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")) |
