]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Fix msgid inconsistencies with TAGMSG
authorlinuxdaemon <linuxdaemon@snoonet.org>
Sat, 22 Jun 2019 14:10:32 +0000 (09:10 -0500)
committerPeter Powell <petpow@saberuk.com>
Sat, 22 Jun 2019 15:08:21 +0000 (16:08 +0100)
Also fixes accidentally copying incoming tags on TAGMSG when sending to
other users

src/modules/m_ircv3_ctctags.cpp
src/modules/m_spanningtree/main.cpp
src/modules/m_spanningtree/main.h

index 36e10a32584ba822c3fb6a174e58a34cfefd646a..5b53d668e38b93c8d493a6b5c4a901beeca3385f 100644 (file)
@@ -75,7 +75,7 @@ class CommandTagMsg : public Command
                        return CMD_FAILURE;
 
                unsigned int minrank = pm ? pm->GetPrefixRank() : 0;
-               CTCTags::TagMessage message(source, chan, parameters.GetTags());
+               CTCTags::TagMessage message(source, chan, msgdetails.tags_out);
                message.SetSideEffect(true);
                const Channel::MemberMap& userlist = chan->GetUsers();
                for (Channel::MemberMap::const_iterator iter = userlist.begin(); iter != userlist.end(); ++iter)
@@ -117,7 +117,7 @@ class CommandTagMsg : public Command
                // the message out to the local users.
                if (InspIRCd::Match(ServerInstance->Config->ServerName, servername))
                {
-                       CTCTags::TagMessage message(source, "$*", parameters.GetTags());
+                       CTCTags::TagMessage message(source, "$*", msgdetails.tags_out);
                        message.SetSideEffect(true);
                        const UserManager::LocalList& list = ServerInstance->Users.GetLocalUsers();
                        for (UserManager::LocalList::const_iterator iter = list.begin(); iter != list.end(); ++iter)
@@ -185,7 +185,7 @@ class CommandTagMsg : public Command
                if (localtarget && cap.get(localtarget))
                {
                        // Send to the target if they have the capability and are a local user.
-                       CTCTags::TagMessage message(source, localtarget, parameters.GetTags());
+                       CTCTags::TagMessage message(source, localtarget, msgdetails.tags_out);
                        message.SetSideEffect(true);
                        localtarget->Send(msgevprov, message);
                }
@@ -233,7 +233,11 @@ class CommandTagMsg : public Command
 
        RouteDescriptor GetRouting(User* user, const Params& parameters) CXX11_OVERRIDE
        {
-               return ROUTE_MESSAGE(parameters[0]);
+               if (IS_LOCAL(user))
+                       // This is handled by the OnUserPostTagMessage hook to split the LoopCall pieces
+                       return ROUTE_LOCALONLY;
+               else
+                       return ROUTE_MESSAGE(parameters[0]);
        }
 };
 
index 55fe992b67d1b3b3a5ef66f0de9800af0717dde6..db526534425ec398e84aa3a69aa529828183473c 100644 (file)
@@ -39,6 +39,7 @@
 ModuleSpanningTree::ModuleSpanningTree()
        : Away::EventListener(this)
        , Stats::EventListener(this)
+       , CTCTags::EventListener(this)
        , rconnect(this)
        , rsquit(this)
        , map(this)
@@ -418,6 +419,42 @@ void ModuleSpanningTree::OnUserPostMessage(User* user, const MessageTarget& targ
        }
 }
 
+void ModuleSpanningTree::OnUserPostTagMessage(User* user, const MessageTarget& target, const CTCTags::TagMessageDetails& details)
+{
+       if (!IS_LOCAL(user))
+               return;
+
+       switch (target.type)
+       {
+               case MessageTarget::TYPE_USER:
+               {
+                       User* d = target.Get<User>();
+                       if (!IS_LOCAL(d))
+                       {
+                               CmdBuilder params(user, "TAGMSG");
+                               params.push_tags(details.tags_out);
+                               params.push_back(d->uuid);
+                               params.Unicast(d);
+                       }
+                       break;
+               }
+               case MessageTarget::TYPE_CHANNEL:
+               {
+                       Utils->SendChannelMessage(user->uuid, target.Get<Channel>(), "", target.status, details.tags_out, details.exemptions, "TAGMSG");
+                       break;
+               }
+               case MessageTarget::TYPE_SERVER:
+               {
+                       const std::string* serverglob = target.Get<std::string>();
+                       CmdBuilder par(user, "TAGMSG");
+                       par.push_tags(details.tags_out);
+                       par.push_back(*serverglob);
+                       par.Broadcast();
+                       break;
+               }
+       }
+}
+
 void ModuleSpanningTree::OnBackgroundTimer(time_t curtime)
 {
        AutoConnectServers(curtime);
index 1186f072c3682401caec0e2b1ee8ff0ff34605be..9a9d4733d0e8c139c4e3fe5045928714d995b6c2 100644 (file)
@@ -28,6 +28,7 @@
 #include "modules/dns.h"
 #include "modules/ssl.h"
 #include "modules/stats.h"
+#include "modules/ctctags.h"
 #include "servercommand.h"
 #include "commands.h"
 #include "protocolinterface.h"
@@ -72,6 +73,7 @@ class ModuleSpanningTree
        : public Module
        , public Away::EventListener
        , public Stats::EventListener
+       , public CTCTags::EventListener
 {
        /** Client to server commands, registered in the core
         */
@@ -169,6 +171,7 @@ class ModuleSpanningTree
        ModResult OnPreTopicChange(User* user, Channel* chan, const std::string& topic) CXX11_OVERRIDE;
        void OnPostTopicChange(User* user, Channel* chan, const std::string &topic) CXX11_OVERRIDE;
        void OnUserPostMessage(User* user, const MessageTarget& target, const MessageDetails& details) CXX11_OVERRIDE;
+       void OnUserPostTagMessage(User* user, const MessageTarget& target, const CTCTags::TagMessageDetails& details) CXX11_OVERRIDE;
        void OnBackgroundTimer(time_t curtime) CXX11_OVERRIDE;
        void OnUserJoin(Membership* memb, bool sync, bool created, CUList& excepts) CXX11_OVERRIDE;
        void OnChangeHost(User* user, const std::string &newhost) CXX11_OVERRIDE;