/// <summary>
        /// listens for reactions from users and responds accordingly
        /// </summary>
        /// <returns></returns>
        public async Task<GameState> RunLobby()
        {
            var timeOut = TimeSpan.FromSeconds(1);
            while (CurrentGameStatus != GameState.Finished)
            {
                var emojiReaction = await _Interactivity.WaitForReactionAsync(x => x.Message == _EmbedMessage, timeOut);
                if (!emojiReaction.TimedOut)
                {
                    var emoji = emojiReaction.Result.Emoji;
                    var user = emojiReaction.Result.User;

                    if (_ValidReactEmojis.Contains(emoji))
                    {
                        if (emoji == _PlayGame)
                        {
                            await StartOrPauseGame(user);
                        }
                        else if (emoji == _StopGame)
                        {
                            await RestartGame(user);
                        }
                        else if (emoji == _LeaveLobby)
                        {
                            if (await LeaveLobby(user))
                                break;
                        }
                        else if (emoji != _LeaveLobby)
                        {
                            await OnEmbedMessageReaction(user, emoji);
                        }
                    }
                    else
                    {
                        //delete unwanted reactions
                        await _EmbedMessage.DeleteReactionsEmojiAsync(emoji);
                    }

                    //delete the latest reaction
                    await _EmbedMessage.DeleteReactionAsync(emoji, user);
                }
            }

            return CurrentGameStatus.GetValueOrDefault();
        }
Пример #2
0
        public async static Task OnPendingGameReaction(DiscordClient sender, DiscordMessage msg, DiscordEmoji emoji, DiscordUser user, bool added)
        {
            var  kanContext = KandoraContext.Instance;
            var  msgId      = msg.Id;
            var  userId     = user.Id.ToString();
            var  game       = kanContext.PendingGames[msgId];
            bool result     = false;
            var  okEmoji    = DiscordEmoji.FromName(sender, Reactions.OK);
            var  noEmoji    = DiscordEmoji.FromName(sender, Reactions.NO);

            if (emoji.Id == okEmoji.Id)
            {
                result = game.TryChangeUserOk(userId, isAdd: added);
            }
            else if (emoji.Id == noEmoji.Id)
            {
                result = game.TryChangeUserNo(userId, isAdd: added);
            }
            if (!result && added)
            {
                await msg.DeleteReactionAsync(emoji, user);
            }
            if (game.IsCancelled)
            {
                await msg.ModifyAsync($"All players have voted {noEmoji}, this log won't be recorded");

                kanContext.PendingGames.Remove(msgId);
            }
            if (game.IsValidated)
            {
                DbService.Begin("recordgame");
                try
                {
                    var serverId     = msg.Channel.GuildId.ToString();
                    var users        = UserDbService.GetUsers();
                    var servers      = ServerDbService.GetServers(users);
                    var server       = servers[serverId];
                    var leagueConfig = LeagueConfigDbService.GetLeagueConfig(server.LeagueConfigId);

                    if (game.Log == null)
                    {
                        ScoreDbService.RecordIRLGame(game.UserIds, game.Scores, server, leagueConfig);
                    }
                    else
                    {
                        ScoreDbService.RecordOnlineGame(game.Log, server);
                    }
                    kanContext.PendingGames.Remove(msgId);
                    await msg.RespondAsync($"All players have voted {okEmoji}, this log has been recorded!");

                    await msg.DeleteReactionsEmojiAsync(okEmoji);

                    await msg.DeleteReactionsEmojiAsync(noEmoji);

                    DbService.Commit("recordgame");
                }
                catch (Exception e)
                {
                    DbService.Rollback("recordgame");
                    await msg.RespondAsync(e.Message);
                }
            }
        }
Пример #3
0
        internal static async Task RoleEmbedRemoveRole(CommandContext ctx,
                                                       DiscordChannel channel,
                                                       ulong messageId,
                                                       DiscordEmoji emoji)
        {
            var a = channel.GetMessageAsync(messageId);
            var b = CheckEmoteMessageExists(messageId, emoji);

            await Task.WhenAll(a, b);

            DiscordMessage message         = a.Result;
            bool           messageHasEmote = b.Result;

            // Check if the message actually has that emote.
            if (messageHasEmote)
            {   // It does, so let's query the database for everything that should be in the message.
                EmojiData  emojiRemove = new EmojiData(emoji);
                RoleInfo[] roleInfos   = await GetMessageEmotes(messageId);

                string botComments = String.Empty;

                var c = RemoveRow(messageId, emojiRemove.Value);
                await Task.WhenAll(c);

                // Let's check if this is the message's only react.
                if (roleInfos.Length == 1)
                {   // It is, so let's delete the message as well.
                    await message.DeleteAsync();

                    botComments = @"Additionally, the message was deleted because you deleted its only react.";
                }
                else
                {   // It's not the only react, so let's rebuild the message string.
                    // Get the first line of the content.
                    var stringBuilder = new StringBuilder(
                        new string(message.Content.TakeWhile(a => a != '\n').ToArray()));

                    stringBuilder.Append('\n');

                    foreach (var roleInfo in roleInfos)
                    {
                        // Check if this is the emoji we want to remove.
                        if (!roleInfo.EmojiData.Equals(emojiRemove))
                        {   // It's not the emoji we want to remove, so let's add it to the stringbuilder.
                            DiscordRole role = ctx.Guild.GetRole(roleInfo.RoleId);

                            string emojiString = EmojiConverter.GetEmojiString(
                                emoji: EmojiConverter.GetEmoji(
                                    cl: ctx.Client,
                                    data: roleInfo.EmojiData));

                            stringBuilder.AppendLine($"{role.Mention} {emojiString}");
                        } // end if
                    }     // end foreach

                    var d = message.ModifyAsync(stringBuilder.ToString());
                    var e = message.DeleteReactionsEmojiAsync(emoji);

                    await Task.WhenAll(d, e);

                    await ctx.RespondAsync(
                        embed : Generics.GenericEmbedTemplate(
                            color: Generics.NeutralColor,
                            description: $"Tasks:\nMessage Edit Success: {d.IsCompletedSuccessfully || e.IsCompletedSuccessfully}\n" +
                            $"Database Check Success: {b.IsCompletedSuccessfully}\n" +
                            $"Database Delete Success: {c.IsCompletedSuccessfully}" +
                            (botComments.Length > 0 ? $"\n{botComments}" : String.Empty),
                            title: @"Add new roles onto embed"));
                } // end else
            }     // end if
            else
            {   // It doesn't have the emote we want to remove, so let's notify the user.
                await ctx.RespondAsync(
                    embed : Generics.GenericEmbedTemplate(
                        color: Generics.NegativeColor,
                        description: Generics.NegativeDirectResponseTemplate(
                            mention: ctx.Member.Mention,
                            body: $"that message doesn't have emote {EmojiConverter.GetEmojiString(emoji)} on it...")));
            }
        }
Пример #4
0
 // Removes the emoji that has been recently selected by a player or AI
 public async Task RemoveChoice(DiscordMessage embed, DiscordEmoji demoji)
 {
     await embed.DeleteReactionsEmojiAsync(demoji).ConfigureAwait(false);
 }
 /// <summary>Deletes all reactions of a specific reaction to this message.</summary>
 public static Task DeleteReactionsEmojiAsync(this DiscordMessage message, string emoji)
 => message.DeleteReactionsEmojiAsync(emoji.ToEmoji());