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.BreakMentions()}"; await chn.SafeMessageUnformattedAsync(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})"); } } } }