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