X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules.cpp;h=7e932ed72ba9f508246ba5f34fdbf116df74f4b1;hb=5bea41d726f9c93ca1914ae9b6259765991d383c;hp=c27147820579c78aa459c677d35063a244de7090;hpb=025aa693fd47228d101062248ff7b71ec9638a71;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules.cpp b/src/modules.cpp index c27147820..7e932ed72 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -26,25 +26,19 @@ #include #include "inspircd.h" -#include "xline.h" -#include "socket.h" -#include "socketengine.h" -#include "command_parse.h" #include "exitcodes.h" #ifndef _WIN32 #include #endif -static intrusive_list* dynrefs = NULL; -static bool dynref_init_complete = false; +static insp::intrusive_list* dynrefs = NULL; void dynamic_reference_base::reset_all() { - dynref_init_complete = true; if (!dynrefs) return; - for (intrusive_list::iterator i = dynrefs->begin(); i != dynrefs->end(); ++i) + for (insp::intrusive_list::iterator i = dynrefs->begin(); i != dynrefs->end(); ++i) (*i)->resolve(); } @@ -92,14 +86,14 @@ void Module::OnUserPart(Membership*, std::string&, CUList&) { DetachEvent(I_OnU void Module::OnPreRehash(User*, const std::string&) { DetachEvent(I_OnPreRehash); } void Module::OnModuleRehash(User*, const std::string&) { DetachEvent(I_OnModuleRehash); } ModResult Module::OnUserPreJoin(LocalUser*, Channel*, const std::string&, std::string&, const std::string&) { DetachEvent(I_OnUserPreJoin); return MOD_RES_PASSTHRU; } -void Module::OnMode(User*, User*, Channel*, const std::vector&, const std::vector&) { DetachEvent(I_OnMode); } +void Module::OnMode(User*, User*, Channel*, const Modes::ChangeList&, ModeParser::ModeProcessFlag, const std::string&) { DetachEvent(I_OnMode); } void Module::OnOper(User*, const std::string&) { DetachEvent(I_OnOper); } void Module::OnPostOper(User*, const std::string&, const std::string &) { DetachEvent(I_OnPostOper); } void Module::OnInfo(User*) { DetachEvent(I_OnInfo); } void Module::OnWhois(User*, User*) { DetachEvent(I_OnWhois); } ModResult Module::OnUserPreInvite(User*, User*, Channel*, time_t) { DetachEvent(I_OnUserPreInvite); return MOD_RES_PASSTHRU; } ModResult Module::OnUserPreMessage(User*, void*, int, std::string&, char, CUList&, MessageType) { DetachEvent(I_OnUserPreMessage); return MOD_RES_PASSTHRU; } -ModResult Module::OnUserPreNick(User*, const std::string&) { DetachEvent(I_OnUserPreNick); return MOD_RES_PASSTHRU; } +ModResult Module::OnUserPreNick(LocalUser*, const std::string&) { DetachEvent(I_OnUserPreNick); return MOD_RES_PASSTHRU; } void Module::OnUserPostNick(User*, const std::string&) { DetachEvent(I_OnUserPostNick); } ModResult Module::OnPreMode(User*, User*, Channel*, const std::vector&) { DetachEvent(I_OnPreMode); return MOD_RES_PASSTHRU; } void Module::On005Numeric(std::map&) { DetachEvent(I_On005Numeric); } @@ -151,7 +145,7 @@ void Module::OnBuildNeighborList(User*, IncludeChanList&, std::map& void Module::OnGarbageCollect() { DetachEvent(I_OnGarbageCollect); } ModResult Module::OnSetConnectClass(LocalUser* user, ConnectClass* myclass) { DetachEvent(I_OnSetConnectClass); return MOD_RES_PASSTHRU; } void Module::OnText(User*, void*, int, const std::string&, char, CUList&) { DetachEvent(I_OnText); } -void Module::OnNamesListItem(User*, Membership*, std::string&, std::string&) { DetachEvent(I_OnNamesListItem); } +ModResult Module::OnNamesListItem(User*, Membership*, std::string&, std::string&) { DetachEvent(I_OnNamesListItem); return MOD_RES_PASSTHRU; } ModResult Module::OnNumeric(User*, unsigned int, const std::string&) { DetachEvent(I_OnNumeric); return MOD_RES_PASSTHRU; } ModResult Module::OnAcceptConnection(int, ListenSocket*, irc::sockets::sockaddrs*, irc::sockets::sockaddrs*) { DetachEvent(I_OnAcceptConnection); return MOD_RES_PASSTHRU; } void Module::OnSendWhoLine(User*, const std::vector&, User*, Membership*, std::string&) { DetachEvent(I_OnSendWhoLine); } @@ -397,8 +391,8 @@ void ModuleManager::DoSafeUnload(Module* mod) ++c; mod->OnCleanup(TYPE_CHANNEL, chan); chan->doUnhookExtensions(items); - const UserMembList* users = chan->GetUsers(); - for(UserMembCIter mi = users->begin(); mi != users->end(); mi++) + const Channel::MemberMap& users = chan->GetUsers(); + for (Channel::MemberMap::const_iterator mi = users.begin(); mi != users.end(); ++mi) mi->second->doUnhookExtensions(items); } @@ -521,7 +515,7 @@ void ModuleManager::Reload(Module* mod, HandlerBase1* callback) { if (CanUnload(mod)) ServerInstance->AtomicActions.AddAction(new ReloadAction(mod, callback)); - else + else if (callback) callback->Call(false); } @@ -593,7 +587,7 @@ void ModuleManager::AddService(ServiceProvider& item) switch (item.service) { case SERVICE_COMMAND: - if (!ServerInstance->Parser->AddCommand(static_cast(&item))) + if (!ServerInstance->Parser.AddCommand(static_cast(&item))) throw ModuleException("Command "+std::string(item.name)+" already exists."); return; case SERVICE_MODE: @@ -611,7 +605,7 @@ void ModuleManager::AddService(ServiceProvider& item) case SERVICE_DATA: case SERVICE_IOHOOK: { - if ((item.name.substr(0, 5) == "mode/") || (item.name.substr(0, 6) == "umode/")) + if ((!item.name.compare(0, 5, "mode/", 5)) || (!item.name.compare(0, 6, "umode/", 6))) throw ModuleException("The \"mode/\" and the \"umode\" service name prefixes are reserved."); DataProviders.insert(std::make_pair(item.name, &item)); @@ -676,9 +670,11 @@ dynamic_reference_base::dynamic_reference_base(Module* Creator, const std::strin : name(Name), value(NULL), creator(Creator) { if (!dynrefs) - dynrefs = new intrusive_list; + dynrefs = new insp::intrusive_list; dynrefs->push_front(this); - if (dynref_init_complete) + + // Resolve unless there is no ModuleManager (part of class InspIRCd) + if (ServerInstance) resolve(); }