]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Add a config option that forces bots to use NOTICEs.
authorSadie Powell <sadie@witchery.services>
Tue, 7 Jul 2020 00:42:38 +0000 (01:42 +0100)
committerSadie Powell <sadie@witchery.services>
Tue, 7 Jul 2020 00:49:03 +0000 (01:49 +0100)
include/message.h
src/coremods/core_message.cpp
src/modules/m_botmode.cpp

index eae27ff94c0332d73222e2ae47d046145ea31547..5d83829f6ca93620fbe02c3f287c89b39948586e 100644 (file)
@@ -58,7 +58,7 @@ class CoreExport MessageDetails
        std::string text;
 
        /** The type of message. */
-       const MessageType type;
+       MessageType type;
 
        /** Determines whether the specified message is a CTCP. If the specified message
         * is a CTCP then the CTCP name and CTCP body are extracted and stored in the
index 585e299486d0bdf6653b546640edea040863ad5d..c950ab24b62aae25a7615b411d89862260aa8abd 100644 (file)
@@ -247,21 +247,21 @@ class CommandMessage : public Command
                        return CMD_FAILURE;
                }
 
-               // If the target is away then inform the user.
-               if (target->IsAway() && msgtype == MSG_PRIVMSG)
-                       source->WriteNumeric(RPL_AWAY, target->nick, target->awaymsg);
-
                // Fire the pre-message events.
                MessageTarget msgtarget(target);
                MessageDetailsImpl msgdetails(msgtype, parameters[1], parameters.GetTags());
                if (!FirePreEvents(source, msgtarget, msgdetails))
                        return CMD_FAILURE;
 
+               // If the target is away then inform the user.
+               if (target->IsAway() && msgdetails.type == MSG_PRIVMSG)
+                       source->WriteNumeric(RPL_AWAY, target->nick, target->awaymsg);
+
                LocalUser* const localtarget = IS_LOCAL(target);
                if (localtarget)
                {
                        // Send to the target if they are a local user.
-                       ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, source, localtarget->nick, msgdetails.text, msgtype);
+                       ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, source, localtarget->nick, msgdetails.text, msgdetails.type);
                        privmsg.AddTags(msgdetails.tags_out);
                        privmsg.SetSideEffect(true);
                        localtarget->Send(ServerInstance->GetRFCEvents().privmsg, privmsg);
index 7abf6f7493020000c53018fc65125e140fd8eb4c..a31d51d3d9a2c740b20cbf5c3fbab47bd4a54769 100644 (file)
@@ -69,6 +69,7 @@ class ModuleBotMode
  private:
        SimpleUserModeHandler bm;
        BotTag tag;
+       bool forcenotice;
 
  public:
        ModuleBotMode()
@@ -79,11 +80,31 @@ class ModuleBotMode
        {
        }
 
+       void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
+       {
+               forcenotice = ServerInstance->Config->ConfValue("botmode")->getBool("forcenotice");
+       }
+
        void On005Numeric(std::map<std::string, std::string>& tokens) CXX11_OVERRIDE
        {
                tokens["BOT"] = ConvToStr(bm.GetModeChar());
        }
 
+       ModResult OnUserPreMessage(User* user, const MessageTarget& target, MessageDetails& details) CXX11_OVERRIDE
+       {
+               // Allow sending if forcenotice is off, the user is not a bot, or if the message is a notice.
+               if (!forcenotice || !user->IsModeSet(bm) || details.type == MSG_NOTICE)
+                       return MOD_RES_PASSTHRU;
+
+               // Allow sending PRIVMSGs to services pseudoclients.
+               if (target.type == MessageTarget::TYPE_USER && target.Get<User>()->server->IsULine())
+                       return MOD_RES_PASSTHRU;
+
+               // Force the message to be broadcast as a NOTICE.
+               details.type = MSG_NOTICE;
+               return MOD_RES_PASSTHRU;
+       }
+
        ModResult OnWhoLine(const Who::Request& request, LocalUser* source, User* user, Membership* memb, Numeric::Numeric& numeric) CXX11_OVERRIDE
        {
                size_t flag_index;