2 * InspIRCd -- Internet Relay Chat Daemon
4 * Copyright (C) 2015 Attila Molnar <attilamolnar@hush.com>
5 * Copyright (C) 2013-2015 Peter Powell <petpow@saberuk.com>
7 * This file is part of InspIRCd. InspIRCd is free software: you can
8 * redistribute it and/or modify it under the terms of the GNU General Public
9 * License as published by the Free Software Foundation, version 2.
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "modules/cap.h"
23 #include "modules/ctctags.h"
25 class ModuleIRCv3EchoMessage
27 , public CTCTags::EventListener
31 ClientProtocol::EventProvider tagmsgprov;
34 ModuleIRCv3EchoMessage()
35 : CTCTags::EventListener(this)
36 , cap(this, "echo-message")
37 , tagmsgprov(this, "TAGMSG")
41 void OnUserPostMessage(User* user, const MessageTarget& target, const MessageDetails& details) CXX11_OVERRIDE
43 if (!cap.get(user) || !details.echo)
46 // Caps are only set on local users
47 LocalUser* const localuser = static_cast<LocalUser*>(user);
49 const std::string& text = details.echo_original ? details.original_text : details.text;
50 const ClientProtocol::TagMap& tags = details.echo_original ? details.tags_in : details.tags_out;
53 case MessageTarget::TYPE_USER:
55 User* destuser = target.Get<User>();
56 ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, destuser, text, details.type);
57 privmsg.AddTags(tags);
58 localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg);
61 case MessageTarget::TYPE_CHANNEL:
63 Channel* chan = target.Get<Channel>();
64 ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, chan, text, details.type, target.status);
65 privmsg.AddTags(tags);
66 localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg);
69 case MessageTarget::TYPE_SERVER:
71 const std::string* servername = target.Get<std::string>();
72 ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, *servername, text, details.type);
73 privmsg.AddTags(tags);
74 localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg);
80 void OnUserPostTagMessage(User* user, const MessageTarget& target, const CTCTags::TagMessageDetails& details) CXX11_OVERRIDE
82 if (!cap.get(user) || !details.echo)
85 // Caps are only set on local users
86 LocalUser* const localuser = static_cast<LocalUser*>(user);
88 const ClientProtocol::TagMap& tags = details.echo_original ? details.tags_in : details.tags_out;
91 case MessageTarget::TYPE_USER:
93 User* destuser = target.Get<User>();
94 CTCTags::TagMessage message(user, destuser, tags);
95 localuser->Send(tagmsgprov, message);
98 case MessageTarget::TYPE_CHANNEL:
100 Channel* chan = target.Get<Channel>();
101 CTCTags::TagMessage message(user, chan, tags);
102 localuser->Send(tagmsgprov, message);
105 case MessageTarget::TYPE_SERVER:
107 const std::string* servername = target.Get<std::string>();
108 CTCTags::TagMessage message(user, servername->c_str(), tags);
109 localuser->Send(tagmsgprov, message);
115 void OnUserMessageBlocked(User* user, const MessageTarget& target, const MessageDetails& details) CXX11_OVERRIDE
117 // Prevent spammers from knowing that their spam was blocked.
118 if (details.echo_original)
119 OnUserPostMessage(user, target, details);
122 void OnUserTagMessageBlocked(User* user, const MessageTarget& target, const CTCTags::TagMessageDetails& details) CXX11_OVERRIDE
124 // Prevent spammers from knowing that their spam was blocked.
125 if (details.echo_original)
126 OnUserPostTagMessage(user, target, details);
129 Version GetVersion() CXX11_OVERRIDE
131 return Version("Provides the echo-message IRCv3 extension", VF_VENDOR);
135 MODULE_INIT(ModuleIRCv3EchoMessage)