예제 #1
0
        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();
        }
예제 #2
0
        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();
            }
        }