using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using Luski.Shared.PublicServers.V1.Enums; using Luski.Shared.PublicServers.V1.Shared; namespace Luski.net.Structures.Public; public class SocketAppUser : SocketUser { public long SelectedChannel { get; init; } = default!; public async Task GetSelectedChannel(CancellationToken Token) { return await Server.GetChannel(SelectedChannel, Token); } public async Task HasAccessToCategory(SocketCategory Category, ServerPermission RequiredPerms) { if (Category.Server != Server) return false; if (Server.OwnerID == Id) return true; Role[] UserRoleIDList = await GetRoles(); RequiredPerms |= ServerPermission.ViewThis; ServerPermission GoodPerms = ServerPermission.None; UserOverride[] CatUserOverides = await Category.GetUserOverrides(); foreach (UserOverride CatUserOveride in CatUserOverides) { if (CatUserOveride.UserID != Id) continue; if ((CatUserOveride.BadPermissions & RequiredPerms) > ServerPermission.None) return false; GoodPerms |= CatUserOveride.GoodPermissions; } RoleOveride[] CatRoleOverides = await Category.GetRoleOverrides(); foreach (RoleOveride CatRoleOveride in CatRoleOverides) { if (!RoleIds.Contains(CatRoleOveride.ParentRoleID)) continue; if ((CatRoleOveride.BadPermissions & RequiredPerms) > ServerPermission.None) return false; GoodPerms |= CatRoleOveride.GoodPermissions; } foreach (Role RoleID in UserRoleIDList) { if (((RoleID.ServerPermissions & RequiredPerms) ^ GoodPerms) > ServerPermission.None) return false; GoodPerms |= RoleID.ServerPermissions; } return GoodPerms.HasPermission(RequiredPerms); } public string Username { get; internal set; } = default!; }