32 #include "inspsocket.h"
53 enum TargetTypeFlags {
67 #define MOD_RES_ALLOW (ModResult(1))
68 #define MOD_RES_PASSTHRU (ModResult(0))
69 #define MOD_RES_DENY (ModResult(-1))
79 inline bool operator==(
const ModResult& r)
const
83 inline bool operator!=(
const ModResult& r)
const
87 inline bool operator!()
const
91 inline bool check(
bool def)
const
93 return (res == 1 || (res == 0 && def));
100 if (res == r.res || r.res == 0)
105 return MOD_RES_ALLOW;
112 #define INSPIRCD_VERSION_MAJ 200
119 #define INSPIRCD_VERSION_API 11
126 #define FOREACH_MOD(y,x) do { \
127 EventHandlerIter safei; \
128 for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ) \
136 catch (CoreException& modexcept) \
138 ServerInstance->Logs->Log("MODULE",DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
150 #define DO_EACH_HOOK(n,v,args) \
152 EventHandlerIter iter_ ## n = ServerInstance->Modules->EventHandlers[I_ ## n].begin(); \
153 while (iter_ ## n != ServerInstance->Modules->EventHandlers[I_ ## n].end()) \
155 Module* mod_ ## n = *iter_ ## n; \
159 v = (mod_ ## n)->n args;
161 #define WHILE_EACH_HOOK(n) \
163 catch (CoreException& except_ ## n) \
165 ServerInstance->Logs->Log("MODULE",DEFAULT,"Exception caught: %s", (except_ ## n).GetReason()); \
178 #define FIRST_MOD_RESULT(n,v,args) do { \
179 v = MOD_RES_PASSTHRU; \
180 DO_EACH_HOOK(n,v,args) \
182 if (v != MOD_RES_PASSTHRU) \
185 WHILE_EACH_HOOK(n); \
207 Version(
const std::string &desc,
int flags = VF_NONE);
210 Version(
const std::string &desc,
int flags,
const std::string& linkdata);
227 const char*
const id;
266 const std::string
id;
295 inline void ClearCache() { value = NULL; }
296 inline const std::string& GetProvider() {
return name; }
297 void SetProvider(
const std::string& newname);
300 static void reset_all();
309 inline T* operator->()
313 return static_cast<T*
>(value);
319 enum Priority { PRIORITY_FIRST, PRIORITY_LAST, PRIORITY_BEFORE, PRIORITY_AFTER };
326 I_OnUserConnect, I_OnUserQuit, I_OnUserDisconnect, I_OnUserJoin, I_OnUserPart, I_OnRehash,
327 I_OnSendSnotice, I_OnUserPreJoin, I_OnUserPreKick, I_OnUserKick, I_OnOper, I_OnInfo, I_OnWhois,
328 I_OnUserPreInvite, I_OnUserInvite, I_OnUserPreMessage, I_OnUserPreNotice, I_OnUserPreNick,
329 I_OnUserMessage, I_OnUserNotice, I_OnMode, I_OnGetServerDescription, I_OnSyncUser,
330 I_OnSyncChannel, I_OnDecodeMetaData, I_OnWallops, I_OnAcceptConnection, I_OnUserInit,
331 I_OnChangeHost, I_OnChangeName, I_OnAddLine, I_OnDelLine, I_OnExpireLine,
332 I_OnUserPostNick, I_OnPreMode, I_On005Numeric, I_OnKill, I_OnRemoteKill, I_OnLoadModule,
333 I_OnUnloadModule, I_OnBackgroundTimer, I_OnPreCommand, I_OnCheckReady, I_OnCheckInvite,
334 I_OnRawMode, I_OnCheckKey, I_OnCheckLimit, I_OnCheckBan, I_OnCheckChannelBan, I_OnExtBanCheck,
335 I_OnStats, I_OnChangeLocalUserHost, I_OnPreTopicChange, I_OnPostDeoper,
336 I_OnPostTopicChange, I_OnEvent, I_OnGlobalOper, I_OnPostConnect, I_OnAddBan,
337 I_OnDelBan, I_OnChangeLocalUserGECOS, I_OnUserRegister, I_OnChannelPreDelete, I_OnChannelDelete,
338 I_OnPostOper, I_OnSyncNetwork, I_OnSetAway, I_OnPostCommand, I_OnPostJoin,
339 I_OnWhoisLine, I_OnBuildNeighborList, I_OnGarbageCollect, I_OnSetConnectClass,
340 I_OnText, I_OnPassCompare, I_OnRunTestSuite, I_OnNamesListItem, I_OnNumeric, I_OnHookIO,
341 I_OnPreRehash, I_OnModuleRehash, I_OnSendWhoLine, I_OnChangeIdent, I_OnSetUserIP,
386 virtual void Prioritize()
400 virtual void OnUserConnect(
LocalUser* user);
410 virtual void OnUserQuit(
User* user,
const std::string &message,
const std::string &oper_message);
418 virtual void OnUserDisconnect(
LocalUser* user);
429 virtual void OnChannelDelete(
Channel* chan);
440 virtual void OnUserJoin(
Membership* memb,
bool sync,
bool created, CUList& except_list);
456 virtual void OnUserPart(
Membership* memb, std::string &partmessage, CUList& except_list);
468 virtual void OnPreRehash(
User* user,
const std::string ¶meter);
478 virtual void OnModuleRehash(
User* user,
const std::string ¶meter);
486 virtual void OnRehash(
User* user);
495 virtual ModResult OnSendSnotice(
char &snomask, std::string &type,
const std::string &message);
517 virtual ModResult OnUserPreJoin(
User* user,
Channel* chan,
const char* cname, std::string &privs,
const std::string &keygiven);
538 virtual void OnUserKick(
User* source,
Membership* memb,
const std::string &reason, CUList& except_list);
546 virtual void OnOper(
User* user,
const std::string &opertype);
556 virtual void OnPostOper(
User* user,
const std::string &opername,
const std::string &opertype);
561 virtual void OnPostDeoper(
User* user);
573 virtual void OnInfo(
User* user);
581 virtual void OnWhois(
User* source,
User* dest);
603 virtual void OnUserInvite(
User* source,
User* dest,
Channel* channel, time_t timeout);
621 virtual ModResult OnUserPreMessage(
User* user,
void* dest,
int target_type, std::string &text,
char status, CUList &exempt_list);
642 virtual ModResult OnUserPreNotice(
User* user,
void* dest,
int target_type, std::string &text,
char status, CUList &exempt_list);
653 virtual void OnBuildNeighborList(
User* source, UserChanList &include_c, std::map<User*,bool> &exceptions);
665 virtual ModResult OnUserPreNick(
User* user,
const std::string &newnick);
677 virtual void OnUserMessage(
User* user,
void* dest,
int target_type,
const std::string &text,
char status,
const CUList &exempt_list);
689 virtual void OnUserNotice(
User* user,
void* dest,
int target_type,
const std::string &text,
char status,
const CUList &exempt_list);
704 virtual void OnText(
User* user,
void* dest,
int target_type,
const std::string &text,
char status, CUList &exempt_list);
716 virtual void OnMode(
User* user,
void* dest,
int target_type,
const std::vector<std::string> &text,
const std::vector<TranslateType> &translate);
726 virtual void OnGetServerDescription(
const std::string &servername,std::string &description);
740 virtual void OnSyncUser(
User* user,
Module* proto,
void* opaque);
755 virtual void OnSyncChannel(
Channel* chan,
Module* proto,
void* opaque);
768 virtual void OnSyncNetwork(
Module* proto,
void* opaque);
776 virtual void OnDecodeMetaData(
Extensible* target,
const std::string &extname,
const std::string &extdata);
792 virtual void ProtoSendMode(
void* opaque, TargetTypeFlags target_type,
void* target,
const std::vector<std::string> &modeline,
const std::vector<TranslateType> &translate);
807 virtual void ProtoSendMetaData(
void* opaque,
Extensible* target,
const std::string &extname,
const std::string &extdata);
813 virtual void OnWallops(
User* user,
const std::string &text);
820 virtual void OnChangeHost(
User* user,
const std::string &newhost);
827 virtual void OnChangeName(
User* user,
const std::string &gecos);
834 virtual void OnChangeIdent(
User* user,
const std::string &ident);
841 virtual void OnAddLine(
User* source,
XLine* line);
848 virtual void OnDelLine(
User* source,
XLine* line);
854 virtual void OnExpireLine(
XLine *line);
865 virtual void OnCleanup(
int target_type,
void* item);
876 virtual void OnUserPostNick(
User* user,
const std::string &oldnick);
889 virtual ModResult OnPreMode(
User* source,
User* dest,
Channel* channel,
const std::vector<std::string>& parameters);
895 virtual void On005Numeric(std::string &output);
918 virtual void OnRemoteKill(
User* source,
User* dest,
const std::string &reason,
const std::string &operreason);
931 virtual void OnLoadModule(
Module* mod);
944 virtual void OnUnloadModule(
Module* mod);
952 virtual void OnBackgroundTimer(time_t curtime);
971 virtual ModResult OnPreCommand(std::string &command, std::vector<std::string>& parameters,
LocalUser *user,
bool validated,
const std::string &original_line);
984 virtual void OnPostCommand(
const std::string &command,
const std::vector<std::string>& parameters,
LocalUser *user, CmdResult result,
const std::string &original_line);
989 virtual void OnUserInit(
LocalUser* user);
1036 virtual ModResult OnRawMode(
User* user,
Channel* chan,
const char mode,
const std::string ¶m,
bool adding,
int pcnt);
1094 virtual ModResult OnStats(
char symbol,
User* user, string_list &results);
1102 virtual ModResult OnChangeLocalUserHost(
LocalUser* user,
const std::string &newhost);
1110 virtual ModResult OnChangeLocalUserGECOS(
LocalUser* user,
const std::string &newhost);
1128 virtual void OnPostTopicChange(
User* user,
Channel* chan,
const std::string &topic);
1134 virtual void OnEvent(
Event& event);
1140 virtual void OnRequest(
Request& request);
1152 virtual ModResult OnPassCompare(
Extensible* ex,
const std::string &password,
const std::string &input,
const std::string& hashtype);
1160 virtual void OnGlobalOper(
User* user);
1168 virtual void OnPostConnect(
User* user);
1222 virtual int OnStreamSocketWrite(
StreamSocket* sock, std::string& sendq);
1234 virtual void OnStreamSocketConnect(
StreamSocket* sock);
1243 virtual int OnStreamSocketRead(
StreamSocket* sock, std::string& recvq);
1253 virtual ModResult OnSetAway(
User* user,
const std::string &awaymsg);
1266 virtual ModResult OnWhoisLine(
User* user,
User* dest,
int &numeric, std::string &text);
1273 virtual void OnGarbageCollect();
1284 virtual void OnRunTestSuite();
1290 virtual void OnNamesListItem(
User* issuer,
Membership* item, std::string &prefixes, std::string &nick);
1292 virtual ModResult OnNumeric(
User* user,
unsigned int numeric,
const std::string &text);
1300 virtual void OnSendWhoLine(
User* source,
const std::vector<std::string>& params,
User* user, std::string& line);
1306 virtual void OnSetUserIP(
LocalUser* user);
1310 #define CONF_NO_ERROR 0x000000
1311 #define CONF_NOT_A_NUMBER 0x000010
1312 #define CONF_INT_NEGATIVE 0x000080
1313 #define CONF_VALUE_NOT_FOUND 0x000100
1314 #define CONF_FILE_NOT_FOUND 0x000200
1345 std::string ReadValue(
const std::string &tag,
const std::string &name,
int index,
bool allow_linefeeds =
false);
1351 std::string ReadValue(
const std::string &tag,
const std::string &name,
const std::string &default_value,
int index,
bool allow_linefeeds =
false);
1358 bool ReadFlag(
const std::string &tag,
const std::string &name,
int index);
1365 bool ReadFlag(
const std::string &tag,
const std::string &name,
const std::string &default_value,
int index);
1376 int ReadInteger(
const std::string &tag,
const std::string &name,
int index,
bool need_positive);
1385 int ReadInteger(
const std::string &tag,
const std::string &name,
const std::string &default_value,
int index,
bool need_positive);
1399 int Enumerate(
const std::string &tag);
1413 std::vector<std::string> fc;
1417 unsigned long contentsize;
1447 void LoadFile(
const std::string &filename);
1451 std::string Contents();
1455 unsigned long ContentSize();
1466 std::string GetLine(
int x);
1478 typedef std::vector<Module*> IntModuleList;
1482 typedef IntModuleList::iterator EventHandlerIter;
1492 std::string LastModuleError;
1501 std::map<std::string, Module*> Modules;
1507 } prioritizationState;
1516 IntModuleList EventHandlers[I_END];
1545 bool SetPriority(
Module* mod, Implementation i, Priority s,
Module* which = NULL);
1550 return SetPriority(mod, i, s, *dptr);
1561 bool SetPriority(
Module* mod, Priority s);
1570 bool Attach(Implementation i,
Module* mod);
1579 bool Detach(Implementation i,
Module* mod);
1586 void Attach(Implementation* i,
Module* mod,
size_t sz);
1591 void DetachAll(
Module* mod);
1596 std::string& LastError();
1603 bool Load(
const std::string& filename,
bool defer =
false);
1610 bool Unload(
Module* module);
1622 void DoSafeUnload(
Module*);
1629 return this->ModCount;
1637 Module* Find(
const std::string &name);
1647 for(
int i=0; i < count; i++)
1648 AddService(*list[i]);
1654 ServiceProvider* FindService(ServiceType Type,
const std::string& name);
1656 template<
typename T>
inline T* FindDataService(
const std::string& name)
1658 return static_cast<T*
>(FindService(SERVICE_DATA, name));
1667 const std::vector<std::string> GetAllModuleNames(
int filter);
1673 #define MODULE_INIT_STR MODULE_INIT_STR_FN_2(MODULE_INIT_SYM)
1674 #define MODULE_INIT_STR_FN_2(x) MODULE_INIT_STR_FN_1(x)
1675 #define MODULE_INIT_STR_FN_1(x) #x
1676 #define MODULE_INIT_SYM MODULE_INIT_SYM_FN_2(INSPIRCD_VERSION_MAJ, INSPIRCD_VERSION_API)
1677 #define MODULE_INIT_SYM_FN_2(x,y) MODULE_INIT_SYM_FN_1(x,y)
1678 #define MODULE_INIT_SYM_FN_1(x,y) inspircd_module_ ## x ## _ ## y
1682 struct AllCommandList {
1684 AllCommandList(fn cmd);
1686 #define COMMAND_INIT(x) static Command* MK_ ## x(Module* m) { return new x(m); } \
1687 static const AllCommandList PREP_ ## x(&MK_ ## x);
1689 struct AllModuleList {
1693 AllModuleList(fn mod,
const std::string& Name);
1696 #define MODULE_INIT(x) static Module* MK_ ## x() { return new x; } \
1697 static const AllModuleList PREP_ ## x(&MK_ ## x, MODNAMESTR);
1699 #define MODNAMESTR MODNAMESTR_FN_2(MODNAME)
1700 #define MODNAMESTR_FN_2(x) MODNAMESTR_FN_1(x)
1701 #define MODNAMESTR_FN_1(x) #x
1711 #define MODULE_INIT(y) \
1712 extern "C" DllExport Module * MODULE_INIT_SYM() \
1716 BOOLEAN WINAPI DllMain(HINSTANCE hDllHandle, DWORD nReason, LPVOID Reserved) \
1718 switch ( nReason ) \
1720 case DLL_PROCESS_ATTACH: \
1721 case DLL_PROCESS_DETACH: \
1726 extern "C" DllExport const char inspircd_src_version[] = VERSION " r" REVISION;
1730 #define MODULE_INIT(y) \
1731 extern "C" DllExport Module * MODULE_INIT_SYM() \
1735 extern "C" const char inspircd_src_version[] = VERSION " r" REVISION;
1738 #define COMMAND_INIT(c) MODULE_INIT(CommandModule<c>)