using System.Collections.Generic; using System.Linq; using ChaosBot.Models; using ChaosBot.Repositories; using Discord.Commands; using Discord.WebSocket; namespace ChaosBot.Services { public class CheckPermissions { public static bool CheckPerms(ICommandContext context, string command, string defaultRole = "User") { // Debug information LoggingFacade.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 commandPermissions; using (ChaosbotContext dbContext = new ChaosbotContext()) { IQueryable 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($"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 LoggingFacade.Info("CheckCommandperm.CheckPermissionsAsync|commandPermissions: No Default"); } // Permission denied return false; } } }