Exemple #1
0
 private async Task Module_UserLeft(IDiscordUser arg)
 {
     if (await IsEnabled(arg.Guild.Id))
     {
         await MeruUtils.TryAsync(async() =>
         {
             await UserLeaveGuild(arg.Guild, arg);
         });
     }
 }
Exemple #2
0
 private async Task Client_UserUpdated(IDiscordUser oldUser, IDiscordUser newUser)
 {
     using (var scope = MikiApp.Instance.Services.CreateScope())
     {
         if (oldUser.AvatarId != newUser.AvatarId)
         {
             await Utils.SyncAvatarAsync(newUser, scope.ServiceProvider.GetService <IExtendedCacheClient>(), scope.ServiceProvider.GetService <MikiDbContext>());
         }
     }
 }
Exemple #3
0
        public async Task <List <EventMessageObject> > GetMessageAsync(
            DbContext db, IDiscordGuild guild, EventMessageType type, IDiscordUser user)
        {
            var channels   = (await guild.GetChannelsAsync()).ToList();
            var channelIds = channels.Select(x => (long)x.Id);

            IDiscordGuildUser owner = await guild.GetOwnerAsync();

            var ownerMention = owner.Mention;
            var ownerName    = owner.Username;

            List <EventMessageObject> output = new List <EventMessageObject>();
            short t = (short)type;

            var messageObjects = await db.Set <EventMessage>()
                                 .Where(x => channelIds.Contains(x.ChannelId) && t == x.EventType)
                                 .ToListAsync();

            foreach (var c in messageObjects)
            {
                if (c == null)
                {
                    continue;
                }

                if (string.IsNullOrEmpty(c.Message))
                {
                    continue;
                }

                string modifiedMessage = c.Message;

                modifiedMessage = modifiedMessage.Replace("-um", user.Mention);
                modifiedMessage = modifiedMessage.Replace("-uc", guild.MemberCount.ToString());
                modifiedMessage = modifiedMessage.Replace("-u", user.Username);

                modifiedMessage = modifiedMessage.Replace("-now", DateTime.Now.ToShortDateString());
                modifiedMessage = modifiedMessage.Replace("-s", guild.Name);

                modifiedMessage = modifiedMessage.Replace("-om", ownerMention);
                modifiedMessage = modifiedMessage.Replace("-o", ownerName);

                modifiedMessage = modifiedMessage.Replace("-cc", channels.Count().ToString());
                modifiedMessage = modifiedMessage.Replace("-vc", channels.Count().ToString());

                output.Add(new EventMessageObject
                {
                    Message            = modifiedMessage,
                    DestinationChannel = channels.FirstOrDefault(
                        x => (long)x.Id == c.ChannelId) as IDiscordTextChannel
                });
            }

            return(output);
        }
Exemple #4
0
        public async Task AchievementsAsync(EventContext e)
        {
            using (var context = new MikiContext())
            {
                long id = (long)e.Author.Id;

                ArgObject arg = e.Arguments.FirstOrDefault();

                if (arg != null)
                {
                    IDiscordUser user = await arg.TakeUntilEnd()
                                        .GetUserAsync(e.Guild);

                    if (user != null)
                    {
                        id = (long)user.Id;
                    }
                }

                IDiscordUser discordUser = await e.Guild.GetUserAsync(id.FromDbLong());

                User u = await User.GetAsync(context, discordUser);

                List <Achievement> achievements = await context.Achievements
                                                  .Where(x => x.Id == id)
                                                  .ToListAsync();

                EmbedBuilder embed = Utils.Embed
                                     .SetAuthor($"{u.Name} | " + "Achievements", discordUser.GetAvatarUrl(), "https://miki.ai/profiles/ID/achievements");

                embed.SetColor(255, 255, 255);

                StringBuilder leftBuilder = new StringBuilder();

                int totalScore = 0;

                foreach (var a in achievements)
                {
                    BaseAchievement metadata = AchievementManager.Instance.GetContainerById(a.Name).Achievements[a.Rank];
                    leftBuilder.AppendLine(metadata.Icon + " | `" + metadata.Name.PadRight(15) + $"{metadata.Points.ToString().PadLeft(3)} pts` | 📅 {a.UnlockedAt.ToShortDateString()}");
                    totalScore += metadata.Points;
                }

                if (string.IsNullOrEmpty(leftBuilder.ToString()))
                {
                    embed.AddInlineField("Total Pts: " + totalScore, "None, yet.");
                }
                else
                {
                    embed.AddInlineField("Total Pts: " + totalScore, leftBuilder.ToString());
                }

                embed.ToEmbed().QueueToChannel(e.Channel);
            }
        }
