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 Raw { get; } = new Dictionary(); 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 ChanTypes { get; private set; } = new List { "#" }; public List StatusMsg { get; private set; } = new List(); 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; } /// /// Parse the ISupport values from the line's parameters /// /// public void Parse(IEnumerable 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(); 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(); 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; } } } } }