/// <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(); }
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); } } }
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..."))); } }
// 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());