]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Add an event for adding tags to S2S messages.
authorPeter Powell <petpow@saberuk.com>
Fri, 19 Jul 2019 13:12:13 +0000 (14:12 +0100)
committerPeter Powell <petpow@saberuk.com>
Fri, 19 Jul 2019 13:17:10 +0000 (14:17 +0100)
include/modules/server.h
src/modules/m_spanningtree/commandbuilder.h
src/modules/m_spanningtree/main.cpp
src/modules/m_spanningtree/main.h
src/modules/m_spanningtree/misccommands.cpp
src/modules/m_spanningtree/netburst.cpp
src/modules/m_spanningtree/treeserver.cpp
src/modules/m_spanningtree/treesocket1.cpp
src/modules/m_spanningtree/utils.cpp

index 6bd10b3e3ef603a678f50527fa7dce990d8b3d15..259da868f8c387043b8be9de580b85ced6f91c60 100644 (file)
@@ -25,6 +25,7 @@ namespace ServerProtocol
 {
        class BroadcastEventListener;
        class LinkEventListener;
+       class MessageEventListener;
        class SyncEventListener;
 }
 
@@ -66,6 +67,30 @@ class ServerProtocol::LinkEventListener
        virtual void OnServerSplit(const Server* server) { }
 };
 
+class ServerProtocol::MessageEventListener
+       : public Events::ModuleEventListener
+{
+ public:
+       MessageEventListener(Module* mod)
+               : ModuleEventListener(mod, "event/server-message")
+       {
+       }
+
+       /** Fired when a server message is being sent by a user.
+        * @param source The user who sent the message.
+        * @param name The name of the command which was sent.
+        * @param tags The tags which will be sent with the message.
+        */
+       virtual void OnBuildMessage(User* source, const char* name, ClientProtocol::TagMap& tags) { }
+
+       /** Fired when a server message is being sent by a server.
+        * @param source The server who sent the message.
+        * @param name The name of the command which was sent.
+        * @param tags The tags which will be sent with the message.
+        */
+       virtual void OnBuildMessage(Server* source, const char* name, ClientProtocol::TagMap& tags) { }
+};
+
 class ServerProtocol::SyncEventListener
        : public Events::ModuleEventListener
 {
index 4913120e0645b01cab976887d3e8a67924b85118..6159d7b8ad18ab609aef86eda7e756d3fc476aeb 100644 (file)
@@ -26,28 +26,53 @@ class TreeServer;
 class CmdBuilder
 {
  protected:
+       /** The raw message contents. */
        std::string content;
 
+       /** Tags which have been added to this message. */
+       ClientProtocol::TagMap tags;
+
+       /** The size of tags within the contents. */
+       size_t tagsize;
+
+       /** Fires the ServerProtocol::MessageEventListener::OnBuildMessage event for a server target. */
+       void FireEvent(Server* target, const char* cmd, ClientProtocol::TagMap& taglist);
+
+       /** Fires the ServerProtocol::MessageEventListener::OnBuildMessage event for a user target. */
+       void FireEvent(User* target, const char* cmd, ClientProtocol::TagMap& taglist);
+
+       /** Updates the tag string within the buffer. */
+       void UpdateTags();
+
  public:
        CmdBuilder(const char* cmd)
                : content(1, ':')
+               , tagsize(0)
        {
                content.append(ServerInstance->Config->GetSID());
                push(cmd);
+               FireEvent(ServerInstance->FakeClient->server, cmd, tags);
        }
 
        CmdBuilder(TreeServer* src, const char* cmd)
                : content(1, ':')
+               , tagsize(0)
        {
                content.append(src->GetID());
                push(cmd);
+               FireEvent(src, cmd, tags);
        }
 
        CmdBuilder(User* src, const char* cmd)
                : content(1, ':')
+               , tagsize(0)
        {
                content.append(src->uuid);
                push(cmd);
+               if (src == ServerInstance->FakeClient)
+                       FireEvent(src->server, cmd, tags);
+               else
+                       FireEvent(src, cmd, tags);
        }
 
        CmdBuilder& push_raw(const std::string& s)
@@ -119,27 +144,12 @@ class CmdBuilder
                return *this;
        }
 
-       CmdBuilder& push_tags(const ClientProtocol::TagMap& tags)
-       {
-               if (!tags.empty())
-               {
-                       char separator = '@';
-                       std::string taglist;
-                       for (ClientProtocol::TagMap::const_iterator iter = tags.begin(); iter != tags.end(); ++iter)
-                       {
-                               taglist.push_back(separator);
-                               separator = ';';
-
-                               taglist.append(iter->first);
-                               if (!iter->second.value.empty())
-                               {
-                                       taglist.push_back('=');
-                                       taglist.append(iter->second.value);
-                               }
-                       }
-                       taglist.push_back(' ');
-                       content.insert(0, taglist);
-               }
+       CmdBuilder& push_tags(ClientProtocol::TagMap newtags)
+       {
+               // It has to be this way around so new tags get priority.
+               newtags.insert(tags.begin(), tags.end());
+               std::swap(tags, newtags);
+               UpdateTags();
                return *this;
        }
 
index 561eed2fb47caf7396dca88eaf9efec944e1b04b..484d72e6d0a364c54a97fb6ff584186af4f2ea5a 100644 (file)
@@ -25,7 +25,6 @@
 #include "socket.h"
 #include "xline.h"
 #include "iohook.h"
-#include "modules/server.h"
 
 #include "resolvers.h"
 #include "main.h"
@@ -47,6 +46,7 @@ ModuleSpanningTree::ModuleSpanningTree()
        , currmembid(0)
        , broadcasteventprov(this, "event/server-broadcast")
        , linkeventprov(this, "event/server-link")
+       , messageeventprov(this, "event/server-message")
        , synceventprov(this, "event/server-sync")
        , sslapi(this)
        , DNS(this, "DNS")
index 1aeffbc728bd834729125792f80641c59c45a5d5..bc31a9aea902c54125d6359a2ba9526dc0142dda 100644 (file)
@@ -29,6 +29,7 @@
 #include "modules/ssl.h"
 #include "modules/stats.h"
 #include "modules/ctctags.h"
+#include "modules/server.h"
 #include "servercommand.h"
 #include "commands.h"
 #include "protocolinterface.h"
@@ -99,6 +100,9 @@ class ModuleSpanningTree
        /** Event provider for our link events. */
        Events::ModuleEventProvider linkeventprov;
 
+       /** Event provider for our message events. */
+       Events::ModuleEventProvider messageeventprov;
+
        /** Event provider for our sync events. */
        Events::ModuleEventProvider synceventprov;
 
@@ -169,6 +173,9 @@ class ModuleSpanningTree
        /** Retrieves the event provider for link events. */
        const Events::ModuleEventProvider& GetLinkEventProvider() const { return linkeventprov; }
 
+       /** Retrieves the event provider for message events. */
+       const Events::ModuleEventProvider& GetMessageEventProvider() const { return messageeventprov; }
+
        /** Retrieves the event provider for sync events. */
        const Events::ModuleEventProvider& GetSyncEventProvider() const { return synceventprov; }
 
index 8fc1b178f4134a738ff8f96ec7bd43ff9c71b3d2..1d4104f285b723c7c8deb1209f59ddfe231f7e75 100644 (file)
 #include "commands.h"
 #include "treeserver.h"
 
+void CmdBuilder::FireEvent(Server* target, const char* cmd, ClientProtocol::TagMap& taglist)
+{
+       FOREACH_MOD_CUSTOM(Utils->Creator->GetMessageEventProvider(), ServerProtocol::MessageEventListener, OnBuildMessage, (target, cmd, taglist));
+       UpdateTags();
+}
+
+void CmdBuilder::FireEvent(User* target, const char* cmd, ClientProtocol::TagMap& taglist)
+{
+       FOREACH_MOD_CUSTOM(Utils->Creator->GetMessageEventProvider(), ServerProtocol::MessageEventListener, OnBuildMessage, (target, cmd, taglist));
+       UpdateTags();
+}
+
+void CmdBuilder::UpdateTags()
+{
+       std::string taglist;
+       if (!tags.empty())
+       {
+               char separator = '@';
+               for (ClientProtocol::TagMap::const_iterator iter = tags.begin(); iter != tags.end(); ++iter)
+               {
+                       taglist.push_back(separator);
+                       separator = ';';
+                       taglist.append(iter->first);
+                       if (!iter->second.value.empty())
+                       {
+                               taglist.push_back('=');
+                               taglist.append(iter->second.value);
+                       }
+               }
+               taglist.push_back(' ');
+               content.insert(0, taglist);
+       }
+       content.replace(0, tagsize, taglist);
+       tagsize = content.length();
+}
+
 CmdResult CommandSNONotice::Handle(User* user, Params& params)
 {
        ServerInstance->SNO->WriteToSnoMask(params[0][0], "From " + user->nick + ": " + params[1]);
index ca4d1a4721ec2ece642b75db8abe59d8fa662bdb..f3f2ea7ac7ade4b8d26c0b7f5a36ca7a13ce2688 100644 (file)
@@ -27,7 +27,6 @@
 #include "treeserver.h"
 #include "main.h"
 #include "commands.h"
-#include "modules/server.h"
 
 /**
  * Creates FMODE messages, used only when syncing channels
index ec1fb079d671b19e8b396f853987960a504b7411..9528999626ff5ea095a2ae93a668732b5c9c1a60 100644 (file)
@@ -23,7 +23,6 @@
 #include "inspircd.h"
 #include "xline.h"
 #include "main.h"
-#include "modules/server.h"
 
 #include "utils.h"
 #include "treeserver.h"
index 190c5dc15891ac22c2d708532fff6c437ec398be..2e08dea630e66a8b138fbdc3e279b1e514ed3a8b 100644 (file)
@@ -24,7 +24,6 @@
 #include "iohook.h"
 
 #include "main.h"
-#include "modules/server.h"
 #include "utils.h"
 #include "treeserver.h"
 #include "link.h"
index 2957b8c1462231e4f97e7a2954301ee76266a49f..41cce0541c9ad93d6137605e694eb5c9e7d6cab2 100644 (file)
@@ -28,7 +28,6 @@
 #include "treesocket.h"
 #include "resolvers.h"
 #include "commandbuilder.h"
-#include "modules/server.h"
 
 SpanningTreeUtilities* Utils = NULL;