예제 #1
0
        private async Task CreatureReactionHandler(IUserMessage message, ISocketMessageChannel channel, SocketReaction reaction, IUser user)
        {
            var CreatureHelperEmbed = message.Embeds.FirstOrDefault(embed => embed?.Title?.Contains(CreatureResources.CreatureHelper) ?? false);

            if (CreatureHelperEmbed != null)
            {
                CreatureEnvironment environment = StarforgedUtilites.CreatureEnvironmentFromEmote(reaction.Emote.Name);
                if (reaction.Emote.IsSameAs(randomEmoji))
                {
                    string lookupValue = Services.GetRequiredService <OracleService>().RandomRow("Creature Environment").Description;
                    environment = StarforgedUtilites.GetAnyEnvironment(lookupValue);
                }
                if (environment == CreatureEnvironment.None)
                {
                    return;
                }

                var newCreature = Creature.GenerateNewCreature(Services, channel.Id, environment);
                Task.WaitAll(message.RemoveAllReactionsAsync());

                await message.ModifyAsync(msg =>
                {
                    msg.Content = string.Empty;
                    msg.Embed   = newCreature.GetEmbedBuilder().Build();
                }).ConfigureAwait(false);

                await Task.Run(async() =>
                {
                    if (message.Reactions.Count > 0)
                    {
                        await Task.Delay(1500); //wait just in case we are still adding more reactions. Impatient users deserve to wait!!!
                        await message.RemoveAllReactionsAsync();
                    }

                    await message.AddReactionAsync(revealAspectEmoji).ConfigureAwait(false);
                }).ConfigureAwait(false);

                return;
            }

            var creatureEmbed = message.Embeds.FirstOrDefault(embed => embed?.Title?.Contains(CreatureResources.CreatureTitle) ?? false);

            if (creatureEmbed == null)
            {
                return;
            }

            var creature = Creature.FromEmbed(creatureEmbed, Services, channel.Id);

            if (reaction.Emote.IsSameAs(revealAspectEmoji))
            {
                creature.AddRandomAspect();
            }

            await message.ModifyAsync(msg => msg.Embed = creature.GetEmbedBuilder().Build()).ConfigureAwait(false);

            await message.RemoveReactionAsync(reaction.Emote, user).ConfigureAwait(false);

            return;
        }
예제 #2
0
파일: Spawn.cs 프로젝트: fossabot/sanakan
        private void RunSafari(EmbedBuilder embed, IUserMessage msg, Card newCard,
                               SafariImage pokeImage, ICharacterInfo character, ITextChannel trashChannel)
        {
            _ = Task.Run(async() =>
            {
                try
                {
                    await Task.Delay(TimeSpan.FromMinutes(5));

                    var usersReacted = await msg.GetReactionUsersAsync(ClaimEmote, 300).FlattenAsync();
                    var users        = usersReacted.ToList();

                    IUser winner = null;
                    using (var db = new Database.UserContext(_config))
                    {
                        var watch = Stopwatch.StartNew();
                        while (winner == null)
                        {
                            if (watch.ElapsedMilliseconds > 60000)
                            {
                                throw new Exception("Timeout");
                            }

                            if (users.Count < 1)
                            {
                                embed.Description = $"Na polowanie nie stawił się żaden łowca!";
                                await msg.ModifyAsync(x => x.Embed = embed.Build());
                                return;
                            }

                            var selected = Fun.GetOneRandomFrom(users);
                            var dUser    = await db.GetCachedFullUserAsync(selected.Id);

                            if (dUser != null)
                            {
                                if (!dUser.IsBlacklisted)
                                {
                                    winner = selected;
                                }
                            }
                            else
                            {
                                users.Remove(selected);
                            }
                        }
                    }

                    var exe = GetSafariExe(embed, msg, newCard, pokeImage, character, trashChannel, winner);
                    await _executor.TryAdd(exe, TimeSpan.FromSeconds(1));
                    await msg.RemoveAllReactionsAsync();
                }
                catch (Exception ex)
                {
                    _logger.Log($"In Safari: {ex}");
                    await msg.ModifyAsync(x => x.Embed = "Karta uciekła!".ToEmbedMessage(EMType.Error).Build());
                    await msg.RemoveAllReactionsAsync();
                }
            });
        }
예제 #3
0
        public static async Task PvPMainMenu(UserAccount user, IUserMessage message, IEmote emote, ContextIds idList)
        {
            switch (emote.Name.ToLower())
            {
            case "back1":
                user.RemoveAllReactionMessages(11);
                user.RemoveAllReactionMessages(1);

                await message.RemoveAllReactionsAsync();

                await message.ModifyAsync(m => { m.Embed = MonEmbedBuilder.MainMenu(user); m.Content = ""; });

                await MessageHandler.MenuEmojis(message);

                user.ReactionMessages.Add(message.Id, 1);
                break;

            case "singlebattle":
                user.RemoveAllReactionMessages(12);
                user.RemoveAllReactionMessages(11);
                user.RemoveAllReactionMessages(1);
                CombatCreationTool lobby = user.GetOrCreatePvPLobby("single", user.UserId);

                await message.RemoveAllReactionsAsync();

                string url = MessageHandler.GetImageURL(ImageGenerator.PvPSoloLobby(lobby)).Result;
                await message.ModifyAsync(m => { m.Embed = MonEmbedBuilder.PvPLobby(lobby, url, user); m.Content = ""; });

                await MessageHandler.PvPLobbyEmojis(message, user);

                user.ReactionMessages.Add(message.Id, 12);
                break;

            case "doublebattle":
                await MessageHandler.NotImplemented(idList, "double battle");

                break;

            case "ffa":
                await MessageHandler.NotImplemented(idList, "free for all");

                break;

            case "custombattle":
                await MessageHandler.NotImplemented(idList, "custom battle");

                break;

            default:
                break;
            }
        }
