diff options
| author | Sadie Powell <sadie@witchery.services> | 2025-02-24 03:39:50 +0000 |
|---|---|---|
| committer | Sadie Powell <sadie@witchery.services> | 2025-02-24 03:59:52 +0000 |
| commit | 801a748e256cb7c4952969103f2f2eaf5ee36552 (patch) | |
| tree | 2dae96409362ee42b2591128a1ba42896226ecd2 /modules | |
| parent | a111b40560bf305653b07d8f7289484793a32588 (diff) | |
Add the system.listMethods RPC method.
Still to implement:
- system.getCapabilities
- system.methodHelp
- system.methodSignature
Diffstat (limited to 'modules')
| -rw-r--r-- | modules/extra/xmlrpc.cpp | 7 | ||||
| -rw-r--r-- | modules/rpc/jsonrpc.cpp | 7 | ||||
| -rw-r--r-- | modules/rpc/rpc_system.cpp | 64 |
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) |
