public async Task <bool> StartGame()
        {
            var context = GetContext();

            if (Mode != AutohostMode.None)
            {
                var balance = Balancer.BalanceTeams(context, true, null, null);
                if (!IsNullOrEmpty(balance.Message))
                {
                    await SayBattle(balance.Message);
                }
                if (!balance.CanStart)
                {
                    return(false);
                }
                context.ApplyBalance(balance);
            }

            var startSetup = StartSetup.GetDedicatedServerStartSetup(context);

            if (!await EnsureEngineIsPresent())
            {
                return(false);
            }

            if (IsInGame || spring.IsRunning)
            {
                await SayBattle("Game already running");

                return(false);
            }
            spring.HostGame(startSetup, hostingIp, hostingPort);
            IsInGame     = true;
            RunningSince = DateTime.UtcNow;
            foreach (var us in Users.Values)
            {
                if (us != null)
                {
                    ConnectedUser user;
                    if (server.ConnectedUsers.TryGetValue(us.Name, out user))
                    {
                        await user.SendCommand(GetConnectSpringStructure(us.ScriptPassword));
                    }
                }
            }
            await server.Broadcast(server.ConnectedUsers.Values, new BattleUpdate()
            {
                Header = GetHeader()
            });

            // remove all from MM
            await Task.WhenAll(startSetup.Players.Where(x => !x.IsSpectator).Select(x => server.MatchMaker.RemoveUser(x.Name, false)));

            await server.MatchMaker.UpdateAllPlayerStatuses();

            return(true);
        }
        public async Task <bool> RunServerBalance(bool isGameStart, int?allyTeams, bool?clanWise)
        {
            try
            {
                var context = GetContext();
                context.Mode = Mode;
                var balance = Balancer.BalanceTeams(context, isGameStart, allyTeams, clanWise);
                await ApplyBalanceResults(balance);

                return(balance.CanStart);
            }
            catch (Exception ex)
            {
                Trace.TraceError(ex.ToString());
                return(false);
            }
        }
 public BalanceTeamsResult BalanceTeams(BattleContext context, bool isGameStart, int?allyCount, bool?clanWise)
 {
     return(Balancer.BalanceTeams(context, isGameStart, allyCount, clanWise));
 }