Exemplo n.º 1
0
        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());
        }