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)); }
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, })); }