]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/commandbuilder.h
Fix sending DEL for caps which have not been advertised yet.
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / commandbuilder.h
index 07f7c94d0c0d616d622bbf045290706b8a669231..f6cca9917739e7f28345d03bf4c2c043c53daed6 100644 (file)
@@ -25,39 +25,65 @@ 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(const std::string& src, const char* cmd)
+       CmdBuilder(TreeServer* src, const char* cmd)
                : content(1, ':')
+               , tagsize(0)
        {
-               content.append(src);
+               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& str)
+       CmdBuilder& push_raw(const std::string& s)
        {
-               content.append(str);
+               content.append(s);
                return *this;
        }
 
-       CmdBuilder& push_raw(const char* str)
+       CmdBuilder& push_raw(const char* s)
        {
-               content.append(str);
+               content.append(s);
                return *this;
        }
 
@@ -67,17 +93,31 @@ class CmdBuilder
                return *this;
        }
 
-       CmdBuilder& push(const std::string& str)
+       template <typename T>
+       CmdBuilder& push_raw_int(T i)
+       {
+               content.append(ConvToStr(i));
+               return *this;
+       }
+
+       template <typename InputIterator>
+       CmdBuilder& push_raw(InputIterator first, InputIterator last)
+       {
+               content.append(first, last);
+               return *this;
+       }
+
+       CmdBuilder& push(const std::string& s)
        {
                content.push_back(' ');
-               content.append(str);
+               content.append(s);
                return *this;
        }
 
-       CmdBuilder& push(const char* str)
+       CmdBuilder& push(const char* s)
        {
                content.push_back(' ');
-               content.append(str);
+               content.append(s);
                return *this;
        }
 
@@ -96,11 +136,20 @@ class CmdBuilder
                return *this;
        }
 
-       CmdBuilder& push_last(const std::string& str)
+       CmdBuilder& push_last(const std::string& s)
        {
                content.push_back(' ');
                content.push_back(':');
-               content.append(str);
+               content.append(s);
+               return *this;
+       }
+
+       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;
        }
 
@@ -112,8 +161,6 @@ class CmdBuilder
                return *this;
        }
 
-       void push_back(const std::string& str) { push(str); }
-
        const std::string& str() const { return content; }
        operator const std::string&() const { return str(); }
 
@@ -127,13 +174,8 @@ class CmdBuilder
                Utils->DoOneToAllButSender(*this, omit);
        }
 
-       bool Unicast(const std::string& target) const
-       {
-               return Utils->DoOneToOne(*this, target);
-       }
-
-       bool Unicast(User* target) const
+       void Unicast(User* target) const
        {
-               return Unicast(target->server);
+               Utils->DoOneToOne(*this, target->server);
        }
 };