using System.Net.Sockets; using System.Net; using AscNet.Logging; namespace AscNet.GameServer { public class Server { public static Logger log; public readonly Dictionary Sessions = new(); private static Server? _instance; private readonly TcpListener listener; public static Server Instance { get { return _instance ??= new Server(); } } static Server() { // TODO: add loglevel based on appsettings LogLevel logLevel = LogLevel.DEBUG; LogLevel fileLogLevel = LogLevel.DEBUG; log = new(typeof(Server), logLevel, fileLogLevel); } public Server() { listener = new(IPAddress.Parse("0.0.0.0"), Common.Common.config.GameServer.Port); } public void Start() { while (true) { try { listener.Start(); log.Info($"{nameof(GameServer)} started and listening on port {Common.Common.config.GameServer.Port}"); while (true) { TcpClient tcpClient = listener.AcceptTcpClient(); string id = tcpClient.Client.RemoteEndPoint!.ToString()!; log.Warn($"{id} connected"); Sessions.Add(id, new Session(id, tcpClient)); } } catch (Exception ex) { log.Error("TCP listener error: " + ex.Message); log.Info("Waiting 3 seconds before restarting..."); Thread.Sleep(3000); } } } public Session? SessionFromUID(long uid) { return Sessions.Select(x => x.Value).FirstOrDefault(x => x.player.PlayerData.Id == uid); } } }