예제 #1
0
파일: Timers.cs 프로젝트: kylesalk/ModCore
        private static async Task DispatchTimer(TimerData tdata)
        {
            var timer  = tdata.DbTimer;
            var client = tdata.Context;

            if (timer.ActionType == TimerActionType.Reminder)
            {
                DiscordChannel chn = null;
                try
                {
                    chn = await client.GetChannelAsync((ulong)timer.ChannelId);
                }
                catch
                {
                    return;
                }

                if (chn == null)
                {
                    return;
                }

                var data  = timer.GetData <TimerReminderData>();
                var emoji = DiscordEmoji.FromName(client, ":alarm_clock:");
                var user  = (ulong)timer.UserId;
                var msg   = $"{emoji} <@!{user}>, you wanted to be reminded of the following:\n\n{data.ReminderText}";
                await chn.SafeMessageAsync(msg, false);

                // ALWAYS filter stuff so i set it to false. No need to @everyone in a reminder.
            }
            else if (timer.ActionType == TimerActionType.Unban)
            {
                var data = timer.GetData <TimerUnbanData>();
                if (client.Guilds.Any(x => x.Key == (ulong)timer.GuildId))
                {
                    using (var db = tdata.Database.CreateContext())
                    {
                        var guild = client.Guilds[(ulong)timer.GuildId];
                        try
                        {
                            await guild.UnbanMemberAsync((ulong)data.UserId);
                        }
                        catch
                        {
                            // ignored
                        }

                        var settings = guild.GetGuildSettings(db);
                        await client.LogAutoActionAsync(guild, db, $"Member unbanned: {data.DisplayName}#{data.Discriminator} (ID: {data.UserId})");
                    }
                }
            }
            else if (timer.ActionType == TimerActionType.Unmute)
            {
                var data = timer.GetData <TimerUnmuteData>();
                if (client.Guilds.Any(x => x.Key == (ulong)timer.GuildId))
                {
                    using (var db = tdata.Database.CreateContext())
                    {
                        var guild  = client.Guilds[(ulong)timer.GuildId];
                        var member = await guild.GetMemberAsync((ulong)data.UserId);

                        var role = (DiscordRole)null;
                        try
                        {
                            role = guild.GetRole((ulong)data.MuteRoleId);
                        }
                        catch (Exception)
                        {
                            try
                            {
                                role = guild.GetRole(guild.GetGuildSettings(db).MuteRoleId);
                            }
                            catch (Exception)
                            {
                                await client.LogAutoActionAsync(guild, db, $"**[IMPORTANT]**\nFailed to unmute member: {data.DisplayName}#{data.Discriminator} (ID: {data.UserId})\nMute role does not exist!");

                                return;
                            }
                        }
                        await member.RevokeRoleAsync(role, "");

                        await client.LogAutoActionAsync(guild, db, $"Member unmuted: {data.DisplayName}#{data.Discriminator} (ID: {data.UserId})");
                    }
                }
            }
            else if (timer.ActionType == TimerActionType.Pin)
            {
                var data = timer.GetData <TimerPinData>();
                if (client.Guilds.Any(x => x.Key == (ulong)timer.GuildId))
                {
                    using (var db = tdata.Database.CreateContext())
                    {
                        var guild   = client.Guilds[(ulong)timer.GuildId];
                        var channel = guild.GetChannel((ulong)data.ChannelId);
                        var message = await channel.GetMessageAsync((ulong)data.MessageId);

                        await message.PinAsync();

                        await client.LogAutoActionAsync(guild, db, $"Scheduled pin: Message with ID: {data.MessageId} in Channel #{channel.Name} ({channel.Id})");
                    }
                }
            }
            else if (timer.ActionType == TimerActionType.Unpin)
            {
                var data = timer.GetData <TimerPinData>();
                if (client.Guilds.Any(x => x.Key == (ulong)timer.GuildId))
                {
                    using (var db = tdata.Database.CreateContext())
                    {
                        var guild   = client.Guilds[(ulong)timer.GuildId];
                        var channel = guild.GetChannel((ulong)data.ChannelId);
                        var message = await channel.GetMessageAsync((ulong)data.MessageId);

                        await message.UnpinAsync();

                        await client.LogAutoActionAsync(guild, db, $"Scheduled unpin: Message with ID: {data.MessageId} in Channel #{channel.Name} ({channel.Id})");
                    }
                }
            }
        }