| @@ -1,4 +1,4 @@ | |||
| using System; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Collections.Immutable; | |||
| using System.Diagnostics; | |||
| @@ -15,7 +15,9 @@ namespace Discord.WebSocket | |||
| public class SocketCategoryChannel : SocketGuildChannel, ICategoryChannel | |||
| { | |||
| public override IReadOnlyCollection<SocketGuildUser> Users | |||
| => throw new NotSupportedException(); | |||
| => Guild.Users.Where(x => Permissions.GetValue( | |||
| Permissions.ResolveChannel(Guild, x, this, Permissions.ResolveGuild(Guild, x)), | |||
| ChannelPermission.ViewChannel)).ToImmutableArray(); | |||
| public IReadOnlyCollection<SocketGuildChannel> Channels | |||
| => Guild.Channels.Where(x => x.CategoryId == Id).ToImmutableArray(); | |||
| @@ -31,14 +33,28 @@ namespace Discord.WebSocket | |||
| 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)"; | |||
| internal new SocketCategoryChannel Clone() => MemberwiseClone() as SocketCategoryChannel; | |||
| internal new SocketCategoryChannel Clone() => MemberwiseClone() as SocketCategoryChannel; | |||
| // IGuildChannel | |||
| 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) | |||
| => throw new NotSupportedException(); | |||
| => Task.FromResult<IGuildUser>(GetUser(id)); | |||
| Task<IInviteMetadata> IGuildChannel.CreateInviteAsync(int? maxAge, int? maxUses, bool isTemporary, bool isUnique, RequestOptions options) | |||
| => throw new NotSupportedException(); | |||
| Task<IReadOnlyCollection<IInviteMetadata>> IGuildChannel.GetInvitesAsync(RequestOptions options) | |||
| @@ -46,8 +62,8 @@ namespace Discord.WebSocket | |||
| //IChannel | |||
| IAsyncEnumerable<IReadOnlyCollection<IUser>> IChannel.GetUsersAsync(CacheMode mode, RequestOptions options) | |||
| => throw new NotSupportedException(); | |||
| => ImmutableArray.Create<IReadOnlyCollection<IGuildUser>>(Users).ToAsyncEnumerable(); | |||
| Task<IUser> IChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions options) | |||
| => throw new NotSupportedException(); | |||
| => Task.FromResult<IUser>(GetUser(id)); | |||
| } | |||
| } | |||