aboutsummaryrefslogtreecommitdiffstats
path: root/src/modules/m_showfile.cpp
diff options
context:
space:
mode:
authorGravatar Sadie Powell2024-07-17 00:06:50 +0100
committerGravatar Sadie Powell2024-07-17 00:06:50 +0100
commit889d521e05f2e922683d48c74eb00290e7a2f548 (patch)
treeb4c56bd4cdf0881601c7e4d6ff571e491af10bf4 /src/modules/m_showfile.cpp
parentUse std::endian from C++20 in the sha1 module. (diff)
Shuffle the modules about a bit.
Diffstat (limited to 'src/modules/m_showfile.cpp')
-rw-r--r--src/modules/m_showfile.cpp196
1 files changed, 0 insertions, 196 deletions
diff --git a/src/modules/m_showfile.cpp b/src/modules/m_showfile.cpp
deleted file mode 100644
index 82cb7abe0..000000000
--- a/src/modules/m_showfile.cpp
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * InspIRCd -- Internet Relay Chat Daemon
- *
- * Copyright (C) 2018-2024 Sadie Powell <sadie@witchery.services>
- * Copyright (C) 2013-2014, 2016, 2018 Attila Molnar <attilamolnar@hush.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 "clientprotocolmsg.h"
-
-enum
-{
- // From UnrealIRCd.
- RPL_RULES = 232,
- RPL_RULESTART = 308,
- RPL_RULESEND = 309,
- ERR_NORULES = 434
-};
-
-class CommandShowFile final
- : public Command
-{
- enum Method
- {
- SF_MSG,
- SF_NOTICE,
- SF_NUMERIC
- };
-
- std::string introtext;
- std::string endtext;
- unsigned int intronumeric;
- unsigned int textnumeric;
- unsigned int endnumeric;
- std::vector<std::string> contents;
- Method method;
-
-public:
- CommandShowFile(Module* parent, const std::string& cmdname)
- : Command(parent, cmdname)
- {
- }
-
- CmdResult Handle(User* user, const Params& parameters) override
- {
- if (method == SF_NUMERIC)
- {
- if (!introtext.empty() && intronumeric)
- user->WriteRemoteNumeric(intronumeric, introtext);
-
- for (const auto& line : contents)
- user->WriteRemoteNumeric(textnumeric, line);
-
- if (!endtext.empty() && endnumeric)
- user->WriteRemoteNumeric(endnumeric, endtext);
- }
- else if (IS_LOCAL(user))
- {
- LocalUser* const localuser = IS_LOCAL(user);
- for (const auto& line : contents)
- {
- ClientProtocol::Messages::Privmsg msg(ClientProtocol::Messages::Privmsg::nocopy, ServerInstance->FakeClient, localuser, line, ((method == SF_MSG) ? MessageType::PRIVMSG : MessageType::NOTICE));
- localuser->Send(ServerInstance->GetRFCEvents().privmsg, msg);
- }
- }
- return CmdResult::SUCCESS;
- }
-
- void UpdateSettings(const std::shared_ptr<ConfigTag>& tag, const std::string& filecontents)
- {
- introtext = tag->getString("introtext", "Showing " + name);
- endtext = tag->getString("endtext", "End of " + name);
- intronumeric = tag->getNum<unsigned int>("intronumeric", RPL_RULESTART, 0, 999);
- textnumeric = tag->getNum<unsigned int>("numeric", RPL_RULES, 0, 999);
- endnumeric = tag->getNum<unsigned int>("endnumeric", RPL_RULESEND, 0, 999);
- std::string smethod = tag->getString("method");
-
- method = SF_NUMERIC;
- if (smethod == "msg")
- method = SF_MSG;
- else if (smethod == "notice")
- method = SF_NOTICE;
-
- // Process the entry.
- contents.clear();
-
- irc::sepstream linestream(filecontents, '\n', true);
- for (std::string line; linestream.GetToken(line); )
- {
- // Some clients can not handle receiving NOTICE/PRIVMSG/RPL_RULES
- // with an empty trailing parameter so if a line is empty we
- // replace it with a single space.
- contents.push_back(line.empty() ? " " : line);
- }
- InspIRCd::ProcessColors(contents);
- contents.shrink_to_fit();
- }
-};
-
-class ModuleShowFile final
- : public Module
-{
-private:
- std::vector<CommandShowFile*> cmds;
-
- void ReadTag(const std::shared_ptr<ConfigTag>& tag, std::vector<CommandShowFile*>& newcmds)
- {
- std::string cmdname = tag->getString("name");
- if (cmdname.empty())
- throw ModuleException(this, "Empty value for 'name'");
-
- std::transform(cmdname.begin(), cmdname.end(), cmdname.begin(), ::toupper);
-
- const std::string file = tag->getString("file", cmdname);
- if (file.empty())
- throw ModuleException(this, "Empty value for 'file'");
-
- auto reader = ServerInstance->Config->ReadFile(file);
- if (!reader)
- throw ModuleException(this, "Unable to read " + file + ": " + reader.error);
-
- CommandShowFile* sfcmd;
- Command* handler = ServerInstance->Parser.GetHandler(cmdname);
- if (handler)
- {
- // Command exists, check if it is ours
- if (handler->creator != this)
- throw ModuleException(this, "Command " + cmdname + " already exists");
-
- // This is our command, make sure we don't have the same entry twice
- sfcmd = static_cast<CommandShowFile*>(handler);
- if (stdalgo::isin(newcmds, sfcmd))
- throw ModuleException(this, "Command " + cmdname + " is already used in a <showfile> tag");
- }
- else
- {
- // Command doesn't exist, create it
- sfcmd = new CommandShowFile(this, cmdname);
- ServerInstance->Modules.AddService(*sfcmd);
- }
-
- sfcmd->UpdateSettings(tag, reader.contents);
- newcmds.push_back(sfcmd);
- }
-
-public:
- ModuleShowFile()
- : Module(VF_VENDOR, "Adds support for showing the contents of files to users when they execute a command.")
- {
- }
-
- void ReadConfig(ConfigStatus& status) override
- {
- std::vector<CommandShowFile*> newcmds;
-
- for (const auto& [_, tag] : ServerInstance->Config->ConfTags("showfile"))
- {
- try
- {
- ReadTag(tag, newcmds);
- }
- catch (const CoreException& ex)
- {
- ServerInstance->Logs.Warning(MODNAME, "Error: " + ex.GetReason() + " at " + tag->source.str());
- }
- }
-
- // Remove all commands that were removed from the config
- std::vector<CommandShowFile*> removed(cmds.size());
- std::sort(newcmds.begin(), newcmds.end());
- std::set_difference(cmds.begin(), cmds.end(), newcmds.begin(), newcmds.end(), removed.begin());
-
- stdalgo::delete_all(removed);
- cmds.swap(newcmds);
- }
-
- ~ModuleShowFile() override
- {
- stdalgo::delete_all(cmds);
- }
-};
-
-MODULE_INIT(ModuleShowFile)