예제 #4
0
        public static async Task CreateTeamMenu(UserAccount user, IUserMessage message, IEmote emote, ContextIds idList)
        {
            switch (emote.Name.ToLower())
            {
            case "back1":
                user.RemoveAllReactionMessages(9);
                user.RemoveAllReactionMessages(1);

                await message.RemoveAllReactionsAsync();

                await message.ModifyAsync(m => { m.Embed = MonEmbedBuilder.MainMenu(user); m.Content = ""; });

                await MessageHandler.MenuEmojis(message);

                user.ReactionMessages.Add(message.Id, 1);
                break;

            case "team":
                Team t = new Team(true);
                t.AddMember(user);
                TownHandler.GetTown(user.Char.CurrentGuildId).Teams.Add(t);

                if (user.ExpectedInput == 5)
                {
                    user.ExpectedInput         = -1;
                    user.ExpectedInputLocation = 0;
                }

                user.RemoveAllReactionMessages(9);
                user.RemoveAllReactionMessages(7);

                await message.RemoveAllReactionsAsync();

                await message.ModifyAsync(m => { m.Embed = MonEmbedBuilder.TeamMenu(user); m.Content = ""; });

                await MessageHandler.TeamMenuEmojis(message, user);

                break;

            case "invite":
                await message.ModifyAsync(m => { m.Content = "**Tag someone in the team you want to join. The team must be open.**"; });

                user.ExpectedInput         = 5;
                user.ExpectedInputLocation = message.Channel.Id;
                break;

            default:
                break;
            }
        }
예제 #5
0
        protected async Task RedrawBattle()
        {
            autoTurn.Stop();
            wasJustReset = false;
            Task.WaitAll(PlayerMessages.Select(m => m.Key.RemoveAllReactionsAsync())
                         .Append(EnemyMessage.RemoveAllReactionsAsync())
                         .Append(SummonsMessage.RemoveAllReactionsAsync())
                         .ToArray()
                         );

            await WriteBattleInit();

            autoTurn.Start();
        }
예제 #6
0
        private static async void PlayDealerHand(IUserMessage message, SocketGuildChannel guildChannel, SocketReaction reaction)
        {
            // No active game, no handling
            if (activeGame == null)
            {
                return;
            }

            // Show dealer's second card
            await message.ModifyAsync(x => x.Embed = GetEmbedBuilder(true).Build());

            while (!activeGame.DealerIsStanding)
            {
                activeGame.DealCardToDealer();
                await message.ModifyAsync(x => x.Embed = GetEmbedBuilder(true).Build());
            }

            // Payout
            if (activeGame.UserWon)
            {
                User user = await UserService.GetUser(guildChannel.Guild.Id, reaction.UserId);

                int payout = activeGame.Payout();
                Log.Write("User (" + activeGame.UserId.ToString() + ") won " + payout.ToString() + " nuts with a game of Black Jack", "Bot - Blackjack");

                user.UpdateTotalKupoNuts(payout);
            }

            // Game finished - Perform last build, remove reactions, and clear active game
            await message.ModifyAsync(x => x.Embed = GetEmbedBuilder(true, true).Build());

            await message.RemoveAllReactionsAsync();

            activeGame = null;
        }
        private async Task SettlementReactionHandler(IUserMessage message, ISocketMessageChannel channel, SocketReaction reaction, IUser user)
        {
            var settlementHelperEmbed = message.Embeds.FirstOrDefault(embed => embed?.Title?.Contains(SettlementResources.SettlementHelper) ?? false);

            if (settlementHelperEmbed != null)
            {
                var region = StarforgedUtilites.SpaceRegionFromEmote(reaction.Emote.Name);
                if (region == SpaceRegion.None)
                {
                    return;
                }

                string command  = settlementHelperEmbed.Fields.FirstOrDefault(fld => fld.Name == SettlementResources.SettlementName).Value ?? string.Empty;
                string location = ExtractAnySettlementLocation(ref command);

                var newSettlement = Settlement.GenerateSettlement(Services, region, channel.Id, command, location);
                Task.WaitAll(message.RemoveAllReactionsAsync());

                await message.ModifyAsync(msg =>
                {
                    msg.Content = string.Empty;
                    msg.Embed   = newSettlement.GetEmbedBuilder().Build();
                }).ConfigureAwait(false);

                await Task.Run(async() =>
                {
                    await message.AddReactionAsync(projectEmoji);
                    await message.AddReactionAsync(contactEmoji);
                    await message.AddReactionAsync(troubleEmoji);
                }).ConfigureAwait(false);

                return;
            }
        }
