in Line code for special permission nodes
This commit is contained in:
parent
afcd6039c6
commit
a672c3968f
86
ChaosBot/Services/CheckPermissions.cs
Normal file
86
ChaosBot/Services/CheckPermissions.cs
Normal file
@ -0,0 +1,86 @@
|
||||
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;
|
||||
using NLog;
|
||||
|
||||
namespace ChaosBot.Services
|
||||
{
|
||||
public class CheckPermissions
|
||||
{
|
||||
private static ILogger _logger = Program.Logger;
|
||||
|
||||
public static async Task<Boolean> CheckPerms(ICommandContext context, string command, string defaultRole = "User")
|
||||
{
|
||||
// Debug information
|
||||
_logger.Trace($"CheckCommandPerm.CheckPermissionsAsync|Checking permissions for command: {command}");
|
||||
|
||||
// If user is not SocketGuildUser, then return error
|
||||
if (!(context.User is SocketGuildUser gUser)) return false;
|
||||
|
||||
// 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))
|
||||
.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 true;
|
||||
|
||||
return false;
|
||||
}
|
||||
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 true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (defaultRole == "Admin")
|
||||
{
|
||||
if (gUser.GuildPermissions.Administrator)
|
||||
return true;
|
||||
}
|
||||
else if (defaultRole == "User")
|
||||
{
|
||||
if (gUser.GuildPermissions.SendMessages)
|
||||
return true;
|
||||
}
|
||||
else
|
||||
_logger.Info($"CheckCommandperm.CheckPermissionsAsync|commandPermissions: No Default");
|
||||
}
|
||||
|
||||
// Permission denied
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user