Exemple #5
0
        public async Task GuildInfoAsync(EventContext e)
        {
            IDiscordEmbed embed = Utils.Embed;
            Locale        l     = Locale.GetEntity(e.Channel.Id.ToDbLong());

            embed.SetAuthor(e.Guild.Name, e.Guild.AvatarUrl, e.Guild.AvatarUrl);

            IDiscordUser owner = await e.Guild.GetOwnerAsync();

            embed.AddInlineField(
                "👑" + l.GetString("miki_module_general_guildinfo_owned_by"),
                owner.Username + "#" + owner.Discriminator);

            embed.AddInlineField(
                "👉" + l.GetString("miki_label_prefix"),
                await PrefixInstance.Default.GetForGuildAsync(e.Guild.Id));

            embed.AddInlineField(
                "📺" + l.GetString("miki_module_general_guildinfo_channels"),
                (await e.Guild.GetChannelCountAsync()).ToString());

            embed.AddInlineField(
                "🔊" + l.GetString("miki_module_general_guildinfo_voicechannels"),
                (await e.Guild.GetVoiceChannelCountAsync()).ToString());

            embed.AddInlineField(
                "🙎" + l.GetString("miki_module_general_guildinfo_users"),
                (await e.Guild.GetUserCountAsync()).ToString());

            embed.AddInlineField(
                "🤖" + l.GetString("term_shard"),
                Bot.instance.Client.GetShardIdFor((e.Guild as IProxy <IGuild>).ToNativeObject()));

            List <string> roleNames = new List <string>();

            foreach (IDiscordRole r in e.Guild.Roles)
            {
                roleNames.Add($"`{r.Name}`");
            }

            embed.AddInlineField(
                "#⃣" + l.GetString("miki_module_general_guildinfo_roles_count"),
                e.Guild.Roles.Count.ToString());

            string roles = string.Join(", ", roleNames);

            if (roles.Length <= 1000)
            {
                embed.AddInlineField(
                    "📜" + l.GetString("miki_module_general_guildinfo_roles"),
                    roles);
            }

            await embed.QueueToChannel(e.Channel);
        }
Exemple #6
0
        public async Task EditExpAsync(EventContext e)
        {
            ArgObject arg = e.Arguments.FirstOrDefault();

            if (arg == null)
            {
                throw new ArgumentException();
            }

            IDiscordUser target = await arg.GetUserAsync(e.Guild);
        }
Exemple #7
0
 private async Task Module_UserLeft(IDiscordUser arg)
 {
     if (await IsEnabled(arg.Guild.Id))
     {
         try
         {
             await UserLeaveGuild(arg.Guild, arg);
         }
         catch { }
     }
 }
Exemple #8
0
        public static async Task SendPM(IDiscordUser user, string message, DatabaseSettingId settingId = DatabaseSettingId.PERSONALMESSAGE)
        {
            if (CanSendNotification(user.Id, settingId))
            {
                RuntimeEmbed e = new RuntimeEmbed(new Discord.EmbedBuilder());
                e.Title       = "NOTIFICATION";
                e.Description = message;

                await e.QueueToUser(user);
            }
        }
