summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSadie Powell <sadie@witchery.services>2025-03-17 12:58:22 +0000
committerSadie Powell <sadie@witchery.services>2025-03-17 12:58:22 +0000
commitbb1f93f1508ebdd0a6bef227cf924229dd05497b (patch)
tree807223c968d79a37c125cb2b5f41248f5ed6a45a
parent85fbc500d8bcc83a26f3227c90cb82896b767d62 (diff)
Switch RPC event registration to use the service system.
-rw-r--r--include/modules/rpc.h19
-rw-r--r--modules/extra/xmlrpc.cpp28
-rw-r--r--modules/rpc/jsonrpc.cpp28
-rw-r--r--modules/rpc/rpc_data.cpp70
-rw-r--r--modules/rpc/rpc_main.cpp29
-rw-r--r--modules/rpc/rpc_message.cpp31
-rw-r--r--modules/rpc/rpc_system.cpp31
7 files changed, 67 insertions, 169 deletions
diff --git a/include/modules/rpc.h b/include/modules/rpc.h
index 52d1d6492..719c459e8 100644
--- a/include/modules/rpc.h
+++ b/include/modules/rpc.h
@@ -21,9 +21,6 @@ namespace RPC
class ServiceInterface;
class Value;
- /** Represents a list of registered events. */
- using Events = Anope::map<Event *>;
-
/** Represents possible types of RPC value. */
using ValueUnion = std::variant<Array, Map, Anope::string, std::nullptr_t, bool, double, int64_t, uint64_t>;
@@ -171,15 +168,17 @@ public:
inline const auto &GetRoot() const { return this->root; }
};
+#define RPC_EVENT "RPC::Event"
+
class RPC::Event
+ : public Service
{
private:
- Anope::string event;
size_t minparams;
protected:
- Event(const Anope::string& e, size_t mp = 0)
- : event(e)
+ Event(Module *o, const Anope::string& e, size_t mp = 0)
+ : Service(o, RPC_EVENT, e)
, minparams(mp)
{
}
@@ -187,8 +186,6 @@ protected:
public:
virtual ~Event() = default;
- const auto &GetEvent() const { return event; }
-
const auto &GetMinParams() const { return minparams; }
virtual bool Run(ServiceInterface *iface, HTTPClient *client, Request &request) = 0;
@@ -203,12 +200,6 @@ public:
{
}
- virtual const Events &GetEvents() = 0;
-
- virtual bool Register(Event *event) = 0;
-
- virtual bool Unregister(Event *event) = 0;
-
virtual void Reply(Request &request) = 0;
};
diff --git a/modules/extra/xmlrpc.cpp b/modules/extra/xmlrpc.cpp
index e0efd1a9c..de23f0dc1 100644
--- a/modules/extra/xmlrpc.cpp
+++ b/modules/extra/xmlrpc.cpp
@@ -23,8 +23,6 @@ class XMLRPCServiceInterface final
, public HTTPPage
{
private:
- RPC::Events events;
-
static void SendError(HTTPReply &reply, xmlrpc_env &env)
{
Log(LOG_DEBUG) << "XML-RPC error " << env.fault_code << ": " << env.fault_string;
@@ -75,21 +73,6 @@ public:
{
}
- const RPC::Events &GetEvents() override
- {
- return events;
- }
-
- bool Register(RPC::Event *event) override
- {
- return this->events.emplace(event->GetEvent(), event).second;
- }
-
- bool Unregister(RPC::Event *event) override
- {
- return this->events.erase(event->GetEvent()) != 0;
- }
-
bool OnRequest(HTTPProvider *provider, const Anope::string &page_name, HTTPClient *client, HTTPMessage &message, HTTPReply &reply) override
{
xmlrpc_env env;
@@ -110,8 +93,8 @@ public:
request.name = method;
delete method;
- auto event = this->events.find(request.name);
- if (event == this->events.end())
+ ServiceReference<RPC::Event> event(RPC_EVENT, request.name);
+ if (!event)
{
xmlrpc_env_set_fault(&env, RPC::ERR_METHOD_NOT_FOUND, "Method not found");
SendError(reply, env);
@@ -152,17 +135,16 @@ public:
}
xmlrpc_DECREF(params);
- auto *eh = event->second;
- if (request.data.size() < eh->GetMinParams())
+ if (request.data.size() < event->GetMinParams())
{
auto error = Anope::printf("Not enough parameters (given %zu, expected %zu)",
- request.data.size(), eh->GetMinParams());
+ request.data.size(), event->GetMinParams());
xmlrpc_env_set_fault(&env, RPC::ERR_INVALID_PARAMS, error.c_str());
SendError(reply, env);
return true;
}
- if (!eh->Run(this, client, request))
+ if (!event->Run(this, client, request))
return false;
this->Reply(request);
diff --git a/modules/rpc/jsonrpc.cpp b/modules/rpc/jsonrpc.cpp
index c0ae6df56..cb6835d47 100644
--- a/modules/rpc/jsonrpc.cpp
+++ b/modules/rpc/jsonrpc.cpp
@@ -26,8 +26,6 @@ class JSONRPCServiceInterface final
, public HTTPPage
{
private:
- RPC::Events events;
-
static std::pair<yyjson_mut_doc *, yyjson_mut_val *> CreateReply(const Anope::string &id)
{
auto* doc = yyjson_mut_doc_new(nullptr);
@@ -94,21 +92,6 @@ public:
{
}
- const RPC::Events &GetEvents() override
- {
- return events;
- }
-
- bool Register(RPC::Event *event) override
- {
- return this->events.emplace(event->GetEvent(), event).second;
- }
-
- bool Unregister(RPC::Event *event) override
- {
- return this->events.erase(event->GetEvent()) != 0;
- }
-
bool OnRequest(HTTPProvider *provider, const Anope::string &page_name, HTTPClient *client, HTTPMessage &message, HTTPReply &reply) override
{
yyjson_read_err error;
@@ -159,23 +142,22 @@ public:
yyjson_doc_free(doc);
- auto event = this->events.find(request.name);
- if (event == this->events.end())
+ ServiceReference<RPC::Event> event(RPC_EVENT, request.name);
+ if (!event)
{
SendError(reply, RPC::ERR_METHOD_NOT_FOUND, "Method not found: " + request.name, id);
return true;
}
- auto *eh = event->second;
- if (request.data.size() < eh->GetMinParams())
+ if (request.data.size() < event->GetMinParams())
{
auto error = Anope::printf("Not enough parameters for %s (given %zu, expected %zu)",
- request.name.c_str(), request.data.size(), eh->GetMinParams());
+ request.name.c_str(), request.data.size(), event->GetMinParams());
SendError(reply, RPC::ERR_INVALID_PARAMS, error, id);
return true;
}
- if (!eh->Run(this, client, request))
+ if (!event->Run(this, client, request))
return false;
this->Reply(request);
diff --git a/modules/rpc/rpc_data.cpp b/modules/rpc/rpc_data.cpp
index 2b58a9f76..e776d8e1a 100644
--- a/modules/rpc/rpc_data.cpp
+++ b/modules/rpc/rpc_data.cpp
@@ -19,8 +19,8 @@ class AnopeListChannelsRPCEvent final
: public RPC::Event
{
public:
- AnopeListChannelsRPCEvent()
- : RPC::Event("anope.listChannels")
+ AnopeListChannelsRPCEvent(Module *o)
+ : RPC::Event(o, "anope.listChannels")
{
}
@@ -37,8 +37,8 @@ class AnopeChannelRPCEvent final
: public RPC::Event
{
public:
- AnopeChannelRPCEvent()
- : RPC::Event("anope.channel", 1)
+ AnopeChannelRPCEvent(Module *o)
+ : RPC::Event(o, "anope.channel", 1)
{
}
@@ -112,8 +112,8 @@ class AnopeListOpersRPCEvent final
: public RPC::Event
{
public:
- AnopeListOpersRPCEvent()
- : RPC::Event("anope.listOpers")
+ AnopeListOpersRPCEvent(Module *o)
+ : RPC::Event(o, "anope.listOpers")
{
}
@@ -130,8 +130,8 @@ class AnopeOperRPCEvent final
: public RPC::Event
{
public:
- AnopeOperRPCEvent()
- : RPC::Event("anope.oper", 1)
+ AnopeOperRPCEvent(Module *o)
+ : RPC::Event(o, "anope.oper", 1)
{
}
@@ -193,8 +193,8 @@ class AnopeListServersRPCEvent final
: public RPC::Event
{
public:
- AnopeListServersRPCEvent()
- : RPC::Event("anope.listServers")
+ AnopeListServersRPCEvent(Module *o)
+ : RPC::Event(o, "anope.listServers")
{
}
@@ -211,8 +211,8 @@ class AnopeServerRPCEvent final
: public RPC::Event
{
public:
- AnopeServerRPCEvent()
- : RPC::Event("anope.server")
+ AnopeServerRPCEvent(Module *o)
+ : RPC::Event(o, "anope.server")
{
}
@@ -254,8 +254,8 @@ class AnopeListUsersRPCEvent final
: public RPC::Event
{
public:
- AnopeListUsersRPCEvent()
- : RPC::Event("anope.listUsers")
+ AnopeListUsersRPCEvent(Module *o)
+ : RPC::Event(0, "anope.listUsers")
{
}
@@ -272,8 +272,8 @@ class AnopeUserRPCEvent final
: public RPC::Event
{
public:
- AnopeUserRPCEvent()
- : RPC::Event("anope.user", 1)
+ AnopeUserRPCEvent(Module *o)
+ : RPC::Event(o, "anope.user", 1)
{
}
@@ -379,41 +379,19 @@ private:
public:
ModuleRPCData(const Anope::string &modname, const Anope::string &creator)
: Module(modname, creator, EXTRA | VENDOR)
+ , anopelistchannelsrpcevent(this)
+ , anopechannelrpcevent(this)
+ , anopelistopersrpcevent(this)
+ , anopeoperrpcevent(this)
+ , anopelistserversrpcevent(this)
+ , anopeserverrpcevent(this)
+ , anopelistusersrpcevent(this)
+ , anopeuserrpcevent(this)
{
if (!RPC::service)
throw ModuleException("Unable to find RPC interface, is jsonrpc/xmlrpc loaded?");
-
- RPC::service->Register(&anopelistchannelsrpcevent);
- RPC::service->Register(&anopechannelrpcevent);
-
- RPC::service->Register(&anopelistopersrpcevent);
- RPC::service->Register(&anopeoperrpcevent);
-
- RPC::service->Register(&anopelistserversrpcevent);
- RPC::service->Register(&anopeserverrpcevent);
-
- RPC::service->Register(&anopelistusersrpcevent);
- RPC::service->Register(&anopeuserrpcevent);
-
}
- ~ModuleRPCData() override
- {
- if (!RPC::service)
- return;
-
- RPC::service->Unregister(&anopelistchannelsrpcevent);
- RPC::service->Unregister(&anopechannelrpcevent);
-
- RPC::service->Unregister(&anopelistopersrpcevent);
- RPC::service->Unregister(&anopeoperrpcevent);
-
- RPC::service->Unregister(&anopelistserversrpcevent);
- RPC::service->Unregister(&anopeserverrpcevent);
-
- RPC::service->Unregister(&anopelistusersrpcevent);
- RPC::service->Unregister(&anopeuserrpcevent);
- }
};
MODULE_INIT(ModuleRPCData)
diff --git a/modules/rpc/rpc_main.cpp b/modules/rpc/rpc_main.cpp
index 68bcf9a04..4fd40697d 100644
--- a/modules/rpc/rpc_main.cpp
+++ b/modules/rpc/rpc_main.cpp
@@ -61,8 +61,8 @@ class CommandRPCEvent final
: public RPC::Event
{
public:
- CommandRPCEvent()
- : RPC::Event("command")
+ CommandRPCEvent(Module *o)
+ : RPC::Event(o, "command")
{
}
@@ -118,8 +118,8 @@ class CheckAuthenticationRPCEvent final
: public RPC::Event
{
public:
- CheckAuthenticationRPCEvent()
- : RPC::Event("checkAuthentication")
+ CheckAuthenticationRPCEvent(Module *o)
+ : RPC::Event(o, "checkAuthentication")
{
}
@@ -145,8 +145,8 @@ class StatsRPCEvent final
: public RPC::Event
{
public:
- StatsRPCEvent()
- : RPC::Event("stats")
+ StatsRPCEvent(Module *o)
+ : RPC::Event(o, "stats")
{
}
@@ -178,25 +178,14 @@ private:
public:
ModuleRPCMain(const Anope::string &modname, const Anope::string &creator)
: Module(modname, creator, EXTRA | VENDOR)
+ , commandrpcevent(this)
+ , checkauthenticationrpcevent(this)
+ , statsrpcevent(this)
{
me = this;
if (!RPC::service)
throw ModuleException("Unable to find RPC interface, is jsonrpc/xmlrpc loaded?");
-
- RPC::service->Register(&commandrpcevent);
- RPC::service->Register(&checkauthenticationrpcevent);
- RPC::service->Register(&statsrpcevent);
- }
-
- ~ModuleRPCMain() override
- {
- if (!RPC::service)
- return;
-
- RPC::service->Unregister(&commandrpcevent);
- RPC::service->Unregister(&checkauthenticationrpcevent);
- RPC::service->Unregister(&statsrpcevent);
}
};
diff --git a/modules/rpc/rpc_message.cpp b/modules/rpc/rpc_message.cpp
index f85635943..cff6ebd30 100644
--- a/modules/rpc/rpc_message.cpp
+++ b/modules/rpc/rpc_message.cpp
@@ -30,8 +30,8 @@ private:
ServiceReference<GlobalService> &global;
public:
- MessageNetworkRPCEvent(ServiceReference<GlobalService> &g)
- : RPC::Event("anope.messageNetwork", 1)
+ MessageNetworkRPCEvent(Module *o, ServiceReference<GlobalService> &g)
+ : RPC::Event(o, "anope.messageNetwork", 1)
, global(g)
{
}
@@ -57,8 +57,8 @@ private:
ServiceReference<GlobalService> &global;
public:
- MessageServerRPCEvent(ServiceReference<GlobalService> &g)
- : RPC::Event("anope.messageServer", 2)
+ MessageServerRPCEvent(Module *o, ServiceReference<GlobalService> &g)
+ : RPC::Event(o, "anope.messageServer", 2)
, global(g)
{
}
@@ -89,8 +89,8 @@ class MessageUserRPCEvent final
: public RPC::Event
{
public:
- MessageUserRPCEvent()
- : RPC::Event("anope.messageUser", 3)
+ MessageUserRPCEvent(Module *o)
+ : RPC::Event(o, "anope.messageUser", 3)
{
}
@@ -129,25 +129,12 @@ public:
ModuleRPCSystem(const Anope::string &modname, const Anope::string &creator)
: Module(modname, creator, EXTRA | VENDOR)
, global("GlobalService", "Global")
- , messagenetworkrpcevent(global)
- , messageserverrpcevent(global)
+ , messagenetworkrpcevent(this, global)
+ , messageserverrpcevent(this, global)
+ , messageuserrpcevent(this)
{
if (!RPC::service)
throw ModuleException("Unable to find RPC interface, is jsonrpc/xmlrpc loaded?");
-
- RPC::service->Register(&messagenetworkrpcevent);
- RPC::service->Register(&messageserverrpcevent);
- RPC::service->Register(&messageuserrpcevent);
- }
-
- ~ModuleRPCSystem() override
- {
- if (!RPC::service)
- return;
-
- RPC::service->Unregister(&messagenetworkrpcevent);
- RPC::service->Unregister(&messageserverrpcevent);
- RPC::service->Unregister(&messageuserrpcevent);
}
};
diff --git a/modules/rpc/rpc_system.cpp b/modules/rpc/rpc_system.cpp
index 4982e0646..2c2f33fd2 100644
--- a/modules/rpc/rpc_system.cpp
+++ b/modules/rpc/rpc_system.cpp
@@ -19,9 +19,12 @@ class AnopeDebugTypesRPCEvent final
: public RPC::Event
{
public:
- AnopeDebugTypesRPCEvent()
- : RPC::Event("anope.debugTypes")
+ AnopeDebugTypesRPCEvent(Module *o)
+ : RPC::Event(o, "anope.debugTypes")
{
+#if !DEBUG_BUILD
+ Unregister();
+#endif
}
bool Run(RPC::ServiceInterface *iface, HTTPClient *client, RPC::Request &request) override
@@ -80,15 +83,15 @@ class SystemListMethodsRPCEvent final
: public RPC::Event
{
public:
- SystemListMethodsRPCEvent()
- : RPC::Event("system.listMethods")
+ SystemListMethodsRPCEvent(Module *o)
+ : RPC::Event(o, "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())
+ for (const auto &event : Service::GetServiceKeys(RPC_EVENT))
root.Reply(event);
return true;
}
@@ -104,25 +107,11 @@ private:
public:
ModuleRPCSystem(const Anope::string &modname, const Anope::string &creator)
: Module(modname, creator, EXTRA | VENDOR)
+ , anopedebugtypesrpcevent(this)
+ , systemlistmethodsrpcevent(this)
{
if (!RPC::service)
throw ModuleException("Unable to find RPC interface, is jsonrpc/xmlrpc loaded?");
-
-#if DEBUG_BUILD
- RPC::service->Register(&anopedebugtypesrpcevent);
-#endif
- RPC::service->Register(&systemlistmethodsrpcevent);
- }
-
- ~ModuleRPCSystem() override
- {
- if (!RPC::service)
- return;
-
-#if DEBUG_BUILD
- RPC::service->Unregister(&anopedebugtypesrpcevent);
-#endif
- RPC::service->Unregister(&systemlistmethodsrpcevent);
}
};