2018-03-29 13:35:00 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Concurrent;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using DeukBot4.Database;
|
|
|
|
|
using Discord;
|
2018-03-28 23:34:48 +00:00
|
|
|
|
using Discord.WebSocket;
|
|
|
|
|
|
|
|
|
|
namespace DeukBot4.MessageHandlers.Permissions
|
|
|
|
|
{
|
|
|
|
|
public static class PermissionValidator
|
|
|
|
|
{
|
2018-03-29 13:35:00 +00:00
|
|
|
|
private static readonly ConcurrentDictionary<ulong, ConcurrentDictionary<ulong, PermissionLevel>> PermissionCache =
|
|
|
|
|
new ConcurrentDictionary<ulong, ConcurrentDictionary<ulong, PermissionLevel>>();
|
|
|
|
|
|
|
|
|
|
private static async Task<PermissionLevel> GetDatabasePermissionLevelForRole(ulong serverId, ulong roleId)
|
|
|
|
|
{
|
|
|
|
|
if (PermissionCache.TryGetValue(serverId, out var serverPermissions))
|
|
|
|
|
{
|
|
|
|
|
if (serverPermissions.TryGetValue(roleId, out var permissions))
|
|
|
|
|
{
|
|
|
|
|
return permissions;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
PermissionCache.TryAdd(serverId, new ConcurrentDictionary<ulong, PermissionLevel>());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
serverPermissions = PermissionCache[serverId];
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var permission = await DatabaseRolePermissions.GetRolePermission(serverId, roleId);
|
|
|
|
|
serverPermissions.TryAdd(serverId, permission);
|
|
|
|
|
return permission;
|
|
|
|
|
}
|
|
|
|
|
catch(Exception e)
|
|
|
|
|
{
|
2018-08-13 16:41:59 +00:00
|
|
|
|
await Logger.Main.LogError(e.ToString());
|
2018-03-29 13:35:00 +00:00
|
|
|
|
return PermissionLevel.Everyone;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void UpdateCache(ulong serverId, ulong roleId, PermissionLevel level)
|
|
|
|
|
{
|
|
|
|
|
if (PermissionCache.TryGetValue(serverId, out var serverPermissions))
|
|
|
|
|
{
|
|
|
|
|
if (serverPermissions.ContainsKey(roleId))
|
|
|
|
|
{
|
|
|
|
|
serverPermissions[roleId] = level;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
serverPermissions.TryAdd(roleId, level);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static async Task<PermissionLevel> GetDatabasePermissionLevel(ulong serverId, ulong[] roles)
|
|
|
|
|
{
|
|
|
|
|
var highestRole = (PermissionLevel)sbyte.MinValue;
|
|
|
|
|
foreach (var role in roles)
|
|
|
|
|
{
|
|
|
|
|
var perms = await GetDatabasePermissionLevelForRole(serverId, role);
|
|
|
|
|
if (perms > highestRole)
|
|
|
|
|
{
|
|
|
|
|
highestRole = perms;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (highestRole == (PermissionLevel) sbyte.MinValue)
|
|
|
|
|
{
|
|
|
|
|
return PermissionLevel.Everyone;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return highestRole;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static async Task<PermissionLevel> GetUserPermissionLevel(SocketMessage message)
|
2018-03-28 23:34:48 +00:00
|
|
|
|
{
|
2018-03-29 19:57:16 +00:00
|
|
|
|
return await GetUserPermissionLevel(message.Channel, message.Author);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static async Task<PermissionLevel> GetUserPermissionLevel(ISocketMessageChannel channel, SocketUser user)
|
|
|
|
|
{
|
|
|
|
|
if (user.Id == Program.Settings.OwnerId)
|
2018-03-28 23:34:48 +00:00
|
|
|
|
{
|
2018-03-29 13:35:00 +00:00
|
|
|
|
return PermissionLevel.BotCreator;
|
2018-03-28 23:34:48 +00:00
|
|
|
|
}
|
2018-03-29 19:57:16 +00:00
|
|
|
|
if (user.IsBot)
|
2018-03-28 23:34:48 +00:00
|
|
|
|
{
|
|
|
|
|
return PermissionLevel.Bot;
|
|
|
|
|
}
|
2018-03-29 19:57:16 +00:00
|
|
|
|
if (!(channel is IGuildChannel serverChannel))
|
2018-03-29 13:35:00 +00:00
|
|
|
|
return PermissionLevel.Everyone;
|
2018-03-28 23:34:48 +00:00
|
|
|
|
|
2018-03-29 19:57:16 +00:00
|
|
|
|
|
|
|
|
|
if (serverChannel.Guild.OwnerId == user.Id)
|
2018-03-29 13:35:00 +00:00
|
|
|
|
return PermissionLevel.ServerOwner;
|
|
|
|
|
|
2018-03-29 19:57:16 +00:00
|
|
|
|
if (!(user is IGuildUser guildUser))
|
2018-03-29 13:35:00 +00:00
|
|
|
|
return PermissionLevel.Everyone;
|
|
|
|
|
|
2018-03-29 19:57:16 +00:00
|
|
|
|
var perms = await GetDatabasePermissionLevel(serverChannel.GuildId, guildUser.RoleIds.ToArray());
|
2018-03-29 13:35:00 +00:00
|
|
|
|
return perms;
|
2018-03-29 19:57:16 +00:00
|
|
|
|
|
2018-03-28 23:34:48 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|