Skip to content

Commit

Permalink
Fixed potential failure when modifying permission overwrite after cre…
Browse files Browse the repository at this point in the history
…ation immediately
  • Loading branch information
gehongyan committed Jul 29, 2023
1 parent f49ba86 commit 605f8b3
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 14 deletions.
8 changes: 6 additions & 2 deletions src/Kook.Net.Rest/Entities/Channels/ChannelHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -514,7 +514,9 @@ public static async Task<UserPermissionOverwrite> ModifyPermissionOverwriteAsync
IGuildUser user, Func<OverwritePermissions, OverwritePermissions> func, RequestOptions options)
{
OverwritePermissions? perms = channel.UserPermissionOverwrites.SingleOrDefault(x => x.Target.Id == user.Id)?.Permissions;
if (!perms.HasValue) return null;
if (!perms.HasValue)
throw new ArgumentNullException(nameof(user),
"The user does not have any permission overwrites on this channel.");

perms = func(perms.Value);
ModifyChannelPermissionOverwriteParams args = new(channel.Id, PermissionOverwriteTargetType.User,
Expand All @@ -530,7 +532,9 @@ public static async Task<RolePermissionOverwrite> ModifyPermissionOverwriteAsync
IRole role, Func<OverwritePermissions, OverwritePermissions> func, RequestOptions options)
{
OverwritePermissions? perms = channel.RolePermissionOverwrites.SingleOrDefault(x => x.Target == role.Id)?.Permissions;
if (!perms.HasValue) return null;
if (!perms.HasValue)
throw new ArgumentNullException(nameof(role),
"The role does not have any permission overwrites on this channel.");

perms = func(perms.Value);
ModifyChannelPermissionOverwriteParams args = new(channel.Id, PermissionOverwriteTargetType.Role,
Expand Down
66 changes: 54 additions & 12 deletions src/Kook.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -170,8 +170,11 @@ public Task DeleteAsync(RequestOptions options = null)
/// <returns>
/// A task representing the asynchronous permission operation for adding the specified permissions to the channel.
/// </returns>
public async Task AddPermissionOverwriteAsync(IGuildUser user, RequestOptions options = null) =>
await ChannelHelper.AddPermissionOverwriteAsync(this, Kook, user, options).ConfigureAwait(false);
public async Task AddPermissionOverwriteAsync(IGuildUser user, RequestOptions options = null)
{
UserPermissionOverwrite perms = await ChannelHelper.AddPermissionOverwriteAsync(this, Kook, user, options).ConfigureAwait(false);
_userPermissionOverwrites = _userPermissionOverwrites.Add(perms);
}

/// <summary>
/// Adds or updates the permission overwrite for the given role.
Expand All @@ -181,8 +184,11 @@ public async Task AddPermissionOverwriteAsync(IGuildUser user, RequestOptions op
/// <returns>
/// A task representing the asynchronous permission operation for adding the specified permissions to the channel.
/// </returns>
public async Task AddPermissionOverwriteAsync(IRole role, RequestOptions options = null) =>
await ChannelHelper.AddPermissionOverwriteAsync(this, Kook, role, options).ConfigureAwait(false);
public async Task AddPermissionOverwriteAsync(IRole role, RequestOptions options = null)
{
RolePermissionOverwrite perms = await ChannelHelper.AddPermissionOverwriteAsync(this, Kook, role, options).ConfigureAwait(false);
_rolePermissionOverwrites = _rolePermissionOverwrites.Add(perms);
}

/// <summary>
/// Removes the permission overwrite for the given user, if one exists.
Expand All @@ -192,9 +198,18 @@ public async Task AddPermissionOverwriteAsync(IRole role, RequestOptions options
/// <returns>
/// A task representing the asynchronous operation for removing the specified permissions from the channel.
/// </returns>
public async Task RemovePermissionOverwriteAsync(IGuildUser user, RequestOptions options = null) =>
public async Task RemovePermissionOverwriteAsync(IGuildUser user, RequestOptions options = null)
{
await ChannelHelper.RemovePermissionOverwriteAsync(this, Kook, user, options).ConfigureAwait(false);

for (int i = 0; i < _userPermissionOverwrites.Length; i++)
if (_userPermissionOverwrites[i].Target.Id == user.Id)
{
_userPermissionOverwrites = _userPermissionOverwrites.RemoveAt(i);
return;
}
}

/// <summary>
/// Removes the permission overwrite for the given role, if one exists.
/// </summary>
Expand All @@ -203,9 +218,18 @@ public async Task RemovePermissionOverwriteAsync(IGuildUser user, RequestOptions
/// <returns>
/// A task representing the asynchronous operation for removing the specified permissions from the channel.
/// </returns>
public async Task RemovePermissionOverwriteAsync(IRole role, RequestOptions options = null) =>
public async Task RemovePermissionOverwriteAsync(IRole role, RequestOptions options = null)
{
await ChannelHelper.RemovePermissionOverwriteAsync(this, Kook, role, options).ConfigureAwait(false);

for (int i = 0; i < _rolePermissionOverwrites.Length; i++)
if (_rolePermissionOverwrites[i].Target == role.Id)
{
_rolePermissionOverwrites = _rolePermissionOverwrites.RemoveAt(i);
return;
}
}

/// <summary>
/// Updates the permission overwrite for the given user, if one exists.
/// </summary>
Expand All @@ -215,9 +239,18 @@ public async Task RemovePermissionOverwriteAsync(IRole role, RequestOptions opti
/// <returns>
/// A task representing the asynchronous operation for removing the specified permissions from the channel.
/// </returns>
public async Task ModifyPermissionOverwriteAsync(IGuildUser user, Func<OverwritePermissions, OverwritePermissions> func,
RequestOptions options = null) =>
await ChannelHelper.ModifyPermissionOverwriteAsync(this, Kook, user, func, options).ConfigureAwait(false);
public async Task ModifyPermissionOverwriteAsync(IGuildUser user, Func<OverwritePermissions, OverwritePermissions> func, RequestOptions options = null)
{
UserPermissionOverwrite perms = await ChannelHelper.ModifyPermissionOverwriteAsync(this, Kook, user, func, options).ConfigureAwait(false);

for (int i = 0; i < _userPermissionOverwrites.Length; i++)
if (_userPermissionOverwrites[i].Target.Id == user.Id)
{
_userPermissionOverwrites = _userPermissionOverwrites.RemoveAt(i);
_userPermissionOverwrites = _userPermissionOverwrites.Add(perms);
return;
}
}

/// <summary>
/// Updates the permission overwrite for the given role, if one exists.
Expand All @@ -228,9 +261,18 @@ public async Task ModifyPermissionOverwriteAsync(IGuildUser user, Func<Overwrite
/// <returns>
/// A task representing the asynchronous operation for removing the specified permissions from the channel.
/// </returns>
public async Task
ModifyPermissionOverwriteAsync(IRole role, Func<OverwritePermissions, OverwritePermissions> func, RequestOptions options = null) =>
await ChannelHelper.ModifyPermissionOverwriteAsync(this, Kook, role, func, options).ConfigureAwait(false);
public async Task ModifyPermissionOverwriteAsync(IRole role, Func<OverwritePermissions, OverwritePermissions> func, RequestOptions options = null)
{
RolePermissionOverwrite perms = await ChannelHelper.ModifyPermissionOverwriteAsync(this, Kook, role, func, options).ConfigureAwait(false);

for (int i = 0; i < _rolePermissionOverwrites.Length; i++)
if (_rolePermissionOverwrites[i].Target == role.Id)
{
_rolePermissionOverwrites = _rolePermissionOverwrites.RemoveAt(i);
_rolePermissionOverwrites = _rolePermissionOverwrites.Add(perms);
return;
}
}

/// <summary>
/// Gets a <see cref="SocketGuildUser"/> from this channel.
Expand Down

0 comments on commit 605f8b3

Please sign in to comment.