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
|
2020-04-22 20:28:51 +00:00
|
|
|
|
{
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-04-22 20:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
}
|