summaryrefslogtreecommitdiff
path: root/modules/chanserv
diff options
context:
space:
mode:
authorSadie Powell <sadie@witchery.services>2025-05-03 17:07:07 +0100
committerSadie Powell <sadie@witchery.services>2025-05-03 21:28:56 +0100
commit010beb52b1f3c697a07f9a130d2ed9335fe1cd98 (patch)
tree734750a5677afff443f2117dc34ba14d3351fb28 /modules/chanserv
parentc95594141346ef6fb65a5af177bed35ed865234d (diff)
Store the setter and ts for all modes and try to restore them.
This is mostly for preserving channel list mode info.
Diffstat (limited to 'modules/chanserv')
-rw-r--r--modules/chanserv/chanserv.cpp6
-rw-r--r--modules/chanserv/cs_mode.cpp2
-rw-r--r--modules/chanserv/cs_set.cpp47
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 &param) 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 &param) override
+ EventReturn OnChannelModeSet(Channel *c, MessageSource &setter, ChannelMode *mode, const ModeData &data) override
{
if (c->ci)
{