summaryrefslogtreecommitdiff
path: root/modules/protocol/inspircd20.cpp
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2011-08-19 04:18:13 -0400
committerAdam <Adam@anope.org>2011-09-10 01:52:59 -0400
commit4fcb371bc8813cd647b7769a64d586e3a57d684d (patch)
tree836584fe2392b5ea21115111dbd470dbf04ce47b /modules/protocol/inspircd20.cpp
parent6401d93b8e0ec5b6f68bd507dffa360b4d60d335 (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.cpp19
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"))