From 1f421861e6cc5d6e497ebb5aabba8d04d74fd4e5 Mon Sep 17 00:00:00 2001 From: Sadie Powell Date: Tue, 1 Jun 2021 02:30:31 +0100 Subject: Convert simple modes to use Simple{Channel,User}Mode. --- src/modules/m_deaf.cpp | 36 ++++++++++++++------------ src/modules/m_delayjoin.cpp | 40 +++++++++++++---------------- src/modules/m_permchannels.cpp | 19 +++++++------- src/modules/m_services_account.cpp | 52 +++++++++++++++++--------------------- src/modules/m_servprotect.cpp | 10 +++++--- 5 files changed, 77 insertions(+), 80 deletions(-) (limited to 'src/modules') diff --git a/src/modules/m_deaf.cpp b/src/modules/m_deaf.cpp index e8644298c..7702e2225 100644 --- a/src/modules/m_deaf.cpp +++ b/src/modules/m_deaf.cpp @@ -29,42 +29,46 @@ #include "modules/ctctags.h" // User mode +d - filter out channel messages and channel notices -class DeafMode : public ModeHandler +class DeafMode final + : public SimpleUserMode { public: - DeafMode(Module* Creator) : ModeHandler(Creator, "deaf", 'd', PARAM_NONE, MODETYPE_USER) { } + DeafMode(Module* Creator) + : SimpleUserMode(Creator, "deaf", 'd') + { + } ModeAction OnModeChange(User* source, User* dest, Channel* channel, Modes::Change& change) override { - if (change.adding == dest->IsModeSet(this)) - return MODEACTION_DENY; - - if (change.adding) + if (SimpleUserMode::OnModeChange(source, dest, channel, change) == MODEACTION_ALLOW) + { dest->WriteNotice("*** You have enabled user mode +d, deaf mode. This mode means you WILL NOT receive any messages from any channels you are in. If you did NOT mean to do this, use /mode " + dest->nick + " -d."); + return MODEACTION_ALLOW; + } - dest->SetMode(this, change.adding); - return MODEACTION_ALLOW; + return MODEACTION_DENY; } }; // User mode +D - filter out user messages and user notices -class PrivDeafMode : public ModeHandler +class PrivDeafMode final + : public SimpleUserMode { public: - PrivDeafMode(Module* Creator) : ModeHandler(Creator, "privdeaf", 'D', PARAM_NONE, MODETYPE_USER) + PrivDeafMode(Module* Creator) + : SimpleUserMode(Creator, "privdeaf", 'D') { } ModeAction OnModeChange(User* source, User* dest, Channel* channel, Modes::Change& change) override { - if (change.adding == dest->IsModeSet(this)) - return MODEACTION_DENY; - - if (change.adding) + if (SimpleUserMode::OnModeChange(source, dest, channel, change) == MODEACTION_ALLOW) + { dest->WriteNotice("*** You have enabled user mode +D, private deaf mode. This mode means you WILL NOT receive any messages and notices from any nicks. If you did NOT mean to do this, use /mode " + dest->nick + " -D."); + return MODEACTION_ALLOW; + } - dest->SetMode(this, change.adding); - return MODEACTION_ALLOW; + return MODEACTION_DENY; } }; diff --git a/src/modules/m_delayjoin.cpp b/src/modules/m_delayjoin.cpp index 700b88ad8..2a3f111b2 100644 --- a/src/modules/m_delayjoin.cpp +++ b/src/modules/m_delayjoin.cpp @@ -30,7 +30,8 @@ #include "modules/names.h" #include "modules/who.h" -class DelayJoinMode : public ModeHandler +class DelayJoinMode final + : public SimpleChannelMode { private: IntExtItem& unjoined; @@ -38,14 +39,28 @@ class DelayJoinMode : public ModeHandler public: DelayJoinMode(Module* Parent, IntExtItem& ext) - : ModeHandler(Parent, "delayjoin", 'D', PARAM_NONE, MODETYPE_CHANNEL) + : SimpleChannelMode(Parent, "delayjoin", 'D') , unjoined(ext) , servertime(Parent) { ranktoset = ranktounset = OP_VALUE; } - ModeAction OnModeChange(User* source, User* dest, Channel* channel, Modes::Change& change) override; + ModeAction OnModeChange(User* source, User* dest, Channel* channel, Modes::Change& change) override + { + if (SimpleChannelMode::OnModeChange(source, dest, channel, change)) + { + /* + * Make all users visible, as +D is being removed. If we don't do this, + * they remain permanently invisible on this channel! + */ + for (const auto& [member, _] : channel->GetUsers()) + RevealUser(member, channel); + return MODEACTION_ALLOW; + } + return MODEACTION_DENY; + } + void RevealUser(User* user, Channel* chan); }; @@ -131,25 +146,6 @@ class ModuleDelayJoin ModResult OnRawMode(User* user, Channel* channel, const Modes::Change& change) override; }; -ModeAction DelayJoinMode::OnModeChange(User* source, User* dest, Channel* channel, Modes::Change& change) -{ - /* no change */ - if (channel->IsModeSet(this) == change.adding) - return MODEACTION_DENY; - - if (!change.adding) - { - /* - * Make all users visible, as +D is being removed. If we don't do this, - * they remain permanently invisible on this channel! - */ - for (const auto& [member, _] : channel->GetUsers()) - RevealUser(member, channel); - } - channel->SetMode(this, change.adding); - return MODEACTION_ALLOW; -} - ModResult ModuleDelayJoin::OnNamesListItem(LocalUser* issuer, Membership* memb, std::string& prefixes, std::string& nick) { /* don't prevent the user from seeing themself */ diff --git a/src/modules/m_permchannels.cpp b/src/modules/m_permchannels.cpp index 33c8abbe1..dc3fbd0d1 100644 --- a/src/modules/m_permchannels.cpp +++ b/src/modules/m_permchannels.cpp @@ -32,25 +32,26 @@ /** Handles the +P channel mode */ -class PermChannel : public ModeHandler +class PermChannel final + : public SimpleChannelMode { public: PermChannel(Module* Creator) - : ModeHandler(Creator, "permanent", 'P', PARAM_NONE, MODETYPE_CHANNEL) + : SimpleChannelMode(Creator, "permanent", 'P', true) { - oper = true; } ModeAction OnModeChange(User* source, User* dest, Channel* channel, Modes::Change& change) override { - if (change.adding == channel->IsModeSet(this)) - return MODEACTION_DENY; + if (SimpleChannelMode::OnModeChange(source, dest, channel, change)) + { + if (!change.adding) + channel->CheckDestroy(); - channel->SetMode(this, change.adding); - if (!change.adding) - channel->CheckDestroy(); + return MODEACTION_ALLOW; + } - return MODEACTION_ALLOW; + return MODEACTION_DENY; } }; diff --git a/src/modules/m_services_account.cpp b/src/modules/m_services_account.cpp index 446fd61a3..6271b35a0 100644 --- a/src/modules/m_services_account.cpp +++ b/src/modules/m_services_account.cpp @@ -52,54 +52,48 @@ enum /** Channel mode +r - mark a channel as identified */ -class Channel_r : public ModeHandler +class RegisteredChannel final + : public SimpleChannelMode { public: - Channel_r(Module* Creator) : ModeHandler(Creator, "c_registered", 'r', PARAM_NONE, MODETYPE_CHANNEL) { } + RegisteredChannel(Module* Creator) + : SimpleChannelMode(Creator, "c_registered", 'r') + { + } ModeAction OnModeChange(User* source, User* dest, Channel* channel, Modes::Change& change) override { - // Only a U-lined server may add or remove the +r mode. - if (!IS_LOCAL(source)) - { - // Only change the mode if it's not redundant - if (change.adding != channel->IsModeSet(this)) - { - channel->SetMode(this, change.adding); - return MODEACTION_ALLOW; - } - } - else + if (IS_LOCAL(source)) { source->WriteNumeric(ERR_NOPRIVILEGES, "Only a server may modify the +r channel mode"); + return MODEACTION_DENY; } - return MODEACTION_DENY; + + return SimpleChannelMode::OnModeChange(source, dest, channel, change); } }; /** User mode +r - mark a user as identified */ -class User_r : public ModeHandler +class RegisteredUser final + : public SimpleUserMode { public: - User_r(Module* Creator) : ModeHandler(Creator, "u_registered", 'r', PARAM_NONE, MODETYPE_USER) { } + RegisteredUser(Module* Creator) + : SimpleUserMode(Creator, "u_registered", 'r') + { + } ModeAction OnModeChange(User* source, User* dest, Channel* channel, Modes::Change& change) override { - if (!IS_LOCAL(source)) + if (IS_LOCAL(source)) { - if (change.adding != dest->IsModeSet(this)) - { - dest->SetMode(this, change.adding); - return MODEACTION_ALLOW; - } - } - else - { - source->WriteNumeric(ERR_NOPRIVILEGES, "Only a server may modify the +r user mode"); + source->WriteNumeric(ERR_NOPRIVILEGES, "Only a server may modify the +r channel mode"); + return MODEACTION_DENY; } - return MODEACTION_DENY; + + return SimpleUserMode::OnModeChange(source, dest, channel, change); } }; @@ -193,8 +187,8 @@ class ModuleServicesAccount SimpleChannelMode reginvitemode; SimpleChannelMode regmoderatedmode; SimpleUserMode regdeafmode; - Channel_r chanregmode; - User_r userregmode; + RegisteredChannel chanregmode; + RegisteredUser userregmode; AccountExtItemImpl accountname; AccountExtBan accountextban; UnauthedExtBan unauthedextban; diff --git a/src/modules/m_servprotect.cpp b/src/modules/m_servprotect.cpp index 247a81da7..6dc0dbe63 100644 --- a/src/modules/m_servprotect.cpp +++ b/src/modules/m_servprotect.cpp @@ -34,12 +34,14 @@ enum ERR_KILLDENY = 485 }; -/** Handles user mode +k - */ -class ServProtectMode : public ModeHandler +class ServProtectMode final + : public SimpleUserMode { public: - ServProtectMode(Module* Creator) : ModeHandler(Creator, "servprotect", 'k', PARAM_NONE, MODETYPE_USER) { oper = true; } + ServProtectMode(Module* Creator) + : SimpleUserMode(Creator, "servprotect", 'k', true) + { + } ModeAction OnModeChange(User* source, User* dest, Channel* channel, Modes::Change& change) override { -- cgit v1.3.1-10-gc9f91