@@ -39,61 +39,8 @@ namespace Discord
return SetChannelPermissions(channel, role?.Id, PermissionTarget.Role, permissions?.Allow, permissions?.Deny);
}
private async Task SetChannelPermissions(Channel channel, string targetId, PermissionTarget targetType, ChannelPermissions allow = null, ChannelPermissions deny = null)
{
uint allowValue = allow?.RawValue ?? 0;
uint denyValue = deny?.RawValue ?? 0;
bool changed = false;
var perms = channel.PermissionOverwrites.Where(x => x.TargetType != targetType || x.TargetId != targetId).FirstOrDefault();
if (allowValue != 0 || denyValue != 0)
{
await _api.SetChannelPermissions(channel.Id, targetId, targetType.Value, allowValue, denyValue).ConfigureAwait(false);
if (perms != null)
{
perms.Allow.SetRawValueInternal(allowValue);
perms.Deny.SetRawValueInternal(denyValue);
}
else
{
var oldPerms = channel.PermissionOverwrites.ToArray();
var newPerms = new Channel.PermissionOverwrite[oldPerms.Length + 1];
Array.Copy(oldPerms, newPerms, oldPerms.Length);
newPerms[oldPerms.Length] = new Channel.PermissionOverwrite(targetType, targetId, allowValue, denyValue);
channel.PermissionOverwrites = newPerms;
}
changed = true;
}
else
{
try
{
await _api.DeleteChannelPermissions(channel.Id, targetId).ConfigureAwait(false);
if (perms != null)
{
channel.PermissionOverwrites = channel.PermissionOverwrites.Where(x => x.TargetType != targetType || x.TargetId != targetId).ToArray();
changed = true;
}
}
catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { }
}
if (changed)
{
if (targetType == PermissionTarget.Role)
{
var role = _roles[targetId];
if (role != null)
channel.InvalidatePermissionsCache(role);
}
else if (targetType == PermissionTarget.User)
{
var user = _users[targetId, channel.Server?.Id];
if (user != null)
channel.InvalidatePermissionsCache(user);
}
}
}
private Task SetChannelPermissions(Channel channel, string targetId, PermissionTarget targetType, ChannelPermissions allow = null, ChannelPermissions deny = null)
=> _api.SetChannelPermissions(channel.Id, targetId, targetType.Value, allow?.RawValue ?? 0, deny?.RawValue ?? 0);
public Task RemoveChannelUserPermissions(Channel channel, User user)
{
@@ -117,22 +64,6 @@ namespace Discord
{
var perms = channel.PermissionOverwrites.Where(x => x.TargetType != targetType || x.TargetId != userOrRoleId).FirstOrDefault();
await _api.DeleteChannelPermissions(channel.Id, userOrRoleId).ConfigureAwait(false);
if (perms != null)
{
channel.PermissionOverwrites.Where(x => x.TargetType != targetType || x.TargetId != userOrRoleId).ToArray();
if (targetType == PermissionTarget.Role)
{
var role = _roles[userOrRoleId];
channel.InvalidatePermissionsCache(role);
}
else if (targetType == PermissionTarget.User)
{
var user = _users[userOrRoleId, channel.Server?.Id];
if (user != null)
channel.InvalidatePermissionsCache(user);
}
}
}
catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { }
}