]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_ircv3_echomessage.cpp
8f281da709342f64e8426574caeb5ad6e5e4e91d
[user/henk/code/inspircd.git] / src / modules / m_ircv3_echomessage.cpp
1 /*
2  * InspIRCd -- Internet Relay Chat Daemon
3  *
4  *   Copyright (C) 2015 Attila Molnar <attilamolnar@hush.com>
5  *   Copyright (C) 2013-2015 Peter Powell <petpow@saberuk.com>
6  *
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.
10  *
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
14  * details.
15  *
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/>.
18  */
19
20
21 #include "inspircd.h"
22 #include "modules/cap.h"
23 #include "modules/ctctags.h"
24
25 class ModuleIRCv3EchoMessage
26         : public Module
27         , public CTCTags::EventListener
28 {
29  private:
30         Cap::Capability cap;
31         ClientProtocol::EventProvider tagmsgprov;
32
33  public:
34         ModuleIRCv3EchoMessage()
35                 : CTCTags::EventListener(this)
36                 , cap(this, "echo-message")
37                 , tagmsgprov(this, "TAGMSG")
38         {
39         }
40
41         void OnUserPostMessage(User* user, const MessageTarget& target, const MessageDetails& details) CXX11_OVERRIDE
42         {
43                 if (!cap.get(user) || !details.echo)
44                         return;
45
46                 // Caps are only set on local users
47                 LocalUser* const localuser = static_cast<LocalUser*>(user);
48
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;
51                 switch (target.type)
52                 {
53                         case MessageTarget::TYPE_USER:
54                         {
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);
59                                 break;
60                         }
61                         case MessageTarget::TYPE_CHANNEL:
62                         {
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);
67                                 break;
68                         }
69                         case MessageTarget::TYPE_SERVER:
70                         {
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);
75                                 break;
76                         }
77                 }
78         }
79
80         void OnUserPostTagMessage(User* user, const MessageTarget& target, const CTCTags::TagMessageDetails& details) CXX11_OVERRIDE
81         {
82                 if (!cap.get(user) || !details.echo)
83                         return;
84
85                 // Caps are only set on local users
86                 LocalUser* const localuser = static_cast<LocalUser*>(user);
87
88                 const ClientProtocol::TagMap& tags = details.echo_original ? details.tags_in : details.tags_out;
89                 switch (target.type)
90                 {
91                         case MessageTarget::TYPE_USER:
92                         {
93                                 User* destuser = target.Get<User>();
94                                 CTCTags::TagMessage message(user, destuser, tags);
95                                 localuser->Send(tagmsgprov, message);
96                                 break;
97                         }
98                         case MessageTarget::TYPE_CHANNEL:
99                         {
100                                 Channel* chan = target.Get<Channel>();
101                                 CTCTags::TagMessage message(user, chan, tags);
102                                 localuser->Send(tagmsgprov, message);
103                                 break;
104                         }
105                         case MessageTarget::TYPE_SERVER:
106                         {
107                                 const std::string* servername = target.Get<std::string>();
108                                 CTCTags::TagMessage message(user, servername->c_str(), tags);
109                                 localuser->Send(tagmsgprov, message);
110                                 break;
111                         }
112                 }
113         }
114
115         void OnUserMessageBlocked(User* user, const MessageTarget& target, const MessageDetails& details) CXX11_OVERRIDE
116         {
117                 // Prevent spammers from knowing that their spam was blocked.
118                 if (details.echo_original)
119                         OnUserPostMessage(user, target, details);
120         }
121
122         void OnUserTagMessageBlocked(User* user, const MessageTarget& target, const CTCTags::TagMessageDetails& details) CXX11_OVERRIDE
123         {
124                 // Prevent spammers from knowing that their spam was blocked.
125                 if (details.echo_original)
126                         OnUserPostTagMessage(user, target, details);
127         }
128
129         Version GetVersion() CXX11_OVERRIDE
130         {
131                 return Version("Provides the echo-message IRCv3 extension", VF_VENDOR);
132         }
133 };
134
135 MODULE_INIT(ModuleIRCv3EchoMessage)