diff options
author | Ben Harris <ben@tilde.team> | 2020-05-06 21:27:36 -0400 |
---|---|---|
committer | Ben Harris <ben@tilde.team> | 2020-05-06 21:27:36 -0400 |
commit | f6f3e7e0c535aaf3627f815dd63970aec6c73f75 (patch) | |
tree | 54b7790cb6ebcc26e02d97f24ae8d09fc67163de /IrcStates/Server.cs | |
parent | 0117d9d9a0a395166e15c0996f87af823928d011 (diff) |
start impl
Diffstat (limited to 'IrcStates/Server.cs')
-rw-r--r-- | IrcStates/Server.cs | 80 |
1 files changed, 72 insertions, 8 deletions
diff --git a/IrcStates/Server.cs b/IrcStates/Server.cs index 7199668..1d4f90f 100644 --- a/IrcStates/Server.cs +++ b/IrcStates/Server.cs @@ -1,6 +1,9 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; +using System.Reflection; +using System.Reflection.Metadata.Ecma335; using IrcTokens; namespace IrcStates @@ -10,8 +13,6 @@ namespace IrcStates public const string WhoType = "525"; // randomly generated private readonly StatefulDecoder _decoder; - public Dictionary<string, List<Func<string, Line, Emit>>> LineHandlers; - private Dictionary<string, string> TempCaps; public Server(string name) @@ -21,7 +22,6 @@ namespace IrcStates Modes = new List<string>(); Motd = new List<string>(); _decoder = new StatefulDecoder(); - LineHandlers = new Dictionary<string, List<Func<string, Line, Emit>>>(); Users = new Dictionary<string, User>(); Channels = new Dictionary<string, Channel>(); ISupport = new ISupport(); @@ -29,6 +29,12 @@ namespace IrcStates TempCaps = new Dictionary<string, string>(); AvailableCaps = new Dictionary<string, string>(); AgreedCaps = new List<string>(); + RegisterHandlersByAttribute(); + } + + private void RegisterHandlersByAttribute() + { + throw new NotImplementedException(); } public string Name { get; set; } @@ -51,6 +57,9 @@ namespace IrcStates public ISupport ISupport { get; set; } public bool HasCap { get; set; } + public delegate Emit MessageHandler(Server server, Line line); + private Dictionary<string, List<MessageHandler>> Handlers { get; set; } + public override string ToString() { return $"Server(name={Name})"; @@ -58,20 +67,21 @@ namespace IrcStates public List<(Line, Emit)> Recv(byte[] data) { + if (data == null) return null; + var lines = _decoder.Push(data, data.Length); if (lines == null) throw new ServerDisconnectedException(); - var emits = lines.Select(ParseTokens).ToList(); - return null; + return lines.Select(l => (l, ParseTokens(l))).ToList(); } public Emit ParseTokens(Line line) { - if (line != null && !LineHandlers.ContainsKey(line.Command)) return null; + if (line == null || !Handlers.ContainsKey(line.Command)) return null; var ret = new Emit(); - var handlers = LineHandlers[line.Command] - .Select(callback => callback(line.Command, line)) + var handlers = Handlers[line.Command] + .Select(callback => callback(this, line)) .Where(emit => emit != null); foreach (var emit in handlers) @@ -87,5 +97,59 @@ namespace IrcStates { return Casemap.CaseFold(ISupport.CaseMapping, str); } + + public bool CaseFoldEquals(string s1, string s2) + { + return CaseFold(s1) == CaseFold(s2); + } + + public bool IsMe(string nickname) + { + return CaseFold(nickname) == NickNameLower; + } + + public bool HasUser(string nickname) + { + return Users.ContainsKey(CaseFold(nickname)); + } + + private void AddUser(string nickname, string nicknameLower) + { + var user = CreateUser(nickname, nicknameLower); + Users[nicknameLower] = user; + } + + private User CreateUser(string nickname, string nicknameLower) + { + var user = new User(); + user.SetNickName(nickname, nicknameLower); + return user; + } + + public bool IsChannel(string target) + { + return !string.IsNullOrEmpty(target) && + ISupport.ChanTypes.Contains(target[0].ToString(CultureInfo.InvariantCulture)); + } + + public bool HasChannel(string name) + { + return Channels.ContainsKey(CaseFold(name)); + } + + public Channel GetChannel(string name) + { + return HasChannel(name) ? Channels[name] : null; + } + + [Handles(Numeric.RPL_WELCOME)] + private Emit HandleWelcome(Line line) + { + NickName = line.Params[0]; + NickNameLower = CaseFold(line.Params[0]); + Registered = true; + return new Emit(); + } + } } |