private static async Task Main(string[] args) { await OpenConfig(); await using (var ctx = new NovaContext()) { await ctx.EnsureUpdatedAsync(); foreach (var specification in ctx.Specifications) { ctx.Specifications.Remove(specification); } foreach (var request in ctx.WorldServerRequests) { ctx.WorldServerRequests.Remove(request); } await ctx.SaveChangesAsync(); } await StartAuthentication(); await StartCharacter(); Console.CancelKeyPress += ShutdownProcesses; AppDomain.CurrentDomain.ProcessExit += ShutdownProcesses; await HandleRequests(); }
public async Task Start() { await using var ctx = new NovaContext(); await ctx.EnsureUpdatedAsync(); _server.Start(); RegisterAssembly(typeof(Server).Assembly); RegisterAssembly(Assembly.GetEntryAssembly()); _server.NewConnection += point => { var connection = new Connection(point, _server); Connections.Add(connection); OnConnection?.Invoke(connection); }; _server.Disconnection += point => { var connection = Connections.FirstOrDefault(c => c.EndPoint.Equals(point)); if (connection == default) { return; } Connections.Remove(connection); OnDisconnect?.Invoke(connection); }; _server.PacketReceived += (point, bytes) => { var connection = Connections.FirstOrDefault(c => c.EndPoint.Equals(point)); if (connection == default) { Logger.Warning($"{point} is not connected but we still got data from them!"); return; } using var stream = new MemoryStream(bytes); using var reader = new BitReader(stream); var id = (MessageIdentifiers)reader.Read <byte>(); if (id != MessageIdentifiers.UserPacketEnum) { Logger.Error($"Invalid packet: {id}"); return; } HandlePacket(reader, connection); reader.BaseStream.Position = 0; OnPacket?.Invoke(connection, reader); }; var request = ctx.WorldServerRequests.FirstOrDefault(w => w.SpecificationId == Id); if (request != default) { Logger.Information($"Request found for {Id}"); request.State = WorldServerRequestState.Complete; await ctx.SaveChangesAsync(); } await ctx.DisposeAsync(); while (true) { var command = Console.ReadLine(); } }