chaosbot/ChaosBot/Discord/PreConditions/CheckCommandPerm.cs

87 lines
3.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using ChaosBot.Models;
using ChaosBot.Repositories;
using Discord.Commands;
using Discord.WebSocket;
namespace ChaosBot.Discord.PreConditions
{
public class CheckCommandPerm : PreconditionAttribute
{
private readonly string _defaultRole;
public CheckCommandPerm(string defaultRole) => _defaultRole = defaultRole;
public override Task<PreconditionResult> CheckPermissionsAsync(ICommandContext context, CommandInfo command, IServiceProvider services)
{
// Debug information
LoggingFacade.Trace($"CheckCommandPerm.CheckPermissionsAsync|Checking permissions for command: {command.Name}");
// If user is not SocketGuildUser, then return error
if (!(context.User is SocketGuildUser gUser)) return Task.FromResult(PreconditionResult.FromError("You must be in a guild to run this command."));
// Get the possible permissions
List<CommandPermission> commandPermissions;
using (ChaosbotContext dbContext = new ChaosbotContext())
{
IQueryable<CommandPermission> permissions = dbContext.CommandPermissions;
commandPermissions = permissions.Where(p => p.Command.Equals(command.Name))
.Where(p => p.DiscordGuildId == context.Guild.Id)
.ToList();
}
// If we can find a permission
if(commandPermissions.Count >= 1)
{
// Loop through all permissions
foreach (CommandPermission perm in commandPermissions)
{
ulong requiredGroup;
// Check if it's a role or group permission and fetch the right type
if (perm.TargetType == (int)PermissionTarget.Role)
{
// If it's a role, check the configuration for the role otherwise return the permission value
requiredGroup = ConfigurationRepository.GetValue<ulong>($"Role:{perm.TargetId}", context.Guild.Id, perm.TargetId);
}
else if (perm.TargetType == (int) PermissionTarget.User)
{
if(context.User.Id == perm.TargetId)
return Task.FromResult(PreconditionResult.FromSuccess());
return Task.FromResult(PreconditionResult.FromError($"You do not have access to this command."));
}
else
{
// Return the permission value
requiredGroup = perm.TargetId;
}
// Check if any of the users roles are of the required group, if so, permission granted
if (gUser.Roles.Any(r => r.Id == requiredGroup))
return Task.FromResult(PreconditionResult.FromSuccess());
}
}
else
{
if (_defaultRole == "Admin")
{
if(gUser.GuildPermissions.Administrator)
return Task.FromResult(PreconditionResult.FromSuccess());
}
else if ( _defaultRole == "User")
{
if(gUser.GuildPermissions.SendMessages)
return Task.FromResult(PreconditionResult.FromSuccess());
}
else
LoggingFacade.Info($"CheckCommandperm.CheckPermissionsAsync|commandPermissions: No Default");
}
// Permission denied
return Task.FromResult(PreconditionResult.FromError($"You do not have access to this command."));
}
}
}