summaryrefslogtreecommitdiff
path: root/modules/nickserv/ns_set_keepmodes.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/nickserv/ns_set_keepmodes.cpp')
-rw-r--r--modules/nickserv/ns_set_keepmodes.cpp45
1 files changed, 36 insertions, 9 deletions
diff --git a/modules/nickserv/ns_set_keepmodes.cpp b/modules/nickserv/ns_set_keepmodes.cpp
index faa44b9d3..8e5c902b2 100644
--- a/modules/nickserv/ns_set_keepmodes.cpp
+++ b/modules/nickserv/ns_set_keepmodes.cpp
@@ -128,13 +128,19 @@ private:
const NickCore *nc = anope_dynamic_static_cast<const NickCore *>(s);
Anope::string modes;
- for (const auto &[last_mode, last_value] : nc->last_modes)
+ for (const auto &[last_mode, last_data] : nc->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);
}
@@ -152,11 +158,32 @@ private:
nc->last_modes.clear();
for (spacesepstream sep(modes); sep.GetToken(modes);)
{
- size_t c = modes.find(',');
- if (c == Anope::string::npos)
- nc->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();
+
+ nc->last_modes.emplace(modes, info);
+ continue;
+ }
else
- nc->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)
+ nc->last_modes.emplace(modes, ModeData());
+ else
+ nc->last_modes.emplace(modes.substr(0, c), ModeData(modes.substr(c + 1)));
+ // End 2.0 compatibility.
+ }
}
}
} keep_modes;
@@ -197,11 +224,11 @@ public:
{
const auto norestore = Config->GetModule(this).Get<const Anope::string>("norestore");
User::ModeList modes = u->Account()->last_modes;
- for (const auto &[last_mode, last_value] : modes)
+ for (const auto &[last_mode, last_data] : modes)
{
auto *um = ModeManager::FindUserModeByName(last_mode);
if (um && um->CanSet(nullptr) && norestore.find(um->mchar) == Anope::string::npos)
- u->SetMode(nullptr, last_mode, last_value);
+ u->SetMode(nullptr, last_mode, last_data);
}
}
}