From 21959fe43c220d804f252cf65e75137336a1aa20 Mon Sep 17 00:00:00 2001 From: RogueException Date: Sat, 18 Mar 2017 10:36:37 -0300 Subject: [PATCH] Fixed several permission issues --- src/Discord.Net.Core/Utils/Permissions.cs | 27 ++++++++++++++++------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/Discord.Net.Core/Utils/Permissions.cs b/src/Discord.Net.Core/Utils/Permissions.cs index a6c545da0..d0e78472d 100644 --- a/src/Discord.Net.Core/Utils/Permissions.cs +++ b/src/Discord.Net.Core/Utils/Permissions.cs @@ -111,7 +111,7 @@ namespace Discord ulong resolvedPermissions = 0; ulong mask = ChannelPermissions.All(channel).RawValue; - if (/*user.Id == user.Guild.OwnerId || */GetValue(guildPermissions, GuildPermission.Administrator)) + if (GetValue(guildPermissions, GuildPermission.Administrator)) //Includes owner resolvedPermissions = mask; //Owners and administrators always have all permissions else { @@ -133,21 +133,32 @@ namespace Discord deniedPermissions |= perms.Value.DenyValue; } } - resolvedPermissions = (resolvedPermissions | allowedPermissions) & ~deniedPermissions; + resolvedPermissions = (resolvedPermissions & ~deniedPermissions) | allowedPermissions; } //Give/Take User permissions perms = channel.GetPermissionOverwrite(user); if (perms != null) - resolvedPermissions = (resolvedPermissions | perms.Value.AllowValue) & ~perms.Value.DenyValue; + resolvedPermissions = (resolvedPermissions & ~perms.Value.DenyValue) | perms.Value.AllowValue; //TODO: C#7 Typeswitch candidate var textChannel = channel as ITextChannel; - var voiceChannel = channel as IVoiceChannel; - if (textChannel != null && !GetValue(resolvedPermissions, ChannelPermission.ReadMessages)) - resolvedPermissions = 0; //No read permission on a text channel removes all other permissions - else if (voiceChannel != null && !GetValue(resolvedPermissions, ChannelPermission.Connect)) - resolvedPermissions = 0; //No connect permission on a voice channel removes all other permissions + if (textChannel != null) + { + if (!GetValue(resolvedPermissions, ChannelPermission.ReadMessages)) + { + //No read permission on a text channel removes all other permissions + resolvedPermissions = 0; + } + else if (!GetValue(resolvedPermissions, ChannelPermission.SendMessages)) + { + //No send permissions on a text channel removes all send-related permissions + resolvedPermissions &= ~(1UL << (int)ChannelPermission.SendTTSMessages); + resolvedPermissions &= ~(1UL << (int)ChannelPermission.MentionEveryone); + resolvedPermissions &= ~(1UL << (int)ChannelPermission.EmbedLinks); + resolvedPermissions &= ~(1UL << (int)ChannelPermission.AttachFiles); + } + } resolvedPermissions &= mask; //Ensure we didnt get any permissions this channel doesnt support (from guildPerms, for example) }