Exemple #9
0
        public async Task FavouritePastaList(EventContext e, bool lovedPastas = true)
        {
            Locale       locale       = Locale.GetEntity(e.Channel.Id.ToDbLong());
            IDiscordUser targetUser   = e.Author;
            float        totalPerPage = 25f;
            int          page         = 0;

            if (e.message.MentionedUserIds.Count() >= 1)
            {
                targetUser = await e.Guild.GetUserAsync(e.message.MentionedUserIds.First());

                string[] args = e.arguments.Split(' ');
                int.TryParse((args.Count() > 1 ? args[1] : "0"), out page);
            }
            else
            {
                int.TryParse(e.arguments, out page);
            }

            using (MikiContext context = new MikiContext())
            {
                long authorId = targetUser.Id.ToDbLong();
                IEnumerable <PastaVote> pastaVotes = context.Votes.Where(x => x.__UserId == authorId && x.PositiveVote == lovedPastas);

                int maxPage = (int)Math.Ceiling(pastaVotes.Count() / totalPerPage);
                page = page > maxPage - 1 ? maxPage - 1 : page;

                if (pastaVotes.Count() <= 0)
                {
                    string loveString  = (lovedPastas ? locale.GetString("miki_module_pasta_loved") : locale.GetString("miki_module_pasta_hated"));
                    string errorString = locale.GetString("miki_module_pasta_favlist_self_none", loveString);
                    if (e.message.MentionedUserIds.Count() >= 1)
                    {
                        errorString = locale.GetString("miki_module_pasta_favlist_mention_none", loveString);
                    }
                    await Utils.ErrorEmbed(e, errorString).SendToChannel(e.Channel.Id);

                    return;
                }

                IDiscordEmbed    embed        = Utils.Embed;
                List <PastaVote> neededPastas = pastaVotes.Skip((int)totalPerPage * page).Take((int)totalPerPage).ToList();

                string resultString = "";
                neededPastas.ForEach(x => { resultString += "`" + x.Id + "` "; });

                string useName = string.IsNullOrEmpty(e.Author.Nickname) ? e.Author.Username : e.Author.Nickname;
                embed.SetTitle($"{( lovedPastas ? locale.GetString( "miki_module_pasta_loved_header" ) : locale.GetString( "miki_module_pasta_hated_header" ) )} - {useName}");
                embed.SetDescription(resultString);
                embed.SetFooter(locale.GetString("page_index", page + 1, Math.Ceiling(pastaVotes.Count() / totalPerPage)), "");

                await embed.SendToChannel(e.Channel);
            }
        }
        public async Task BanUserAsync(CommandContext e)
        {
            if (e.Arguments.Take(out string user))
            {
                IDiscordUser u = await DiscordExtensions.GetUserAsync(user, e.Guild);

                var context = e.GetService <MikiDbContext>();
                await(await User.GetAsync(context, u.Id.ToDbLong(), u.Username))
                .BanAsync(context);
            }
        }
Exemple #11
0
        /// <summary>
        /// Unlocks the achievement and if not yet added to the database, It'll add it to the database.
        /// </summary>
        /// <param name="context">sql context</param>
        /// <param name="id">user id</param>
        /// <param name="r">rank set to (optional)</param>
        /// <returns></returns>
        internal async Task UnlockAsync(IDiscordChannel channel, IDiscordUser user, int r = 0)
        {
            long userid = user.Id.ToDbLong();

            if (await UnlockIsValid(userid, r))
            {
                await AchievementManager.Instance.CallAchievementUnlockEventAsync(this, user, channel);

                Notification.SendAchievement(this, channel, user);
            }
        }
Exemple #12
0
        private async Task OnLevelUpAchievementsAsync(
            IDiscordUser user, IDiscordTextChannel channel, int level)
        {
            var achievements = achievementService.GetAchievement(AchievementIds.LevellingId);

            int achievementToUnlock = -1;

            if (level >= 3 && level < 5)
            {
                achievementToUnlock = 0;
            }
            else if (level >= 5 && level < 10)
            {
                achievementToUnlock = 1;
            }
            else if (level >= 10 && level < 20)
            {
                achievementToUnlock = 2;
            }
            else if (level >= 20 && level < 30)
            {
                achievementToUnlock = 3;
            }
            else if (level >= 30 && level < 50)
            {
                achievementToUnlock = 4;
            }
            else if (level >= 50 && level < 100)
            {
                achievementToUnlock = 5;
            }
            else if (level >= 100 && level < 150)
            {
                achievementToUnlock = 6;
            }
            else if (level >= 150)
            {
                achievementToUnlock = 7;
            }

            if (achievementToUnlock != -1)
            {
                if (app is MikiBotApp botApp)
                {
                    using var context = await botApp.CreateFromUserChannelAsync(user, channel);

                    await achievementService.UnlockAsync(
                        context,
                        achievements,
                        user.Id,
                        achievementToUnlock);
                }
            }
        }
Exemple #13
0
        /// <inheritdoc />
        public async Task <IDiscordGuildUser> GetSelfAsync()
        {
            IDiscordUser user = await client.GetSelfAsync()
                                .ConfigureAwait(false);

            if (user == null)
            {
                throw new InvalidOperationException("Could not find self user");
            }

            return(await GetMemberAsync(user.Id));
        }
Exemple #14
0
 /// <summary>
 /// Creates and returns the User regardless of business errors.
 /// </summary>
 public static async Task <User> GetOrCreateUserAsync(
     this IUserService service, IDiscordUser user)
 {
     try
     {
         return(await service.GetUserAsync((long)user.Id));
     }
     catch (EntityNullException <User> )
     {
         return(await service.CreateUserAsync((long)user.Id, user.Username));
     }
 }
