about summary refs log tree commit diff
path: root/IrcStates/ISupport.cs
diff options
context:
space:
mode:
Diffstat (limited to 'IrcStates/ISupport.cs')
-rw-r--r--IrcStates/ISupport.cs81
1 files changed, 81 insertions, 0 deletions
diff --git a/IrcStates/ISupport.cs b/IrcStates/ISupport.cs
index bfee9ee..b9ad502 100644
--- a/IrcStates/ISupport.cs
+++ b/IrcStates/ISupport.cs
@@ -1,8 +1,89 @@
 // ReSharper disable InconsistentNaming
 
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+
 namespace IrcStates
 {
     public class ISupport
     {
+        public ISupport()
+        {
+            Raw         = new Dictionary<string, string>();
+            Modes       = 3;
+            CaseMapping = Casemap.CaseMapping.Rfc1459;
+            // TODO: add remaining defaults, change properties to normal members as needed
+        }
+
+        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(IList<string> tokens)
+        {
+            foreach (var token in tokens)
+            {
+                var split = token.Split('=', 2);
+                var key   = split[0];
+                var value = split[1];
+
+                if (split.Length > 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> {value};
+                        break;
+                    case "MODES":
+                        Modes = int.Parse(value, NumberStyles.Integer, CultureInfo.InvariantCulture);
+                        break;
+                    case "MONITOR":
+                        Monitor = int.Parse(value, NumberStyles.Integer, CultureInfo.InvariantCulture);
+                        break;
+                    case "WATCH":
+                        Watch = int.Parse(value, NumberStyles.Integer, CultureInfo.InvariantCulture);
+                        break;
+                    case "CASEMAPPING":
+                        if (Enum.TryParse(value, true, out Casemap.CaseMapping caseMapping)) CaseMapping = caseMapping;
+                        break;
+                    case "CHANTYPES":
+                        ChanTypes = new List<string> {value};
+                        break;
+                    case "CALLERID":
+                        CallerId = string.IsNullOrEmpty(value) ? value : "g";
+                        break;
+                    case "EXCEPTS":
+                        Excepts = string.IsNullOrEmpty(value) ? value : "e";
+                        break;
+                    case "INVEX":
+                        Invex = string.IsNullOrEmpty(value) ? value : "I";
+                        break;
+                    case "WHOX":
+                        Whox = true;
+                        break;
+                }
+            }
+        }
     }
 }