|
|
@@ -7,13 +7,25 @@ using System.Linq; |
|
|
|
|
|
|
|
namespace Discord |
|
|
|
{ |
|
|
|
public struct ChannelPermissionsPair |
|
|
|
{ |
|
|
|
public Channel Channel; |
|
|
|
public ChannelPermissions Permissions; |
|
|
|
|
|
|
|
public ChannelPermissionsPair(Channel channel) |
|
|
|
{ |
|
|
|
Channel = channel; |
|
|
|
Permissions = new ChannelPermissions(); |
|
|
|
Permissions.Lock(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public class User : CachedObject |
|
|
|
{ |
|
|
|
internal static string GetId(string userId, string serverId) => (serverId ?? "Private") + '_' + userId; |
|
|
|
internal static string GetAvatarUrl(string userId, string avatarId) => avatarId != null ? Endpoints.UserAvatar(userId, avatarId) : null; |
|
|
|
|
|
|
|
private ConcurrentDictionary<string, Channel> _channels; |
|
|
|
private ConcurrentDictionary<string, ChannelPermissions> _permissions; |
|
|
|
|
|
|
|
private ConcurrentDictionary<string, ChannelPermissionsPair> _permissions; |
|
|
|
private ServerPermissions _serverPermissions; |
|
|
|
|
|
|
|
/// <summary> Returns a unique identifier combining this user's id with its server's. </summary> |
|
|
@@ -91,13 +103,8 @@ namespace Discord |
|
|
|
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.Value.Permissions.ReadMessages) |
|
|
|
.Select(x => x.Value.Channel) |
|
|
|
.Where(x => x != null); |
|
|
|
} |
|
|
|
else |
|
|
@@ -136,10 +143,10 @@ namespace Discord |
|
|
|
_roles = new Dictionary<string, Role>(); |
|
|
|
|
|
|
|
Status = UserStatus.Offline; |
|
|
|
_channels = new ConcurrentDictionary<string, Channel>(); |
|
|
|
//_channels = new ConcurrentDictionary<string, Channel>(); |
|
|
|
if (serverId != null) |
|
|
|
{ |
|
|
|
_permissions = new ConcurrentDictionary<string, ChannelPermissions>(); |
|
|
|
_permissions = new ConcurrentDictionary<string, ChannelPermissionsPair>(); |
|
|
|
_serverPermissions = new ServerPermissions(); |
|
|
|
} |
|
|
|
|
|
|
@@ -268,7 +275,6 @@ namespace Discord |
|
|
|
newPermissions = ServerPermissions.All.RawValue; |
|
|
|
else |
|
|
|
{ |
|
|
|
//var roles = Roles.OrderBy(x => x.Id); |
|
|
|
var roles = Roles; |
|
|
|
foreach (var serverRole in roles) |
|
|
|
newPermissions |= serverRole.Permissions.RawValue; |
|
|
@@ -280,8 +286,8 @@ namespace Discord |
|
|
|
if (newPermissions != oldPermissions) |
|
|
|
{ |
|
|
|
_serverPermissions.SetRawValueInternal(newPermissions); |
|
|
|
foreach (var channel in _channels) |
|
|
|
UpdateChannelPermissions(channel.Value); |
|
|
|
foreach (var permission in _permissions) |
|
|
|
UpdateChannelPermissions(permission.Value.Channel); |
|
|
|
} |
|
|
|
} |
|
|
|
internal void UpdateChannelPermissions(Channel channel) |
|
|
@@ -290,10 +296,10 @@ namespace Discord |
|
|
|
if (server == null) return; |
|
|
|
if (channel.Server != server) throw new InvalidOperationException(); |
|
|
|
|
|
|
|
ChannelPermissions permissions; |
|
|
|
if (!_permissions.TryGetValue(channel.Id, out permissions)) return; |
|
|
|
ChannelPermissionsPair chanPerms; |
|
|
|
if (!_permissions.TryGetValue(channel.Id, out chanPerms)) return; |
|
|
|
uint newPermissions = _serverPermissions.RawValue; |
|
|
|
uint oldPermissions = permissions.RawValue; |
|
|
|
uint oldPermissions = chanPerms.Permissions.RawValue; |
|
|
|
|
|
|
|
if (server.Owner == this) |
|
|
|
newPermissions = ChannelPermissions.All(channel).RawValue; |
|
|
@@ -321,11 +327,11 @@ namespace Discord |
|
|
|
|
|
|
|
if (newPermissions != oldPermissions) |
|
|
|
{ |
|
|
|
permissions.SetRawValueInternal(newPermissions); |
|
|
|
chanPerms.Permissions.SetRawValueInternal(newPermissions); |
|
|
|
channel.InvalidateMembersCache(); |
|
|
|
} |
|
|
|
|
|
|
|
permissions.SetRawValueInternal(newPermissions); |
|
|
|
chanPerms.Permissions.SetRawValueInternal(newPermissions); |
|
|
|
} |
|
|
|
|
|
|
|
public ServerPermissions GetServerPermissions() => _serverPermissions; |
|
|
@@ -337,9 +343,9 @@ namespace Discord |
|
|
|
if (_server.Id == null) |
|
|
|
return ChannelPermissions.PrivateOnly; |
|
|
|
|
|
|
|
ChannelPermissions perms; |
|
|
|
if (_permissions.TryGetValue(channel.Id, out perms)) |
|
|
|
return perms; |
|
|
|
ChannelPermissionsPair chanPerms; |
|
|
|
if (_permissions.TryGetValue(channel.Id, out chanPerms)) |
|
|
|
return chanPerms.Permissions; |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
@@ -347,10 +353,7 @@ namespace Discord |
|
|
|
{ |
|
|
|
if (_server.Id != null) |
|
|
|
{ |
|
|
|
var perms = new ChannelPermissions(); |
|
|
|
perms.Lock(); |
|
|
|
_channels.TryAdd(channel.Id, channel); |
|
|
|
_permissions.TryAdd(channel.Id, perms); |
|
|
|
_permissions.TryAdd(channel.Id, new ChannelPermissionsPair(channel)); |
|
|
|
UpdateChannelPermissions(channel); |
|
|
|
} |
|
|
|
} |
|
|
@@ -358,8 +361,8 @@ namespace Discord |
|
|
|
{ |
|
|
|
if (_server.Id != null) |
|
|
|
{ |
|
|
|
ChannelPermissions ignored; |
|
|
|
_channels.TryRemove(channel.Id, out channel); |
|
|
|
ChannelPermissionsPair ignored; |
|
|
|
//_channels.TryRemove(channel.Id, out channel); |
|
|
|
_permissions.TryRemove(channel.Id, out ignored); |
|
|
|
} |
|
|
|
} |
|
|
|