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