diff options
| author | 2022-04-21 16:16:05 +0100 | |
|---|---|---|
| committer | 2022-04-21 16:17:10 +0100 | |
| commit | cdd80af74c43015b9b492bc3c5eabc3ab982a0df (patch) | |
| tree | e4950cc41e2b53f72a6d033929497fd9c89d2052 /src/modules/m_override.cpp | |
| parent | Fix 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.cpp | 44 |
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 |
