about summary refs log tree commit diff
path: root/IrcStates/ISupport.cs
blob: f481f5f7fbd3bd795b9240209eda400f9a3c4de6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// ReSharper disable InconsistentNaming

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;

namespace IrcStates
{
    public class ISupport
    {
        public ISupport()
        {
            Raw         = new Dictionary<string, string>();
            Modes       = 3;
            CaseMapping = Casemap.CaseMapping.Rfc1459;
            Prefix      = new ISupportPrefix("(ov)@+");
            ChanModes   = new ISupportChanModes("b,k,l,imnpst");
            ChanTypes   = new List<string> {"#"};
            StatusMsg   = new List<string>();
            Whox        = false;
        }

        public Dictionary<string, string> Raw { get; set; }
        public string Network { get; set; }
        public ISupportChanModes ChanModes { get; set; }
        public ISupportPrefix Prefix { get; set; }
        public int? Modes { get; set; }
        public Casemap.CaseMapping CaseMapping { get; set; }
        public List<string> ChanTypes { get; set; }
        public List<string> StatusMsg { get; set; }
        public string CallerId { get; set; }
        public string Excepts { get; set; }
        public string Invex { get; set; }
        public int? Monitor { get; set; }
        public int? Watch { get; set; }
        public bool Whox { get; set; }

        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;
                }
            }
        }
    }
}