X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_callerid.cpp;h=149767f1821cd58ebff5a72b20ceb0828c787d60;hb=da29af8cba49d51e53d6e68237ccbf6370b6dd1f;hp=c861b7687a97f9e810475ec367ca364b47190f9e;hpb=bfc85ec4300d32fe164794ad2247fc0c3bd6050d;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_callerid.cpp b/src/modules/m_callerid.cpp index c861b7687..149767f18 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,7 +140,7 @@ struct CallerIDExtInfo : public ExtensionItem continue; // shouldn't happen, but oh well. } - if (!stdalgo::erase(targ->wholistsme, dat)) + if (!stdalgo::vector::swaperase(targ->wholistsme, dat)) ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "ERROR: Inconsistency detected in callerid state, please report (2)"); } delete dat; @@ -167,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); @@ -221,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; } @@ -264,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) @@ -276,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; } @@ -299,12 +303,12 @@ 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; } 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; } @@ -317,7 +321,7 @@ public: return false; } - if (!stdalgo::erase(dat2->wholistsme, dat)) + if (!stdalgo::vector::swaperase(dat2->wholistsme, dat)) ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "ERROR: Inconsistency detected in callerid state, please report (4)"); @@ -347,7 +351,7 @@ 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); @@ -391,10 +395,10 @@ public: { 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()); + user->WriteNumeric(RPL_TARGNOTIFY, dest->nick, "has been informed that you messaged them."); 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()); dat->lastnotify = now; @@ -423,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)