예제 #8
0
        public static async Task HandleReactionMessage(ISocketMessageChannel channel, SocketSelfUser botUser, SocketReaction reaction, IUserMessage message)
        {
            if (message.Author.Id == botUser.Id && reaction.UserId != botUser.Id)
            {
                var reactionMessage = GetReactionMessageById(message.Id);
                if (reactionMessage != null && reaction.UserId == reactionMessage.Context.User.Id && (reactionMessage.AcceptsAllReactions || reactionMessage.AcceptedReactions.Contains(reaction.Emote.ToString())))
                {
                    try
                    {
                        await reactionMessage.RunAction(reaction.Emote);
                    }
                    catch (Exception ex)
                    {
                        await ExceptionMessageHelper.HandleException(ex, channel);
                    }

                    if (reactionMessage.AllowMultipleReactions)
                    {
                        await message.RemoveReactionAsync(reaction.Emote, reactionMessage.Context.User);
                    }
                    else
                    {
                        await message.RemoveAllReactionsAsync();

                        DeleteReactionMessage(reactionMessage);
                    }
                }
                else if (reactionMessage != null && reaction.User.IsSpecified)
                {
                    await message.RemoveReactionAsync(reaction.Emote, reaction.User.Value);
                }
            }
        }
예제 #9
0
        private async Task BuildProgressTrackerPostAsync(ChallengeRank cr, string ThingToTrack, IUserMessage messageToEdit = null)
        {
            if (messageToEdit == null)
            {
                var tracker = new ProgressTrackerInfo(cr, ThingToTrack);
                messageToEdit = ReplyAsync(embed: tracker.BuildEmbed() as Embed).Result;
            }
            else
            {
                var tracker = new ProgressTrackerInfo().PopulateFromMessage(messageToEdit, cr);
                await messageToEdit.ModifyAsync(msg =>
                {
                    msg.Content = string.Empty;
                    msg.Embed   = tracker.BuildEmbed() as Embed;
                });
            }

            await messageToEdit.RemoveAllReactionsAsync();

            _ = Task.Run(async() =>
            {
                await messageToEdit.AddReactionAsync(DecreaseEmoji);
                await messageToEdit.AddReactionAsync(IncreaseEmoji);
                await messageToEdit.AddReactionAsync(FullEmoji);
                await messageToEdit.AddReactionAsync(RollEmoji);
                await messageToEdit.AddReactionAsync(new Emoji(GenericReactions.recreatePostEmoji));
            }).ConfigureAwait(false);

            return;
        }
예제 #10
0
        private async Task HandleReactionInAdd(SocketReaction reaction, IUserMessage msg)
        {
            if (reaction.Emote.Equals(OneEmote) && reaction.UserId == P1.User.Id)
            {
                P1.Accepted = true;
                RestartTimer();
            }
            else if (reaction.Emote.Equals(TwoEmote) && reaction.UserId == P2.User.Id)
            {
                P2.Accepted = true;
                RestartTimer();
            }

            if (P1.Accepted && P2.Accepted)
            {
                State = ExchangeStatus.AcceptP1;
                Tips  = $"{P1.User.Mention} daj {AcceptEmote} aby zaakceptować, lub {DeclineEmote} aby odrzucić.";

                await msg.RemoveAllReactionsAsync();

                await msg.ModifyAsync(x => x.Embed = BuildEmbed());

                await msg.AddReactionsAsync(new IEmote[] { AcceptEmote, DeclineEmote });
            }
        }
예제 #11
0
        private async Task HandleMessage(IUserMessage msg, IEmote reaction)
        {
            Message mes = _messageRepo.GetMessage(msg.Id);

            _messageRepo.RemoveMessage(mes.MessageID);
            _messages.Remove(_messages.FirstOrDefault(m => m.MessageID == msg.Id));
            Embed embeds = (Embed)msg.Embeds.First();

            if (reaction.Name.Equals(cross.Name))
            {
                var changed = embeds.ToEmbedBuilder();
                changed.Color = Color.Red;

                await msg.RemoveAllReactionsAsync();

                await msg.ModifyAsync(m => m.Embed = changed.Build());

                return;
            }


            await msg.DeleteAsync();

            Channel         chan    = _channelRepo.GetChannelByTypeInGuild(mes.Channel.GuildID, Models.Domain.ChannelType.publicfeed);
            SocketGuild     guild   = _client.Guilds.FirstOrDefault(g => g.Id == chan.GuildID);
            IMessageChannel channel = (IMessageChannel)guild.GetChannel(chan.ChanelID);
            await channel.SendMessageAsync(embed : embeds);
        }
