modules.h

Go to the documentation of this file.
00001 /* Modular support
00002  *
00003  * (C) 2003-2013 Anope Team
00004  * Contact us at team@anope.org
00005  *
00006  * Please read COPYING and README for further details.
00007  *
00008  * Based on the original code of Epona by Lara.
00009  * Based on the original code of Services by Andy Church.
00010  *
00011  */
00012 
00013 #include "serialize.h"
00014 
00015 #ifndef MODULES_H
00016 #define MODULES_H
00017 
00018 #include "base.h"
00019 #include "modes.h"
00020 #include "timers.h"
00021 #include "logger.h"
00022 #include "extensible.h"
00023 
00028 #ifdef _WIN32
00029 # define MODULE_INIT(x) \
00030         extern "C" DllExport Module *AnopeInit(const Anope::string &, const Anope::string &); \
00031         extern "C" Module *AnopeInit(const Anope::string &modname, const Anope::string &creator) \
00032         { \
00033                 return new x(modname, creator); \
00034         } \
00035         BOOLEAN WINAPI DllMain(HINSTANCE, DWORD, LPVOID) \
00036         { \
00037                 return TRUE; \
00038         } \
00039         extern "C" DllExport void AnopeFini(x *); \
00040         extern "C" void AnopeFini(x *m) \
00041         { \
00042                 delete m; \
00043         }
00044 #else
00045 # define MODULE_INIT(x) \
00046         extern "C" DllExport Module *AnopeInit(const Anope::string &modname, const Anope::string &creator) \
00047         { \
00048                 return new x(modname, creator); \
00049         } \
00050         extern "C" DllExport void AnopeFini(x *m) \
00051         { \
00052                 delete m; \
00053         }
00054 #endif
00055 
00061 #define FOREACH_MOD(y, x) \
00062 if (true) \
00063 { \
00064         std::vector<Module *>::iterator safei; \
00065         for (std::vector<Module *>::iterator _i = ModuleManager::EventHandlers[y].begin(); _i != ModuleManager::EventHandlers[y].end(); ) \
00066         { \
00067                 safei = _i; \
00068                 ++safei; \
00069                 try \
00070                 { \
00071                         (*_i)->x ; \
00072                 } \
00073                 catch (const ModuleException &modexcept) \
00074                 { \
00075                         Log() << "Exception caught: " << modexcept.GetReason(); \
00076                 } \
00077                 _i = safei; \
00078         } \
00079 } \
00080 else \
00081         static_cast<void>(0)
00082 
00088 #define FOREACH_RESULT(y, x) \
00089 if (true) \
00090 { \
00091         std::vector<Module *>::iterator safei; \
00092         MOD_RESULT = EVENT_CONTINUE; \
00093         for (std::vector<Module *>::iterator _i = ModuleManager::EventHandlers[y].begin(); _i != ModuleManager::EventHandlers[y].end(); ) \
00094         { \
00095                 safei = _i; \
00096                 ++safei; \
00097                 try \
00098                 { \
00099                         EventReturn res = (*_i)->x ; \
00100                         if (res != EVENT_CONTINUE) { \
00101                                 MOD_RESULT = res; \
00102                                 break; \
00103                         } \
00104                 } \
00105                 catch (const ModuleException &modexcept) \
00106                 { \
00107                         Log() << "Exception caught: " << modexcept.GetReason(); \
00108                 } \
00109                 _i = safei; \
00110         } \
00111 } \
00112 else \
00113         static_cast<void>(0)
00114 
00117 enum EventReturn
00118 {
00119         EVENT_STOP,
00120         EVENT_CONTINUE,
00121         EVENT_ALLOW
00122 };
00123 
00124 enum ModuleReturn
00125 {
00126         MOD_ERR_OK,
00127         MOD_ERR_MEMORY,
00128         MOD_ERR_PARAMS,
00129         MOD_ERR_EXISTS,
00130         MOD_ERR_NOEXIST,
00131         MOD_ERR_NOLOAD,
00132         MOD_ERR_UNKNOWN,
00133         MOD_ERR_FILE_IO,
00134         MOD_ERR_EXCEPTION,
00135         MOD_ERR_VERSION
00136 };
00137 
00140 enum Priority { PRIORITY_FIRST, PRIORITY_DONTCARE, PRIORITY_LAST, PRIORITY_BEFORE, PRIORITY_AFTER };
00141 /* Module types, in the order in which they are unloaded. The order these are in is IMPORTANT */
00142 enum ModType { MT_BEGIN, THIRD, SUPPORTED, CORE, DATABASE, ENCRYPTION, PROTOCOL, MT_END };
00143 
00147 class ModuleVersion
00148 {
00149  private:
00150         int version_major;
00151         int version_minor;
00152         int version_patch;
00153 
00154  public:
00160         ModuleVersion(int major, int minor, int patch);
00161 
00165         int GetMajor() const;
00166 
00170         int GetMinor() const;
00171 
00175         int GetPatch() const;
00176 };
00177 
00178 
00181 class CoreExport Module : public Extensible
00182 {
00183  private:
00184         bool permanent;
00185  public:
00188         Anope::string name;
00189 
00192         ModType type;
00193 
00196         Anope::string filename;
00197 
00200         std::list<CallBack *> callbacks;
00201 
00204         void *handle;
00205 
00208         time_t created;
00209 
00212         Anope::string version;
00213 
00216         Anope::string author;
00217 
00223         Module(const Anope::string &modname, const Anope::string &loadernick, ModType type = THIRD);
00224 
00227         virtual ~Module();
00228 
00236         void SetPermanent(bool state);
00237 
00241         bool GetPermanent() const;
00242 
00246         void SetVersion(const Anope::string &version);
00247 
00251         void SetAuthor(const Anope::string &author);
00252 
00257         ModuleVersion GetVersion() const;
00258 
00259         /* Everything below here are events. Modules must ModuleManager::Attach to these events
00260          * before they will be called.
00261          */
00262 
00269         virtual void OnUserKicked(Channel *c, User *target, MessageSource &source, const Anope::string &kickmsg) { }
00270 
00273         virtual void OnReload() { }
00274 
00281         virtual EventReturn OnBotAssign(User *sender, ChannelInfo *ci, BotInfo *bi) { return EVENT_CONTINUE; }
00282 
00288         virtual EventReturn OnBotUnAssign(User *sender, ChannelInfo *ci) { return EVENT_CONTINUE; }
00289 
00294         virtual void OnUserConnect(User *u, bool &exempt) { }
00295 
00299         virtual void OnNewServer(Server *s) { }
00300 
00305         virtual void OnUserNickChange(User *u, const Anope::string &oldnick) { }
00306 
00312         virtual EventReturn OnPreHelp(CommandSource &source, const std::vector<Anope::string> &params) { return EVENT_CONTINUE; }
00313 
00318         virtual void OnPostHelp(CommandSource &source, const std::vector<Anope::string> &params) { }
00319 
00326         virtual EventReturn OnPreCommand(CommandSource &source, Command *command, std::vector<Anope::string> &params) { return EVENT_CONTINUE; }
00327 
00333         virtual void OnPostCommand(CommandSource &source, Command *command, const std::vector<Anope::string> &params) { }
00334 
00338         virtual EventReturn OnSaveDatabase() { return EVENT_CONTINUE; }
00339 
00343         virtual EventReturn OnLoadDatabase() { return EVENT_CONTINUE; }
00344 
00348         virtual EventReturn OnEncrypt(const Anope::string &src, Anope::string &dest) { return EVENT_CONTINUE; }
00349         virtual EventReturn OnDecrypt(const Anope::string &hashm, const Anope::string &src, Anope::string &dest) { return EVENT_CONTINUE; }
00350 
00358         virtual EventReturn OnBotFantasy(CommandSource &source, Command *c, ChannelInfo *ci, const std::vector<Anope::string> &params) { return EVENT_CONTINUE; }
00359 
00367         virtual EventReturn OnBotNoFantasyAccess(CommandSource &source, Command *c, ChannelInfo *ci, const std::vector<Anope::string> &params) { return EVENT_CONTINUE; }
00368 
00373         virtual void OnBotJoin(Channel *c, BotInfo *bi) { }
00374 
00380         virtual void OnBotBan(User *u, ChannelInfo *ci, const Anope::string &mask) { }
00381 
00386         virtual void OnBadWordAdd(ChannelInfo *ci, const BadWord *bw) { }
00387 
00392         virtual void OnBadWordDel(ChannelInfo *ci, const BadWord *bw) { }
00393 
00401         virtual EventReturn OnBotKick(BotInfo *bi, Channel *c, User *u, const Anope::string &reason) { return EVENT_CONTINUE; }
00402 
00407         virtual void OnPrePartChannel(User *u, Channel *c) {}
00408 
00415         virtual void OnPartChannel(User *u, Channel *c, const Anope::string &channel, const Anope::string &msg) { }
00416 
00422         virtual void OnLeaveChannel(User *u, Channel *c) { }
00423 
00429         virtual EventReturn OnPreJoinChannel(User *u, Channel *c) { return EVENT_CONTINUE; }
00430 
00435         virtual void OnJoinChannel(User *u, Channel *c) { }
00436 
00442         virtual void OnTopicUpdated(Channel *c, const Anope::string &user, const Anope::string &topic) { }
00443 
00448         virtual void OnPreChanExpire(ChannelInfo *ci, bool &expire) { }
00449 
00453         virtual void OnChanExpire(ChannelInfo *ci) { }
00454 
00457         virtual void OnPreServerConnect() { }
00458 
00461         virtual void OnServerConnect() { }
00462 
00465         virtual void OnPreUplinkSync(Server *serv) { }
00466 
00469         virtual void OnServerDisconnect() { }
00470 
00473         virtual void OnRestart() { }
00474 
00477         virtual void OnShutdown() { }
00478 
00483         virtual void OnPreNickExpire(NickAlias *na, bool &expire) { }
00484 
00488         virtual void OnNickExpire(NickAlias *na) { }
00489 
00493         virtual void OnDefconLevel(int level) { }
00494 
00499         virtual EventReturn OnExceptionAdd(Exception *ex) { return EVENT_CONTINUE; }
00500 
00505         virtual void OnExceptionDel(CommandSource &source, Exception *ex) { }
00506 
00513         virtual EventReturn OnAddXLine(CommandSource &source, const XLine *x, XLineManager *xlm) { return EVENT_CONTINUE; }
00514 
00520         virtual void OnDelXLine(CommandSource &source, const XLine *x, XLineManager *xlm) { }
00521 
00526         virtual EventReturn IsServicesOper(User *u) { return EVENT_CONTINUE; }
00527 
00531         virtual void OnServerQuit(Server *server) { }
00532 
00537         virtual void OnUserQuit(User *u, const Anope::string &msg) { }
00538 
00543         virtual void OnPreUserLogoff(User *u) { }
00544         virtual void OnPostUserLogoff(User *u) { }
00545 
00549         virtual void OnBotCreate(BotInfo *bi) { }
00550 
00554         virtual void OnBotChange(BotInfo *bi) { }
00555 
00559         virtual void OnBotDelete(BotInfo *bi) { }
00560 
00566         virtual void OnAccessDel(ChannelInfo *ci, CommandSource &source, ChanAccess *access) { }
00567 
00573         virtual void OnAccessAdd(ChannelInfo *ci, CommandSource &source, ChanAccess *access) { }
00574 
00579         virtual void OnAccessClear(ChannelInfo *ci, CommandSource &source) { }
00580 
00587         virtual void OnLevelChange(CommandSource &source, ChannelInfo *ci, const Anope::string &priv, int16_t what) { }
00588 
00592         virtual void OnChanDrop(ChannelInfo *ci) { }
00593 
00597         virtual void OnChanRegistered(ChannelInfo *ci) { }
00598 
00602         virtual void OnChanSuspend(ChannelInfo *ci) { }
00603 
00607         virtual void OnChanUnsuspend(ChannelInfo *ci) { }
00608 
00612         virtual void OnCreateChan(ChannelInfo *ci) { }
00613 
00617         virtual void OnDelChan(ChannelInfo *ci) { }
00618 
00622         virtual void OnChannelCreate(Channel *c) { }
00623 
00627         virtual void OnChannelDelete(Channel *c) { }
00628 
00634         virtual void OnAkickAdd(CommandSource &source, ChannelInfo *ci, const AutoKick *ak) { }
00635 
00641         virtual void OnAkickDel(CommandSource &source, ChannelInfo *ci, const AutoKick *ak) { }
00642 
00651         virtual EventReturn OnCheckKick(User *u, ChannelInfo *ci, Anope::string &mask, Anope::string &reason) { return EVENT_CONTINUE; }
00652 
00659         virtual void OnChanInfo(CommandSource &source, ChannelInfo *ci, InfoFormatter &info, bool show_hidden) { }
00660 
00666         virtual EventReturn OnCheckPriv(ChanAccess *access, const Anope::string &priv) { return EVENT_CONTINUE; }
00667 
00673         virtual EventReturn OnGroupCheckPriv(const AccessGroup *group, const Anope::string &priv) { return EVENT_CONTINUE; }
00674 
00679         virtual void OnNickDrop(CommandSource &source, NickAlias *na) { }
00680 
00684         virtual void OnNickForbidden(NickAlias *na) { }
00685 
00690         virtual void OnNickGroup(User *u, NickAlias *target) { }
00691 
00695         virtual void OnNickIdentify(User *u) { }
00696 
00700         virtual void OnNickLogout(User *u) { }
00701 
00705         virtual void OnNickRegister(NickAlias *na) { }
00706 
00710         virtual void OnNickSuspend(NickAlias *na) { }
00711 
00715         virtual void OnNickUnsuspended(NickAlias *na) { }
00716 
00720         virtual void OnDelNick(NickAlias *na) { }
00721 
00725         virtual void OnDelCore(NickCore *nc) { }
00726 
00731         virtual void OnChangeCoreDisplay(NickCore *nc, const Anope::string &newdisplay) { }
00732 
00736         virtual void OnNickClearAccess(NickCore *nc) { }
00737 
00742         virtual void OnNickAddAccess(NickCore *nc, const Anope::string &entry) { }
00743 
00748         virtual void OnNickEraseAccess(NickCore *nc, const Anope::string &entry) { }
00749 
00753         virtual void OnNickClearCert(NickCore *nc) { }
00754 
00759         virtual void OnNickAddCert(NickCore *nc, const Anope::string &entry) { }
00760 
00765         virtual void OnNickEraseCert(NickCore *nc, const Anope::string &entry) { }
00766 
00773         virtual void OnNickInfo(CommandSource &source, NickAlias *na, InfoFormatter &info, bool show_hidden) { }
00774 
00779         virtual void OnCheckAuthentication(User *u, IdentifyRequest *req) { }
00780 
00784         virtual void OnNickUpdate(User *u) { }
00785 
00790         virtual void OnFingerprint(User *u) { }
00791 
00795         virtual void OnUserAway(User *u, const Anope::string &message) { }
00796 
00800         virtual void OnDeleteVhost(NickAlias *na) { }
00801 
00805         virtual void OnSetVhost(NickAlias *na) { }
00806 
00813         virtual void OnMemoSend(const Anope::string &source, const Anope::string &target, MemoInfo *mi, Memo *m) { }
00814 
00820         virtual void OnMemoDel(NickCore *nc, MemoInfo *mi, const Memo *m) { }
00821 
00827         virtual void OnMemoDel(ChannelInfo *ci, MemoInfo *mi, const Memo *m) { }
00828 
00836         virtual EventReturn OnChannelModeSet(Channel *c, MessageSource &setter, const Anope::string &mname, const Anope::string &param) { return EVENT_CONTINUE; }
00837 
00845         virtual EventReturn OnChannelModeUnset(Channel *c, MessageSource &setter, const Anope::string &mname, const Anope::string &param) { return EVENT_CONTINUE; }
00846 
00851         virtual void OnUserModeSet(User *u, const Anope::string &mname) { }
00852 
00857         virtual void OnUserModeUnset(User *u, const Anope::string &mname) { }
00858 
00862         virtual void OnChannelModeAdd(ChannelMode *cm) { }
00863 
00867         virtual void OnUserModeAdd(UserMode *um) { }
00868 
00874         virtual EventReturn OnMLock(ChannelInfo *ci, ModeLock *lock) { return EVENT_CONTINUE; }
00875 
00881         virtual EventReturn OnUnMLock(ChannelInfo *ci, ModeLock *lock) { return EVENT_CONTINUE; }
00882 
00887         virtual void OnModuleLoad(User *u, Module *m) { }
00888 
00893         virtual void OnModuleUnload(User *u, Module *m) { }
00894 
00898         virtual void OnServerSync(Server *s) { }
00899 
00903         virtual void OnUplinkSync(Server *s) { }
00904 
00911         virtual EventReturn OnBotPrivmsg(User *u, BotInfo *bi, Anope::string &message) { return EVENT_CONTINUE; }
00912 
00918         virtual void OnPrivmsg(User *u, Channel *c, Anope::string &msg) { }
00919 
00923         virtual void OnLog(Log *l) { }
00924 
00929         virtual void OnDnsRequest(DNS::Packet &req, DNS::Packet *reply) { }
00930 
00936         virtual EventReturn OnCheckModes(Channel *c) { return EVENT_CONTINUE; }
00937 
00938         virtual void OnSerializeCheck(Serialize::Type *) { }
00939         virtual void OnSerializableConstruct(Serializable *) { }
00940         virtual void OnSerializableDestruct(Serializable *) { }
00941         virtual void OnSerializableUpdate(Serializable *) { }
00942         virtual void OnSerializeTypeCreate(Serialize::Type *) { }
00943 
00951         virtual EventReturn OnSetChannelOption(CommandSource &source, Command *cmd, ChannelInfo *ci, const Anope::string &setting) { return EVENT_CONTINUE; }
00952 
00960         virtual EventReturn OnSetNickOption(CommandSource &source, Command *cmd, NickCore *nc, const Anope::string &setting) { return EVENT_CONTINUE; }
00961 
00968         virtual EventReturn OnMessage(MessageSource &source, Anope::string &command, std::vector<Anope::string> &param) { return EVENT_CONTINUE; }
00969 };
00970 
00973 enum Implementation
00974 {
00975         I_BEGIN,
00976                 /* NickServ */
00977                 I_OnPreNickExpire, I_OnNickExpire, I_OnNickForbidden, I_OnNickGroup, I_OnNickLogout, I_OnNickIdentify, I_OnNickDrop,
00978                 I_OnNickRegister, I_OnNickSuspended, I_OnNickUnsuspended, I_OnDelNick, I_OnDelCore, I_OnChangeCoreDisplay,
00979                 I_OnNickClearAccess, I_OnNickAddAccess, I_OnNickEraseAccess, I_OnNickClearCert, I_OnNickAddCert, I_OnNickEraseCert,
00980                 I_OnNickInfo, I_OnCheckAuthentication, I_OnNickUpdate, I_OnSetNickOption,
00981 
00982                 /* ChanServ */
00983                 I_OnChanSuspend, I_OnChanDrop, I_OnPreChanExpire, I_OnChanExpire, I_OnAccessAdd,
00984                 I_OnAccessDel, I_OnAccessClear, I_OnLevelChange, I_OnChanRegistered, I_OnChanUnsuspend, I_OnCreateChan, I_OnDelChan, I_OnChannelCreate,
00985                 I_OnChannelDelete, I_OnAkickAdd, I_OnAkickDel, I_OnCheckKick, I_OnCheckModes,
00986                 I_OnChanInfo, I_OnCheckPriv, I_OnGroupCheckPriv, I_OnSetChannelOption,
00987 
00988                 /* BotServ */
00989                 I_OnBotJoin, I_OnBotKick, I_OnBotCreate, I_OnBotChange, I_OnBotDelete, I_OnBotAssign, I_OnBotUnAssign,
00990                 I_OnUserKicked, I_OnBotFantasy, I_OnBotNoFantasyAccess, I_OnBotBan, I_OnBadWordAdd, I_OnBadWordDel,
00991 
00992                 /* HostServ */
00993                 I_OnSetVhost, I_OnDeleteVhost,
00994 
00995                 /* MemoServ */
00996                 I_OnMemoSend, I_OnMemoDel,
00997 
00998                 /* Users */
00999                 I_OnUserConnect, I_OnUserNickChange, I_OnUserQuit, I_OnPreUserLogoff, I_OnPostUserLogoff, I_OnPreJoinChannel,
01000                 I_OnJoinChannel, I_OnPrePartChannel, I_OnPartChannel, I_OnLeaveChannel, I_OnFingerprint, I_OnUserAway,
01001 
01002                 /* OperServ */
01003                 I_OnDefconLevel, I_OnAddAkill, I_OnDelAkill, I_OnExceptionAdd, I_OnExceptionDel,
01004                 I_OnAddXLine, I_OnDelXLine, I_IsServicesOper,
01005 
01006                 /* Database */
01007                 I_OnSaveDatabase, I_OnLoadDatabase,
01008 
01009                 /* Modules */
01010                 I_OnModuleLoad, I_OnModuleUnload,
01011 
01012                 /* Other */
01013                 I_OnReload, I_OnNewServer, I_OnPreServerConnect, I_OnServerConnect, I_OnPreUplinkSync, I_OnServerDisconnect,
01014                 I_OnPreHelp, I_OnPostHelp, I_OnPreCommand, I_OnPostCommand, I_OnRestart, I_OnShutdown,
01015                 I_OnServerQuit, I_OnTopicUpdated,
01016                 I_OnEncrypt, I_OnDecrypt,
01017                 I_OnChannelModeSet, I_OnChannelModeUnset, I_OnUserModeSet, I_OnUserModeUnset, I_OnChannelModeAdd, I_OnUserModeAdd,
01018                 I_OnMLock, I_OnUnMLock, I_OnServerSync, I_OnUplinkSync, I_OnBotPrivmsg, I_OnPrivmsg, I_OnLog, I_OnDnsRequest,
01019                 I_OnMessage,
01020 
01021                 I_OnSerializeCheck, I_OnSerializableConstruct, I_OnSerializableDestruct, I_OnSerializableUpdate, I_OnSerializeTypeCreate,
01022         I_END
01023 };
01024 
01027 class CoreExport ModuleManager
01028 {
01029  public:
01032         static std::list<Module *> Modules;
01033 
01037         static std::vector<Module *> EventHandlers[I_END];
01038 
01041         static void CleanupRuntimeDirectory();
01042 
01048         static ModuleReturn LoadModule(const Anope::string &modname, User *u);
01049 
01055         static ModuleReturn UnloadModule(Module *m, User * u);
01056 
01061         static Module *FindModule(const Anope::string &name);
01062 
01067         static Module *FindFirstOf(ModType type);
01068 
01075         static void RequireVersion(int major, int minor, int patch);
01076 
01092         static bool SetPriority(Module *mod, Implementation i, Priority s, Module **modules = NULL, size_t sz = 1);
01093 
01100         static bool SetPriority(Module *mod, Priority s);
01101 
01108         static bool Attach(Implementation i, Module *mod);
01109 
01116         static bool Detach(Implementation i, Module *mod);
01117 
01121         static void DetachAll(Module *mod);
01122 
01127         static void Attach(Implementation *i, Module *mod, size_t sz);
01128 
01132         static void ClearCallBacks(Module *m);
01133 
01136         static void UnloadAll();
01137 
01138  private:
01143         static ModuleReturn DeleteModule(Module *m);
01144 };
01145 
01149 class CoreExport CallBack : public Timer
01150 {
01151  private:
01152         Module *m;
01153  public:
01154         CallBack(Module *mod, long time_from_now, time_t now = Anope::CurTime, bool repeating = false);
01155 
01156         virtual ~CallBack();
01157 };
01158 
01159 #endif // MODULES_H