34 #include "moduledefs.h"
38 #include "inspsocket.h"
62 #define MOD_RES_ALLOW (ModResult(1))
65 #define MOD_RES_PASSTHRU (ModResult(0))
68 #define MOD_RES_DENY (ModResult(-1))
93 return result == res.result;
99 return result != res.result;
111 return (result == 1 || (result == 0 && def));
119 if (result == res.result || res.result == 0)
127 return MOD_RES_ALLOW;
136 #define FOREACH_MOD(y,x) do { \
137 const Module::List& _handlers = ServerInstance->Modules->EventHandlers[I_ ## y]; \
138 for (Module::List::const_reverse_iterator _i = _handlers.rbegin(), _next; _i != _handlers.rend(); _i = _next) \
146 catch (CoreException& modexcept) \
148 ServerInstance->Logs->Log("MODULE", LOG_DEFAULT, "Exception caught: " + modexcept.GetReason()); \
159 #define DO_EACH_HOOK(n,v,args) \
161 const Module::List& _handlers = ServerInstance->Modules->EventHandlers[I_ ## n]; \
162 for (Module::List::const_reverse_iterator _i = _handlers.rbegin(), _next; _i != _handlers.rend(); _i = _next) \
170 #define WHILE_EACH_HOOK(n) \
172 catch (CoreException& except_ ## n) \
174 ServerInstance->Logs->Log("MODULE", LOG_DEFAULT, "Exception caught: " + (except_ ## n).GetReason()); \
186 #define FIRST_MOD_RESULT(n,v,args) do { \
187 v = MOD_RES_PASSTHRU; \
188 DO_EACH_HOOK(n,v,args) \
190 if (v != MOD_RES_PASSTHRU) \
193 WHILE_EACH_HOOK(n); \
215 Version(
const std::string &desc,
int flags = VF_NONE);
218 Version(
const std::string &desc,
int flags,
const std::string& linkdata);
230 enum Priority { PRIORITY_FIRST, PRIORITY_LAST, PRIORITY_BEFORE, PRIORITY_AFTER };
237 I_OnAcceptConnection,
240 I_OnBuildNeighborList,
246 I_OnChannelPreDelete,
274 I_OnPreChangeRealName,
294 I_OnUserMessageBlocked,
321 void DetachEvent(Implementation i);
325 typedef std::vector<Module*>
List;
362 virtual
void Prioritize() { }
375 virtual Version GetVersion() = 0;
381 virtual void OnUserConnect(
LocalUser* user);
391 virtual ModResult OnUserPreQuit(
LocalUser* user, std::string& message, std::string& oper_message);
401 virtual void OnUserQuit(
User* user,
const std::string &message,
const std::string &oper_message);
409 virtual void OnUserDisconnect(
LocalUser* user);
420 virtual void OnChannelDelete(
Channel* chan);
431 virtual void OnUserJoin(
Membership* memb,
bool sync,
bool created, CUList& except_list);
447 virtual void OnUserPart(
Membership* memb, std::string &partmessage, CUList& except_list);
459 virtual void OnPreRehash(
User* user,
const std::string ¶meter);
469 virtual void OnModuleRehash(
User* user,
const std::string ¶meter);
478 virtual ModResult OnSendSnotice(
char &snomask, std::string &type,
const std::string &message);
500 virtual ModResult OnUserPreJoin(
LocalUser* user,
Channel* chan,
const std::string& cname, std::string& privs,
const std::string& keygiven);
521 virtual void OnUserKick(
User* source,
Membership* memb,
const std::string &reason, CUList& except_list);
529 virtual void OnOper(
User* user,
const std::string &opertype);
539 virtual void OnPostOper(
User* user,
const std::string &opername,
const std::string &opertype);
544 virtual void OnPostDeoper(
User* user);
568 virtual void OnUserInvite(
User* source,
User* dest,
Channel* channel, time_t timeout,
unsigned int notifyrank, CUList& notifyexcepts);
590 virtual void OnBuildNeighborList(
User* source, IncludeChanList& include_c, std::map<User*, bool>& exceptions);
647 virtual void OnDecodeMetaData(
Extensible* target,
const std::string &extname,
const std::string &extdata);
654 virtual void OnChangeHost(
User* user,
const std::string &newhost);
661 virtual void OnChangeRealHost(
User* user,
const std::string& newhost);
668 virtual void OnChangeRealName(
User* user,
const std::string& real);
675 virtual void OnChangeIdent(
User* user,
const std::string &ident);
682 virtual void OnAddLine(
User* source,
XLine* line);
689 virtual void OnDelLine(
User* source,
XLine* line);
695 virtual void OnExpireLine(
XLine *line);
716 virtual void OnUserPostNick(
User* user,
const std::string &oldnick);
735 virtual void On005Numeric(std::map<std::string, std::string>& tokens);
763 virtual void OnLoadModule(
Module* mod);
776 virtual void OnUnloadModule(
Module* mod);
784 virtual void OnBackgroundTimer(time_t curtime);
830 virtual void OnUserInit(
LocalUser* user);
836 virtual void OnUserPostInit(
LocalUser* user);
963 virtual void OnPostTopicChange(
User* user,
Channel* chan,
const std::string &topic);
975 virtual ModResult OnPassCompare(
Extensible* ex,
const std::string &password,
const std::string &input,
const std::string& hashtype);
983 virtual void OnPostConnect(
User* user);
999 virtual void OnGarbageCollect();
1013 virtual void OnSetUserIP(
LocalUser* user);
1044 virtual void OnShutdown(
const std::string& reason);
1053 typedef std::multimap<std::string, ServiceProvider*, irc::insensitive_swo> DataProviderMap;
1054 typedef std::vector<ServiceProvider*> ServiceList;
1059 std::string LastModuleError;
1064 std::map<std::string, Module*> Modules;
1070 } prioritizationState;
1074 void LoadCoreModules(std::map<std::string, ServiceList>& servicemap);
1079 bool PrioritizeHooks();
1085 void UnregisterModes(
Module* mod, ModeType modetype);
1088 typedef std::map<std::string, Module*> ModuleMap;
1113 static std::string ExpandModName(
const std::string& modname);
1139 bool SetPriority(
Module* mod, Implementation i, Priority s,
Module* which = NULL);
1149 void SetPriority(
Module* mod, Priority s);
1158 bool Attach(Implementation i,
Module* mod);
1167 bool Detach(Implementation i,
Module* mod);
1174 void Attach(Implementation* i,
Module* mod,
size_t sz);
1179 void DetachAll(
Module* mod);
1184 void AttachAll(
Module* mod);
1189 std::string& LastError();
1196 bool Load(
const std::string& filename,
bool defer =
false);
1203 bool Unload(
Module* module);
1209 void DoSafeUnload(
Module*);
1216 bool CanUnload(
Module* mod);
1223 Module* Find(
const std::string &name);
1234 void AddServices(
const ServiceList& list);
1238 for(
int i=0; i < count; i++)
1239 AddService(*list[i]);
1245 ServiceProvider* FindService(ServiceType Type,
const std::string& name);
1247 template<
typename T>
inline T* FindDataService(
const std::string& name)
1249 return static_cast<T*
>(FindService(SERVICE_DATA, name));