예제 #12
0
        private async Task MakePlanetPost(SpaceRegion region, string PlanetName, IUserMessage message = null)
        {
            Planet planet = Planet.GeneratePlanet(PlanetName, region, Services);

            if (message != null)
            {
                await message.RemoveAllReactionsAsync();

                await message.ModifyAsync(msg => msg.Embed = planet.GetEmbedBuilder().Build());
            }
            else
            {
                message = await ReplyAsync(embed : planet.GetEmbedBuilder().Build());
            }

            _ = Task.Run(async() =>
            {
                await message.AddReactionAsync(new Emoji("🔍"));
                await message.AddReactionAsync(new Emoji("\U0001F996"));

                if (planet.NumberOfBiomes > 1)
                {
                    var biome = new Emoji("\uD83C\uDF0D");
                    await message.AddReactionAsync(biome);
                }
            }).ConfigureAwait(false);
        }
        /// <summary>
        /// Executes the action in <paramref name="actionOnStop"/>.
        /// </summary>
        /// <param name="message">
        /// The message.
        /// </param>
        /// <param name="actionOnStop">
        /// The action to do.
        /// </param>
        public async Task OnStopAsync(IUserMessage message, ActionOnTimeout actionOnStop)
        {
            Interactive.RemoveReactionCallback(message);
            switch (actionOnStop)
            {
            case ActionOnTimeout.DeleteMessage:
                await message.DeleteAsync();

                break;

            case ActionOnTimeout.DeleteReactions:
                bool manageMessages = message.Channel is SocketGuildChannel guildChannel &&
                                      guildChannel.GetUser(message.Author.Id).GetPermissions(guildChannel).ManageMessages;
                if (manageMessages)
                {
                    await message.RemoveAllReactionsAsync();
                }
                else
                {
                    await message.RemoveReactionsAsync(message.Author, message.Reactions.Where(x => x.Value.IsMe).Select(x => x.Key).ToArray());
                }
                break;

            case ActionOnTimeout.Nothing:
            default:
                break;
            }
        }
예제 #14
0
        private async Task ExecuteGameInputAsync(IReactionsGame game, SocketReaction reaction, IUserMessage message, ISocketMessageChannel channel)
        {
            var userId = reaction.UserId;
            var user   = reaction.User.GetValueOrDefault() ?? client.GetUser(reaction.UserId);
            var guild  = (channel as SocketTextChannel)?.Guild;

            log.Verbose(
                $"Input {reaction.Emote.ReadableName()} by {user?.FullName()} in {channel.FullName()}",
                game.GameName);

            await game.InputAsync(reaction.Emote, userId);

            if (game.State != GameState.Active)
            {
                if (!(game is IUserGame))
                {
                    games.Remove(game);
                }

                if (game is PacManGame pmGame && pmGame.State != GameState.Cancelled && !pmGame.custom)
                {
                    storage.AddScore(new ScoreEntry(pmGame.score, userId, pmGame.State, pmGame.Time,
                                                    user?.NameandDisc(), $"{guild?.Name}/{channel.Name}", DateTime.Now));
                }

                if (channel.BotCan(ChannelPermission.ManageMessages))
                {
                    await message.RemoveAllReactionsAsync(PmBot.DefaultOptions);
                }
            }

            game.CancelRequests();
            try { await message.ModifyAsync(game.GetMessageUpdate(), game.GetRequestOptions()); }
            catch (OperationCanceledException) { }
        }
예제 #15
0
        private async Task HelperHandler(IUserMessage message, ISocketMessageChannel channel, SocketReaction reaction, IUser user)
        {
            if (!message?.Embeds?.Any(embed => embed.Title == OracleResources.AskOracleHelperTitle) ?? false)
            {
                return;
            }

            await Task.Run(async() =>
            {
                await message.RemoveAllReactionsAsync();

                if (reaction.Emote.Name == oneEmoji)
                {
                    await message.ModifyAsync(msg => { msg.Content = AskTheOracleWithChance(90, OracleResources.AlmostCertain); msg.Embed = null; });
                }
                if (reaction.Emote.Name == twoEmoji)
                {
                    await message.ModifyAsync(msg => { msg.Content = AskTheOracleWithChance(75, OracleResources.Likely); msg.Embed = null; });
                }
                if (reaction.Emote.Name == threeEmoji)
                {
                    await message.ModifyAsync(msg => { msg.Content = AskTheOracleWithChance(50, OracleResources.FiftyFifty); msg.Embed = null; });
                }
                if (reaction.Emote.Name == fourEmoji)
                {
                    await message.ModifyAsync(msg => { msg.Content = AskTheOracleWithChance(25, OracleResources.Unlikely); msg.Embed = null; });
                }
                if (reaction.Emote.Name == fiveEmoji)
                {
                    await message.ModifyAsync(msg => { msg.Content = AskTheOracleWithChance(10, OracleResources.SmallChance); msg.Embed = null; });
                }
            });

            return;
        }
