summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/extra/xmlrpc.cpp7
-rw-r--r--modules/rpc/jsonrpc.cpp7
-rw-r--r--modules/rpc/rpc_system.cpp64
3 files changed, 76 insertions, 2 deletions
diff --git a/modules/extra/xmlrpc.cpp b/modules/extra/xmlrpc.cpp
index 681b230dc..94beb2088 100644
--- a/modules/extra/xmlrpc.cpp
+++ b/modules/extra/xmlrpc.cpp
@@ -23,7 +23,7 @@ class MyXMLRPCServiceInterface final
, public HTTPPage
{
private:
- Anope::map<RPC::Event *> events;
+ RPC::Events events;
static void SendError(HTTPReply &reply, xmlrpc_env &env)
{
@@ -69,6 +69,11 @@ public:
{
}
+ const RPC::Events &GetEvents() override
+ {
+ return events;
+ }
+
bool Register(RPC::Event *event) override
{
return this->events.emplace(event->GetEvent(), event).second;
diff --git a/modules/rpc/jsonrpc.cpp b/modules/rpc/jsonrpc.cpp
index 22c00b118..fc4c40e83 100644
--- a/modules/rpc/jsonrpc.cpp
+++ b/modules/rpc/jsonrpc.cpp
@@ -26,7 +26,7 @@ class MyJSONRPCServiceInterface final
, public HTTPPage
{
private:
- Anope::map<RPC::Event *> events;
+ RPC::Events events;
static void SendError(HTTPReply &reply, int64_t code, const Anope::string &message, const Anope::string &id)
{
@@ -86,6 +86,11 @@ public:
{
}
+ const RPC::Events &GetEvents() override
+ {
+ return events;
+ }
+
bool Register(RPC::Event *event) override
{
return this->events.emplace(event->GetEvent(), event).second;
diff --git a/modules/rpc/rpc_system.cpp b/modules/rpc/rpc_system.cpp
new file mode 100644
index 000000000..d1f49a1aa
--- /dev/null
+++ b/modules/rpc/rpc_system.cpp
@@ -0,0 +1,64 @@
+/*
+ *
+ * (C) 2010-2025 Anope Team
+ * Contact us at team@anope.org
+ *
+ * Please read COPYING and README for further details.
+ */
+
+#include "module.h"
+#include "modules/rpc.h"
+
+// TODO:
+//
+// * system.getCapabilities
+// * system.methodHelp
+// * system.methodSignature
+
+
+class SystemListMethodsRPCEvent final
+ : public RPC::Event
+{
+public:
+ SystemListMethodsRPCEvent()
+ : RPC::Event("system.listMethods")
+ {
+ }
+
+ bool Run(RPC::ServiceInterface *iface, HTTPClient *client, RPC::Request &request) override
+ {
+ auto &root = request.Root<RPC::Array>();
+ for (const auto &[event, _] : iface->GetEvents())
+ root.Reply(event);
+ return true;
+ }
+};
+
+class ModuleRPCSystem final
+ : public Module
+{
+private:
+ ServiceReference<RPC::ServiceInterface> rpc;
+ SystemListMethodsRPCEvent systemlistmethodsrpcevent;
+
+public:
+ ModuleRPCSystem(const Anope::string &modname, const Anope::string &creator)
+ : Module(modname, creator, EXTRA | VENDOR)
+ , rpc("RPCServiceInterface", "rpc")
+ {
+ if (!rpc)
+ throw ModuleException("Unable to find RPC interface, is jsonrpc/xmlrpc loaded?");
+
+ rpc->Register(&systemlistmethodsrpcevent);
+ }
+
+ ~ModuleRPCSystem() override
+ {
+ if (!rpc)
+ return;
+
+ rpc->Unregister(&systemlistmethodsrpcevent);
+ }
+};
+
+MODULE_INIT(ModuleRPCSystem)