aboutsummaryrefslogtreecommitdiff
path: root/src/modules/m_override.cpp
diff options
context:
space:
mode:
authorGravatar Sadie Powell2022-04-21 16:16:05 +0100
committerGravatar Sadie Powell2022-04-21 16:17:10 +0100
commitcdd80af74c43015b9b492bc3c5eabc3ab982a0df (patch)
treee4950cc41e2b53f72a6d033929497fd9c89d2052 /src/modules/m_override.cpp
parentFix an outdated comment. (diff)
Add support for automatically expiring the override user mode.
Diffstat (limited to 'src/modules/m_override.cpp')
-rw-r--r--src/modules/m_override.cpp44
1 files changed, 43 insertions, 1 deletions
diff --git a/src/modules/m_override.cpp b/src/modules/m_override.cpp
index c75b022e3..33add918a 100644
--- a/src/modules/m_override.cpp
+++ b/src/modules/m_override.cpp
@@ -34,15 +34,56 @@
#include "inspircd.h"
#include "modules/invite.h"
+class UnsetTimer CXX11_FINAL
+ : public Timer
+{
+ private:
+ ModeHandler& overridemode;
+ LocalUser* user;
+
+ public:
+ UnsetTimer(LocalUser* u, unsigned long timeout, ModeHandler& om)
+ : Timer(timeout, false)
+ , overridemode(om)
+ , user(u)
+ {
+ ServerInstance->Timers.AddTimer(this);
+ }
+
+ bool Tick(time_t time) CXX11_OVERRIDE
+ {
+ if (!user->quitting && user->IsModeSet(overridemode))
+ {
+ Modes::ChangeList changelist;
+ changelist.push_remove(&overridemode);
+ ServerInstance->Modes.Process(ServerInstance->FakeClient, NULL, user, changelist);
+ }
+ return false;
+ }
+};
+
class Override : public SimpleUserModeHandler
{
public:
- Override(Module* Creator) : SimpleUserModeHandler(Creator, "override", 'O')
+ SimpleExtItem<UnsetTimer> ext;
+ unsigned long timeout;
+
+ Override(Module* Creator)
+ : SimpleUserModeHandler(Creator, "override", 'O')
+ , ext("override-timer", ExtensionItem::EXT_USER, Creator)
{
oper = true;
if (!ServerInstance->Config->ConfValue("override")->getBool("enableumode"))
DisableAutoRegister();
}
+
+ ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string& parameter, bool adding) CXX11_OVERRIDE
+ {
+ ModeAction res = SimpleUserModeHandler::OnModeChange(source, dest, channel, parameter, adding);
+ if (adding && res == MODEACTION_ALLOW && IS_LOCAL(dest) && timeout)
+ ext.set(dest, new UnsetTimer(IS_LOCAL(dest), timeout, *this));
+ return res;
+ }
};
class ModuleOverride : public Module
@@ -107,6 +148,7 @@ class ModuleOverride : public Module
ConfigTag* tag = ServerInstance->Config->ConfValue("override");
NoisyOverride = tag->getBool("noisy");
RequireKey = tag->getBool("requirekey");
+ ou.timeout = tag->getDuration("timeout", 0);
}
void On005Numeric(std::map<std::string, std::string>& tokens) CXX11_OVERRIDE