예제 #16
0
        private async Task ExecuteGameInputAsync(IReactionsGame game, SocketReaction reaction, IUserMessage gameMessage)
        {
            var user    = reaction.User.IsSpecified ? reaction.User.Value : client.GetUser(reaction.UserId);
            var channel = gameMessage.Channel;
            var guild   = (channel as IGuildChannel)?.Guild;

            await logger.Log(LogSeverity.Verbose, game.Name,
                             $"Input {PacManGame.GameInputs[reaction.Emote].ToString().Align(5)} " +
                             $"by {user.FullName()} in {channel.FullName()}");

            game.Input(reaction.Emote, user.Id);

            if (game.State != State.Active)
            {
                storage.DeleteGame(game);

                if (game is PacManGame pmGame && pmGame.State != State.Cancelled && !pmGame.custom)
                {
                    storage.AddScore(new ScoreEntry(pmGame.score, user.Id, pmGame.State, pmGame.Time,
                                                    user.NameandNum(), $"{guild?.Name}/{channel.Name}", DateTime.Now));
                }
                if (channel.BotCan(ChannelPermission.ManageMessages))
                {
                    await gameMessage.RemoveAllReactionsAsync(Bot.DefaultOptions);
                }
            }

            game.CancelRequests();
            await gameMessage.ModifyAsync(game.UpdateMessage, game.RequestOptions);
        }
예제 #17
0
        public async Task<IUserMessage> SendMessageAsync(IMessageChannel channel, PaginatedMessage paginated)
        {
            IUserMessage message = await channel.SendMessageAsync("", embed: paginated.GetEmbed());

            switch (paginated.Options.Style)
            {
                case DisplayStyle.Full:
                    await message.AddReactionAsync(paginated.Options.EmoteFirst);
                    await message.AddReactionAsync(paginated.Options.EmoteBack);
                    await message.AddReactionAsync(paginated.Options.EmoteNext);
                    await message.AddReactionAsync(paginated.Options.EmoteLast);
                    await message.AddReactionAsync(paginated.Options.EmoteStop);
                    break;

                case DisplayStyle.Minimal:
                    await message.AddReactionAsync(paginated.Options.EmoteBack);
                    await message.AddReactionAsync(paginated.Options.EmoteNext);
                    await message.AddReactionAsync(paginated.Options.EmoteStop);
                    break;

                case DisplayStyle.Selector:
                    await message.AddReactionAsync(paginated.Options.EmoteBack);
                    await message.AddReactionAsync(paginated.Options.EmoteStop);
                    await message.AddReactionAsync(paginated.Options.EmoteNext);
                    break;
            }

            Messages.Add(message.Id, paginated);

            if (paginated.Options.Timeout != TimeSpan.Zero)
            {
                Task _ = Task.Delay(paginated.Options.Timeout).ContinueWith(async _t =>
                {
                    if (!Messages.ContainsKey(message.Id))
                    {
                        return;
                    }

                    Console.WriteLine(paginated.Options.TimeoutAction.ToString());

                    if (paginated.Options.TimeoutAction == StopAction.DeleteMessage)
                    {
                        await message.DeleteAsync();
                    }
                    else if (paginated.Options.TimeoutAction == StopAction.ClearReactions)
                    {
                        await message.RemoveAllReactionsAsync();
                    }

                    Messages.Remove(message.Id);
                });
            }

            return message;
        }
예제 #18
0
 public void DisplayTimeout(RestUserMessage m1, IUserMessage m2)
 {
     if (Timeout.HasValue)
     {
         _ = Task.Delay(Timeout.Value).ContinueWith(_ =>
         {
             Interactive.RemoveReactionCallback(m1);
             m2.RemoveAllReactionsAsync();
         });
     }
 }
예제 #19
0
        public async Task WaitMess(ulong userId, IUserMessage socketMsg)
        {
            var globalAccount = _global.Client.GetUser(userId);
            var account       = _accounts.GetAccount(globalAccount);
            var mainPage      = new EmbedBuilder();

            mainPage.WithAuthor(globalAccount);
            mainPage.WithFooter("Preparation time...");
            mainPage.WithColor(Color.DarkGreen);
            mainPage.AddField("Game is being ready", $"**Please wait until you will see emoji** {new Emoji("❌")}");


            await socketMsg.ModifyAsync(message => { message.Embed = mainPage.Build(); });


            if (!(socketMsg.Channel is IDMChannel))
            {
                await socketMsg.RemoveAllReactionsAsync();
            }

            await socketMsg.AddReactionAsync(new Emoji("⬅"));

            await socketMsg.AddReactionAsync(new Emoji("➡"));

            await socketMsg.AddReactionAsync(new Emoji("📖"));

            await socketMsg.AddReactionAsync(new Emoji("1⃣"));

            await socketMsg.AddReactionAsync(new Emoji("2⃣"));

            await socketMsg.AddReactionAsync(new Emoji("3⃣"));

            await socketMsg.AddReactionAsync(new Emoji("4⃣"));

            await socketMsg.AddReactionAsync(new Emoji("5⃣"));

            await socketMsg.AddReactionAsync(new Emoji("6⃣"));

            await socketMsg.AddReactionAsync(new Emoji("7⃣"));

            await socketMsg.AddReactionAsync(new Emoji("8⃣"));

            await socketMsg.AddReactionAsync(new Emoji("9⃣"));

            await socketMsg.AddReactionAsync(new Emoji("🐙"));

            await socketMsg.AddReactionAsync(new Emoji("❌"));


            account.PlayingStatus = 2;
            _accounts.SaveAccounts(userId);

            await MainPage(userId, socketMsg);
        }
