diff --git a/src/Discord.Net/Collections/Roles.cs b/src/Discord.Net/Collections/Roles.cs index 10557e616..8dd47b7f5 100644 --- a/src/Discord.Net/Collections/Roles.cs +++ b/src/Discord.Net/Collections/Roles.cs @@ -9,7 +9,7 @@ namespace Discord.Collections internal Roles(DiscordClient client, object writerLock) : base(client, writerLock) { } - internal Role GetOrAdd(string id, string serverId) => GetOrAdd(id, () => new Role(_client, id, serverId)); + internal Role GetOrAdd(string id, string serverId, bool isEveryone) => GetOrAdd(id, () => new Role(_client, id, serverId, isEveryone)); internal new Role TryRemove(string id) => base.TryRemove(id); protected override void OnCreated(Role item) diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index 34e44a997..e41e83656 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -473,7 +473,7 @@ namespace Discord case "GUILD_ROLE_CREATE": { var data = e.Payload.ToObject(_serializer); - var role = _roles.GetOrAdd(data.Data.Id, data.GuildId); + var role = _roles.GetOrAdd(data.Data.Id, data.GuildId, false); role.Update(data.Data); RaiseRoleUpdated(role); } diff --git a/src/Discord.Net/Models/Role.cs b/src/Discord.Net/Models/Role.cs index fd19f3853..327a2ec06 100644 --- a/src/Discord.Net/Models/Role.cs +++ b/src/Discord.Net/Models/Role.cs @@ -1,4 +1,6 @@ using Newtonsoft.Json; +using System.Collections.Generic; +using System.Linq; namespace Discord { @@ -20,13 +22,21 @@ namespace Discord [JsonIgnore] public Server Server => _client.Servers[ServerId]; - internal Role(DiscordClient client, string id, string serverId) + /// Returns true if this is the role representing all users in a server. + public bool IsEveryone { get; } + /// Returns a list of the ids of all members in this role. + public IEnumerable MemberIds { get { return IsEveryone ? Server.UserIds : Server.Members.Where(x => x.RoleIds.Contains(Id)).Select(x => x.UserId); } } + /// Returns a list of all members in this role. + public IEnumerable Members { get { return IsEveryone ? Server.Members : Server.Members.Where(x => x.RoleIds.Contains(Id)); } } + + internal Role(DiscordClient client, string id, string serverId, bool isEveryone) { _client = client; Id = id; ServerId = serverId; Permissions = new PackedPermissions(true); - } + IsEveryone = isEveryone; + } internal void Update(API.RoleInfo model) {