ircsharp/IRCStates/ISupport.cs

108 lines
4.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
// ReSharper disable InconsistentNaming
// ReSharper disable StringLiteralTypo
namespace IRCStates
{
public class ISupport
{
public Dictionary<string, string> Raw { get; } = new Dictionary<string, string>();
public string Network { get; private set; }
public ISupportChanModes ChanModes { get; private set; } = new ISupportChanModes("b,k,l,imnpst");
public ISupportPrefix Prefix { get; private set; } = new ISupportPrefix("(ov)@+");
public int? Modes { get; private set; } = 3;
public Casemap.CaseMapping CaseMapping { get; private set; } = Casemap.CaseMapping.Rfc1459;
public List<string> ChanTypes { get; private set; } = new List<string> { "#" };
public List<string> StatusMsg { get; private set; } = new List<string>();
public string CallerId { get; private set; }
public string Excepts { get; private set; }
public string Invex { get; private set; }
public int? Monitor { get; private set; }
public int? Watch { get; private set; }
public bool Whox { get; private set; }
/// <summary>
/// Parse the ISupport values from the line's parameters
/// </summary>
/// <param name="tokens"></param>
public void Parse(IEnumerable<string> tokens)
{
if (tokens == null) return;
// remove first and last
tokens = tokens.Skip(1).SkipLast(1);
foreach (var token in tokens)
{
var split = token.Split('=', 2);
var key = split[0];
var value = string.Empty;
if (split.Length > 1)
{
value = split[1];
Raw[key] = value;
}
switch (split[0])
{
case "NETWORK":
Network = value;
break;
case "CHANMODES":
ChanModes = new ISupportChanModes(value);
break;
case "PREFIX":
Prefix = new ISupportPrefix(value);
break;
case "STATUSMSG":
StatusMsg = new List<string>();
StatusMsg.AddRange(value.Select(c => c.ToString(CultureInfo.InvariantCulture)));
break;
case "MODES":
if (int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var modes))
Modes = modes;
else
Modes = -1;
break;
case "MONITOR":
if (int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var monitor))
Monitor = monitor;
else
Monitor = -1;
break;
case "WATCH":
if (int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var watch))
Watch = watch;
else
Watch = -1;
break;
case "CASEMAPPING":
if (Enum.TryParse(value, true, out Casemap.CaseMapping caseMapping)) CaseMapping = caseMapping;
break;
case "CHANTYPES":
ChanTypes = new List<string>();
ChanTypes.AddRange(value.Select(c => c.ToString(CultureInfo.InvariantCulture)));
break;
case "CALLERID":
CallerId = string.IsNullOrEmpty(value) ? "g" : value;
break;
case "EXCEPTS":
Excepts = string.IsNullOrEmpty(value) ? "e" : value;
break;
case "INVEX":
Invex = string.IsNullOrEmpty(value) ? "I" : value;
break;
case "WHOX":
Whox = true;
break;
}
}
}
}
}