X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules.cpp;h=4eca9492e0c95517f3f574bb09c9ebbb466daee2;hb=3c93d5d1c46953ad152f619885c4f3678d4a3ecc;hp=6a870361bb17002e1177357754ca62c6ab8cd235;hpb=9ee525bec55521e9d911df40c2d8ca8b0212ee22;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules.cpp b/src/modules.cpp index 6a870361b..4eca9492e 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -11,10 +11,9 @@ * --------------------------------------------------- */ -/* $Core: libIRCDmodules */ +/* $Core */ #include "inspircd.h" -#include "wildcard.h" #include "xline.h" #include "socket.h" #include "socketengine.h" @@ -27,8 +26,8 @@ #endif // version is a simple class for holding a modules version number -Version::Version(int major, int minor, int revision, int build, int flags, int api_ver) -: Major(major), Minor(minor), Revision(revision), Build(build), Flags(flags), API(api_ver) +Version::Version(const std::string &sversion, int flags, int api_ver) +: version(sversion), Flags(flags), API(api_ver) { } @@ -104,21 +103,21 @@ std::string Event::GetEventID() // These declarations define the behavours of the base class Module (which does nothing at all) - Module::Module(InspIRCd* Me) : ServerInstance(Me) { } - Module::~Module() { } -void Module::OnReadConfig(ServerConfig*, ConfigReader*) { } -int Module::OnDownloadFile(const std::string&, std::istream*&) { return 0; } +Module::Module(InspIRCd* Me) : ServerInstance(Me) { } +Module::~Module() { } + +int Module::OnSendSnotice(char &snomask, std::string &type, const std::string &message) { return 0; } void Module::OnUserConnect(User*) { } void Module::OnUserQuit(User*, const std::string&, const std::string&) { } void Module::OnUserDisconnect(User*) { } void Module::OnUserJoin(User*, Channel*, bool, bool&) { } void Module::OnPostJoin(User*, Channel*) { } -void Module::OnUserPart(User*, Channel*, const std::string&, bool&) { } +void Module::OnUserPart(User*, Channel*, std::string&, bool&) { } void Module::OnRehash(User*, const std::string&) { } void Module::OnServerRaw(std::string&, bool, User*) { } -int Module::OnUserPreJoin(User*, Channel*, const char*, std::string&) { return 0; } +int Module::OnUserPreJoin(User*, Channel*, const char*, std::string&, const std::string&) { return 0; } void Module::OnMode(User*, void*, int, const std::string&) { } -Version Module::GetVersion() { return Version(1,0,0,0,VF_VENDOR,-1); } +Version Module::GetVersion() { return Version("Misconfigured", VF_VENDOR, -1); } void Module::OnOper(User*, const std::string&) { } void Module::OnPostOper(User*, const std::string&, const std::string &) { } void Module::OnInfo(User*) { } @@ -134,8 +133,8 @@ int Module::OnKill(User*, User*, const std::string&) { return 0; } void Module::OnLoadModule(Module*, const std::string&) { } void Module::OnUnloadModule(Module*, const std::string&) { } void Module::OnBackgroundTimer(time_t) { } -int Module::OnPreCommand(const std::string&, const char* const*, int, User *, bool, const std::string&) { return 0; } -void Module::OnPostCommand(const std::string&, const char* const*, int, User *, CmdResult, const std::string&) { } +int Module::OnPreCommand(std::string&, std::vector&, User *, bool, const std::string&) { return 0; } +void Module::OnPostCommand(const std::string&, const std::vector&, User *, CmdResult, const std::string&) { } bool Module::OnCheckReady(User*) { return true; } int Module::OnUserRegister(User*) { return 0; } int Module::OnUserPreKick(User*, User*, Channel*, const std::string&) { return 0; } @@ -145,6 +144,8 @@ int Module::OnCheckInvite(User*, Channel*) { return 0; } int Module::OnCheckKey(User*, Channel*, const std::string&) { return 0; } int Module::OnCheckLimit(User*, Channel*) { return 0; } int Module::OnCheckBan(User*, Channel*) { return 0; } +int Module::OnCheckExtBan(User *, Channel *, char) { return 0; } +int Module::OnCheckStringExtBan(const std::string &s, Channel *c, char type) { return 0; } int Module::OnStats(char, User*, string_list&) { return 0; } int Module::OnChangeLocalUserHost(User*, const std::string&) { return 0; } int Module::OnChangeLocalUserGECOS(User*, const std::string&) { return 0; } @@ -169,12 +170,12 @@ void Module::OnPostLocalTopicChange(User*, Channel*, const std::string&) { } void Module::OnGetServerDescription(const std::string&, std::string&) { } void Module::OnSyncUser(User*, Module*, void*) { } void Module::OnSyncChannel(Channel*, Module*, void*) { } -void Module::ProtoSendMode(void*, int, void*, const std::string&) { } +void Module::ProtoSendMode(void*, TargetTypeFlags, void*, const std::string&) { } void Module::OnSyncChannelMetaData(Channel*, Module*, void*, const std::string&, bool) { } void Module::OnSyncUserMetaData(User*, Module*, void*, const std::string&, bool) { } void Module::OnSyncOtherMetaData(Module*, void*, bool) { } void Module::OnDecodeMetaData(int, void*, const std::string&, const std::string&) { } -void Module::ProtoSendMetaData(void*, int, void*, const std::string&, const std::string&) { } +void Module::ProtoSendMetaData(void*, TargetTypeFlags, void*, const std::string&, const std::string&) { } void Module::OnWallops(User*, const std::string&) { } void Module::OnChangeHost(User*, const std::string&) { } void Module::OnChangeName(User*, const std::string&) { } @@ -184,8 +185,7 @@ void Module::OnExpireLine(XLine*) { } void Module::OnCleanup(int, void*) { } int Module::OnChannelPreDelete(Channel*) { return 0; } void Module::OnChannelDelete(Channel*) { } -void Module::OnSetAway(User*) { } -void Module::OnCancelAway(User*) { } +int Module::OnSetAway(User*, const std::string &) { return 0; } int Module::OnUserList(User*, Channel*, CUList*&) { return 0; } int Module::OnWhoisLine(User*, User*, int&, std::string&) { return 0; } void Module::OnBuildExemptList(MessageType, Channel*, User*, char, CUList&, const std::string&) { } @@ -195,6 +195,8 @@ void Module::OnText(User*, void*, int, const std::string&, char, CUList&) { } void Module::OnRunTestSuite() { } void Module::OnNamesListItem(User*, User*, Channel*, std::string&, std::string&) { } int Module::OnNumeric(User*, unsigned int, const std::string&) { return 0; } +void Module::OnHookUserIO(User*, const std::string&) { } +bool Module::OnHostCycle(User* user) { return false; } ModuleManager::ModuleManager(InspIRCd* Ins) : ModCount(0), Instance(Ins) { @@ -334,7 +336,21 @@ bool ModuleManager::SetPriority(Module* mod, Implementation i, PriorityState s, /* Do we need to swap? */ if (swap && (swap_pos != source)) - std::swap(EventHandlers[i][swap_pos], EventHandlers[i][source]); + { + /* Suggestion from Phoenix, "shuffle" the modules to better retain call order */ + int incrmnt = 1; + + if (source > swap_pos) + incrmnt = -1; + + for (unsigned int j = source; j != swap_pos; j += incrmnt) + { + if (( j + incrmnt > EventHandlers[i].size() - 1) || (j + incrmnt < 0)) + continue; + + std::swap(EventHandlers[i][j], EventHandlers[i][j+incrmnt]); + } + } return true; } @@ -358,9 +374,9 @@ bool ModuleManager::Load(const char* filename) { /* Try and locate and load all modules matching the pattern */ dirent* entry = NULL; - while ((entry = readdir(library))) + while (0 != (entry = readdir(library))) { - if (Instance->MatchText(entry->d_name, filename)) + if (InspIRCd::Match(entry->d_name, filename, NULL)) { if (!this->Load(entry->d_name)) n_match++; @@ -381,7 +397,7 @@ bool ModuleManager::Load(const char* filename) if (!ServerConfig::DirValid(modfile)) { - LastModuleError = "Module " + filename_str + " is not within the modules directory."; + LastModuleError = "Module " + std::string(filename) + " is not in the module directory that i am configured to look in (is "+Instance->Config->ModPath+" really a symlink?)"; Instance->Logs->Log("MODULE", DEFAULT, LastModuleError); return false; } @@ -426,7 +442,7 @@ bool ModuleManager::Load(const char* filename) } else { - Instance->Logs->Log("MODULE", DEFAULT,"New module introduced: %s (API version %d, Module version %d.%d.%d.%d)%s", filename, v.API, v.Major, v.Minor, v.Revision, v.Build, (!(v.Flags & VF_VENDOR) ? " [3rd Party]" : " [Vendor]")); + Instance->Logs->Log("MODULE", DEFAULT,"New module introduced: %s (API version %d, Module version %s)%s", filename, v.API, v.version.c_str(), (!(v.Flags & VF_VENDOR) ? " [3rd Party]" : " [Vendor]")); } Modules[filename_str] = std::make_pair(newhandle, newmod); @@ -604,14 +620,12 @@ bool ModuleManager::PublishInterface(const std::string &InterfaceName, Module* M modulelist ml; ml.push_back(Mod); Interfaces[InterfaceName] = std::make_pair(0, ml); - return true; } else { iter->second.second.push_back(Mod); - return true; } - return false; + return true; } bool ModuleManager::UnpublishInterface(const std::string &InterfaceName, Module* Mod) @@ -717,14 +731,9 @@ Channel* InspIRCd::GetChannelIndex(long index) return NULL; } -bool InspIRCd::MatchText(const std::string &sliteral, const std::string &spattern) -{ - return match(sliteral.c_str(),spattern.c_str()); -} - -CmdResult InspIRCd::CallCommandHandler(const std::string &commandname, const char* const* parameters, int pcnt, User* user) +CmdResult InspIRCd::CallCommandHandler(const std::string &commandname, const std::vector& parameters, User* user) { - return this->Parser->CallHandler(commandname,parameters,pcnt,user); + return this->Parser->CallHandler(commandname, parameters, user); } bool InspIRCd::IsValidModuleCommand(const std::string &commandname, int pcnt, User* user) @@ -741,9 +750,9 @@ void InspIRCd::AddCommand(Command *f) } } -void InspIRCd::SendMode(const char* const* parameters, int pcnt, User *user) +void InspIRCd::SendMode(const std::vector& parameters, User *user) { - this->Modes->Process(parameters,pcnt,user,true); + this->Modes->Process(parameters, user, true); } void InspIRCd::DumpText(User* User, const std::string &LinePrefix, std::stringstream &TextStream) @@ -892,7 +901,7 @@ long ConfigReader::GetError() void ConfigReader::DumpErrors(bool bail, User* user) { - ServerInstance->Config->ReportConfigError(this->errorlog->str(), bail, user); + ServerInstance->Config->ReportConfigError(this->errorlog->str(), bail, user->uuid); }