예제 #20
0
        public static async Task TeamInviteMenu(UserAccount user, IUserMessage message, IEmote emote, ContextIds idList)
        {
            switch (emote.Name.ToLower())
            {
            case "check":
                if (user.GetTeam() == null)
                {
                    if (user.InviteMessages.ContainsKey(message.Id))
                    {
                        var otherUser = UserHandler.GetUser(user.InviteMessages[message.Id]);
                        if (otherUser.GetTeam() != null)
                        {
                            user.InviteMessages.Remove(message.Id);
                            user.RemoveAllReactionMessages(10);
                            otherUser.GetTeam().AddMember(user);
                            await message.RemoveAllReactionsAsync();

                            //FOR FUTURE USE- When bot has no permissions, this can be used to remove bot-only reactions
                            //await message.RemoveReactionAsync(await MessageHandler.GetEmoji(736480922152730665), message.Author);
                            await message.ModifyAsync(m => { m.Embed = MonEmbedBuilder.TeamMenu(user); m.Content = ""; });

                            await MessageHandler.TeamMenuEmojis(message, user);

                            //Update the menu of the person who sent the invite
                            foreach (KeyValuePair <ulong, int> kvp in otherUser.ReactionMessages)
                            {
                                if (kvp.Value == 7)
                                {
                                    IMessage teamMess = await message.Channel.GetMessageAsync(kvp.Key);

                                    if (teamMess is IUserMessage)
                                    {
                                        IUserMessage userTeamMess = (IUserMessage)teamMess;
                                        await userTeamMess.ModifyAsync(m => { m.Embed = MonEmbedBuilder.TeamMenu(otherUser); m.Content = ""; });
                                    }
                                }
                            }
                        }
                    }
                }
                break;

            case "redx":
                user.InviteMessages.Remove(message.Id);
                user.RemoveAllReactionMessages(10);
                await message.ModifyAsync(m => { m.Content = "Invite Declined."; });

                break;

            default:
                break;
            }
        }
예제 #21
0
        private async Task ResetReactionsIfNecessary(Workshop currentWorkshop, Emoji thumbsUpEmote, Workshop dbWorkshop, IUserMessage message)
        {
            if (dbWorkshop == null)
            {
                return;
            }

            if (!WorkshopHelpers.TimeHasChanged(dbWorkshop, currentWorkshop))
            {
                return;
            }

            var hadOneUser = false;

            var reactedUsers = message.GetReactionUsersAsync(thumbsUpEmote, 1000)
                               .SelectMany(x => x.ToAsyncEnumerable())
                               .Where(x => !x.IsBot && x.Id != _discordClient.CurrentUser.Id);

            await foreach (var reactedUser in reactedUsers)
            {
                hadOneUser = true;
                // Notify user that time has changed
                var affectedTimes = new string[]
                {
                    !WorkshopHelpers.BeginTimeChanged(dbWorkshop, currentWorkshop) ? string.Empty : "Startzeit",
                    !WorkshopHelpers.EndTimeChanged(dbWorkshop, currentWorkshop) ? string.Empty : "Endzeit"
                }.Where(x => !string.IsNullOrEmpty(x));

                var affectedTimeString = string.Join(" und ", affectedTimes);
                try
                {
                    await reactedUser.SendMessageAsync
                    (
                        $"Die {affectedTimeString} vom Workshop **{currentWorkshop.title}** wurde geändert. \n" +
                        $"Er beginnt um **{currentWorkshop.begintime}** und endet um {currentWorkshop.endtime}.:alarm_clock:\n" +
                        $"Deshalb wurde deine Benachrichtigung deaktiviert. Bitte reagiere erneut mit \U0001F44D auf die Nachricht am Server, damit du rechtzeitig erinnert wirst!"
                    );
                }
                catch (Exception)
                {
                    //Ignore
                }
            }

            if (hadOneUser)
            {
                await message.RemoveAllReactionsAsync();

                await message.AddReactionAsync(thumbsUpEmote);
            }
        }
예제 #22
0
        private async Task CreatureReactionHandler(IUserMessage message, ISocketMessageChannel channel, SocketReaction reaction, IUser user)
        {
            var CreatureHelperEmbed = message.Embeds.FirstOrDefault(embed => embed?.Title?.Contains(CreatureResources.CreatureHelper) ?? false);

            if (CreatureHelperEmbed != null)
            {
                CreatureEnvironment environment = StarforgedUtilites.CreatureEnvironmentFromEmote(reaction.Emote.Name);
                if (reaction.Emote.Name == randomEmoji.Name)
                {
                    string lookupValue = Services.GetRequiredService <OracleService>().RandomRow("Creature Environment").Description;
                    environment = StarforgedUtilites.GetAnyEnvironment(lookupValue);
                }
                if (environment == CreatureEnvironment.None)
                {
                    return;
                }

                var newCreature = Creature.GenerateCreature(Services, channel.Id, environment);
                Task.WaitAll(message.RemoveAllReactionsAsync());

                await message.ModifyAsync(msg =>
                {
                    msg.Content = string.Empty;
                    msg.Embed   = newCreature.GetEmbedBuilder().Build();
                }).ConfigureAwait(false);

                await message.AddReactionAsync(revealAspectEmoji).ConfigureAwait(false);

                return;
            }

            var creatureEmbed = message.Embeds.FirstOrDefault(embed => embed?.Title?.Contains(CreatureResources.CreatureTitle) ?? false);

            if (creatureEmbed == null)
            {
                return;
            }

            var creature = Creature.FromEmbed(creatureEmbed, Services, channel.Id);

            if (reaction.Emote.Name == revealAspectEmoji.Name)
            {
                creature.RevealedAspectsToShow++;
            }

            await message.ModifyAsync(msg => msg.Embed = creature.GetEmbedBuilder().Build()).ConfigureAwait(false);

            await message.RemoveReactionAsync(reaction.Emote, user).ConfigureAwait(false);

            return;
        }
