protected virtual async Task OnDedicatedExited(SpringBattleContext springBattleContext)
        {
            StopVote();
            IsInGame     = false;
            RunningSince = null;

            var debriefingMessage = BattleResultHandler.SubmitSpringBattleResult(springBattleContext, server);

            Debriefings.Add(debriefingMessage);

            await server.Broadcast(Users.Keys, debriefingMessage);

            await server.Broadcast(server.ConnectedUsers.Keys, new BattleUpdate()
            {
                Header = GetHeader()
            });

            foreach (var s in toNotify)
            {
                await
                server.GhostSay(new Say()
                {
                    User       = GlobalConst.NightwatchName,
                    Text       = $"** {FounderName} 's {Title} just ended, join me! **",
                    Target     = s,
                    IsEmote    = true,
                    Place      = SayPlace.User,
                    Ring       = true,
                    AllowRelay = false
                });
            }

            toNotify.Clear();
            await CheckCloseBattle();
        }
        protected virtual async Task OnDedicatedExited(SpringBattleContext springBattleContext)
        {
            StopVote();
            IsInGame     = false;
            RunningSince = null;
            EndedSince   = DateTime.UtcNow;

            var debriefingMessage = BattleResultHandler.SubmitSpringBattleResult(springBattleContext, server);

            Debriefings.Add(debriefingMessage);

            await server.Broadcast(Users.Keys, debriefingMessage);

            await server.Broadcast(server.ConnectedUsers.Keys, new BattleUpdate()
            {
                Header = GetHeader()
            });

            foreach (var s in toNotify)
            {
                await
                server.GhostSay(new Say()
                {
                    User       = GlobalConst.NightwatchName,
                    Text       = $"** {FounderName} 's {Title} just ended, join me! **",
                    Target     = s,
                    IsEmote    = true,
                    Place      = SayPlace.User,
                    Ring       = true,
                    AllowRelay = false
                });
            }

            toNotify.Clear();

            var playingEligibleUsers = server.MatchMaker.GetEligibleQuickJoinPlayers(Users.Values.Where(x => !x.LobbyUser.IsAway && !x.IsSpectator).Select(x => server.ConnectedUsers[x.Name]).ToList());

            if (playingEligibleUsers.Count() >= InviteMMPlayers)   //Make sure there are enough eligible users for a battle to be likely to happen

            //put all users into MM queue to suggest battles
            {
                var teamsQueues    = server.MatchMaker.PossibleQueues.Where(x => x.Mode == AutohostMode.Teams).ToList();
                var availableUsers = Users.Values.Where(x => !x.LobbyUser.IsAway).Select(x => server.ConnectedUsers[x.Name]).ToList();
                await server.MatchMaker.MassJoin(availableUsers, teamsQueues);
            }


            if (IsAutohost)
            {
                await RunCommandDirectly <CmdMap>(null);

                discussionTimer.Interval = (DiscussionTime + 1) * 1000;
                discussionTimer.Start();
            }
            await CheckCloseBattle();
        }
        protected virtual async Task OnDedicatedExited(SpringBattleContext springBattleContext)
        {
            StopVote();
            IsInGame        = false;
            RunningSince    = null;
            BlockPollsUntil = DateTime.UtcNow.AddSeconds(DiscussionSeconds);

            bool result = BattleResultHandler.SubmitSpringBattleResult(springBattleContext, server, (debriefing) =>
            {
                Debriefings.Add(debriefing);
                server.Broadcast(springBattleContext.ActualPlayers.Select(x => x.Name), debriefing);
                Trace.TraceInformation("Battle ended: Sent out debriefings for B" + debriefing.ServerBattleID);
            });

            await server.Broadcast(server.ConnectedUsers.Keys, new BattleUpdate()
            {
                Header = GetHeader()
            });

            foreach (var s in toNotify)
            {
                await
                server.GhostSay(new Say()
                {
                    User       = GlobalConst.NightwatchName,
                    Text       = $"** {FounderName} 's {Title} just ended, join me! **",
                    Target     = s,
                    IsEmote    = true,
                    Place      = SayPlace.User,
                    Ring       = true,
                    AllowRelay = false
                });
            }

            toNotify.Clear();

            var playingEligibleUsers = server.MatchMaker.GetEligibleQuickJoinPlayers(Users.Values.Where(x => !x.LobbyUser.IsAway && !x.IsSpectator && x.Name != null).Select(x => server.ConnectedUsers[x.Name]).ToList());

            if (playingEligibleUsers.Count() >= InviteMMPlayers)
            { //Make sure there are enough eligible users for a battle to be likely to happen
                //put all users into MM queue to suggest battles
                var teamsQueues    = server.MatchMaker.PossibleQueues.Where(x => x.Mode == AutohostMode.Teams).ToList();
                var availableUsers = Users.Values.Where(x => !x.LobbyUser.IsAway && x.Name != null).Select(x => server.ConnectedUsers[x.Name]).ToList();
                await server.MatchMaker.MassJoin(availableUsers, teamsQueues);

                DiscussionSeconds = MatchMaker.TimerSeconds + 2;
            }
            else
            {
                DiscussionSeconds = 5;
            }
            BlockPollsUntil = DateTime.UtcNow.AddSeconds(DiscussionSeconds);


            if (IsAutohost || (!Users.ContainsKey(FounderName) || Users[FounderName].LobbyUser?.IsAway == true) && Mode != AutohostMode.None && Mode != AutohostMode.Planetwars && !IsPassworded)
            {
                if (!result)
                {
                    //Game was aborted/exited/invalid, allow manual commands
                    BlockPollsUntil = DateTime.UtcNow;
                }
                else
                {
                    //Initiate discussion time, then map vote, then start vote
                    discussionTimer.Interval = (DiscussionSeconds - 1) * 1000;
                    discussionTimer.Start();
                }
            }
            await CheckCloseBattle();
        }