summaryrefslogtreecommitdiff
path: root/src/modules/m_ircv3_echomessage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/m_ircv3_echomessage.cpp')
-rw-r--r--src/modules/m_ircv3_echomessage.cpp77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/modules/m_ircv3_echomessage.cpp b/src/modules/m_ircv3_echomessage.cpp
new file mode 100644
index 000000000..056b02194
--- /dev/null
+++ b/src/modules/m_ircv3_echomessage.cpp
@@ -0,0 +1,77 @@
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
+ *
+ * Copyright (C) 2015 Attila Molnar <attilamolnar@hush.com>
+ * Copyright (C) 2013-2015 Peter Powell <petpow@saberuk.com>
+ *
+ * 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
+ * License as published by the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "inspircd.h"
+#include "modules/cap.h"
+
+static const char* MessageTypeStringSp[] = { "PRIVMSG ", "NOTICE " };
+
+class ModuleIRCv3EchoMessage : public Module
+{
+ Cap::Capability cap;
+
+ public:
+ ModuleIRCv3EchoMessage()
+ : cap(this, "echo-message")
+ {
+ }
+
+ void OnUserPostMessage(User* user, const MessageTarget& target, const MessageDetails& details) CXX11_OVERRIDE
+ {
+ if (!cap.get(user))
+ return;
+
+ std::string msg = MessageTypeStringSp[details.type];
+ if (target.type == MessageTarget::TYPE_USER)
+ {
+ User* destuser = target.Get<User>();
+ msg.append(destuser->nick);
+ }
+ else if (target.type == MessageTarget::TYPE_CHANNEL)
+ {
+ if (target.status)
+ msg.push_back(target.status);
+
+ Channel* chan = target.Get<Channel>();
+ msg.append(chan->name);
+ }
+ else
+ {
+ const std::string* servername = target.Get<std::string>();
+ msg.append(*servername);
+ }
+ msg.append(" :").append(details.echooriginal ? details.originaltext : details.text);
+ user->WriteFrom(user, msg);
+ }
+
+ void OnUserMessageBlocked(User* user, const MessageTarget& target, const MessageDetails& details) CXX11_OVERRIDE
+ {
+ // Prevent spammers from knowing that their spam was blocked.
+ if (details.echooriginal)
+ OnUserPostMessage(user, target, details);
+ }
+
+ Version GetVersion() CXX11_OVERRIDE
+ {
+ return Version("Provides the echo-message IRCv3.2 extension", VF_VENDOR);
+ }
+};
+
+MODULE_INIT(ModuleIRCv3EchoMessage)