예제 #23
0
        private async Task ShipReactionHandler(IUserMessage message, ISocketMessageChannel channel, SocketReaction reaction, IUser user)
        {
            var starshipHelperEmbed = message.Embeds.FirstOrDefault(embed => embed?.Title?.Contains(StarShipResources.StarshipHelperTitle) ?? false);

            if (starshipHelperEmbed != null)
            {
                var region = StarforgedUtilites.SpaceRegionFromEmote(reaction.Emote.Name);
                if (region == SpaceRegion.None)
                {
                    return;
                }

                string name = starshipHelperEmbed.Fields.FirstOrDefault(fld => fld.Name == StarShipResources.StarshipName).Value ?? string.Empty;

                Starship newShip = Starship.GenerateShip(Services, region, name);
                Task.WaitAll(message.RemoveAllReactionsAsync());

                await message.ModifyAsync(msg =>
                {
                    msg.Content = string.Empty;
                    msg.Embed   = newShip.GetEmbedBuilder().Build();
                }).ConfigureAwait(false);

                await message.AddReactionAsync(missionEmoji).ConfigureAwait(false);

                return;
            }

            var shipEmbed = message.Embeds.FirstOrDefault(embed => embed?.Description?.Contains(StarShipResources.Starship, StringComparison.OrdinalIgnoreCase) ?? false);

            if (shipEmbed == null)
            {
                return;
            }

            Starship ship = Starship.FromEmbed(Services, shipEmbed);

            if (reaction.Emote.Name == missionEmoji.Name)
            {
                ship.MissionRevealed = true;
                await message.RemoveReactionAsync(reaction.Emote, message.Author).ConfigureAwait(false);
            }

            await message.ModifyAsync(msg => msg.Embed = ship.GetEmbedBuilder().Build()).ConfigureAwait(false);

            await message.RemoveReactionAsync(reaction.Emote, user).ConfigureAwait(false);

            return;
        }
예제 #24
0
        private async Task SettlementReactionHandler(IUserMessage message, ISocketMessageChannel channel, SocketReaction reaction, IUser user)
        {
            var settlementHelperEmbed = message.Embeds.FirstOrDefault(embed => embed?.Title?.Contains(SettlementResources.SettlementHelper) ?? false);

            if (settlementHelperEmbed != null)
            {
                var region = StarforgedUtilites.SpaceRegionFromEmote(reaction.Emote.Name);
                if (region == SpaceRegion.None)
                {
                    return;
                }

                string name = settlementHelperEmbed.Fields.FirstOrDefault(fld => fld.Name == SettlementResources.SettlementName).Value ?? string.Empty;

                var newSettlement = Settlement.GenerateSettlement(Services, region, name);
                Task.WaitAll(message.RemoveAllReactionsAsync());

                await message.ModifyAsync(msg =>
                {
                    msg.Content = string.Empty;
                    msg.Embed   = newSettlement.GetEmbedBuilder().Build();
                }).ConfigureAwait(false);

                await message.AddReactionAsync(projectEmoji).ConfigureAwait(false);

                return;
            }

            var settlmentEmbed = message.Embeds.FirstOrDefault(embed => embed?.Description?.Contains(SettlementResources.Settlement) ?? false);

            if (settlmentEmbed == null)
            {
                return;
            }

            var settlement = new Settlement(Services).FromEmbed(settlmentEmbed);

            if (reaction.Emote.Name == projectEmoji.Name)
            {
                settlement.ProjectsRevealed++;
            }

            await message.ModifyAsync(msg => msg.Embed = settlement.GetEmbedBuilder().Build()).ConfigureAwait(false);

            await message.RemoveReactionAsync(reaction.Emote, user).ConfigureAwait(false);

            return;
        }
