1
0
mirror of https://github.com/anope/anope.git synced 2026-06-12 19:14:47 +02:00

Switch RPC event registration to use the service system.

This commit is contained in:
Sadie Powell
2025-03-17 12:58:22 +00:00
parent 85fbc500d8
commit bb1f93f150
7 changed files with 67 additions and 169 deletions
+5 -14
View File
@@ -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;
};
+5 -23
View File
@@ -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);
+5 -23
View File
@@ -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);
+24 -46
View File
@@ -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)
+9 -20
View File
@@ -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);
}
};
+9 -22
View File
@@ -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);
}
};
+10 -21
View File
@@ -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);
}
};