Exemple #15
0
        public async Task BanUserAsync(EventContext e)
        {
            if (e.Arguments.Take(out string user))
            {
                IDiscordUser u = await DiscordExtensions.GetUserAsync(user, e.Guild);

                using (var context = new MikiContext())
                {
                    await(await User.GetAsync(context, u.Id.ToDbLong(), u.Username)).BanAsync();
                }
            }
        }
Exemple #16
0
        public static async Task <BankAccount> GetAsync(MikiContext context, IDiscordUser user, IDiscordGuild guild)
        {
            if (await Global.RedisClient.ExistsAsync($"bankaccount:{guild.Id}:{user.Id}"))
            {
                return(context.BankAccounts.Attach(await Global.RedisClient.GetAsync <BankAccount>($"bankaccount:{guild.Id}:{user.Id}")).Entity);
            }
            BankAccount account = await context.BankAccounts.FindAsync(guild.Id.ToString(), user.Id.ToDbLong());

            await Global.RedisClient.AddAsync <BankAccount>($"bankaccount:{guild.Id}:{user.Id}", account);

            return(account);
        }
Exemple #17
0
        public async Task GiveMekosAsync(EventContext e)
        {
            IDiscordUser user = null;

            if (e.Arguments.Take(out string userName))
            {
                user = await DiscordExtensions.GetUserAsync(userName, e.Guild);

                if (user == null)
                {
                    await e.ErrorEmbedResource("give_error_no_mention")
                    .ToEmbed().QueueToChannelAsync(e.Channel);

                    return;
                }

                if (!e.Arguments.Take(out int amount))
                {
                    await e.ErrorEmbedResource("give_error_amount_unparsable")
                    .ToEmbed().QueueToChannelAsync(e.Channel);

                    return;
                }

                using (MikiContext context = new MikiContext())
                {
                    User sender = await DatabaseHelpers.GetUserAsync(context, e.Author);

                    User receiver = await DatabaseHelpers.GetUserAsync(context, user);

                    if (amount <= sender.Currency)
                    {
                        sender.RemoveCurrency(amount);
                        await receiver.AddCurrencyAsync(amount);

                        await new EmbedBuilder()
                        {
                            Title       = "🔸 transaction",
                            Description = e.Locale.GetString("give_description", sender.Name, receiver.Name, amount.ToFormattedString()),
                            Color       = new Color(255, 140, 0),
                        }.ToEmbed().QueueToChannelAsync(e.Channel);

                        await context.SaveChangesAsync();
                    }
                    else
                    {
                        await e.ErrorEmbedResource("user_error_insufficient_mekos")
                        .ToEmbed().QueueToChannelAsync(e.Channel);
                    }
                }
            }
        }
Exemple #18
0
 private async Task Module_UserUpdated(IDiscordUser arg1, IDiscordUser arg2)
 {
     if (arg1.Guild != null)
     {
         if (await IsEnabled(arg1.Guild.Id))
         {
             try {
                 await UserUpdated(arg1, arg2);
             }
             catch { }
         }
     }
 }
Exemple #19
0
 private async Task Module_UserUpdated(IDiscordUser arg1, IDiscordUser arg2)
 {
     if (arg1.Guild != null)
     {
         if (await IsEnabled(arg1.Guild.Id))
         {
             await MeruUtils.TryAsync(async() =>
             {
                 await UserUpdated(arg1, arg2);
             });
         }
     }
 }
