public async Task Status(CommandContext ctx, [Description( "Optional parameter to specify a lobby number. Not required for sets or if you are checking a lobby you are in.")] int lobbyNum = 0) { if (!(ctx.User is DiscordMember user)) { return; } Set setInChannel = CommandHelper.SetFromChannel(ctx.Channel.Id); if (setInChannel != null && setInChannel.AllPlayers.Any()) { await ctx.RespondAsync(embed : setInChannel.GetEmbedBuilder().Build()); } else if (Matchmaker.Lobbies.All(e => e.LobbyNumber != lobbyNum)) { Lobby joinedLobby = Matchmaker.Lobbies.FirstOrDefault(e => e.Players.Any(f => f.DiscordId == user.Id)); if (joinedLobby == null) { await ctx.RespondAsync(Resources.NotInLobby); return; } DiscordEmbedBuilder builder = joinedLobby.GetEmbedBuilder(); await ctx.RespondAsync(embed : builder.Build()); } else { Lobby selectedLobby = Matchmaker.Lobbies.First(e => e.LobbyNumber == lobbyNum); await ctx.RespondAsync(embed : selectedLobby.GetEmbedBuilder().Build()); } }
public async Task Overwrite(CommandContext ctx, string team, int set = 0) { Set selectedSet; DiscordRole modRole = ctx.Guild.Roles.First(e => e.Name == "Moderator"); if (set == 0) { selectedSet = CommandHelper.SetFromChannel(ctx.Channel.Id); if (selectedSet == null) { await ctx.RespondAsync("Please specify set number or use the correct channel as context."); return; } if (selectedSet.ResolveMode <= 0) { // Force report score by moderator. selectedSet.ReportScore(team); if (selectedSet.AlphaTeam.Score > SET_MATCH_NUMBER / 2 || selectedSet.BravoTeam.Score > SET_MATCH_NUMBER / 2 || selectedSet.MatchNum == SET_MATCH_NUMBER) { string winner = selectedSet.AlphaTeam.Score > selectedSet.BravoTeam.Score ? "Alpha" : "Bravo"; string loser = selectedSet.AlphaTeam.Score < selectedSet.BravoTeam.Score ? "Alpha" : "Bravo"; DiscordEmbedBuilder builder = new DiscordEmbedBuilder(); builder.WithTitle("__Results__"); builder.AddField(e => { e.Name = "Score"; e.IsInline = true; e.Value = $"{winner} Wins {selectedSet.AlphaTeam.Score} - {selectedSet.BravoTeam.Score}"; }); await ctx.RespondAsync($"The winner of this set is Team {winner}!", embed : builder.Build()); DiscordRole loserRole = loser == "Alpha" ? ctx.Guild.Roles.First(e => e.Name == $"Alpha ({selectedSet.SetNumber})") : ctx.Guild.Roles.First(e => e.Name == $"Bravo ({selectedSet.SetNumber})"); await ctx.RespondAsync( $"{loserRole.Mention}, please acknowledge these results by either sending \"confirm\" or \"deny\"."); InteractivityModule interactivity = ctx.Client.GetInteractivityModule(); DateTime timeoutDateTime = DateTime.Now + TimeSpan.FromMinutes(2); MessageContext replyMessage; try { replyMessage = await interactivity.WaitForMessageAsync(x => { return(((DiscordMember)x.Author).Roles.Select(e => e.Id).Contains(loserRole.Id)); }, TimeSpan.FromMinutes(1)); } catch (Exception e) { Console.WriteLine(e); Logger.Error(e); throw; } while (true) { if (replyMessage.Message == null) { await ctx.RespondAsync("Time's up! Assuming the losing team has accepted their loss."); await this.EndMatchAsync(selectedSet, ctx); return; } if (replyMessage.Message.Content.ToLower() == "confirm") { await this.EndMatchAsync(selectedSet, ctx); return; } if (replyMessage.Message.Content.ToLower() == "deny") { await ctx.RespondAsync($"{modRole.Mention} issue reported by {replyMessage.Message.Author.Mention}. " + $"To resolve the error, use `%resolve` and follow the resulting instructions." + $" Otherwise, use `%resolve deny` to continue reporting the current score."); return; } replyMessage = await interactivity.WaitForMessageAsync(x => { return(((DiscordMember)x.Author).Roles.Select(e => e.Id).Contains(loserRole.Id)); }, timeoutDateTime - DateTime.Now); } } else { try { selectedSet.MatchNum++; Stage selectedStage = selectedSet.GetCurrentStage(); await ctx.RespondAsync(embed : selectedStage .GetEmbedBuilder($"Match {selectedSet.MatchNum} of 7: {selectedStage.MapName}") .AddField(e => { e.Name = "Alpha Team's Score"; e.Value = selectedSet.AlphaTeam.Score; e.IsInline = true; }) .AddField(e => { e.Name = "Bravo Team's Score"; e.Value = selectedSet.BravoTeam.Score; e.IsInline = true; }) .Build()); DiscordMessage feedMessage = (DiscordMessage)await ctx.Guild.GetChannel(666563839646760960).GetMessageAsync(OrderedFeedMessages[selectedSet.SetNumber - 1]); await feedMessage.ModifyAsync(embed : selectedSet.GetFeedEmbedBuilder(ctx.Channel).Build()); } catch (Exception e) { Console.WriteLine(e); throw; } } return; // End force report logic. } } else { selectedSet = Matchmaker.Sets[set - 1]; } team = team.ToLower(); selectedSet.ReportScore(team); selectedSet.MatchNum++; selectedSet.ResolveMode--; if (selectedSet.ResolveMode == 0) { if (selectedSet.AlphaTeam.Score > SET_MATCH_NUMBER / 2 || selectedSet.BravoTeam.Score > SET_MATCH_NUMBER / 2 || selectedSet.MatchNum == SET_MATCH_NUMBER) { await ctx.RespondAsync("Resolved all issues! All scores will be reported to Airtable."); await this.EndMatchAsync(selectedSet, ctx); } else { await ctx.RespondAsync("Resolved all issues! Teams, continue with your matches."); selectedSet.MatchNum++; Stage selectedStage = selectedSet.Stages[selectedSet.MatchNum - 1]; await ctx.RespondAsync(embed : selectedStage .GetEmbedBuilder($"Match {selectedSet.MatchNum} of 7: {selectedStage.MapName}") .AddField(e => { e.Name = "Alpha Team's Score"; e.Value = selectedSet.AlphaTeam.Score; e.IsInline = true; }) .AddField(e => { e.Name = "Bravo Team's Score"; e.Value = selectedSet.BravoTeam.Score; e.IsInline = true; }) .Build()); DiscordMessage feedMessage = await ctx.Guild.GetChannel(666563839646760960).GetMessageAsync(OrderedFeedMessages[selectedSet.SetNumber - 1]); await feedMessage.ModifyAsync(embed : selectedSet.GetFeedEmbedBuilder(ctx.Channel).Build()); } } else { Stage selectedStage = selectedSet.Stages[selectedSet.MatchNum]; await ctx.RespondAsync("Moderator, use `%overwrite [Team]` to select the winner for this map.", embed : selectedStage.GetEmbedBuilder($"Match {selectedSet.MatchNum + 1} of 7: {selectedStage.MapName}") .AddField(e => { e.Name = "Alpha Team's Score"; e.Value = selectedSet.AlphaTeam.Score; e.IsInline = true; }) .AddField(e => { e.Name = "Bravo Team's Score"; e.Value = selectedSet.BravoTeam.Score; e.IsInline = true; }) .Build()); } }
public async Task Resolve(CommandContext ctx, string deny = null, int setNumber = 0) { Set playerSet; if (setNumber == 0) { playerSet = CommandHelper.SetFromChannel(ctx.Channel.Id); if (playerSet == null) { await ctx.RespondAsync("Please specify set number or use the correct channel as context."); return; } } else { playerSet = Matchmaker.Sets[setNumber - 1]; } playerSet.Locked = false; if (deny == "deny") { if (playerSet.AlphaTeam.Score > SET_MATCH_NUMBER / 2 || playerSet.BravoTeam.Score > SET_MATCH_NUMBER / 2 || playerSet.MatchNum == SET_MATCH_NUMBER) { await this.EndMatchAsync(playerSet, ctx); return; } await ctx.RespondAsync("The report has been resolved by a moderator. This is a final decision. Please continue with the set."); Stage selectedRandomStage = playerSet.GetCurrentStage(); await ctx.RespondAsync(embed : selectedRandomStage .GetEmbedBuilder($"Match {playerSet.MatchNum} of 7: {selectedRandomStage.MapName}") .AddField(e => { e.Name = "Alpha Team's Score"; e.Value = playerSet.AlphaTeam.Score; e.IsInline = true; }) .AddField(e => { e.Name = "Bravo Team's Score"; e.Value = playerSet.BravoTeam.Score; e.IsInline = true; }) .Build()); return; } playerSet.MatchNum--; playerSet.ResolveMode = playerSet.MatchNum; playerSet.MatchNum = 0; playerSet.AlphaTeam.OrderedMatchResults.Clear(); playerSet.BravoTeam.OrderedMatchResults.Clear(); Stage selectedStage = playerSet.Stages[0]; await ctx.RespondAsync("Moderator, use `%overwrite [Team]` to select the winner for this map.", embed : selectedStage.GetEmbedBuilder($"Match 1 of 7: {selectedStage.MapName}") .AddField(e => { e.Name = "Alpha Team's Score"; e.Value = playerSet.AlphaTeam.Score; e.IsInline = true; }) .AddField(e => { e.Name = "Bravo Team's Score"; e.Value = playerSet.BravoTeam.Score; e.IsInline = true; }) .Build()); }