2 * InspIRCd -- Internet Relay Chat Daemon
4 * Copyright (C) 2019 linuxdaemon <linuxdaemon.irc@gmail.com>
5 * Copyright (C) 2017-2020 Sadie Powell <sadie@witchery.services>
6 * Copyright (C) 2015, 2018 Attila Molnar <attilamolnar@hush.com>
8 * This file is part of InspIRCd. InspIRCd is free software: you can
9 * redistribute it and/or modify it under the terms of the GNU General Public
10 * License as published by the Free Software Foundation, version 2.
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "modules/cap.h"
24 #include "modules/ctctags.h"
26 class ModuleIRCv3EchoMessage
28 , public CTCTags::EventListener
32 ClientProtocol::EventProvider tagmsgprov;
35 ModuleIRCv3EchoMessage()
36 : CTCTags::EventListener(this)
37 , cap(this, "echo-message")
38 , tagmsgprov(this, "TAGMSG")
42 void OnUserPostMessage(User* user, const MessageTarget& target, const MessageDetails& details) CXX11_OVERRIDE
44 if (!cap.get(user) || !details.echo)
47 // Caps are only set on local users
48 LocalUser* const localuser = static_cast<LocalUser*>(user);
50 const std::string& text = details.echo_original ? details.original_text : details.text;
51 const ClientProtocol::TagMap& tags = details.echo_original ? details.tags_in : details.tags_out;
54 case MessageTarget::TYPE_USER:
56 User* destuser = target.Get<User>();
57 ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, destuser, text, details.type);
58 privmsg.AddTags(tags);
59 localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg);
62 case MessageTarget::TYPE_CHANNEL:
64 Channel* chan = target.Get<Channel>();
65 ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, chan, text, details.type, target.status);
66 privmsg.AddTags(tags);
67 localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg);
70 case MessageTarget::TYPE_SERVER:
72 const std::string* servername = target.Get<std::string>();
73 ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, *servername, text, details.type);
74 privmsg.AddTags(tags);
75 localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg);
81 void OnUserPostTagMessage(User* user, const MessageTarget& target, const CTCTags::TagMessageDetails& details) CXX11_OVERRIDE
83 if (!cap.get(user) || !details.echo)
86 // Caps are only set on local users
87 LocalUser* const localuser = static_cast<LocalUser*>(user);
89 const ClientProtocol::TagMap& tags = details.echo_original ? details.tags_in : details.tags_out;
92 case MessageTarget::TYPE_USER:
94 User* destuser = target.Get<User>();
95 CTCTags::TagMessage message(user, destuser, tags);
96 localuser->Send(tagmsgprov, message);
99 case MessageTarget::TYPE_CHANNEL:
101 Channel* chan = target.Get<Channel>();
102 CTCTags::TagMessage message(user, chan, tags, target.status);
103 localuser->Send(tagmsgprov, message);
106 case MessageTarget::TYPE_SERVER:
108 const std::string* servername = target.Get<std::string>();
109 CTCTags::TagMessage message(user, servername->c_str(), tags);
110 localuser->Send(tagmsgprov, message);
116 void OnUserMessageBlocked(User* user, const MessageTarget& target, const MessageDetails& details) CXX11_OVERRIDE
118 // Prevent spammers from knowing that their spam was blocked.
119 if (details.echo_original)
120 OnUserPostMessage(user, target, details);
123 void OnUserTagMessageBlocked(User* user, const MessageTarget& target, const CTCTags::TagMessageDetails& details) CXX11_OVERRIDE
125 // Prevent spammers from knowing that their spam was blocked.
126 if (details.echo_original)
127 OnUserPostTagMessage(user, target, details);
130 Version GetVersion() CXX11_OVERRIDE
132 return Version("Provides the IRCv3 echo-message client capability.", VF_VENDOR);
136 MODULE_INIT(ModuleIRCv3EchoMessage)