]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/commandbuilder.h
Update copyright headers.
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / commandbuilder.h
index 4913120e0645b01cab976887d3e8a67924b85118..527b535847109d9267799128f3fc592e638f903f 100644 (file)
@@ -1,7 +1,9 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
- *   Copyright (C) 2013 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2019 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2013-2015 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2013 Adam <Adam@anope.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
@@ -26,28 +28,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());
+               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 (InspIRCd::IsSID(src->uuid))
+                       FireEvent(src->server, cmd, tags);
+               else
+                       FireEvent(src, cmd, tags);
        }
 
        CmdBuilder& push_raw(const std::string& s)
@@ -119,27 +146,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;
        }