]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_delaymsg.cpp
Allow configuring whether SETNAME sends snotices and is oper-only.
[user/henk/code/inspircd.git] / src / modules / m_delaymsg.cpp
index 06a05db0238cc51287156e3e7d85b939953b51e2..f13ea48ead7e9acba3ebae251b09ecaa4e8b3e74 100644 (file)
@@ -25,20 +25,20 @@ class DelayMsgMode : public ParamMode<DelayMsgMode, LocalIntExt>
        LocalIntExt jointime;
        DelayMsgMode(Module* Parent)
                : ParamMode<DelayMsgMode, LocalIntExt>(Parent, "delaymsg", 'd')
-               , jointime("delaymsg", Parent)
+               , jointime("delaymsg", ExtensionItem::EXT_MEMBERSHIP, Parent)
        {
-               levelrequired = OP_VALUE;
+               ranktoset = ranktounset = OP_VALUE;
        }
 
-       bool ResolveModeConflict(std::string &their_param, const std::string &our_param, Channel*)
+       bool ResolveModeConflict(std::string& their_param, const std::string& our_param, Channel*) CXX11_OVERRIDE
        {
                return (atoi(their_param.c_str()) < atoi(our_param.c_str()));
        }
 
-       ModeAction OnSet(User* source, Channel* chan, std::string& parameter);
-       void OnUnset(User* source, Channel* chan);
+       ModeAction OnSet(User* source, Channel* chan, std::string& parameter) CXX11_OVERRIDE;
+       void OnUnset(User* source, Channel* chan) CXX11_OVERRIDE;
 
-       void SerializeParam(Channel* chan, int n, std::string& out)
+       void SerializeParam(Channel* chan, intptr_t n, std::string& out)
        {
                out += ConvToStr(n);
        }
@@ -47,6 +47,7 @@ class DelayMsgMode : public ParamMode<DelayMsgMode, LocalIntExt>
 class ModuleDelayMsg : public Module
 {
        DelayMsgMode djm;
+       bool allownotice;
  public:
        ModuleDelayMsg() : djm(this)
        {
@@ -54,14 +55,15 @@ class ModuleDelayMsg : public Module
 
        Version GetVersion() CXX11_OVERRIDE;
        void OnUserJoin(Membership* memb, bool sync, bool created, CUList&) CXX11_OVERRIDE;
-       ModResult OnUserPreMessage(User* user, void* dest, int target_type, std::string& text, char status, CUList& exempt_list, MessageType msgtype) CXX11_OVERRIDE;
+       ModResult OnUserPreMessage(User* user, const MessageTarget& target, MessageDetails& details) CXX11_OVERRIDE;
+       void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE;
 };
 
 ModeAction DelayMsgMode::OnSet(User* source, Channel* chan, std::string& parameter)
 {
        // Setting a new limit, sanity check
-       unsigned int limit = ConvToInt(parameter);
-       if (limit == 0)
+       intptr_t limit = ConvToNum<intptr_t>(parameter);
+       if (limit <= 0)
                limit = 1;
 
        ext.set(chan, limit);
@@ -91,16 +93,15 @@ void ModuleDelayMsg::OnUserJoin(Membership* memb, bool sync, bool created, CULis
        }
 }
 
-ModResult ModuleDelayMsg::OnUserPreMessage(User* user, void* dest, int target_type, std::string& text, char status, CUList& exempt_list, MessageType msgtype)
+ModResult ModuleDelayMsg::OnUserPreMessage(User* user, const MessageTarget& target, MessageDetails& details)
 {
-       /* Server origin */
-       if ((!user) || (!IS_LOCAL(user)))
+       if (!IS_LOCAL(user))
                return MOD_RES_PASSTHRU;
 
-       if ((target_type != TYPE_CHANNEL) || (msgtype != MSG_PRIVMSG))
+       if ((target.type != MessageTarget::TYPE_CHANNEL) || ((!allownotice) && (details.type == MSG_NOTICE)))
                return MOD_RES_PASSTHRU;
 
-       Channel* channel = (Channel*) dest;
+       Channel* channel = target.Get<Channel>();
        Membership* memb = channel->GetUser(user);
 
        if (!memb)
@@ -117,8 +118,7 @@ ModResult ModuleDelayMsg::OnUserPreMessage(User* user, void* dest, int target_ty
        {
                if (channel->GetPrefixValue(user) < VOICE_VALUE)
                {
-                       user->WriteNumeric(ERR_CANNOTSENDTOCHAN, "%s :You must wait %d seconds after joining to send to channel (+d)",
-                               channel->name.c_str(), len);
+                       user->WriteNumeric(ERR_CANNOTSENDTOCHAN, channel->name, InspIRCd::Format("You must wait %d seconds after joining to send to channel (+d)", len));
                        return MOD_RES_DENY;
                }
        }
@@ -130,4 +130,10 @@ ModResult ModuleDelayMsg::OnUserPreMessage(User* user, void* dest, int target_ty
        return MOD_RES_PASSTHRU;
 }
 
+void ModuleDelayMsg::ReadConfig(ConfigStatus& status)
+{
+       ConfigTag* tag = ServerInstance->Config->ConfValue("delaymsg");
+       allownotice = tag->getBool("allownotice", true);
+}
+
 MODULE_INIT(ModuleDelayMsg)