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)
// 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)
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);
}
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]);
}
};
ModuleSpanningTree::ModuleSpanningTree()
: Away::EventListener(this)
, Stats::EventListener(this)
+ , CTCTags::EventListener(this)
, rconnect(this)
, rsquit(this)
, map(this)
}
}
+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);
#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"
: public Module
, public Away::EventListener
, public Stats::EventListener
+ , public CTCTags::EventListener
{
/** Client to server commands, registered in the core
*/
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;