@@ -94,8 +94,11 @@ namespace Discord
});
Status = UserStatus.Offline;
_channels = new ConcurrentDictionary<string, Channel>();
_permissions = new ConcurrentDictionary<string, ChannelPermissions>();
_serverPermissions = new ServerPermissions();
if (serverId != null)
{
_permissions = new ConcurrentDictionary<string, ChannelPermissions>();
_serverPermissions = new ServerPermissions();
}
if (serverId == null)
UpdateRoles(null);
@@ -181,18 +184,20 @@ namespace Discord
}
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)
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
everyone = _client.Roles.VirtualEveryone;
newRoles.Add(everyone.Id, everyone);
_roles = newRoles;
_roles = new Dictionary<string, Role>();
}
internal void UpdateActivity(DateTime? activity = null)
@@ -200,20 +205,51 @@ namespace Discord
if (LastActivityAt == null || activity > LastActivityAt.Value)
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)
{
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 && channel.Server != server) throw new InvalidOperationException();
if (server == null) return;
if (channel.Server != server) throw new InvalidOperationException();
ChannelPermissions permissions;
if (!_permissions.TryGetValue(channel.Id, out permissions)) return;
uint newPermissions = _serverPermissions.RawValue;
uint oldPermissions = permissions.RawValue;
if (server != null && server.Owner == this)
if (server.Owner == this)
newPermissions = ChannelPermissions.All(channel).RawValue;
else
{
@@ -242,40 +278,16 @@ namespace Discord
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;
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 ServerPermissions GetServerPermissions() => _serverPermissions;
public ChannelPermissions GetPermissions(Channel 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;
if (_permissions.TryGetValue(channel.Id, out perms))
return perms;
@@ -300,7 +312,7 @@ namespace Discord
public bool HasRole(Role role)
{
if (role == null) throw new ArgumentNullException(nameof(role));
return _roles.ContainsKey(role.Id);
}
}