]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_ircv3_echomessage.cpp
Fix the cloaking module on C++98 compilers.
[user/henk/code/inspircd.git] / src / modules / m_ircv3_echomessage.cpp
index f6eae5a00741c92038d8ca61c3811ad8831b026a..62fee4c17b72ac90c0954aa918235354864d89e7 100644 (file)
@@ -1,8 +1,9 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
- *   Copyright (C) 2015 Attila Molnar <attilamolnar@hush.com>
- *   Copyright (C) 2013-2015 Peter Powell <petpow@saberuk.com>
+ *   Copyright (C) 2019 linuxdaemon <linuxdaemon.irc@gmail.com>
+ *   Copyright (C) 2017-2020 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2015, 2018 Attila Molnar <attilamolnar@hush.com>
  *
  * 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
 
 #include "inspircd.h"
 #include "modules/cap.h"
+#include "modules/ctctags.h"
 
-class ModuleIRCv3EchoMessage : public Module
+class ModuleIRCv3EchoMessage
+       : public Module
+       , public CTCTags::EventListener
 {
+ private:
        Cap::Capability cap;
+       ClientProtocol::EventProvider tagmsgprov;
 
  public:
        ModuleIRCv3EchoMessage()
-               : cap(this, "echo-message")
+               : CTCTags::EventListener(this)
+               , cap(this, "echo-message")
+               , tagmsgprov(this, "TAGMSG")
        {
        }
 
@@ -40,26 +48,68 @@ class ModuleIRCv3EchoMessage : public Module
                LocalUser* const localuser = static_cast<LocalUser*>(user);
 
                const std::string& text = details.echo_original ? details.original_text : details.text;
-               if (target.type == MessageTarget::TYPE_USER)
+               const ClientProtocol::TagMap& tags = details.echo_original ? details.tags_in : details.tags_out;
+               switch (target.type)
                {
-                       User* destuser = target.Get<User>();
-                       ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, destuser, text, details.type);
-                       privmsg.AddTags(details.tags_in);
-                       localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg);
+                       case MessageTarget::TYPE_USER:
+                       {
+                               User* destuser = target.Get<User>();
+                               ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, destuser, text, details.type);
+                               privmsg.AddTags(tags);
+                               localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg);
+                               break;
+                       }
+                       case MessageTarget::TYPE_CHANNEL:
+                       {
+                               Channel* chan = target.Get<Channel>();
+                               ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, chan, text, details.type, target.status);
+                               privmsg.AddTags(tags);
+                               localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg);
+                               break;
+                       }
+                       case MessageTarget::TYPE_SERVER:
+                       {
+                               const std::string* servername = target.Get<std::string>();
+                               ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, *servername, text, details.type);
+                               privmsg.AddTags(tags);
+                               localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg);
+                               break;
+                       }
                }
-               else if (target.type == MessageTarget::TYPE_CHANNEL)
-               {
-                       Channel* chan = target.Get<Channel>();
-                       ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, chan, text, details.type, target.status);
-                       privmsg.AddTags(details.tags_in);
-                       localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg);
-               }
-               else
+       }
+
+       void OnUserPostTagMessage(User* user, const MessageTarget& target, const CTCTags::TagMessageDetails& details) CXX11_OVERRIDE
+       {
+               if (!cap.get(user) || !details.echo)
+                       return;
+
+               // Caps are only set on local users
+               LocalUser* const localuser = static_cast<LocalUser*>(user);
+
+               const ClientProtocol::TagMap& tags = details.echo_original ? details.tags_in : details.tags_out;
+               switch (target.type)
                {
-                       const std::string* servername = target.Get<std::string>();
-                       ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, *servername, text, details.type);
-                       privmsg.AddTags(details.tags_in);
-                       localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg);
+                       case MessageTarget::TYPE_USER:
+                       {
+                               User* destuser = target.Get<User>();
+                               CTCTags::TagMessage message(user, destuser, tags);
+                               localuser->Send(tagmsgprov, message);
+                               break;
+                       }
+                       case MessageTarget::TYPE_CHANNEL:
+                       {
+                               Channel* chan = target.Get<Channel>();
+                               CTCTags::TagMessage message(user, chan, tags, target.status);
+                               localuser->Send(tagmsgprov, message);
+                               break;
+                       }
+                       case MessageTarget::TYPE_SERVER:
+                       {
+                               const std::string* servername = target.Get<std::string>();
+                               CTCTags::TagMessage message(user, servername->c_str(), tags);
+                               localuser->Send(tagmsgprov, message);
+                               break;
+                       }
                }
        }
 
@@ -70,9 +120,16 @@ class ModuleIRCv3EchoMessage : public Module
                        OnUserPostMessage(user, target, details);
        }
 
+       void OnUserTagMessageBlocked(User* user, const MessageTarget& target, const CTCTags::TagMessageDetails& details) CXX11_OVERRIDE
+       {
+               // Prevent spammers from knowing that their spam was blocked.
+               if (details.echo_original)
+                       OnUserPostTagMessage(user, target, details);
+       }
+
        Version GetVersion() CXX11_OVERRIDE
        {
-               return Version("Provides the echo-message IRCv3 extension", VF_VENDOR);
+               return Version("Provides the IRCv3 echo-message client capability.", VF_VENDOR);
        }
 };