예제 #1
0
        public void Listen()
        {
            Console.WriteLine("Starting...");
            socket = new TcpListener(ServerAddress, ServerPort);
            socket.Start();

            var server = new Data.Server
            {
                IP           = ServerAddress.ToString(),
                CurrentUsers = 0,
                MaxUsers     = MaxConnections,
                Enabled      = true,
            };

            UnitOfWork.Servers.Add(server);
            UnitOfWork.SaveChanges();

            Console.WriteLine("Server is listening for new connections");

            while (!cancelTokenSource.IsCancellationRequested)
            {
                Thread.Sleep(200);
                if (socket.Pending())
                {
                    var tcpClient = socket.AcceptTcpClient();
                    Task.Factory.StartNew(AcceptClient, tcpClient, TaskCreationOptions.LongRunning);
                }
            }

            server = UnitOfWork.Servers.Find(ServerAddress.ToString());
            UnitOfWork.Servers.Remove(server);
            UnitOfWork.SaveChanges();

            Console.WriteLine("Server has received a request to shut down");
            socket.Stop();
            Clients.ForEach(c => Network.Disconnect(c.Client));
        }
예제 #2
0
        public IHttpActionResult Login(LoginModel model)
        {
            model = model ?? new LoginModel();
            if (model.Username == null || model.Password == null)
            {
                return(BadRequest(ErrorCodes.InvalidLogin.ToString()));
            }

            // Authenticate user
            byte[] passwordBytes = Encoding.UTF8.GetBytes(model.Password);
            var    password      = Convert.ToBase64String(new SHA256Managed().ComputeHash(passwordBytes));

            var user = unitOfWork.Users.Query()
                       .Where(u => u.Username == model.Username)
                       .Where(u => u.Password == password)
                       .SingleOrDefault();

            if (user == null)
            {
                return(BadRequest(ErrorCodes.InvalidLogin.ToString()));
            }

            if (user.LoginToken != null)
            {
                user.LoginToken.Server.CurrentUsers -= 1;
                unitOfWork.Servers.Update(user.LoginToken.Server);

                unitOfWork.LoginTokens.Remove(user.LoginToken);
            }

            // Determine optimal world server
            var server = unitOfWork.Servers.Query()
                         .Where(s => s.Enabled)
                         .Where(s => s.CurrentUsers < s.MaxUsers)
                         .OrderBy(s => s.CurrentUsers)
                         .FirstOrDefault();

            if (server == null)
            {
                return(Content(System.Net.HttpStatusCode.ServiceUnavailable, ErrorCodes.NoGameServersAvailable.ToString()));
            }

            // Generate login token
            var token = new LoginToken
            {
                Id        = Guid.NewGuid(),
                User      = user,
                LoginTime = DateTime.UtcNow,
                Server    = server,
            };

            unitOfWork.LoginTokens.Add(token);

            server.CurrentUsers += 1;
            unitOfWork.Servers.Update(server);

            user.LastLogin = DateTime.UtcNow;
            unitOfWork.Users.Update(user);

            unitOfWork.SaveChanges();

            // Send success message with token info to user
            return(Ok(new LoginResultModel
            {
                Success = true,
                Token = token.Id,
                ServerIP = server.IP,
            }));
        }