ircsharp/IRCStates/ISupport.cs

108 lines
4.3 KiB
C#
Raw Permalink Normal View History

2024-04-19 23:34:36 +00:00
using System;
2020-05-06 06:04:00 +00:00
using System.Collections.Generic;
using System.Globalization;
2020-05-14 03:34:33 +00:00
using System.Linq;
2020-05-06 06:04:00 +00:00
2024-04-19 23:34:36 +00:00
// ReSharper disable InconsistentNaming
// ReSharper disable StringLiteralTypo
2020-05-15 03:06:10 +00:00
namespace IRCStates
{
public class ISupport
{
2023-11-07 22:54:58 +00:00
public Dictionary<string, string> Raw { get; } = new Dictionary<string, string>();
2020-05-17 02:08:40 +00:00
public string Network { get; private set; }
2023-11-07 22:54:58 +00:00
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;
2024-04-19 23:34:36 +00:00
public List<string> ChanTypes { get; private set; } = new List<string> { "#" };
2023-11-07 22:54:58 +00:00
public List<string> StatusMsg { get; private set; } = new List<string>();
2020-05-17 02:08:40 +00:00
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; }
2020-05-06 06:04:00 +00:00
2020-05-17 02:08:40 +00:00
/// <summary>
/// Parse the ISupport values from the line's parameters
/// </summary>
/// <param name="tokens"></param>
2020-05-13 18:21:49 +00:00
public void Parse(IEnumerable<string> tokens)
2020-05-06 06:04:00 +00:00
{
2020-05-13 18:21:49 +00:00
if (tokens == null) return;
2020-05-14 06:10:04 +00:00
2020-05-14 03:34:33 +00:00
// remove first and last
tokens = tokens.Skip(1).SkipLast(1);
2020-05-06 06:04:00 +00:00
foreach (var token in tokens)
{
var split = token.Split('=', 2);
var key = split[0];
2020-05-14 21:13:46 +00:00
var value = string.Empty;
if (split.Length > 1)
{
2020-05-15 03:50:06 +00:00
value = split[1];
2020-05-14 21:13:46 +00:00
Raw[key] = value;
}
2020-05-15 03:50:06 +00:00
2020-05-06 06:04:00 +00:00
switch (split[0])
{
case "NETWORK":
Network = value;
break;
case "CHANMODES":
ChanModes = new ISupportChanModes(value);
break;
case "PREFIX":
Prefix = new ISupportPrefix(value);
break;
case "STATUSMSG":
2020-05-14 21:13:46 +00:00
StatusMsg = new List<string>();
StatusMsg.AddRange(value.Select(c => c.ToString(CultureInfo.InvariantCulture)));
2020-05-06 06:04:00 +00:00
break;
case "MODES":
2020-05-14 23:29:01 +00:00
if (int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var modes))
Modes = modes;
else
Modes = -1;
2020-05-06 06:04:00 +00:00
break;
case "MONITOR":
2020-05-14 23:29:01 +00:00
if (int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var monitor))
Monitor = monitor;
else
Monitor = -1;
2020-05-06 06:04:00 +00:00
break;
case "WATCH":
2020-05-14 23:29:01 +00:00
if (int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var watch))
Watch = watch;
else
Watch = -1;
2020-05-06 06:04:00 +00:00
break;
case "CASEMAPPING":
2020-05-14 06:10:04 +00:00
if (Enum.TryParse(value, true, out Casemap.CaseMapping caseMapping)) CaseMapping = caseMapping;
2020-05-06 06:04:00 +00:00
break;
case "CHANTYPES":
2020-05-14 21:13:46 +00:00
ChanTypes = new List<string>();
ChanTypes.AddRange(value.Select(c => c.ToString(CultureInfo.InvariantCulture)));
2020-05-06 06:04:00 +00:00
break;
case "CALLERID":
2020-05-14 21:13:46 +00:00
CallerId = string.IsNullOrEmpty(value) ? "g" : value;
2020-05-06 06:04:00 +00:00
break;
case "EXCEPTS":
2020-05-14 21:13:46 +00:00
Excepts = string.IsNullOrEmpty(value) ? "e" : value;
2020-05-06 06:04:00 +00:00
break;
case "INVEX":
2020-05-14 21:13:46 +00:00
Invex = string.IsNullOrEmpty(value) ? "I" : value;
2020-05-06 06:04:00 +00:00
break;
case "WHOX":
Whox = true;
break;
}
}
}
}
}