Removed the VirtualEveryone, hardcoded permissions response for private channels instead.

This commit is contained in:
RogueException
2015-10-25 05:00:06 -03:00
parent ce2aa72622
commit cb747a2095
2 changed files with 58 additions and 51 deletions

View File

@@ -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));

View File

@@ -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);
} }
} }