diff options
author | danieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7> | 2009-10-08 23:29:21 +0000 |
---|---|---|
committer | danieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7> | 2009-10-08 23:29:21 +0000 |
commit | 7e843c22e16c81054bad18073d24fe1a07026431 (patch) | |
tree | 44ca0213c7d7a80270b993fec1fbed275ec56424 /include | |
parent | c440038736f749a56dbac1badee5b2f099286117 (diff) |
Update Event and Request APIs
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11808 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'include')
-rw-r--r-- | include/modules.h | 103 | ||||
-rw-r--r-- | include/u_listmode.h | 123 |
2 files changed, 25 insertions, 201 deletions
diff --git a/include/modules.h b/include/modules.h index d59bdf05b..972dabb43 100644 --- a/include/modules.h +++ b/include/modules.h @@ -105,7 +105,7 @@ struct ModResult { }; /** If you change the module API in any way, increment this value. */ -#define API_VERSION 131 +#define API_VERSION 132 class ServerConfig; @@ -254,77 +254,38 @@ class CoreExport VersionBase : public classbase typedef VersionBase<API_VERSION> Version; -/** The ModuleMessage class is the base class of Request and Event - * This class is used to represent a basic data structure which is passed - * between modules for safe inter-module communications. - */ -class CoreExport ModuleMessage : public Extensible -{ - public: - /** Destructor - */ - virtual ~ModuleMessage() {}; -}; - /** The Request class is a unicast message directed at a given module. * When this class is properly instantiated it may be sent to a module * using the Send() method, which will call the given module's OnRequest * method with this class as its parameter. */ -class CoreExport Request : public ModuleMessage +class CoreExport Request : public classbase { - protected: - /** This member holds a pointer to arbitary data set by the emitter of the message - */ - char* data; + public: /** This should be a null-terminated string identifying the type of request, * all modules should define this and use it to determine the nature of the * request before they attempt to cast the Request in any way. */ - const char* id; + const char* const id; /** This is a pointer to the sender of the message, which can be used to * directly trigger events, or to create a reply. */ - Module* source; + Module* const source; /** The single destination of the Request */ - Module* dest; - public: - /** Create a new Request - * This is for the 'old' way of casting whatever the data is - * to char* and hoping you get the right thing at the other end. - * This is slowly being depreciated in favor of the 'new' way. - */ - Request(char* anydata, Module* src, Module* dst); + Module* const dest; + /** Create a new Request * This is for the 'new' way of defining a subclass * of Request and defining it in a common header, * passing an object of your Request subclass through * as a Request* and using the ID string to determine - * what to cast it back to and the other end. This is - * much safer as there are no casts not confirmed by - * the ID string, and all casts are child->parent and - * can be checked at runtime with dynamic_cast<>() + * what to cast it back to and the other end. */ Request(Module* src, Module* dst, const char* idstr); - /** Fetch the Request data - */ - char* GetData(); - /** Fetch the ID string - */ - const char* GetId(); - /** Fetch the request source - */ - Module* GetSource(); - /** Fetch the request destination (should be 'this' in the receiving module) - */ - Module* GetDest(); /** Send the Request. - * Upon returning the result will be arbitary data returned by the module you - * sent the request to. It is up to your module to know what this data is and - * how to deal with it. */ - const char* Send(); + void Send(); }; @@ -333,40 +294,27 @@ class CoreExport Request : public ModuleMessage * using the Send() method, which will trigger the OnEvent method in * all modules passing the object as its parameter. */ -class CoreExport Event : public ModuleMessage +class CoreExport Event : public classbase { - protected: - /** This member holds a pointer to arbitary data set by the emitter of the message - */ - char* data; + public: /** This is a pointer to the sender of the message, which can be used to * directly trigger events, or to create a reply. */ - Module* source; + Module* const source; /** The event identifier. * This is arbitary text which should be used to distinguish * one type of event from another. */ - std::string id; - public: + const std::string id; + /** Create a new Event */ - Event(char* anydata, Module* src, const std::string &eventid); - /** Get the Event data - */ - char* GetData(); - /** Get the event Source - */ - Module* GetSource(); - /** Get the event ID. - * Use this to determine the event type for safe casting of the data - */ - std::string GetEventID(); + Event(Module* src, const std::string &eventid); /** Send the Event. * The return result of an Event::Send() will always be NULL as * no replies are expected. */ - char* Send(); + void Send(); }; /** Priority types which can be returned from Module::Prioritize() @@ -383,12 +331,12 @@ enum Implementation I_OnUserPreInvite, I_OnUserInvite, I_OnUserPreMessage, I_OnUserPreNotice, I_OnUserPreNick, I_OnUserMessage, I_OnUserNotice, I_OnMode, I_OnGetServerDescription, I_OnSyncUser, I_OnSyncChannel, I_OnDecodeMetaData, I_OnWallops, - I_OnChangeHost, I_OnChangeName, I_OnAddLine, I_OnDelLine, I_OnExpireLine, I_OnCleanup, + I_OnChangeHost, I_OnChangeName, I_OnAddLine, I_OnDelLine, I_OnExpireLine, I_OnUserPostNick, I_OnPreMode, I_On005Numeric, I_OnKill, I_OnRemoteKill, I_OnLoadModule, I_OnUnloadModule, I_OnBackgroundTimer, I_OnPreCommand, I_OnCheckReady, I_OnCheckInvite, I_OnRawMode, I_OnCheckKey, I_OnCheckLimit, I_OnCheckBan, I_OnCheckChannelBan, I_OnExtBanCheck, I_OnStats, I_OnChangeLocalUserHost, I_OnChangeLocalUserGecos, I_OnPreTopicChange, - I_OnPostTopicChange, I_OnEvent, I_OnRequest, I_OnGlobalOper, I_OnPostConnect, I_OnAddBan, + I_OnPostTopicChange, I_OnEvent, I_OnGlobalOper, I_OnPostConnect, I_OnAddBan, I_OnDelBan, I_OnChangeLocalUserGECOS, I_OnUserRegister, I_OnChannelPreDelete, I_OnChannelDelete, I_OnPostOper, I_OnSyncNetwork, I_OnSetAway, I_OnUserList, I_OnPostCommand, I_OnPostJoin, I_OnWhoisLine, I_OnBuildNeighborList, I_OnGarbageCollect, @@ -1165,22 +1113,17 @@ class CoreExport Module : public Extensible */ virtual void OnPostTopicChange(User* user, Channel* chan, const std::string &topic); - /** Called whenever an Event class is sent to all module by another module. - * Please see the documentation of Event::Send() for further information. The Event sent can - * always be assumed to be non-NULL, you should *always* check the value of Event::GetEventID() - * before doing anything to the event data, and you should *not* change the event data in any way! + /** Called whenever an Event class is sent to all modules by another module. + * You should *always* check the value of Event::id to determine the event type. * @param event The Event class being received */ - virtual void OnEvent(Event* event); + virtual void OnEvent(Event& event); /** Called whenever a Request class is sent to your module by another module. - * Please see the documentation of Request::Send() for further information. The Request sent - * can always be assumed to be non-NULL, you should not change the request object or its data. - * Your method may return arbitary data in the char* result which the requesting module - * may be able to use for pre-determined purposes (e.g. the results of an SQL query, etc). + * The value of Request::id should be used to determine the type of request. * @param request The Request class being received */ - virtual const char* OnRequest(Request* request); + virtual void OnRequest(Request& request); /** Called whenever a password check is to be made. Replaces the old OldOperCompare API. * The password field (from the config file) is in 'password' and is to be compared against diff --git a/include/u_listmode.h b/include/u_listmode.h index 7c34605f4..86749b8ab 100644 --- a/include/u_listmode.h +++ b/include/u_listmode.h @@ -49,59 +49,6 @@ typedef std::list<ListItem> modelist; */ typedef std::list<ListLimit> limitlist; -/** A request used to check if a user is on a channel's list or not - */ -class ListModeRequest : public Request -{ - public: - User* user; - std::string literal; - const char extban; - Channel* chan; - - /** Check if a user is on a channel's list. - * The Event::Send() event returns the ban string if the user is on the channel's list, - * or NULL if the user is not on the list. - * @param sender Sending module - * @param target Target module - * @param u User to check against - * @param c Channel to check against - */ - ListModeRequest(Module* sender, Module* target, User* u, Channel* c) : Request(sender, target, "LM_CHECKLIST"), user(u), literal(""), extban(0), chan(c) - { - } - - /** Check if a literal string is on a channel's list, optionally using an extban char. - * The Event::Send() event returns the ban string if the user is on the channel's list, - * or NULL if the user is not on the list. - * @param sender Sending module - * @param target Target module - * @param literalstr String to check against, e.g. "Bob!Bobbertson@weeblshouse" - * @param extbanchar Extended ban character to use for the match, or a null char if not using extban - */ - ListModeRequest(Module* sender, Module* target, std::string literalstr, char extbanchar, Channel* channel) : Request(sender, target, "LM_CHECKLIST_EX"), user(NULL), literal(literalstr), extban(extbanchar), chan(channel) - { - } - - /** Check if a literal string is on a channel's list, optionally using an extban char. - * The Event::Send() event returns the ban string if the user is on the channel's list, - * or NULL if the user is not on the list. - * @param sender Sending module - * @param target Target module - * @param User to check against, e.g. "Bob!Bobbertson@weeblshouse" - * @param extbanchar Extended ban character to use for the match, or a null char if not using extban - */ - ListModeRequest(Module* sender, Module* target, User* u, char extbanchar, Channel* channel) : Request(sender, target, "LM_CHECKLIST_EX"), user(u), literal(""), extban(extbanchar), chan(channel) - { - } - - /** Destructor - */ - ~ListModeRequest() - { - } -}; - /** The base class for list modes, should be inherited. */ class ListModeBase : public ModeHandler @@ -262,8 +209,8 @@ class ListModeBase : public ModeHandler */ virtual void DoImplements(Module* m) { - Implementation eventlist[] = { I_OnChannelDelete, I_OnSyncChannel, I_OnCleanup, I_OnRehash, I_OnRequest }; - ServerInstance->Modules->Attach(eventlist, m, 5); + Implementation eventlist[] = { I_OnChannelDelete, I_OnSyncChannel, I_OnRehash }; + ServerInstance->Modules->Attach(eventlist, m, 3); } /** Handle the list mode. @@ -462,72 +409,6 @@ class ListModeBase : public ModeHandler virtual void TellNotSet(User*, Channel*, std::string&) { } - - virtual const char* DoOnRequest(Request* request) - { - ListModeRequest* LM = (ListModeRequest*)request; - if (strcmp("LM_CHECKLIST", request->GetId()) == 0) - { - modelist* mlist = extItem.get(LM->chan); - if (mlist) - { - std::string mask = LM->user->nick + "!" + LM->user->ident + "@" + LM->user->GetIPString(); - for (modelist::iterator it = mlist->begin(); it != mlist->end(); ++it) - { - if (InspIRCd::Match(LM->user->GetFullRealHost(), it->mask) || InspIRCd::Match(LM->user->GetFullHost(), it->mask) || (InspIRCd::MatchCIDR(mask, it->mask))) - return it->mask.c_str(); - } - return NULL; - } - } - else if (strcmp("LM_CHECKLIST_EX", request->GetId()) == 0) - { - modelist* mlist = extItem.get(LM->chan); - - if (mlist) - { - if (LM->user) - { - LM->literal = LM->user->nick + "!" + LM->user->ident + "@" + LM->user->GetIPString(); - } - - for (modelist::iterator it = mlist->begin(); it != mlist->end(); it++) - { - if (LM->extban && it->mask.length() > 1 && it->mask[0] == LM->extban && it->mask[1] == ':') - { - std::string ext = it->mask.substr(2); - if (LM->user) - { - if (InspIRCd::Match(LM->user->GetFullRealHost(), ext) || InspIRCd::Match(LM->user->GetFullHost(), ext) || (InspIRCd::MatchCIDR(LM->literal, ext))) - { - return it->mask.c_str(); - } - } - else if (InspIRCd::Match(LM->literal, ext)) - { - return it->mask.c_str(); - } - } - else - { - if (LM->user) - { - if (InspIRCd::Match(LM->user->GetFullRealHost(), it->mask) || InspIRCd::Match(LM->user->GetFullHost(), it->mask) || (InspIRCd::MatchCIDR(LM->literal, it->mask))) - { - return it->mask.c_str(); - } - } - else if (InspIRCd::Match(LM->literal, it->mask)) - { - return it->mask.c_str(); - } - } - } - } - } - return NULL; - } - }; #endif |