Skip to content

Commit 05cd1ff

Browse files
committed
Don't attempt to resolve permissions for invalid roles
This resolves #824. Discord seems to have inconsistencies where a role can be deleted, but there will still be a few users who still have it in their `role_ids`. I was able to find this bug appearing in 11 members of a 10,000 member guild, so it would make sense that this is relatively rare, and it's why we hadn't noticed it previously. Since our permission resolution code is implementation agnostic, it operates on the user's RoleIds collection, which is what Discord sends us directly, and is not vaidated against the member's guild. In our permission resolution code, we make the assumption that Discord will always be telling us the truth with regard to a member's `role_ids`. This PR changes the behavior of permissions resolution to instead verify that the guild was able to return a role before attempting to resolve its permissions.
1 parent a384ce0 commit 05cd1ff

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

src/Discord.Net.Core/Utils/Permissions.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,10 @@ public static ulong ResolveChannel(IGuild guild, IGuildUser user, IGuildChannel
133133
ulong deniedPermissions = 0UL, allowedPermissions = 0UL;
134134
foreach (var roleId in user.RoleIds)
135135
{
136-
if (roleId != guild.EveryoneRole.Id)
136+
IRole role = null;
137+
if (roleId != guild.EveryoneRole.Id && (role = guild.GetRole(roleId)) != null)
137138
{
138-
perms = channel.GetPermissionOverwrite(guild.GetRole(roleId));
139+
perms = channel.GetPermissionOverwrite(role);
139140
if (perms != null)
140141
{
141142
allowedPermissions |= perms.Value.AllowValue;

0 commit comments

Comments
 (0)