X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules.cpp;h=42cfce33affb2e65b4da318216c4e9fcd8606db6;hb=31407a3b9e138266bcc1ddb5cffd91bee4f1092c;hp=4cbe8d7f6df7cbc7c57c3eaaa1571524e0acacf6;hpb=e65eee7e8db55e90dfef2b818394b8224b367766;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules.cpp b/src/modules.cpp index 4cbe8d7f6..42cfce33a 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -2,7 +2,7 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2008 InspIRCd Development Team + * InspIRCd: (C) 2002-2009 InspIRCd Development Team * See: http://www.inspircd.org/wiki/index.php/Credits * * This program is free but copyrighted software; see @@ -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&) { } @@ -195,6 +196,7 @@ 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, ascii_case_insensitive_map)) { if (!this->Load(entry->d_name)) n_match++; @@ -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) @@ -804,6 +813,7 @@ ConfigReader::ConfigReader(InspIRCd* Instance) : ServerInstance(Instance) this->error = CONF_NO_ERROR; this->data = &ServerInstance->Config->config_data; this->privatehash = false; + this->error = 0; } @@ -828,6 +838,7 @@ ConfigReader::ConfigReader(InspIRCd* Instance, const std::string &filename) : Se this->readerror = ServerInstance->Config->DoInclude(*this->data, filename, *this->errorlog); if (!this->readerror) this->error = CONF_FILE_NOT_FOUND; + this->error = 0; } @@ -892,7 +903,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); }