X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_ircv3_echomessage.cpp;h=62fee4c17b72ac90c0954aa918235354864d89e7;hb=HEAD;hp=f6eae5a00741c92038d8ca61c3811ad8831b026a;hpb=77730fd5f09f8fc193205654c8bba84d34365670;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_ircv3_echomessage.cpp b/src/modules/m_ircv3_echomessage.cpp index f6eae5a00..62fee4c17 100644 --- a/src/modules/m_ircv3_echomessage.cpp +++ b/src/modules/m_ircv3_echomessage.cpp @@ -1,8 +1,9 @@ /* * InspIRCd -- Internet Relay Chat Daemon * - * Copyright (C) 2015 Attila Molnar - * Copyright (C) 2013-2015 Peter Powell + * Copyright (C) 2019 linuxdaemon + * Copyright (C) 2017-2020 Sadie Powell + * Copyright (C) 2015, 2018 Attila Molnar * * 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 @@ -20,14 +21,21 @@ #include "inspircd.h" #include "modules/cap.h" +#include "modules/ctctags.h" -class ModuleIRCv3EchoMessage : public Module +class ModuleIRCv3EchoMessage + : public Module + , public CTCTags::EventListener { + private: Cap::Capability cap; + ClientProtocol::EventProvider tagmsgprov; public: ModuleIRCv3EchoMessage() - : cap(this, "echo-message") + : CTCTags::EventListener(this) + , cap(this, "echo-message") + , tagmsgprov(this, "TAGMSG") { } @@ -40,26 +48,68 @@ class ModuleIRCv3EchoMessage : public Module LocalUser* const localuser = static_cast(user); const std::string& text = details.echo_original ? details.original_text : details.text; - if (target.type == MessageTarget::TYPE_USER) + const ClientProtocol::TagMap& tags = details.echo_original ? details.tags_in : details.tags_out; + switch (target.type) { - User* destuser = target.Get(); - ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, destuser, text, details.type); - privmsg.AddTags(details.tags_in); - localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg); + case MessageTarget::TYPE_USER: + { + User* destuser = target.Get(); + ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, destuser, text, details.type); + privmsg.AddTags(tags); + localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg); + break; + } + case MessageTarget::TYPE_CHANNEL: + { + Channel* chan = target.Get(); + ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, chan, text, details.type, target.status); + privmsg.AddTags(tags); + localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg); + break; + } + case MessageTarget::TYPE_SERVER: + { + const std::string* servername = target.Get(); + ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, *servername, text, details.type); + privmsg.AddTags(tags); + localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg); + break; + } } - else if (target.type == MessageTarget::TYPE_CHANNEL) - { - Channel* chan = target.Get(); - ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, chan, text, details.type, target.status); - privmsg.AddTags(details.tags_in); - localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg); - } - else + } + + void OnUserPostTagMessage(User* user, const MessageTarget& target, const CTCTags::TagMessageDetails& details) CXX11_OVERRIDE + { + if (!cap.get(user) || !details.echo) + return; + + // Caps are only set on local users + LocalUser* const localuser = static_cast(user); + + const ClientProtocol::TagMap& tags = details.echo_original ? details.tags_in : details.tags_out; + switch (target.type) { - const std::string* servername = target.Get(); - ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, *servername, text, details.type); - privmsg.AddTags(details.tags_in); - localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg); + case MessageTarget::TYPE_USER: + { + User* destuser = target.Get(); + CTCTags::TagMessage message(user, destuser, tags); + localuser->Send(tagmsgprov, message); + break; + } + case MessageTarget::TYPE_CHANNEL: + { + Channel* chan = target.Get(); + CTCTags::TagMessage message(user, chan, tags, target.status); + localuser->Send(tagmsgprov, message); + break; + } + case MessageTarget::TYPE_SERVER: + { + const std::string* servername = target.Get(); + CTCTags::TagMessage message(user, servername->c_str(), tags); + localuser->Send(tagmsgprov, message); + break; + } } } @@ -70,9 +120,16 @@ class ModuleIRCv3EchoMessage : public Module OnUserPostMessage(user, target, details); } + void OnUserTagMessageBlocked(User* user, const MessageTarget& target, const CTCTags::TagMessageDetails& details) CXX11_OVERRIDE + { + // Prevent spammers from knowing that their spam was blocked. + if (details.echo_original) + OnUserPostTagMessage(user, target, details); + } + Version GetVersion() CXX11_OVERRIDE { - return Version("Provides the echo-message IRCv3 extension", VF_VENDOR); + return Version("Provides the IRCv3 echo-message client capability.", VF_VENDOR); } };