2022-03-12 05:52:46 +00:00
|
|
|
|
using BirthdayBot.Data;
|
|
|
|
|
using Discord.Interactions;
|
|
|
|
|
|
|
|
|
|
namespace BirthdayBot.ApplicationCommands;
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Only users not on the blocklist or affected by moderator mode may use the command.<br/>
|
|
|
|
|
/// This is used in the <see cref="BotModuleBase"/> base class. Manually using it anywhere else is unnecessary.
|
|
|
|
|
/// </summary>
|
|
|
|
|
class EnforceBlockingAttribute : PreconditionAttribute {
|
|
|
|
|
public const string FailModerated = "Guild has moderator mode enabled.";
|
|
|
|
|
public const string FailBlocked = "User is in the guild's block list.";
|
|
|
|
|
public const string ReplyModerated = ":x: This bot is in moderated mode, preventing you from using any bot commands in this server.";
|
|
|
|
|
public const string ReplyBlocked = ":x: You have been blocked from using bot commands in this server.";
|
|
|
|
|
|
2022-03-20 04:09:42 +00:00
|
|
|
|
public override Task<PreconditionResult> CheckRequirementsAsync(
|
2022-03-12 05:52:46 +00:00
|
|
|
|
IInteractionContext context, ICommandInfo commandInfo, IServiceProvider services) {
|
|
|
|
|
// Not in guild context, unaffected by blocking
|
2022-03-20 04:09:42 +00:00
|
|
|
|
if (context.Guild is not SocketGuild guild) return Task.FromResult(PreconditionResult.FromSuccess());
|
2022-03-12 05:52:46 +00:00
|
|
|
|
|
|
|
|
|
// Manage Guild permission overrides any blocks
|
|
|
|
|
var user = (SocketGuildUser)context.User;
|
2022-03-20 04:09:42 +00:00
|
|
|
|
if (user.GuildPermissions.ManageGuild) return Task.FromResult(PreconditionResult.FromSuccess());
|
2022-03-12 05:52:46 +00:00
|
|
|
|
|
2022-03-20 04:09:42 +00:00
|
|
|
|
using var db = new BotDatabaseContext();
|
2022-03-20 19:40:33 +00:00
|
|
|
|
var settings = (from row in db.GuildConfigurations
|
2022-11-23 07:19:37 +00:00
|
|
|
|
where row.GuildId == guild.Id
|
|
|
|
|
select new { ModRole = row.ModeratorRole, ModMode = row.Moderated }).FirstOrDefault();
|
2022-03-20 19:40:33 +00:00
|
|
|
|
if (settings != null) {
|
|
|
|
|
// Bot moderators override all blocking measures in place
|
|
|
|
|
if (user.Roles.Any(r => r.Id == settings.ModRole)) return Task.FromResult(PreconditionResult.FromSuccess());
|
|
|
|
|
|
|
|
|
|
// Check for moderated mode
|
|
|
|
|
if (settings.ModMode) return Task.FromResult(PreconditionResult.FromError(FailModerated));
|
|
|
|
|
|
|
|
|
|
// Check if user exists in blocklist
|
2022-11-23 07:19:37 +00:00
|
|
|
|
if (db.BlocklistEntries.Where(row => row.GuildId == guild.Id && row.UserId == user.Id).Any())
|
2022-03-20 19:40:33 +00:00
|
|
|
|
return Task.FromResult(PreconditionResult.FromError(FailBlocked));
|
|
|
|
|
}
|
2022-03-12 05:52:46 +00:00
|
|
|
|
|
2022-03-20 04:09:42 +00:00
|
|
|
|
return Task.FromResult(PreconditionResult.FromSuccess());
|
2022-03-12 05:52:46 +00:00
|
|
|
|
}
|
|
|
|
|
}
|