]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_delaymsg.cpp
Sync helpop chmodes s and p with docs
[user/henk/code/inspircd.git] / src / modules / m_delaymsg.cpp
index 32a0ba96ee03d9bdba01e44167fae735482d3fe6..27e2c3e4011ca6c65870763b1c888c353f2580fa 100644 (file)
@@ -1,7 +1,10 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
- *   Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
+ *   Copyright (C) 2013, 2017-2020 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2012-2015 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2012, 2019 Robby <robby@chatbelgie.be>
+ *   Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
  * redistribute it and/or modify it under the terms of the GNU General Public
@@ -18,6 +21,7 @@
 
 
 #include "inspircd.h"
+#include "modules/ctctags.h"
 
 class DelayMsgMode : public ParamMode<DelayMsgMode, LocalIntExt>
 {
@@ -25,45 +29,54 @@ 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;
+               syntax = "<seconds>";
        }
 
-       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()));
+               return ConvToNum<intptr_t>(their_param) < ConvToNum<intptr_t>(our_param);
        }
 
-       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);
        }
 };
 
-class ModuleDelayMsg : public Module
+class ModuleDelayMsg
+       : public Module
+       , public CTCTags::EventListener
 {
+ private:
        DelayMsgMode djm;
        bool allownotice;
+       ModResult HandleMessage(User* user, const MessageTarget& target, bool notice);
+
  public:
-       ModuleDelayMsg() : djm(this)
+       ModuleDelayMsg()
+               : CTCTags::EventListener(this)
+               , djm(this)
        {
        }
 
        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;
+       ModResult OnUserPreTagMessage(User* user, const MessageTarget& target, CTCTags::TagMessageDetails& 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);
@@ -82,7 +95,7 @@ void DelayMsgMode::OnUnset(User* source, Channel* chan)
 
 Version ModuleDelayMsg::GetVersion()
 {
-       return Version("Provides channelmode +d <int>, to deny messages to a channel until <int> seconds.", VF_VENDOR);
+       return Version("Adds channel mode d (delaymsg) which prevents newly joined users from speaking until the specified number of seconds have passed.", VF_VENDOR);
 }
 
 void ModuleDelayMsg::OnUserJoin(Membership* memb, bool sync, bool created, CUList&)
@@ -93,15 +106,25 @@ 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)
+{
+       return HandleMessage(user, target, details.type == MSG_NOTICE);
+}
+
+ModResult ModuleDelayMsg::OnUserPreTagMessage(User* user, const MessageTarget& target, CTCTags::TagMessageDetails& details)
+{
+       return HandleMessage(user, target, false);
+}
+
+ModResult ModuleDelayMsg::HandleMessage(User* user, const MessageTarget& target, bool notice)
 {
        if (!IS_LOCAL(user))
                return MOD_RES_PASSTHRU;
 
-       if ((target_type != TYPE_CHANNEL) || ((!allownotice) && (msgtype == MSG_NOTICE)))
+       if ((target.type != MessageTarget::TYPE_CHANNEL) || ((!allownotice) && (notice)))
                return MOD_RES_PASSTHRU;
 
-       Channel* channel = (Channel*) dest;
+       Channel* channel = target.Get<Channel>();
        Membership* memb = channel->GetUser(user);
 
        if (!memb)
@@ -118,8 +141,8 @@ 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);
+                       const std::string message = InspIRCd::Format("You cannot send messages to this channel until you have been a member for %d seconds.", len);
+                       user->WriteNumeric(Numerics::CannotSendTo(channel, message));
                        return MOD_RES_DENY;
                }
        }