* +------------------------------------+
*
* InspIRCd: (C) 2002-2009 InspIRCd Development Team
- * See: http://www.inspircd.org/wiki/index.php/Credits
+ * See: http://wiki.inspircd.org/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
{
public:
- CommandNicklock (InspIRCd* Instance) : Command(Instance,"NICKLOCK", "o", 2)
+ CommandNicklock (InspIRCd* Instance, Module* Creator) : Command(Instance, Creator,"NICKLOCK", "o", 2)
{
- this->source = "m_nicklock.so";
syntax = "<oldnick> <newnick>";
TRANSLATE3(TR_NICK, TR_TEXT, TR_END);
}
return CMD_FAILURE;
}
- if (target->GetExt("nick_locked"))
- {
- user->WriteNumeric(946, "%s %s :This user's nickname is already locked.",user->nick.c_str(),target->nick.c_str());
- return CMD_FAILURE;
- }
-
if (!ServerInstance->IsNick(parameters[1].c_str(), ServerInstance->Config->Limits.NickMax))
{
user->WriteServ("NOTICE %s :*** Invalid nickname '%s'", user->nick.c_str(), parameters[1].c_str());
return CMD_FAILURE;
}
+
+ user->WriteServ("947 %s %s :Nickname now locked.", user->nick.c_str(), parameters[1].c_str());
}
/* If we made it this far, extend the user */
- if (target)
+ if (target && IS_LOCAL(target))
{
+ // This has to be done *here*, because this metadata must be stored netwide.
target->Extend("nick_locked", "ON");
- ServerInstance->SNO->WriteToSnoMask('A', user->nick+" used NICKLOCK to change and hold "+target->nick+" to "+parameters[1]);
/* Only send out nick from local server */
- if (IS_LOCAL(target))
+ target->Extend("nick_locked");
+
+ std::string oldnick = target->nick;
+ if (target->ForceNickChange(parameters[1].c_str()))
+ ServerInstance->SNO->WriteGlobalSno('a', user->nick+" used NICKLOCK to change and hold "+oldnick+" to "+parameters[1]);
+ else
{
- std::string oldnick = user->nick;
std::string newnick = target->nick;
- if (!target->ForceNickChange(parameters[1].c_str()))
- {
- /* XXX: We failed, this *should* not happen but if it does
- * tell everybody. Note user is still nick locked on their old
- * nick instead.
- */
- ServerInstance->SNO->WriteToSnoMask('A', oldnick+" failed nickchange on NICKLOCK (from "+newnick+" to "+parameters[1]+") Locked to "+newnick+" instead");
- ServerInstance->PI->SendSNONotice("A", oldnick+" failed nickchange on NICKLOCK (from "+newnick+" to "+parameters[1]+") Locked to "+newnick+" instead");
- }
+ ServerInstance->SNO->WriteGlobalSno('a', user->nick+" used NICKLOCK, but "+oldnick+" failed nick change to "+parameters[1]+" and was locked to "+newnick+" instead");
}
}
- /* Route it */
return CMD_SUCCESS;
}
+
+ RouteDescriptor GetRouting(User* user, const std::vector<std::string>& parameters)
+ {
+ User* dest = ServerInstance->FindNick(parameters[0]);
+ if (dest)
+ return ROUTE_OPT_UCAST(dest->server);
+ return ROUTE_LOCALONLY;
+ }
};
/** Handle /NICKUNLOCK
class CommandNickunlock : public Command
{
public:
- CommandNickunlock (InspIRCd* Instance) : Command(Instance,"NICKUNLOCK", "o", 1)
+ CommandNickunlock (InspIRCd* Instance, Module* Creator) : Command(Instance, Creator,"NICKUNLOCK", "o", 1)
{
- this->source = "m_nicklock.so";
syntax = "<locked-nick>";
+ TRANSLATE2(TR_NICK, TR_END);
}
CmdResult Handle (const std::vector<std::string>& parameters, User *user)
user->WriteServ("NOTICE %s :*** No such nickname: '%s'", user->nick.c_str(), parameters[0].c_str());
return CMD_FAILURE;
}
+ }
- if (!target->GetExt("nick_locked"))
+ if (target && IS_LOCAL(target))
+ {
+ if (target->Shrink("nick_locked"))
+ {
+ ServerInstance->SNO->WriteGlobalSno('a', std::string(user->nick)+" used NICKUNLOCK on "+parameters[0]);
+ user->WriteNumeric(945, "%s %s :Nickname now unlocked.",user->nick.c_str(),target->nick.c_str());
+ }
+ else
{
user->WriteNumeric(946, "%s %s :This user's nickname is not locked.",user->nick.c_str(),target->nick.c_str());
return CMD_FAILURE;
}
}
- /* If we made it this far, the command is going out on the wire so send local snotice */
- ServerInstance->SNO->WriteToSnoMask('A', std::string(user->nick)+" used NICKUNLOCK on "+parameters[0]);
-
- if (target)
- {
- target->Shrink("nick_locked");
- if (IS_LOCAL(user))
- user->WriteNumeric(945, "%s %s :Nickname now unlocked.",user->nick.c_str(),target->nick.c_str());
- }
-
- /* Route it */
return CMD_SUCCESS;
}
+
+ RouteDescriptor GetRouting(User* user, const std::vector<std::string>& parameters)
+ {
+ User* dest = ServerInstance->FindNick(parameters[0]);
+ if (dest)
+ return ROUTE_OPT_UCAST(dest->server);
+ return ROUTE_LOCALONLY;
+ }
};
class ModuleNickLock : public Module
{
- CommandNicklock* cmd1;
- CommandNickunlock* cmd2;
- char* n;
+ CommandNicklock cmd1;
+ CommandNickunlock cmd2;
public:
ModuleNickLock(InspIRCd* Me)
- : Module(Me)
+ : Module(Me), cmd1(Me, this), cmd2(Me, this)
{
-
- cmd1 = new CommandNicklock(ServerInstance);
- cmd2 = new CommandNickunlock(ServerInstance);
- ServerInstance->AddCommand(cmd1);
- ServerInstance->AddCommand(cmd2);
+ ServerInstance->AddCommand(&cmd1);
+ ServerInstance->AddCommand(&cmd2);
Implementation eventlist[] = { I_OnUserPreNick, I_OnUserQuit, I_OnCleanup };
ServerInstance->Modules->Attach(eventlist, this, 3);
}
}
- virtual int OnUserPreNick(User* user, const std::string &newnick)
+ virtual ModResult OnUserPreNick(User* user, const std::string &newnick)
{
if (!IS_LOCAL(user))
- return 0;
+ return MOD_RES_PASSTHRU;
if (isdigit(newnick[0])) /* Allow a switch to a UID */
- return 0;
+ return MOD_RES_PASSTHRU;
if (user->GetExt("NICKForced")) /* Allow forced nick changes */
- return 0;
+ return MOD_RES_PASSTHRU;
- if (user->GetExt("nick_locked", n))
+ if (user->GetExt("nick_locked"))
{
user->WriteNumeric(447, "%s :You cannot change your nickname (your nick is locked)",user->nick.c_str());
- return 1;
+ return MOD_RES_DENY;
}
- return 0;
+ return MOD_RES_PASSTHRU;
}
virtual void OnUserQuit(User* user, const std::string &reason, const std::string &oper_message)