From cdd80af74c43015b9b492bc3c5eabc3ab982a0df Mon Sep 17 00:00:00 2001 From: Sadie Powell Date: Thu, 21 Apr 2022 16:16:05 +0100 Subject: Add support for automatically expiring the override user mode. --- src/modules/m_override.cpp | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) (limited to 'src/modules/m_override.cpp') 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 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& tokens) CXX11_OVERRIDE -- cgit v1.3.1-10-gc9f91