X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_callerid.cpp;h=e11b326de73a7941977946c086b83b92b6c7581f;hb=a86e320ac19fbbd6034d0447f048beb8b4a0ad1d;hp=6f2c6730085560a8715ffc53fdfa09993c76970f;hpb=f71e6bf9cb41811f18864f5d4eecb26e29d03f25;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_callerid.cpp b/src/modules/m_callerid.cpp index 6f2c67300..e11b326de 100644 --- a/src/modules/m_callerid.cpp +++ b/src/modules/m_callerid.cpp @@ -37,15 +37,18 @@ enum class callerid_data { public: + typedef insp::flat_set UserSet; + typedef std::vector CallerIdDataSet; + time_t lastnotify; /** Users I accept messages from */ - std::set accepting; + UserSet accepting; /** Users who list me as accepted */ - std::list wholistsme; + CallerIdDataSet wholistsme; callerid_data() : lastnotify(0) { } @@ -53,7 +56,7 @@ class callerid_data { std::ostringstream oss; oss << lastnotify; - for (std::set::const_iterator i = accepting.begin(); i != accepting.end(); ++i) + for (UserSet::const_iterator i = accepting.begin(); i != accepting.end(); ++i) { User* u = *i; // Encode UIDs. @@ -66,7 +69,7 @@ class callerid_data struct CallerIDExtInfo : public ExtensionItem { CallerIDExtInfo(Module* parent) - : ExtensionItem("callerid_data", parent) + : ExtensionItem("callerid_data", ExtensionItem::EXT_USER, parent) { } @@ -86,7 +89,12 @@ struct CallerIDExtInfo : public ExtensionItem if (format == FORMAT_NETWORK) return; + void* old = get_raw(container); + if (old) + this->free(old); callerid_data* dat = new callerid_data; + set_raw(container, dat); + irc::commasepstream s(value); std::string tok; if (s.GetToken(tok)) @@ -95,7 +103,7 @@ struct CallerIDExtInfo : public ExtensionItem while (s.GetToken(tok)) { User *u = ServerInstance->FindNick(tok); - if ((u) && (u->registered == REG_ALL) && (!u->quitting) && (!IS_SERVER(u))) + if ((u) && (u->registered == REG_ALL) && (!u->quitting)) { if (dat->accepting.insert(u).second) { @@ -104,10 +112,6 @@ struct CallerIDExtInfo : public ExtensionItem } } } - - void* old = set_raw(container, dat); - if (old) - this->free(old); } callerid_data* get(User* user, bool create) @@ -126,7 +130,7 @@ struct CallerIDExtInfo : public ExtensionItem callerid_data* dat = static_cast(item); // We need to walk the list of users on our accept list, and remove ourselves from their wholistsme. - for (std::set::iterator it = dat->accepting.begin(); it != dat->accepting.end(); it++) + for (callerid_data::UserSet::iterator it = dat->accepting.begin(); it != dat->accepting.end(); ++it) { callerid_data *targ = this->get(*it, false); @@ -136,10 +140,7 @@ struct CallerIDExtInfo : public ExtensionItem 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 + if (!stdalgo::vector::swaperase(targ->wholistsme, dat)) ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "ERROR: Inconsistency detected in callerid state, please report (2)"); } delete dat; @@ -170,7 +171,7 @@ class CommandAccept : public Command else target = ServerInstance->FindNickOnly(tok); - if ((!target) || (target->registered != REG_ALL) || (target->quitting) || (IS_SERVER(target))) + if ((!target) || (target->registered != REG_ALL) || (target->quitting)) target = NULL; return std::make_pair(target, !remove); @@ -183,7 +184,7 @@ public: extInfo(Creator) { allow_empty_last_param = false; - syntax = "{[+|-]}|*}"; + syntax = "*|(+|-)[,(+|-) ...]"; TRANSLATE1(TR_CUSTOM); } @@ -224,7 +225,7 @@ public: ACCEPTAction action = GetTargetAndAction(tok, user); if (!action.first) { - user->WriteNumeric(ERR_NOSUCHNICK, "%s :No such nick/channel", tok.c_str()); + user->WriteNumeric(Numerics::NoSuchNick(tok)); return CMD_FAILURE; } @@ -267,10 +268,10 @@ public: callerid_data* dat = extInfo.get(user, false); if (dat) { - for (std::set::iterator i = dat->accepting.begin(); i != dat->accepting.end(); ++i) + for (callerid_data::UserSet::iterator i = dat->accepting.begin(); i != dat->accepting.end(); ++i) user->WriteNumeric(RPL_ACCEPTLIST, (*i)->nick); } - user->WriteNumeric(RPL_ENDOFACCEPT, ":End of ACCEPT list"); + user->WriteNumeric(RPL_ENDOFACCEPT, "End of ACCEPT list"); } bool AddAccept(User* user, User* whotoadd) @@ -279,12 +280,12 @@ public: callerid_data* dat = extInfo.get(user, true); if (dat->accepting.size() >= maxaccepts) { - user->WriteNumeric(ERR_ACCEPTFULL, ":Accept list is full (limit is %d)", maxaccepts); + user->WriteNumeric(ERR_ACCEPTFULL, InspIRCd::Format("Accept list is full (limit is %d)", maxaccepts)); return false; } if (!dat->accepting.insert(whotoadd).second) { - user->WriteNumeric(ERR_ACCEPTEXIST, "%s :is already on your accept list", whotoadd->nick.c_str()); + user->WriteNumeric(ERR_ACCEPTEXIST, whotoadd->nick, "is already on your accept list"); return false; } @@ -302,18 +303,15 @@ public: callerid_data* dat = extInfo.get(user, false); if (!dat) { - user->WriteNumeric(ERR_ACCEPTNOT, "%s :is not on your accept list", whotoremove->nick.c_str()); + user->WriteNumeric(ERR_ACCEPTNOT, whotoremove->nick, "is not on your accept list"); return false; } - std::set::iterator i = dat->accepting.find(whotoremove); - if (i == dat->accepting.end()) + if (!dat->accepting.erase(whotoremove)) { - user->WriteNumeric(ERR_ACCEPTNOT, "%s :is not on your accept list", whotoremove->nick.c_str()); + user->WriteNumeric(ERR_ACCEPTNOT, whotoremove->nick, "is not on your accept list"); return false; } - dat->accepting.erase(i); - // Look up their list to remove me. callerid_data *dat2 = extInfo.get(whotoremove, false); if (!dat2) @@ -323,11 +321,7 @@ public: return false; } - std::list::iterator it = std::find(dat2->wholistsme.begin(), dat2->wholistsme.end(), dat); - if (it != dat2->wholistsme.end()) - // Found me! - dat2->wholistsme.erase(it); - else + if (!stdalgo::vector::swaperase(dat2->wholistsme, dat)) ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "ERROR: Inconsistency detected in callerid state, please report (4)"); @@ -357,16 +351,12 @@ class ModuleCallerID : public Module return; // Iterate over the list of people who accept me, and remove all entries - for (std::list::iterator it = userdata->wholistsme.begin(); it != userdata->wholistsme.end(); it++) + for (callerid_data::CallerIdDataSet::iterator it = userdata->wholistsme.begin(); it != userdata->wholistsme.end(); ++it) { callerid_data *dat = *(it); // Find me on their callerid list - std::set::iterator it2 = dat->accepting.find(who); - - if (it2 != dat->accepting.end()) - dat->accepting.erase(it2); - else + if (!dat->accepting.erase(who)) ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "ERROR: Inconsistency detected in callerid state, please report (5)"); } @@ -401,18 +391,16 @@ public: return MOD_RES_PASSTHRU; callerid_data* dat = cmd.extInfo.get(dest, true); - std::set::iterator i = dat->accepting.find(user); - - if (i == dat->accepting.end()) + if (!dat->accepting.count(user)) { time_t now = ServerInstance->Time(); /* +g and *not* accepted */ - user->WriteNumeric(ERR_TARGUMODEG, "%s :is in +g mode (server-side ignore).", dest->nick.c_str()); + user->WriteNumeric(ERR_TARGUMODEG, dest->nick, "is in +g mode (server-side ignore)."); if (now > (dat->lastnotify + (time_t)notify_cooldown)) { - user->WriteNumeric(RPL_TARGNOTIFY, "%s :has been informed that you messaged them.", dest->nick.c_str()); - dest->SendText(":%s %03d %s %s %s@%s :is messaging you, and you have umode +g. Use /ACCEPT +%s to allow.", - ServerInstance->Config->ServerName.c_str(), RPL_UMODEGMSG, dest->nick.c_str(), user->nick.c_str(), user->ident.c_str(), user->dhost.c_str(), user->nick.c_str()); + user->WriteNumeric(RPL_TARGNOTIFY, dest->nick, "has been informed that you messaged them."); + dest->WriteRemoteNumeric(RPL_UMODEGMSG, user->nick, InspIRCd::Format("%s@%s", user->ident.c_str(), user->dhost.c_str()), InspIRCd::Format("is messaging you, and you have umode +g. Use /ACCEPT +%s to allow.", + user->nick.c_str())); dat->lastnotify = now; } return MOD_RES_DENY; @@ -439,6 +427,12 @@ public: tracknick = tag->getBool("tracknick"); notify_cooldown = tag->getInt("cooldown", 60); } + + void Prioritize() CXX11_OVERRIDE + { + // Want to be after modules like silence or services_account + ServerInstance->Modules->SetPriority(this, I_OnUserPreMessage, PRIORITY_LAST); + } }; MODULE_INIT(ModuleCallerID)