public void Handler(object sender, ReceivedCommandEventArgs e)
{
if (e.Arguments.Length < 1)
{
e.User.ErrorNeedMoreParams(CMD);
return;
}
string[] channels = e.Arguments[0].Split(',');
int key = 0;
for (int i = 0; i < channels.Length; i++)
{
try
{
ChannelBase channel = e.Server.GetChannel(channels[i]);
if (channel == null)
{
if (e.Server.GetRegisteredChannel(channels[i]) != null)
{
channel = e.Server.CreateChannel(channels[i], e.User);
}
else
{
e.User.SendNumeric(Numerics.ERR_NOSUCHCHANNEL, ":That channel does not exist. Did you mean to create/register a new channel? If so, use /cjoin " + channels[i] + " or /quote cjoin " + channels[i] + ".");
continue;
}
}
if (channel.HasFlag("RegisteredOnly") && e.User.Level < Authorizations.Registered)
{
e.User.SendNumeric(Numerics.ERR_NOLOGIN, ":Only registered users can join that channel.");
Forward(e, channel);
continue;
}
if (channel.Properties.ContainsKey("Key"))
{
if (e.Arguments.Length <= ++key)
{
e.User.SendNumeric(Numerics.ERR_KEYSET, CMD, channels[i], ":Key not specified for channel.");
Forward(e, channel);
continue;
}
else if (e.Arguments[key] != (string)channel.Properties["Key"])
{
e.User.SendNumeric(Numerics.ERR_BADCHANNELKEY, CMD, channels[i], ":Incorrect channel key specified.");
Forward(e, channel);
continue;
}
}
if (channel.HasFlag("InviteOnly"))
{
if (!e.User.HasSessionFlag("Invite:" + channel.Name)
&& !e.User.IsVoice(channel))
{
bool inviteExcept = false;
for (int m = 0; m < channel.InviteExcepts.Count; m++)
{
if (e.User.Mask.Matches(channel.InviteExcepts[m]))
{
inviteExcept = true;
break;
}
}
if (!inviteExcept)
{
e.User.SendNumeric(Numerics.ERR_INVITEONLYCHAN, CMD, channels[i], ":That channel is marked invite-only.");
Forward(e, channel);
continue;
}
}
}
if (!e.User.IsVoice(channel))
{
if (e.User.IsBanned(channel))
{
e.User.SendNumeric(Numerics.ERR_BANNEDFROMCHAN, channels[i], ":You are banned from that channel.");
Forward(e, channel);
continue;
}
}
if (!e.User.AddToChannel(channel))
{
e.User.SendNumeric(Numerics.ERR_USERONCHANNEL, e.User.Mask.Nickname, channel.Name, ":You are already on that channel.");
return;
}
OnJoin(channel, e.User);
}
catch (Exception ex)
{
e.User.SendNumeric(Numerics.ERR_UNKNOWNERROR, ":Error joining channel:", ex.Message);
}
}
}