X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_callerid.cpp;h=37787b525ee5e1a504dca701b96cba852cc835cd;hb=6e79197210e58d69e7bd512d0b5569c4cb06f3e5;hp=a8a81daef3fa0d167695e178a88ec785e822fb17;hpb=37d7160b3a2434abcb4b39898bb86fa314fc3e5b;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_callerid.cpp b/src/modules/m_callerid.cpp index a8a81daef..37787b525 100644 --- a/src/modules/m_callerid.cpp +++ b/src/modules/m_callerid.cpp @@ -22,7 +22,7 @@ #include "inspircd.h" -/* $ModDesc: Implementation of callerid (umode +g & /accept, ala hybrid etc) */ +/* $ModDesc: Implementation of callerid, usermode +g, /accept */ class callerid_data { @@ -38,26 +38,6 @@ class callerid_data std::list wholistsme; callerid_data() : lastnotify(0) { } - callerid_data(const std::string& str) - { - irc::commasepstream s(str); - std::string tok; - if (s.GetToken(tok)) - { - lastnotify = ConvToInt(tok); - } - while (s.GetToken(tok)) - { - if (tok.empty()) - { - continue; - } - - User *u = ServerInstance->FindNick(tok); - if ((u) && (u->registered == REG_ALL) && (!u->quitting) && (!IS_SERVER(u))) - accepting.insert(u); - } - } std::string ToString(SerializeFormat format) const { @@ -88,8 +68,31 @@ struct CallerIDExtInfo : public ExtensionItem void unserialize(SerializeFormat format, Extensible* container, const std::string& value) { - callerid_data* dat = new callerid_data(value); - set_raw(container, dat); + callerid_data* dat = new callerid_data; + irc::commasepstream s(value); + std::string tok; + if (s.GetToken(tok)) + dat->lastnotify = ConvToInt(tok); + + while (s.GetToken(tok)) + { + if (tok.empty()) + continue; + + User *u = ServerInstance->FindNick(tok); + if ((u) && (u->registered == REG_ALL) && (!u->quitting) && (!IS_SERVER(u))) + { + if (dat->accepting.insert(u).second) + { + callerid_data* other = this->get(u, true); + other->wholistsme.push_back(dat); + } + } + } + + void* old = set_raw(container, dat); + if (old) + this->free(old); } callerid_data* get(User* user, bool create) @@ -113,12 +116,18 @@ struct CallerIDExtInfo : public ExtensionItem callerid_data *targ = this->get(*it, false); if (!targ) + { + ServerInstance->Logs->Log("m_callerid", DEFAULT, "ERROR: Inconsistency detected in callerid state, please report (1)"); continue; // shouldn't happen, but oh well. + } std::list::iterator it2 = std::find(targ->wholistsme.begin(), targ->wholistsme.end(), dat); if (it2 != targ->wholistsme.end()) targ->wholistsme.erase(it2); + else + ServerInstance->Logs->Log("m_callerid", DEFAULT, "ERROR: Inconsistency detected in callerid state, please report (2)"); } + delete dat; } }; @@ -136,6 +145,7 @@ public: CommandAccept(Module* Creator) : Command(Creator, "ACCEPT", 1), extInfo(Creator) { + allow_empty_last_param = false; syntax = "{[+|-]}|*}"; TRANSLATE2(TR_CUSTOM, TR_END); } @@ -144,7 +154,7 @@ public: { if (index != 0) return; - std::string out = ""; + std::string out; irc::commasepstream nicks(parameter); std::string tok; while (nicks.GetToken(tok)) @@ -275,6 +285,7 @@ public: if (!dat2) { // How the fuck is this possible. + ServerInstance->Logs->Log("m_callerid", DEFAULT, "ERROR: Inconsistency detected in callerid state, please report (3)"); return false; } @@ -282,6 +293,9 @@ public: if (it != dat2->wholistsme.end()) // Found me! dat2->wholistsme.erase(it); + else + ServerInstance->Logs->Log("m_callerid", DEFAULT, "ERROR: Inconsistency detected in callerid state, please report (4)"); + user->WriteServ("NOTICE %s :%s is no longer on your accept list", user->nick.c_str(), whotoremove->nick.c_str()); return true; @@ -319,6 +333,8 @@ private: if (it2 != dat->accepting.end()) dat->accepting.erase(it2); + else + ServerInstance->Logs->Log("m_callerid", DEFAULT, "ERROR: Inconsistency detected in callerid state, please report (5)"); } userdata->wholistsme.clear(); @@ -337,8 +353,8 @@ public: ServerInstance->Modules->AddService(cmd); ServerInstance->Modules->AddService(cmd.extInfo); - Implementation eventlist[] = { I_OnRehash, I_OnUserPreNick, I_OnUserQuit, I_On005Numeric, I_OnUserPreNotice, I_OnUserPreMessage }; - ServerInstance->Modules->Attach(eventlist, this, 6); + Implementation eventlist[] = { I_OnRehash, I_OnUserPostNick, I_OnUserQuit, I_On005Numeric, I_OnUserPreNotice, I_OnUserPreMessage }; + ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation)); } virtual ~ModuleCallerID() @@ -347,7 +363,7 @@ public: virtual Version GetVersion() { - return Version("Implementation of callerid (umode +g & /accept, ala hybrid etc)", VF_COMMON | VF_VENDOR); + return Version("Implementation of callerid, usermode +g, /accept", VF_COMMON | VF_VENDOR); } virtual void On005Numeric(std::string& output) @@ -357,7 +373,7 @@ public: ModResult PreText(User* user, User* dest, std::string& text) { - if (!dest->IsModeSet('g')) + if (!dest->IsModeSet('g') || (user == dest)) return MOD_RES_PASSTHRU; if (operoverride && IS_OPER(user)) @@ -399,11 +415,10 @@ public: return MOD_RES_PASSTHRU; } - ModResult OnUserPreNick(User* user, const std::string& newnick) + void OnUserPostNick(User* user, const std::string& oldnick) { if (!tracknick) RemoveFromAllAccepts(user); - return MOD_RES_PASSTHRU; } void OnUserQuit(User* user, const std::string& message, const std::string& oper_message) @@ -413,11 +428,11 @@ public: virtual void OnRehash(User* user) { - ConfigReader Conf; - cmd.maxaccepts = Conf.ReadInteger("callerid", "maxaccepts", "16", 0, true); - operoverride = Conf.ReadFlag("callerid", "operoverride", "0", 0); - tracknick = Conf.ReadFlag("callerid", "tracknick", "0", 0); - notify_cooldown = Conf.ReadInteger("callerid", "cooldown", "60", 0, true); + ConfigTag* tag = ServerInstance->Config->ConfValue("callerid"); + cmd.maxaccepts = tag->getInt("maxaccepts", 16); + operoverride = tag->getBool("operoverride"); + tracknick = tag->getBool("tracknick"); + notify_cooldown = tag->getInt("cooldown", 60); } };