diff options
Diffstat (limited to 'modules/chanserv')
| -rw-r--r-- | modules/chanserv/chanserv.cpp | 6 | ||||
| -rw-r--r-- | modules/chanserv/cs_mode.cpp | 2 | ||||
| -rw-r--r-- | modules/chanserv/cs_set.cpp | 47 |
3 files changed, 41 insertions, 14 deletions
diff --git a/modules/chanserv/chanserv.cpp b/modules/chanserv/chanserv.cpp index 8f3ec68e4..259a92842 100644 --- a/modules/chanserv/chanserv.cpp +++ b/modules/chanserv/chanserv.cpp @@ -309,7 +309,7 @@ public: return; if (c->ci) - c->SetMode(c->ci->WhoSends(), "REGISTERED", "", false); + c->SetMode(c->ci->WhoSends(), "REGISTERED", {}, false); else c->RemoveMode(c->WhoSends(), "REGISTERED", "", false); @@ -461,7 +461,7 @@ public: } } - EventReturn OnChannelModeSet(Channel *c, MessageSource &setter, ChannelMode *mode, const Anope::string ¶m) override + EventReturn OnChannelModeSet(Channel *c, MessageSource &setter, ChannelMode *mode, const ModeData &data) override { if (!always_lower && Anope::CurTime == c->created && c->ci && setter.GetUser() && !setter.GetUser()->server->IsULined()) { @@ -470,7 +470,7 @@ public: if (cu && cm && !cu->status.HasMode(cm->mchar)) { /* Our -o and their mode change crossing, bounce their mode */ - c->RemoveMode(c->ci->WhoSends(), mode, param); + c->RemoveMode(c->ci->WhoSends(), mode, data.value); /* We don't set mlocks until after the join has finished processing, it will stack with this change, * so there isn't much for the user to remove except -nt etc which is likely locked anyway. */ diff --git a/modules/chanserv/cs_mode.cpp b/modules/chanserv/cs_mode.cpp index 26741654f..d6339311e 100644 --- a/modules/chanserv/cs_mode.cpp +++ b/modules/chanserv/cs_mode.cpp @@ -1008,7 +1008,7 @@ public: if (cm->type == MODE_REGULAR) { if (!c->HasMode(cm->name) && ml->set) - c->SetMode(NULL, cm, "", false); + c->SetMode(NULL, cm, {}, false); else if (c->HasMode(cm->name) && !ml->set) c->RemoveMode(NULL, cm, "", false); } diff --git a/modules/chanserv/cs_set.cpp b/modules/chanserv/cs_set.cpp index d3236ea77..8761a3c47 100644 --- a/modules/chanserv/cs_set.cpp +++ b/modules/chanserv/cs_set.cpp @@ -1121,13 +1121,19 @@ class CSSet final const ChannelInfo *ci = anope_dynamic_static_cast<const ChannelInfo *>(s); Anope::string modes; - for (const auto &[last_mode, last_value] : ci->last_modes) + for (const auto &[last_mode, last_data] : ci->last_modes) { if (!modes.empty()) modes += " "; + + modes += '+'; modes += last_mode; - if (!last_value.empty()) - modes += "," + last_value; + if (!last_data.value.empty()) + { + modes += "," + Anope::ToString(last_data.set_at); + modes += "," + last_data.set_by; + modes += "," + last_data.value; + } } data.Store("last_modes", modes); } @@ -1145,11 +1151,32 @@ class CSSet final ci->last_modes.clear(); for (spacesepstream sep(modes); sep.GetToken(modes);) { - size_t c = modes.find(','); - if (c == Anope::string::npos) - ci->last_modes.emplace(modes, ""); + if (modes[0] == '+') + { + commasepstream mode(modes, true); + mode.GetToken(modes); + modes.erase(0, 1); + + ModeData info; + Anope::string set_at; + mode.GetToken(set_at); + info.set_at = Anope::Convert(set_at, 0); + mode.GetToken(info.set_by); + info.value = mode.GetRemaining(); + + ci->last_modes.emplace(modes, info); + continue; + } else - ci->last_modes.emplace(modes.substr(0, c), modes.substr(c + 1)); + { + // Begin 2.0 compatibility + size_t c = modes.find(','); + if (c == Anope::string::npos) + ci->last_modes.emplace(modes, ModeData()); + else + ci->last_modes.emplace(modes.substr(0, c), ModeData(modes.substr(c + 1))); + // End 2.0 compatibility. + } } } } keep_modes; @@ -1207,8 +1234,8 @@ public: if (c->ci && keep_modes.HasExt(c->ci)) { Channel::ModeList ml = c->ci->last_modes; - for (const auto &[last_mode, last_value] : ml) - c->SetMode(c->ci->WhoSends(), last_mode, last_value); + for (const auto &[last_mode, last_data] : ml) + c->SetMode(c->ci->WhoSends(), last_mode, last_data); } } @@ -1230,7 +1257,7 @@ public: persist.Unset(ci); } - EventReturn OnChannelModeSet(Channel *c, MessageSource &setter, ChannelMode *mode, const Anope::string ¶m) override + EventReturn OnChannelModeSet(Channel *c, MessageSource &setter, ChannelMode *mode, const ModeData &data) override { if (c->ci) { |
