ircsharp/IrcStates/Server.cs

86 lines
2.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using IrcTokens;
namespace IrcStates
{
public class Server
{
private readonly StatefulDecoder _decoder;
public Dictionary<string, List<Func<string, Line, Emit>>> LineHandlers;
private Dictionary<string, string> TempCaps;
public Server(string name)
{
Name = name;
Registered = false;
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();
HasCap = false;
TempCaps = new Dictionary<string, string>();
AvailableCaps = new Dictionary<string, string>();
AgreedCaps = new List<string>();
}
public string Name { get; set; }
public string NickName { get; set; }
public string NickNameLower { get; set; }
public string UserName { get; set; }
public string HostName { get; set; }
public string RealName { get; set; }
public string Account { get; set; }
public string Away { get; set; }
public bool Registered { get; set; }
public List<string> Modes { get; set; }
public List<string> Motd { get; set; }
public Dictionary<string, User> Users { get; set; }
public Dictionary<string, Channel> Channels { get; set; }
public Dictionary<string, string> AvailableCaps { get; set; }
public List<string> AgreedCaps { get; set; }
public ISupport ISupport { get; set; }
public bool HasCap { get; set; }
public override string ToString()
{
return $"Server(name={Name})";
}
public List<(Line, Emit)> Recv(byte[] data)
{
var lines = _decoder.Push(data, data.Length);
if (lines == null) throw new ServerDisconnectedException();
var emits = lines.Select(ParseTokens).ToList();
return null;
}
public Emit ParseTokens(Line line)
{
if (line != null && !LineHandlers.ContainsKey(line.Command)) return null;
var ret = new Emit();
var handlers = LineHandlers[line.Command]
.Select(callback => callback(line.Command, line))
.Where(emit => emit != null);
foreach (var emit in handlers)
{
emit.Command = line.Command;
ret = emit;
}
return ret;
}
}
}