summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--modules/protocol/inspircd20.cpp2
-rw-r--r--src/regchannel.cpp26
2 files changed, 22 insertions, 6 deletions
diff --git a/modules/protocol/inspircd20.cpp b/modules/protocol/inspircd20.cpp
index 7aff780be..fd631a334 100644
--- a/modules/protocol/inspircd20.cpp
+++ b/modules/protocol/inspircd20.cpp
@@ -222,6 +222,8 @@ struct IRCDMessageCapab : Message::Capab
cm = new ChannelMode(CMODE_FILTER, modechar[0]);
else if (modename.equals_cs("delayjoin"))
cm = new ChannelMode(CMODE_DELAYEDJOIN, modechar[0]);
+ else if (modename.equals_cs("filter"))
+ cm = new ChannelModeList(CMODE_FILTER, modechar[0]);
else if (modename.equals_cs("flood"))
cm = new ChannelModeFlood(modechar[0], true);
else if (modename.equals_cs("founder"))
diff --git a/src/regchannel.cpp b/src/regchannel.cpp
index cc76bc5ba..ac7fb70fa 100644
--- a/src/regchannel.cpp
+++ b/src/regchannel.cpp
@@ -167,7 +167,10 @@ void ModeLock::Serialize(Serialize::Data &data) const
const Anope::string* ChannelModeNameStrings = Flags<ChannelModeName>::GetFlagStrings();
data["ci"] << this->ci->name;
data["set"] << this->set;
- data["name"] << ChannelModeNameStrings[this->name];
+ if (this->name < CMODE_END)
+ data["name"] << ChannelModeNameStrings[this->name];
+ else
+ data["name"] << this->name - CMODE_END;
data["param"] << this->param;
data["setter"] << this->setter;
data.SetType("created", Serialize::Data::DT_INT); data["created"] << this->created;
@@ -186,13 +189,24 @@ Serializable* ModeLock::Unserialize(Serializable *obj, Serialize::Data &data)
ChannelModeName name = CMODE_END;
- const Anope::string* ChannelModeNameStrings = Flags<ChannelModeName>::GetFlagStrings();
- for (unsigned i = 0; !ChannelModeNameStrings[i].empty(); ++i)
- if (ChannelModeNameStrings[i] == sname)
+ if (sname.is_pos_number_only())
+ {
+ try
{
- name = static_cast<ChannelModeName>(i);
- break;
+ name = static_cast<ChannelModeName>(CMODE_END + convertTo<unsigned>(sname));
}
+ catch (const ConvertException &) { }
+ }
+ else
+ {
+ const Anope::string* ChannelModeNameStrings = Flags<ChannelModeName>::GetFlagStrings();
+ for (unsigned i = 0; !ChannelModeNameStrings[i].empty(); ++i)
+ if (ChannelModeNameStrings[i] == sname)
+ {
+ name = static_cast<ChannelModeName>(i);
+ break;
+ }
+ }
if (name == CMODE_END)
return NULL;