/*
* 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
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& 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;
+ }
+
template<typename T>
CmdBuilder& insert(const T& cont)
{
return *this;
}
- void push_back(const std::string& s) { push(s); }
-
const std::string& str() const { return content; }
operator const std::string&() const { return str(); }
Utils->DoOneToAllButSender(*this, omit);
}
- bool Unicast(const std::string& target) const
- {
- return Utils->DoOneToOne(*this, target);
- }
-
void Unicast(User* target) const
{
Utils->DoOneToOne(*this, target->server);