Exemple #20
0
        public async Task MarryAsync(EventContext e)
        {
            Locale locale = Locale.GetEntity(e.Channel.Id);

            if (e.message.MentionedUserIds.Count == 0)
            {
                await e.Channel.SendMessage(locale.GetString("miki_module_accounts_marry_error_no_mention"));

                return;
            }

            using (MikiContext context = new MikiContext())
            {
                User mentionedPerson = await context.Users.FindAsync(e.message.MentionedUserIds.First().ToDbLong());

                User currentUser = await context.Users.FindAsync(e.Author.Id.ToDbLong());

                IDiscordUser user = await e.Guild.GetUserAsync(e.message.MentionedUserIds.First());

                if (currentUser == null || mentionedPerson == null)
                {
                    await Utils.ErrorEmbed(locale, "miki_module_accounts_marry_error_null").SendToChannel(e.Channel);

                    return;
                }

                if (mentionedPerson.Id == currentUser.Id)
                {
                    await Utils.ErrorEmbed(locale, locale.GetString("miki_module_accounts_marry_error_null")).SendToChannel(e.Channel);

                    return;
                }

                if (await Marriage.ExistsAsync(context, mentionedPerson.Id, currentUser.Id))
                {
                    await Utils.ErrorEmbed(locale, locale.GetString("miki_module_accounts_marry_error_exists")).SendToChannel(e.Channel);

                    return;
                }

                if (await Marriage.ProposeAsync(context, currentUser.Id, mentionedPerson.Id))
                {
                    await e.Channel.SendMessage(
                        $"💍 " +
                        locale.GetString("miki_module_accounts_marry_text", $"**{e.Author.Username}**", $"**{user.Username}**") +
                        " 💍\n\n⛪ " + user.Username + " " +
                        locale.GetString("miki_module_accounts_marry_text2") +
                        $" ⛪\n\n✅ **>acceptmarriage [@{locale.GetString("miki_terms_mention")}]**\n❌ **>declinemarriage [@{locale.GetString("miki_terms_mention")}]**");
                }
            }
        }
Exemple #21
0
        public async Task AchievementsAsync(CommandContext e)
        {
            var context = e.GetService <MikiDbContext>();

            long id = (long)e.Author.Id;

            if (e.Arguments.Take(out string arg))
            {
                IDiscordUser user = await DiscordExtensions.GetUserAsync(arg, e.Guild);

                if (user != null)
                {
                    id = (long)user.Id;
                }
            }

            IDiscordUser discordUser = await e.Guild.GetMemberAsync(id.FromDbLong());

            User u = await User.GetAsync(context, discordUser.Id, discordUser.Username);

            List <Achievement> achievements = await context.Achievements
                                              .Where(x => x.UserId == id)
                                              .ToListAsync();

            EmbedBuilder embed = new EmbedBuilder()
                                 .SetAuthor($"{u.Name} | " + "Achievements", discordUser.GetAvatarUrl(), "https://miki.ai/profiles/ID/achievements");

            embed.SetColor(255, 255, 255);

            StringBuilder leftBuilder = new StringBuilder();

            int totalScore = 0;

            foreach (var a in achievements)
            {
                IAchievement metadata = AchievementManager.Instance.GetContainerById(a.Name).Achievements[a.Rank];
                leftBuilder.AppendLine(metadata.Icon + " | `" + metadata.Name.PadRight(15) + $"{metadata.Points.ToString().PadLeft(3)} pts` | 📅 {a.UnlockedAt.ToShortDateString()}");
                totalScore += metadata.Points;
            }

            if (string.IsNullOrEmpty(leftBuilder.ToString()))
            {
                embed.AddInlineField("Total Pts: " + totalScore.ToFormattedString(), "None, yet.");
            }
            else
            {
                embed.AddInlineField("Total Pts: " + totalScore.ToFormattedString(), leftBuilder.ToString());
            }

            await embed.ToEmbed().QueueToChannelAsync(e.Channel);
        }
Exemple #22
0
 private async Task Module_UserJoined(IDiscordUser arg)
 {
     if (await IsEnabled(arg.Guild.Id))
     {
         try
         {
             await UserJoinGuild(arg.Guild, arg);
         }
         catch (Exception e)
         {
             Log.ErrorAt("userjoin", e.Message + "\n" + e.StackTrace);
         }
     }
 }
Exemple #23
0
        public static async Task <User> GetAsync(MikiContext context, IDiscordUser u)
        {
            long id = u.Id.ToDbLong();

            User user = null;

            user = await context.Users.FindAsync(id);

            if (user == null)
            {
                return(await CreateAsync(u));
            }
            return(user);
        }
Exemple #24
0
 public int AddReminder(IDiscordUser user, string reminder, TimeSpan atTime, bool repeated = false)
 {
     if (reminders.TryGetValue(user.Id, out ReminderContainer container))
     {
         return(container.CreateNewReminder(user, reminder, atTime, repeated));
     }
     else
     {
         ReminderContainer rc = new ReminderContainer();
         rc.Id = user.Id;
         reminders.Add(user.Id, rc);
         return(rc.CreateNewReminder(user, reminder, atTime, repeated));
     }
 }
Exemple #25
0
 public ReminderInstance CancelReminder(IDiscordUser user, int reminderId)
 {
     if (reminders.TryGetValue(user.Id, out ReminderContainer container))
     {
         var instance = container.GetReminder(reminderId);
         if (instance != null)
         {
             instance.Cancel();
             return(instance);
         }
         return(null);
     }
     return(null);
 }
