public void Handler(object sender, ReceivedCommandEventArgs e)
{
if (e.Arguments.Length < 1)
{
e.User.ErrorNeedMoreParams(CMD);
return;
}
string nickname = e.Arguments[0];
if (e.User.Mask.Nickname != "*")
{
e.User.ErrorAlreadyRegistered(CMD);
return;
}
if (!e.User.ValidateNickname(nickname))
{
// ValidateNickname will send the numeric.
return;
}
if (e.Server.IsQLined(nickname))
{
e.User.SendNumeric(Numerics.ERR_NICKCOLLISION, nickname, ":That nickname is invalid.");
return;
}
string id = nickname.ToLower();
if (e.Server.UsersById.ContainsKey(id))
{
e.User.SendNumeric(Numerics.ERR_NICKNAMEINUSE, nickname, ":That nickname is already in use.");
return;
}
if (e.User.Level != Authorizations.Connecting)
{
e.User.BroadcastInclusive("NICK", e.User.Mask.Nickname, nickname);
e.User.Mask.Nickname = nickname;
e.Server.UsersById.Remove(e.User.Id);
e.User.Id = id;
e.Server.UsersById.Add(e.User.Id, e.User);
}
else
{
foreach (ChannelBase c in e.User.Channels.Values)
{
if (!e.User.CanSendToChannel(c, true, "change your nickname"))
{
return;
}
}
e.User.Mask.Nickname = nickname;
e.User.Id = id;
if (e.User.HasSessionFlag("PassedUser") && !e.User.HasSessionFlag("WaitForCap"))
{
e.User.ClearSessionFlag("PassedUser");
e.User.OnConnected();
}
else
{
e.User.SetSessionFlag("PassedNick");
}
}
}