Esempio n. 1
0
        public Task GoBackAsync()
        {
            return(this.DoReadWriteActionOnCurrentTournamentAsync(
                       async currentTournament =>
            {
                bool sendMessage = true;
                switch (currentTournament.Stage)
                {
                case TournamentStage.SetRoundRobins:
                    currentTournament.TryClearReaders();
                    break;

                case TournamentStage.AddTeams:
                    currentTournament.RoundRobinsCount = 0;
                    break;

                case TournamentStage.AddPlayers:
                    currentTournament.TryClearTeams();
                    currentTournament.ClearSymbolsToTeam();

                    List <Task <IMessage> > getJoinTeamMessagesTasks = new List <Task <IMessage> >();
                    foreach (ulong id in currentTournament.JoinTeamMessageIds)
                    {
                        getJoinTeamMessagesTasks.Add(this.Context.Channel.GetMessageAsync(id));
                    }

                    IMessage[] joinTeamMessages = await Task.WhenAll(getJoinTeamMessagesTasks);
                    await Task.WhenAll(joinTeamMessages
                                       .Select(message => this.Context.Channel.DeleteMessageAsync(message)));

                    currentTournament.ClearJoinTeamMessageIds();
                    break;

                case TournamentStage.Rebracketing:
                    // Don't send the message about the tournament starting again
                    sendMessage = false;
                    break;

                default:
                    // Nothing to go back to, so do nothing.
                    this.Logger.Debug("Could not go back on stage {stage}", currentTournament.Stage);
                    await this.SendChannelMessage(BotStrings.CannotGoBack(currentTournament.Stage));
                    return;
                }

                TournamentStage previousStage = currentTournament.Stage == TournamentStage.Finals ?
                                                TournamentStage.RunningTournament :
                                                currentTournament.Stage - 1;
                await this.UpdateStageAsync(currentTournament, previousStage, sendMessage);
            }));
        }