diff options
| author | 2022-04-21 16:32:29 +0100 | |
|---|---|---|
| committer | 2022-04-21 16:32:29 +0100 | |
| commit | 9fbcb685e8eb0686af2504778159b4854c3ba1d5 (patch) | |
| tree | 3af08433919cf288bead68dd2089dc2bfd42129a /src/modules/m_override.cpp | |
| parent | Mark the main loop as noreturn. (diff) | |
| parent | Add support for automatically expiring the override user mode. (diff) | |
Merge branch 'insp3' into master.
Diffstat (limited to 'src/modules/m_override.cpp')
| -rw-r--r-- | src/modules/m_override.cpp | 55 |
1 files changed, 53 insertions, 2 deletions
diff --git a/src/modules/m_override.cpp b/src/modules/m_override.cpp index 3f47a3441..ce2eb75fe 100644 --- a/src/modules/m_override.cpp +++ b/src/modules/m_override.cpp @@ -35,6 +35,56 @@ #include "modules/invite.h" #include "modules/isupport.h" +class UnsetTimer 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() override + { + if (!user->quitting && user->IsModeSet(overridemode)) + { + Modes::ChangeList changelist; + changelist.push_remove(&overridemode); + ServerInstance->Modes.Process(ServerInstance->FakeClient, nullptr, user, changelist); + } + return false; + } +}; + +class Override final + : public SimpleUserMode +{ +public: + SimpleExtItem<UnsetTimer> ext; + unsigned long timeout; + + Override(Module* Creator) + : SimpleUserMode(Creator, "override", 'O', true) + , ext(Creator, "override-timer", ExtensionType::USER) + { + } + + ModeAction OnModeChange(User* source, User* dest, Channel* channel, Modes::Change& change) + { + ModeAction res = SimpleUserMode::OnModeChange(source, dest, channel, change); + if (change.adding && res == MODEACTION_ALLOW && IS_LOCAL(dest) && timeout) + ext.Set(dest, new UnsetTimer(IS_LOCAL(dest), timeout, *this)); + return res; + } +}; + class ModuleOverride final : public Module , public ISupport::EventListener @@ -42,7 +92,7 @@ class ModuleOverride final private: bool RequireKey; bool NoisyOverride; - SimpleUserMode ou; + Override ou; ChanModeReference topiclock; ChanModeReference inviteonly; ChanModeReference key; @@ -78,7 +128,7 @@ public: ModuleOverride() : Module(VF_VENDOR, "Allows server operators to be given privileges that allow them to ignore various channel-level restrictions.") , ISupport::EventListener(this) - , ou(this, "override", 'O') + , ou(this) , topiclock(this, "topiclock") , inviteonly(this, "inviteonly") , key(this, "key") @@ -98,6 +148,7 @@ public: auto tag = ServerInstance->Config->ConfValue("override"); NoisyOverride = tag->getBool("noisy"); RequireKey = tag->getBool("requirekey"); + ou.timeout = tag->getDuration("timeout", 0); } void OnBuildISupport(ISupport::TokenMap& tokens) override |
