diff --git a/src/Discord.Net/Models/User.cs b/src/Discord.Net/Models/User.cs index 935fd4fdc..1da6990e3 100644 --- a/src/Discord.Net/Models/User.cs +++ b/src/Discord.Net/Models/User.cs @@ -82,7 +82,32 @@ namespace Discord /// Returns a collection of all channels this user is a member of. [JsonIgnore] - public IEnumerable Channels => _channels.Select(x => x.Value); + public IEnumerable Channels + { + get + { + if (_server.Id != null) + { + return _permissions + .Where(x => x.Value.ReadMessages) + .Select(x => + { + Channel channel = null; + _channels.TryGetValue(x.Key, out channel); + return channel; + }) + .Where(x => x != null); + } + else + { + var privateChannel = PrivateChannel; + if (privateChannel != null) + return new Channel[] { privateChannel }; + else + return new Channel[0]; + } + } + } internal User(DiscordClient client, string id, string serverId) : base(client, id) @@ -309,17 +334,23 @@ namespace Discord internal void AddChannel(Channel channel) { - var perms = new ChannelPermissions(); - perms.Lock(); - _channels.TryAdd(channel.Id, channel); - _permissions.TryAdd(channel.Id, perms); - UpdateChannelPermissions(channel); + if (_server.Id != null) + { + var perms = new ChannelPermissions(); + perms.Lock(); + _channels.TryAdd(channel.Id, channel); + _permissions.TryAdd(channel.Id, perms); + UpdateChannelPermissions(channel); + } } internal void RemoveChannel(Channel channel) { - ChannelPermissions ignored; - _channels.TryRemove(channel.Id, out channel); - _permissions.TryRemove(channel.Id, out ignored); + if (_server.Id != null) + { + ChannelPermissions ignored; + _channels.TryRemove(channel.Id, out channel); + _permissions.TryRemove(channel.Id, out ignored); + } } public bool HasRole(Role role)