Removed the VirtualEveryone, hardcoded permissions response for private channels instead.
This commit is contained in:
@@ -7,13 +7,8 @@ namespace Discord
|
|||||||
{
|
{
|
||||||
internal sealed class Roles : AsyncCollection<Role>
|
internal sealed class Roles : AsyncCollection<Role>
|
||||||
{
|
{
|
||||||
public Role VirtualEveryone { get; private set; }
|
|
||||||
|
|
||||||
public Roles(DiscordClient client, object writerLock)
|
public Roles(DiscordClient client, object writerLock)
|
||||||
: base(client, writerLock)
|
: base(client, writerLock) { }
|
||||||
{
|
|
||||||
VirtualEveryone = new Role(client, "Private", null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Role GetOrAdd(string id, string serverId)
|
public Role GetOrAdd(string id, string serverId)
|
||||||
=> GetOrAdd(id, () => new Role(_client, id, serverId));
|
=> GetOrAdd(id, () => new Role(_client, id, serverId));
|
||||||
|
|||||||
@@ -94,8 +94,11 @@ namespace Discord
|
|||||||
});
|
});
|
||||||
Status = UserStatus.Offline;
|
Status = UserStatus.Offline;
|
||||||
_channels = new ConcurrentDictionary<string, Channel>();
|
_channels = new ConcurrentDictionary<string, Channel>();
|
||||||
_permissions = new ConcurrentDictionary<string, ChannelPermissions>();
|
if (serverId != null)
|
||||||
_serverPermissions = new ServerPermissions();
|
{
|
||||||
|
_permissions = new ConcurrentDictionary<string, ChannelPermissions>();
|
||||||
|
_serverPermissions = new ServerPermissions();
|
||||||
|
}
|
||||||
|
|
||||||
if (serverId == null)
|
if (serverId == null)
|
||||||
UpdateRoles(null);
|
UpdateRoles(null);
|
||||||
@@ -181,18 +184,20 @@ namespace Discord
|
|||||||
}
|
}
|
||||||
private void UpdateRoles(IEnumerable<Role> roles)
|
private void UpdateRoles(IEnumerable<Role> roles)
|
||||||
{
|
{
|
||||||
Dictionary<string, Role> newRoles;
|
|
||||||
if (roles != null)
|
|
||||||
newRoles = roles.ToDictionary(x => x.Id, x => x);
|
|
||||||
else
|
|
||||||
newRoles = new Dictionary<string, Role>();
|
|
||||||
Role everyone;
|
|
||||||
if (_server.Id != null)
|
if (_server.Id != null)
|
||||||
everyone = Server.EveryoneRole;
|
{
|
||||||
|
Dictionary<string, Role> newRoles;
|
||||||
|
if (roles != null)
|
||||||
|
newRoles = roles.ToDictionary(x => x.Id, x => x);
|
||||||
|
else
|
||||||
|
newRoles = new Dictionary<string, Role>();
|
||||||
|
|
||||||
|
var everyone = Server.EveryoneRole;
|
||||||
|
newRoles.Add(everyone.Id, everyone);
|
||||||
|
_roles = newRoles;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
everyone = _client.Roles.VirtualEveryone;
|
_roles = new Dictionary<string, Role>();
|
||||||
newRoles.Add(everyone.Id, everyone);
|
|
||||||
_roles = newRoles;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void UpdateActivity(DateTime? activity = null)
|
internal void UpdateActivity(DateTime? activity = null)
|
||||||
@@ -200,20 +205,51 @@ namespace Discord
|
|||||||
if (LastActivityAt == null || activity > LastActivityAt.Value)
|
if (LastActivityAt == null || activity > LastActivityAt.Value)
|
||||||
LastActivityAt = activity ?? DateTime.UtcNow;
|
LastActivityAt = activity ?? DateTime.UtcNow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal void UpdateServerPermissions()
|
||||||
|
{
|
||||||
|
if (_roles == null) return; // We don't have all our data processed yet, this will be called again soon
|
||||||
|
|
||||||
|
var server = Server;
|
||||||
|
if (server == null) return;
|
||||||
|
|
||||||
|
uint newPermissions = 0x0;
|
||||||
|
uint oldPermissions = _serverPermissions.RawValue;
|
||||||
|
|
||||||
|
if (server.Owner == this)
|
||||||
|
newPermissions = ServerPermissions.All.RawValue;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//var roles = Roles.OrderBy(x => x.Id);
|
||||||
|
var roles = Roles;
|
||||||
|
foreach (var serverRole in roles)
|
||||||
|
newPermissions |= serverRole.Permissions.RawValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (BitHelper.GetBit(newPermissions, (int)PermissionsBits.ManageRolesOrPermissions))
|
||||||
|
newPermissions = ServerPermissions.All.RawValue;
|
||||||
|
|
||||||
|
if (newPermissions != oldPermissions)
|
||||||
|
{
|
||||||
|
_serverPermissions.SetRawValueInternal(newPermissions);
|
||||||
|
foreach (var channel in _channels)
|
||||||
|
UpdateChannelPermissions(channel.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
internal void UpdateChannelPermissions(Channel channel)
|
internal void UpdateChannelPermissions(Channel channel)
|
||||||
{
|
{
|
||||||
if (_roles == null) return; // We don't have all our data processed yet, this will be called again soon
|
if (_roles == null) return; // We don't have all our data processed yet, this will be called again soon
|
||||||
|
|
||||||
var server = Server;
|
var server = Server;
|
||||||
if (server != null && channel.Server != server) throw new InvalidOperationException();
|
if (server == null) return;
|
||||||
|
if (channel.Server != server) throw new InvalidOperationException();
|
||||||
|
|
||||||
ChannelPermissions permissions;
|
ChannelPermissions permissions;
|
||||||
if (!_permissions.TryGetValue(channel.Id, out permissions)) return;
|
if (!_permissions.TryGetValue(channel.Id, out permissions)) return;
|
||||||
uint newPermissions = _serverPermissions.RawValue;
|
uint newPermissions = _serverPermissions.RawValue;
|
||||||
uint oldPermissions = permissions.RawValue;
|
uint oldPermissions = permissions.RawValue;
|
||||||
|
|
||||||
if (server != null && server.Owner == this)
|
if (server.Owner == this)
|
||||||
newPermissions = ChannelPermissions.All(channel).RawValue;
|
newPermissions = ChannelPermissions.All(channel).RawValue;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -242,40 +278,16 @@ namespace Discord
|
|||||||
|
|
||||||
permissions.SetRawValueInternal(newPermissions);
|
permissions.SetRawValueInternal(newPermissions);
|
||||||
}
|
}
|
||||||
internal void UpdateServerPermissions()
|
|
||||||
{
|
|
||||||
if (_roles == null) return; // We don't have all our data processed yet, this will be called again soon
|
|
||||||
|
|
||||||
var server = Server;
|
public ServerPermissions GetServerPermissions() => _serverPermissions;
|
||||||
|
|
||||||
uint newPermissions = 0x0;
|
|
||||||
uint oldPermissions = _serverPermissions.RawValue;
|
|
||||||
|
|
||||||
if (server != null && server.Owner == this)
|
|
||||||
newPermissions = ServerPermissions.All.RawValue;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//var roles = Roles.OrderBy(x => x.Id);
|
|
||||||
var roles = Roles;
|
|
||||||
foreach (var serverRole in roles)
|
|
||||||
newPermissions |= serverRole.Permissions.RawValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (BitHelper.GetBit(newPermissions, (int)PermissionsBits.ManageRolesOrPermissions))
|
|
||||||
newPermissions = ServerPermissions.All.RawValue;
|
|
||||||
|
|
||||||
if (newPermissions != oldPermissions)
|
|
||||||
{
|
|
||||||
_serverPermissions.SetRawValueInternal(newPermissions);
|
|
||||||
foreach (var channel in _channels)
|
|
||||||
UpdateChannelPermissions(channel.Value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public ServerPermissions GetPermissions() => _serverPermissions;
|
|
||||||
public ChannelPermissions GetPermissions(Channel channel)
|
public ChannelPermissions GetPermissions(Channel channel)
|
||||||
{
|
{
|
||||||
if (channel == null) throw new ArgumentNullException(nameof(channel));
|
if (channel == null) throw new ArgumentNullException(nameof(channel));
|
||||||
|
|
||||||
|
//Return static permissions if this is a private chat
|
||||||
|
if (_server.Id == null)
|
||||||
|
return ChannelPermissions.PrivateOnly;
|
||||||
|
|
||||||
ChannelPermissions perms;
|
ChannelPermissions perms;
|
||||||
if (_permissions.TryGetValue(channel.Id, out perms))
|
if (_permissions.TryGetValue(channel.Id, out perms))
|
||||||
return perms;
|
return perms;
|
||||||
@@ -300,7 +312,7 @@ namespace Discord
|
|||||||
public bool HasRole(Role role)
|
public bool HasRole(Role role)
|
||||||
{
|
{
|
||||||
if (role == null) throw new ArgumentNullException(nameof(role));
|
if (role == null) throw new ArgumentNullException(nameof(role));
|
||||||
|
|
||||||
return _roles.ContainsKey(role.Id);
|
return _roles.ContainsKey(role.Id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user