Fix SocketCategoryChannel properties (#945)
* Update Users property for category channels * Wrong property being used for Channels property CategoryId is the category that "owns" this channel. That is actually impossible right now for category channels, so it returns null and get all channels wrongly. * Resolve permissions for category * Remove spaces * Small fix for IChannel.GetUsersAsync
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Collections.Immutable;
|
using System.Collections.Immutable;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
@@ -15,10 +15,12 @@ namespace Discord.WebSocket
|
|||||||
public class SocketCategoryChannel : SocketGuildChannel, ICategoryChannel
|
public class SocketCategoryChannel : SocketGuildChannel, ICategoryChannel
|
||||||
{
|
{
|
||||||
public override IReadOnlyCollection<SocketGuildUser> Users
|
public override IReadOnlyCollection<SocketGuildUser> Users
|
||||||
=> Guild.Users.Where(x => x.VoiceChannel?.Id == Id).ToImmutableArray();
|
=> Guild.Users.Where(x => Permissions.GetValue(
|
||||||
|
Permissions.ResolveChannel(Guild, x, this, Permissions.ResolveGuild(Guild, x)),
|
||||||
|
ChannelPermission.ViewChannel)).ToImmutableArray();
|
||||||
|
|
||||||
public IReadOnlyCollection<SocketGuildChannel> Channels
|
public IReadOnlyCollection<SocketGuildChannel> Channels
|
||||||
=> Guild.Channels.Where(x => x.CategoryId == CategoryId).ToImmutableArray();
|
=> Guild.Channels.Where(x => x.CategoryId == Id).ToImmutableArray();
|
||||||
|
|
||||||
internal SocketCategoryChannel(DiscordSocketClient discord, ulong id, SocketGuild guild)
|
internal SocketCategoryChannel(DiscordSocketClient discord, ulong id, SocketGuild guild)
|
||||||
: base(discord, id, guild)
|
: base(discord, id, guild)
|
||||||
@@ -31,14 +33,28 @@ namespace Discord.WebSocket
|
|||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Users
|
||||||
|
public override SocketGuildUser GetUser(ulong id)
|
||||||
|
{
|
||||||
|
var user = Guild.GetUser(id);
|
||||||
|
if (user != null)
|
||||||
|
{
|
||||||
|
var guildPerms = Permissions.ResolveGuild(Guild, user);
|
||||||
|
var channelPerms = Permissions.ResolveChannel(Guild, user, this, guildPerms);
|
||||||
|
if (Permissions.GetValue(channelPerms, ChannelPermission.ViewChannel))
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
private string DebuggerDisplay => $"{Name} ({Id}, Category)";
|
private string DebuggerDisplay => $"{Name} ({Id}, Category)";
|
||||||
internal new SocketCategoryChannel Clone() => MemberwiseClone() as SocketCategoryChannel;
|
internal new SocketCategoryChannel Clone() => MemberwiseClone() as SocketCategoryChannel;
|
||||||
|
|
||||||
// IGuildChannel
|
// IGuildChannel
|
||||||
IAsyncEnumerable<IReadOnlyCollection<IGuildUser>> IGuildChannel.GetUsersAsync(CacheMode mode, RequestOptions options)
|
IAsyncEnumerable<IReadOnlyCollection<IGuildUser>> IGuildChannel.GetUsersAsync(CacheMode mode, RequestOptions options)
|
||||||
=> throw new NotSupportedException();
|
=> ImmutableArray.Create<IReadOnlyCollection<IGuildUser>>(Users).ToAsyncEnumerable();
|
||||||
Task<IGuildUser> IGuildChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions options)
|
Task<IGuildUser> IGuildChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions options)
|
||||||
=> throw new NotSupportedException();
|
=> Task.FromResult<IGuildUser>(GetUser(id));
|
||||||
Task<IInviteMetadata> IGuildChannel.CreateInviteAsync(int? maxAge, int? maxUses, bool isTemporary, bool isUnique, RequestOptions options)
|
Task<IInviteMetadata> IGuildChannel.CreateInviteAsync(int? maxAge, int? maxUses, bool isTemporary, bool isUnique, RequestOptions options)
|
||||||
=> throw new NotSupportedException();
|
=> throw new NotSupportedException();
|
||||||
Task<IReadOnlyCollection<IInviteMetadata>> IGuildChannel.GetInvitesAsync(RequestOptions options)
|
Task<IReadOnlyCollection<IInviteMetadata>> IGuildChannel.GetInvitesAsync(RequestOptions options)
|
||||||
@@ -46,8 +62,8 @@ namespace Discord.WebSocket
|
|||||||
|
|
||||||
//IChannel
|
//IChannel
|
||||||
IAsyncEnumerable<IReadOnlyCollection<IUser>> IChannel.GetUsersAsync(CacheMode mode, RequestOptions options)
|
IAsyncEnumerable<IReadOnlyCollection<IUser>> IChannel.GetUsersAsync(CacheMode mode, RequestOptions options)
|
||||||
=> throw new NotSupportedException();
|
=> ImmutableArray.Create<IReadOnlyCollection<IUser>>(Users).ToAsyncEnumerable();
|
||||||
Task<IUser> IChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions options)
|
Task<IUser> IChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions options)
|
||||||
=> throw new NotSupportedException();
|
=> Task.FromResult<IUser>(GetUser(id));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user