chatsharp/ChatSharp/Handlers/ServerHandlers.cs

119 lines
5.4 KiB
C#

using ChatSharp.Events;
using System.Linq;
namespace ChatSharp.Handlers
{
internal static class ServerHandlers
{
public static void HandleISupport(IrcClient client, IrcMessage message)
{
if (client.ServerInfo == null)
client.ServerInfo = new ServerInfo();
foreach (var item in message.Parameters)
{
string key, value;
if (!item.Contains("="))
{
key = item;
value = null;
}
else
{
key = item.Remove(item.IndexOf('='));
value = item.Substring(item.IndexOf('=') + 1);
}
// TODO: Consider doing this differently
// TODO: Allow users to specify other things to handle
if (!string.IsNullOrEmpty(value))
{
switch (key.ToUpper())
{
case "PREFIX":
var modes = value.Substring(1, value.IndexOf(')') - 1);
var prefixes = value.Substring(value.IndexOf(')') + 1);
client.ServerInfo.Prefixes = new[] {modes, prefixes};
break;
case "CHANTYPES":
client.ServerInfo.ChannelTypes = value.ToCharArray();
break;
case "CHANMODES":
var chanModeGroups = value.Split(',');
client.ServerInfo.SupportedChannelModes.ChannelLists = chanModeGroups[0];
client.ServerInfo.SupportedChannelModes.ParameterizedSettings = chanModeGroups[1];
client.ServerInfo.SupportedChannelModes.OptionallyParameterizedSettings = chanModeGroups[2];
client.ServerInfo.SupportedChannelModes.Settings = chanModeGroups[3];
break;
case "MODES":
client.ServerInfo.MaxModesPerCommand = int.Parse(value);
break;
case "MAXCHANNELS": // TODO: CHANLIMIT
client.ServerInfo.MaxChannelsPerUser = int.Parse(value);
break;
case "NICKLEN":
client.ServerInfo.MaxNickLength = int.Parse(value);
break;
case "MAXLIST":
var limits = value.Split(',');
client.ServerInfo.ModeListLimits = new ServerInfo.ModeListLimit[limits.Length];
for (int i = 0; i < limits.Length; i++)
{
var limitedModes = limits[i].Remove(limits[i].IndexOf(':'));
var limit = int.Parse(limits[i].Substring(limits[i].IndexOf(':') + 1));
foreach (var mode in limitedModes)
client.ServerInfo.ModeListLimits[i] = new ServerInfo.ModeListLimit(mode, limit);
}
break;
case "NETWORK":
client.ServerInfo.NetworkName = value;
break;
case "EXCEPTS":
client.ServerInfo.SupportsBanExceptions = value[0];
break;
case "INVEX":
client.ServerInfo.SupportsInviteExceptions = value[0];
break;
case "TOPICLEN":
client.ServerInfo.MaxTopicLength = int.Parse(value);
break;
case "KICKLEN":
client.ServerInfo.MaxKickCommentLength = int.Parse(value);
break;
case "CHANNELLEN":
client.ServerInfo.MaxChannelNameLength = int.Parse(value);
break;
case "AWAYLEN":
client.ServerInfo.MaxAwayLength = int.Parse(value);
break;
}
}
else
{
switch (key.ToUpper())
{
case "WHOX":
client.ServerInfo.ExtendedWho = true;
break;
}
}
}
client.OnServerInfoReceived(new SupportsEventArgs(client.ServerInfo));
}
public static void HandleMyInfo(IrcClient client, IrcMessage message)
{
// 004 sendak.freenode.net ircd-seven-1.1.3 DOQRSZaghilopswz CFILMPQbcefgijklmnopqrstvz bkloveqjfI
// TODO: Figure out how to properly handle this message
if (client.ServerInfo == null)
client.ServerInfo = new ServerInfo();
if (message.Parameters.Length >= 5)
{
foreach (var c in message.Parameters[4])
{
if (!client.ServerInfo.SupportedChannelModes.ChannelUserModes.Contains(c))
client.ServerInfo.SupportedChannelModes.ChannelUserModes += c.ToString();
}
}
}
}
}