/* $ModDesc: Implementation of callerid (umode +g & /accept, ala hybrid etc) */
-class callerid_data
+class callerid_data : public classbase
{
public:
time_t lastnotify;
void RemoveFromAllAccepts(InspIRCd* ServerInstance, User* who)
{
- for (user_hash::iterator i = ServerInstance->clientlist->begin(); i != ServerInstance->clientlist->end(); ++i)
+ for (user_hash::iterator i = ServerInstance->Users->clientlist->begin(); i != ServerInstance->Users->clientlist->end(); ++i)
{
callerid_data* dat = GetData(i->second, false);
if (!dat) continue;
public:
User_g(InspIRCd* Instance) : ModeHandler(Instance, 'g', 0, 0, false, MODETYPE_USER, false) { }
- ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding)
+ ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding, bool)
{
if (adding != dest->IsModeSet('g'))
{
* /accept nick1,nick2,nick3 *
* to add 3 nicks and then show your list
*/
- CmdResult Handle(const char** parameters, int pcnt, User* user)
+ CmdResult Handle(const char* const* parameters, int pcnt, User* user)
{
if (pcnt < 1)
{
}
else
{
- user->WriteServ("401 %s %s :No such nick/channel", user->nick, tok.c_str());
+ user->WriteNumeric(401, "%s %s :No such nick/channel", user->nick, tok.c_str());
}
}
}
{
for (std::set<User*>::iterator i = dat->accepting.begin(); i != dat->accepting.end(); ++i)
{
- user->WriteServ("281 %s %s", user->nick, (*i)->nick);
+ user->WriteNumeric(281, "%s %s", user->nick, (*i)->nick);
}
}
- user->WriteServ("282 %s :End of ACCEPT list", user->nick);
+ user->WriteNumeric(282, "%s :End of ACCEPT list", user->nick);
}
bool AddAccept(User* user, User* whotoadd, bool quiet)
std::set<User*>& accepting = dat->accepting;
if (accepting.size() >= maxaccepts)
{
- if (!quiet) user->WriteServ("456 %s :Accept list is full (limit is %d)", user->nick, maxaccepts);
+ if (!quiet) user->WriteNumeric(456, "%s :Accept list is full (limit is %d)", user->nick, maxaccepts);
return false;
}
if (!accepting.insert(whotoadd).second)
{
- if (!quiet) user->WriteServ("457 %s %s :is already on your accept list", user->nick, whotoadd->nick);
+ if (!quiet) user->WriteNumeric(457, "%s %s :is already on your accept list", user->nick, whotoadd->nick);
return false;
}
return true;
callerid_data* dat = GetData(user, false);
if (!dat)
{
- if (!quiet) user->WriteServ("458 %s %s :is not on your accept list", user->nick, whotoremove->nick);
+ if (!quiet) user->WriteNumeric(458, "%s %s :is not on your accept list", user->nick, whotoremove->nick);
return false;
}
std::set<User*>& accepting = dat->accepting;
std::set<User*>::iterator i = accepting.find(whotoremove);
if (i == accepting.end())
{
- if (!quiet) user->WriteServ("458 %s %s :is not on your accept list", user->nick, whotoremove->nick);
+ if (!quiet) user->WriteNumeric(458, "%s %s :is not on your accept list", user->nick, whotoremove->nick);
return false;
}
accepting.erase(i);
delete myumode;
throw new ModuleException("Could not add usermode and command!");
}
- 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_OnUserPreNick, I_OnUserQuit, I_On005Numeric, I_OnUserPreNotice, I_OnUserPreMessage, I_OnCleanup };
+ ServerInstance->Modules->Attach(eventlist, this, 7);
}
~ModuleCallerID()
{
- delete mycommand;
+ delete myumode;
}
Version GetVersion()
{
time_t now = time(NULL);
/* +g and *not* accepted */
- user->WriteServ("716 %s %s :is in +g mode (server-side ignore).", user->nick, dest->nick);
+ user->WriteNumeric(716, "%s %s :is in +g mode (server-side ignore).", user->nick, dest->nick);
if (now > (lastnotify + (time_t)notify_cooldown))
{
- user->WriteServ("717 %s %s :has been informed that you messaged them.", user->nick, dest->nick);
- dest->WriteServ("718 %s %s %s@%s :is messaging you, and you have umode +g", dest->nick, user->nick, user->ident, user->dhost);
+ user->WriteNumeric(717, "%s %s :has been informed that you messaged them.", user->nick, dest->nick);
+ dest->WriteNumeric(718, "%s %s %s@%s :is messaging you, and you have umode +g", dest->nick, user->nick, user->ident, user->dhost);
lastnotify = now;
}
return 1;
return 0;
}
+ void OnCleanup(int type, void* item)
+ {
+ if (type != TYPE_USER) return;
+ User* u = (User*)item;
+ /* Cleanup only happens on unload (before dtor), so keep this O(n) instead of O(n^2) which deferring to OnUserQuit would do. */
+ RemoveData(u);
+ }
+
int OnUserPreNick(User* user, const std::string& newnick)
{
if (!tracknick)
new_maxaccepts = 16;
break;
case CONF_NOT_A_NUMBER:
- if (user) user->WriteServ("NOTICE %s :Invalid maxaccepts value '%s', not a number", Conf.ReadValue("callerid", "maxaccepts", "", 0).c_str());
+ if (user) user->WriteServ("NOTICE %s :Invalid maxaccepts value '%s', not a number", user->nick, Conf.ReadValue("callerid", "maxaccepts", "", 0).c_str());
throw ModuleException("Invalid maxaccepts value, not a number");
case CONF_INT_NEGATIVE:
- if (user) user->WriteServ("NOTICE %s :Invalid maxaccepts value '%s', negative", Conf.ReadValue("callerid", "maxaccepts", "", 0).c_str());
+ if (user) user->WriteServ("NOTICE %s :Invalid maxaccepts value '%s', negative", user->nick, Conf.ReadValue("callerid", "maxaccepts", "", 0).c_str());
throw ModuleException("Invalid maxaccepts value, negative");
default:
/* Yikes */
new_cooldown = 16;
break;
case CONF_NOT_A_NUMBER:
- if (user) user->WriteServ("NOTICE %s :Invalid cooldown value '%s', not a number", Conf.ReadValue("callerid", "maxaccepts", "", 0).c_str());
+ if (user) user->WriteServ("NOTICE %s :Invalid cooldown value '%s', not a number", user->nick, Conf.ReadValue("callerid", "maxaccepts", "", 0).c_str());
throw ModuleException("Invalid cooldown value, not a number");
case CONF_INT_NEGATIVE:
- if (user) user->WriteServ("NOTICE %s :Invalid cooldown value '%s', negative", Conf.ReadValue("callerid", "maxaccepts", "", 0).c_str());
+ if (user) user->WriteServ("NOTICE %s :Invalid cooldown value '%s', negative", user->nick, Conf.ReadValue("callerid", "maxaccepts", "", 0).c_str());
throw ModuleException("Invalid cooldown value, negative");
default:
/* Yikes */
- throw ModuleException("Invalid maxaccepts value, unknown config error");
+ throw ModuleException("Invalid cooldown value, unknown config error");
}
maxaccepts = new_maxaccepts;
notify_cooldown = new_cooldown;