summaryrefslogtreecommitdiff
path: root/modules/operserv/os_modinfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/operserv/os_modinfo.cpp')
-rw-r--r--modules/operserv/os_modinfo.cpp211
1 files changed, 211 insertions, 0 deletions
diff --git a/modules/operserv/os_modinfo.cpp b/modules/operserv/os_modinfo.cpp
new file mode 100644
index 000000000..66b8788af
--- /dev/null
+++ b/modules/operserv/os_modinfo.cpp
@@ -0,0 +1,211 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2024 Anope Team
+ * Contact us at team@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ */
+
+#include "module.h"
+
+class CommandOSModInfo final
+ : public Command
+{
+public:
+ CommandOSModInfo(Module *creator) : Command(creator, "operserv/modinfo", 1, 1)
+ {
+ this->SetDesc(_("Info about a loaded module"));
+ this->SetSyntax(_("\037modname\037"));
+ }
+
+ void Execute(CommandSource &source, const std::vector<Anope::string> &params) override
+ {
+ const Anope::string &file = params[0];
+
+ Log(LOG_ADMIN, source, this) << "on " << file;
+
+ Module *m = ModuleManager::FindModule(file);
+ if (m)
+ {
+ source.Reply(_("Module: \002%s\002 Version: \002%s\002 Author: \002%s\002 Loaded: \002%s\002"), m->name.c_str(), !m->version.empty() ? m->version.c_str() : "?", !m->author.empty() ? m->author.c_str() : "Unknown", Anope::strftime(m->created, source.GetAccount()).c_str());
+ if (Anope::Debug)
+ source.Reply(_(" Loaded at: %p"), m->handle);
+
+ std::vector<Anope::string> servicekeys = Service::GetServiceKeys("Command");
+ for (const auto &servicekey : servicekeys)
+ {
+ ServiceReference<Command> c("Command", servicekey);
+ if (!c || c->owner != m)
+ continue;
+
+ source.Reply(_(" Providing service: \002%s\002"), c->name.c_str());
+
+ for (const auto &[_, bi] : *BotListByNick)
+ {
+ for (const auto &[c_name, info] : bi->commands)
+ {
+ if (info.name != c->name)
+ continue;
+ source.Reply(_(" Command \002%s\002 on \002%s\002 is linked to \002%s\002"), c_name.c_str(), bi->nick.c_str(), c->name.c_str());
+ }
+ }
+ }
+ }
+ else
+ source.Reply(_("No information about module \002%s\002 is available."), file.c_str());
+
+ return;
+ }
+
+ bool OnHelp(CommandSource &source, const Anope::string &subcommand) override
+ {
+ this->SendSyntax(source);
+ source.Reply(" ");
+ source.Reply(_("This command lists information about the specified loaded module."));
+ return true;
+ }
+};
+
+class CommandOSModList final
+ : public Command
+{
+public:
+ CommandOSModList(Module *creator) : Command(creator, "operserv/modlist", 0, 1)
+ {
+ this->SetDesc(_("List loaded modules"));
+ this->SetSyntax("[all|third|vendor|extra|database|encryption|pseudoclient|protocol]");
+ }
+
+ void Execute(CommandSource &source, const std::vector<Anope::string> &params) override
+ {
+ const Anope::string &param = !params.empty() ? params[0] : "";
+
+ if (!param.empty())
+ Log(LOG_ADMIN, source, this) << "for " << param;
+ else
+ Log(LOG_ADMIN, source, this);
+
+ bool third = false, vendor = false, extra = false, database = false, encryption = false, pseudoclient = false, protocol = false;
+
+ if (param.equals_ci("all"))
+ third = vendor = extra = database = encryption = pseudoclient = protocol = true;
+ else if (param.equals_ci("third"))
+ third = true;
+ else if (param.equals_ci("vendor"))
+ vendor = true;
+ else if (param.equals_ci("extra"))
+ extra = true;
+ else if (param.equals_ci("database"))
+ database = true;
+ else if (param.equals_ci("encryption"))
+ encryption = true;
+ else if (param.equals_ci("pseudoclient"))
+ pseudoclient = true;
+ else if (param.equals_ci("protocol"))
+ protocol = true;
+ else
+ third = extra = database = encryption = protocol = true;
+
+ Module *protomod = ModuleManager::FindFirstOf(PROTOCOL);
+
+ source.Reply(_("Current module list:"));
+
+ int count = 0;
+ for (auto *m : ModuleManager::Modules)
+ {
+ bool show = false;
+ Anope::string mtype;
+
+ if (m->type & PROTOCOL)
+ {
+ show |= protocol;
+ if (!mtype.empty())
+ mtype += ", ";
+ mtype += "Protocol";
+ }
+ if (m->type & PSEUDOCLIENT)
+ {
+ show |= pseudoclient;
+ if (!mtype.empty())
+ mtype += ", ";
+ mtype += "Pseudoclient";
+ }
+ if (m->type & ENCRYPTION)
+ {
+ show |= encryption;
+ if (!mtype.empty())
+ mtype += ", ";
+ mtype += "Encryption";
+ }
+ if (m->type & DATABASE)
+ {
+ show |= database;
+ if (!mtype.empty())
+ mtype += ", ";
+ mtype += "Database";
+ }
+ if (m->type & EXTRA)
+ {
+ show |= extra;
+ if (!mtype.empty())
+ mtype += ", ";
+ mtype += "Extra";
+ }
+ if (m->type & VENDOR)
+ {
+ show |= vendor;
+ if (!mtype.empty())
+ mtype += ", ";
+ mtype += "Vendor";
+ }
+ if (m->type & THIRD)
+ {
+ show |= third;
+ if (!mtype.empty())
+ mtype += ", ";
+ mtype += "Third";
+ }
+
+ if (!show)
+ continue;
+ else if (m->type & PROTOCOL && param.empty() && m != protomod)
+ continue;
+
+ ++count;
+
+ source.Reply(_("Module: \002%s\002 [%s] [%s]"), m->name.c_str(), m->version.c_str(), mtype.c_str());
+ }
+
+ if (!count)
+ source.Reply(_("No modules currently loaded matching that criteria."));
+ else
+ source.Reply(_("%d modules loaded."), count);
+ }
+
+ bool OnHelp(CommandSource &source, const Anope::string &subcommand) override
+ {
+ this->SendSyntax(source);
+ source.Reply(" ");
+ source.Reply(_("Lists currently loaded modules."));
+ return true;
+ }
+};
+
+class OSModInfo final
+ : public Module
+{
+ CommandOSModInfo commandosmodinfo;
+ CommandOSModList commandosmodlist;
+
+public:
+ OSModInfo(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, VENDOR),
+ commandosmodinfo(this), commandosmodlist(this)
+ {
+
+ }
+};
+
+MODULE_INIT(OSModInfo)