예제 #25
0
파일: Music.cs 프로젝트: Drelnoch/Mute
        private async Task RunClipReactions(IUserMessage message, string vid, [NotNull] Task playingClip)
        {
            //Setup reaction buttons
            await Task.Run(async() => await AddYoutubeReactions(message, vid));

            //Wait for the clip to finish playing
            await playingClip;

            //After a short time remove the reactions
            Console.WriteLine("Track complete, starting timeout...");
            await Task.Delay(ReactionTimeout).ContinueWith(async _ => {
                Console.WriteLine("Timeout complete!");
                Interactive.RemoveReactionCallback(message);
                await message.RemoveAllReactionsAsync();
            });
        }
 protected override async Task CloseMessageAsync(IUserMessage message, InteractivityResult <TValue> result)
 {
     //the remove all reactions endpoint requires the user to have the manage messages permission
     //the user wont have this in a DM channel and calling this will throw HttpExceptions
     if (message.Channel is not IDMChannel)
     {
         await message.RemoveAllReactionsAsync();
     }
     if (result.IsCancelled && CancelledPage != null)
     {
         await message.ModifyAsync(x => { x.Content = CancelledPage.Text; x.Embed = CancelledPage.Embed; });
     }
     if (result.IsTimeouted && TimeoutedPage != null)
     {
         await message.ModifyAsync(x => { x.Content = TimeoutedPage.Text; x.Embed = TimeoutedPage.Embed; });
     }
 }
예제 #27
0
        private async Task ExecuteCommandAsync(string command, SocketCommandContext context)
        {
            switch (command)
            {
            case "ls":
                await StartList(context);

                break;

            case "ende":
                await list.DeleteAsync();

                _offline = new List <string>();

                listOpen = false;
                break;

            case "v":
                if (listOpen)
                {
                    foreach (Student item in _students)
                    {
                        item._veryfied = false;
                    }

                    await list.RemoveAllReactionsAsync();

                    await list.AddReactionAsync(new Emoji("✅"));

                    await UpdateList();
                }
                break;

            case "hilfe":
                await context.Channel.SendMessageAsync("", false, new EmbedBuilder().WithTitle("Kommandos").AddField("Generell", "+ls     -> Liste Starten.\n+v      -> neue Verifizierung.\n+ende   -> liste Beenden.\n+hilfe  -> Hilfe anzeigen.").Build());

                break;

            default:
                break;
            }
        }
예제 #28
0
        public async Task DisplayAsync()
        {
            var embed   = BuildEmbed();
            var message = await Context.Channel.SendMessageAsync(_pager.Content, embed : embed).ConfigureAwait(false);

            Message = message;
            Interactive.AddReactionCallback(message, this);
            // Reactions take a while to add, don't wait for them
            _ = Task.Run(async() =>
            {
                await message.AddReactionAsync(options.First);
                await message.AddReactionAsync(options.Back);
                await message.AddReactionAsync(options.Next);
                await message.AddReactionAsync(options.Last);

                var manageMessages = (Context.Channel is IGuildChannel guildChannel)
                    ? (Context.User as IGuildUser).GetPermissions(guildChannel).ManageMessages
                    : false;

                if (options.JumpDisplayOptions == JumpDisplayOptions.Always ||
                    (options.JumpDisplayOptions == JumpDisplayOptions.WithManageMessages && manageMessages))
                {
                    await message.AddReactionAsync(options.Jump);
                }

                await message.AddReactionAsync(options.Stop);

                if (options.DisplayInformationIcon)
                {
                    await message.AddReactionAsync(options.Info);
                }
            });
            // TODO: (Next major version) timeouts need to be handled at the service-level!
            if (Timeout.HasValue && Timeout.Value != null)
            {
                _ = Task.Delay(Timeout.Value).ContinueWith(_ =>
                {
                    Interactive.RemoveReactionCallback(message);
                    _ = Message.RemoveAllReactionsAsync();
                });
            }
        }
예제 #29
0
        /// <summary>
        /// Removes the message from the handler.
        ///
        /// Also removes all reactions.
        /// </summary>
        /// <param name="message">The message to remove from the handler.</param>
        /// <returns></returns>
        public async Task ClearHandler(IUserMessage message)
        {
            try
            {
                if (emojiRemovedFunctions.Any(x => x.Key.Id.Equals(message.Id)))
                {
                    emojiRemovedFunctions.Remove(emojiRemovedFunctions.First(x => x.Key.Id.Equals(message.Id)).Key);
                }

                if (emojiAddedFunctions.Any(x => x.Key.Id.Equals(message.Id)))
                {
                    emojiAddedFunctions.Remove(emojiAddedFunctions.First(x => x.Key.Id.Equals(message.Id)).Key);
                }

                await message.RemoveAllReactionsAsync();
            }
            catch (Exception e)
            {
                await Program.MopsLog(new LogMessage(LogSeverity.Error, "", $"Tried to delete message {message.Id} but it did not exist.", e));
            }
        }
예제 #30
0
        private async Task SetStateAsync(IUserMessage message, State state)
        {
            Owners[message.Id].State = state;
            await message.RemoveAllReactionsAsync().ConfigureAwait(false);

            switch (state)
            {
            case State.Select:
                await message.AddReactionAsync(new Emoji("🛡")).ConfigureAwait(false);

                await message.AddReactionAsync(new Emoji("⚡")).ConfigureAwait(false);

                await message.AddReactionAsync(new Emoji("🗼")).ConfigureAwait(false);

                await message.AddReactionAsync(new Emoji("❌")).ConfigureAwait(false);

                await message.AddReactionAsync(new Emoji("✅")).ConfigureAwait(false);

                break;
            }
        }