Exemple #26
0
        private List <PermissionGroup> GetDefaultPermissions(IDiscordUser user)
        {
            var groups = new List <PermissionGroup>
            {
                PermissionGroup.User
            };

            if (_options.Developers.Contains(user.Id))
            {
                groups.Add(PermissionGroup.Developer);
            }

            return(groups);
        }
Exemple #27
0
        public static async Task <User> GetAsync(MikiContext context, IDiscordUser u)
        {
            long id = u.Id.ToDbLong();

            return(await context.Users.Where(x => x.Id == u.Id.ToDbLong())
                   .Include(x => x.Achievements)
                   .Include(x => x.CommandsUsed)
                   .Include(x => x.Marriages)
                   .ThenInclude(x => x.Marriage)
                   .Include(x => x.LocalExperience)
                   .Include(x => x.Pastas)
                   .Include(x => x.Connections)
                   .FirstOrDefaultAsync()
                   ?? Create(context, u));
        }
Exemple #28
0
        public async Task RunTask(IDiscordUser user)
        {
            await Task.Delay((int)Length.TotalMilliseconds);

            cancellationToken.Token.ThrowIfCancellationRequested();

            CreateReminderEmbed(Text)
            .QueueToUser(user);

            if (RepeatReminder)
            {
                parent.CreateNewReminder(user, Text, Length, RepeatReminder);
            }
            parent.RemoveReminder(ReminderId);
        }
Exemple #29
0
        public async Task KickAsync(EventContext e)
        {
            List <string> arg        = e.arguments.Split(' ').ToList();
            IDiscordUser  bannedUser = null;
            Locale        locale     = Locale.GetEntity(e.Channel.Id.ToDbLong());

            if (e.message.MentionedUserIds.Count > 0)
            {
                bannedUser = await e.Guild.GetUserAsync(e.message.MentionedUserIds.First());
            }
            else
            {
                bannedUser = await e.Guild.GetUserAsync(ulong.Parse(e.arguments.Split(' ')[0]));
            }

            arg.RemoveAt(0);

            string reason = string.Join(" ", arg);

            IDiscordEmbed embed = Utils.Embed;

            embed.Title       = locale.GetString("miki_module_admin_kick_header");
            embed.Description = locale.GetString("miki_module_admin_kick_description", new object[] { e.Guild.Name });

            if (!string.IsNullOrWhiteSpace(reason))
            {
                embed.AddField(f =>
                {
                    f.Name     = locale.GetString("miki_module_admin_kick_reason");
                    f.Value    = reason;
                    f.IsInline = true;
                });
            }

            embed.AddField(f =>
            {
                f.Name     = locale.GetString("miki_module_admin_kick_by");
                f.Value    = e.Author.Username + "#" + e.Author.Discriminator;
                f.IsInline = true;
            });

            embed.Color = new Color(1, 1, 0);

            await bannedUser.SendMessage(embed);

            await bannedUser.Kick();
        }
Exemple #30
0
        // TODO: clean this | also, completely re-write this
        public async Task SendOption(string message, IDiscordUser user, params Option[] reactionEmoji)
        {
            IDiscordMessage e = await SendMessage(message);

            IMessage msg = (e as IProxy <IMessage>).ToNativeObject();

            int output = -1;

            for (int i = 0; i < reactionEmoji.Length; i++)
            {
                await(msg as IUserMessage).AddReactionAsync(reactionEmoji[i].emoji);
            }

            Func <Cacheable <IUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task> socketReaction = new Func <Cacheable <IUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task>(
                async(cachableMessage, channel, reaction) =>
            {
                IUserMessage m = await cachableMessage.GetOrDownloadAsync();
                if (m.Id == msg.Id && reaction.User.Value.Id == user.Id)
                {
                    for (int i = 0; i < reactionEmoji.Length; i++)
                    {
                        if (reactionEmoji[i].emoji == reaction.Emoji.Name)
                        {
                            output = i;
                        }
                    }
                }
            });

            Bot.instance.Client.ReactionAdded += socketReaction;

            int timeTaken = 0;

            while (output == -1 || timeTaken > 10000)
            {
                await Task.Delay(100);

                timeTaken += 100;
            }
            Bot.instance.Client.ReactionAdded -= socketReaction;

            if (output != -1)
            {
                await reactionEmoji[output].output();
            }
        }