00001
00002
00003
00004
00005
00006
00007
00008
00009
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
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
00260
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> ¶ms) { return EVENT_CONTINUE; }
00313
00318 virtual void OnPostHelp(CommandSource &source, const std::vector<Anope::string> ¶ms) { }
00319
00326 virtual EventReturn OnPreCommand(CommandSource &source, Command *command, std::vector<Anope::string> ¶ms) { return EVENT_CONTINUE; }
00327
00333 virtual void OnPostCommand(CommandSource &source, Command *command, const std::vector<Anope::string> ¶ms) { }
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> ¶ms) { return EVENT_CONTINUE; }
00359
00367 virtual EventReturn OnBotNoFantasyAccess(CommandSource &source, Command *c, ChannelInfo *ci, const std::vector<Anope::string> ¶ms) { 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 ¶m) { return EVENT_CONTINUE; }
00837
00845 virtual EventReturn OnChannelModeUnset(Channel *c, MessageSource &setter, const Anope::string &mname, const Anope::string ¶m) { 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> ¶m) { return EVENT_CONTINUE; }
00969 };
00970
00973 enum Implementation
00974 {
00975 I_BEGIN,
00976
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
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
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
00993 I_OnSetVhost, I_OnDeleteVhost,
00994
00995
00996 I_OnMemoSend, I_OnMemoDel,
00997
00998
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
01003 I_OnDefconLevel, I_OnAddAkill, I_OnDelAkill, I_OnExceptionAdd, I_OnExceptionDel,
01004 I_OnAddXLine, I_OnDelXLine, I_IsServicesOper,
01005
01006
01007 I_OnSaveDatabase, I_OnLoadDatabase,
01008
01009
01010 I_OnModuleLoad, I_OnModuleUnload,
01011
01012
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