`Message.MentionedRoles` is now populated properly with roles. `Role.IsMentionable` has been added to determine whether `Role.Mention` now mentions roles that are `IsMentionable` as expected (otherwise returns empty string) `Role.Edit` now takes parameter `bool? isMentionable` `Server.CreateRole` now takes parameter `bool isMentionable` `IsMentionable` added to `UpdateRoleRequest`pull/56/head
| @@ -19,5 +19,7 @@ namespace Discord.API.Client | |||||
| public uint? Color { get; set; } | public uint? Color { get; set; } | ||||
| [JsonProperty("managed")] | [JsonProperty("managed")] | ||||
| public bool? Managed { get; set; } | public bool? Managed { get; set; } | ||||
| [JsonProperty("mentionable")] | |||||
| public bool? Mentionable { get; set; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -18,6 +18,8 @@ namespace Discord.API.Client.Rest | |||||
| public uint Permissions { get; set; } | public uint Permissions { get; set; } | ||||
| [JsonProperty("hoist")] | [JsonProperty("hoist")] | ||||
| public bool IsHoisted { get; set; } | public bool IsHoisted { get; set; } | ||||
| [JsonProperty("mentionable")] | |||||
| public bool IsMentionable { get; set; } | |||||
| [JsonProperty("color")] | [JsonProperty("color")] | ||||
| public uint Color { get; set; } | public uint Color { get; set; } | ||||
| @@ -25,7 +25,7 @@ namespace Discord | |||||
| private static readonly Regex _userRegex = new Regex(@"<@[0-9]+>"); | private static readonly Regex _userRegex = new Regex(@"<@[0-9]+>"); | ||||
| private static readonly Regex _channelRegex = new Regex(@"<#[0-9]+>"); | private static readonly Regex _channelRegex = new Regex(@"<#[0-9]+>"); | ||||
| private static readonly Regex _roleRegex = new Regex(@"@everyone"); | |||||
| private static readonly Regex _roleRegex = new Regex(@"<@&[0-9]+>"); | |||||
| private static readonly Attachment[] _initialAttachments = new Attachment[0]; | private static readonly Attachment[] _initialAttachments = new Attachment[0]; | ||||
| private static readonly Embed[] _initialEmbeds = new Embed[0]; | private static readonly Embed[] _initialEmbeds = new Embed[0]; | ||||
| @@ -68,28 +68,36 @@ namespace Discord | |||||
| return e.Value; //Channel not found or parse failed | return e.Value; //Channel not found or parse failed | ||||
| })); | })); | ||||
| } | } | ||||
| /*internal static string CleanRoleMentions(User user, Channel channel, string text, List<Role> roles = null) | |||||
| internal static string CleanRoleMentions(Channel channel, string text, List<Role> roles = null) | |||||
| { | { | ||||
| var server = channel.Server; | var server = channel.Server; | ||||
| if (server == null) return text; | if (server == null) return text; | ||||
| return _roleRegex.Replace(text, new MatchEvaluator(e => | |||||
| return _roleRegex.Replace(text, new MatchEvaluator(e => | |||||
| { | { | ||||
| if (roles != null && user.GetPermissions(channel).MentionEveryone) | |||||
| roles.Add(server.EveryoneRole); | |||||
| return e.Value; | |||||
| ulong id; | |||||
| if (e.Value.Substring(3, e.Value.Length - 4).TryToId(out id)) | |||||
| { | |||||
| var role = server.GetRole(id); | |||||
| if (role != null) | |||||
| { | |||||
| if (roles != null) | |||||
| roles.Add(role); | |||||
| return "@" + role.Name; | |||||
| } | |||||
| } | |||||
| return e.Value; //Role not found or parse failed | |||||
| })); | })); | ||||
| }*/ | |||||
| } | |||||
| //TODO: Move this somewhere | //TODO: Move this somewhere | ||||
| private static string Resolve(Channel channel, string text) | private static string Resolve(Channel channel, string text) | ||||
| { | { | ||||
| if (text == null) throw new ArgumentNullException(nameof(text)); | if (text == null) throw new ArgumentNullException(nameof(text)); | ||||
| var client = channel.Client; | |||||
| text = CleanUserMentions(channel, text); | text = CleanUserMentions(channel, text); | ||||
| text = CleanChannelMentions(channel, text); | text = CleanChannelMentions(channel, text); | ||||
| //text = CleanRoleMentions(Channel, text); | |||||
| text = CleanRoleMentions(channel, text); | |||||
| return text; | return text; | ||||
| } | } | ||||
| @@ -281,32 +289,28 @@ namespace Discord | |||||
| .Where(x => x != null) | .Where(x => x != null) | ||||
| .ToArray(); | .ToArray(); | ||||
| } | } | ||||
| if (model.IsMentioningEveryone != null) | |||||
| { | |||||
| if (model.IsMentioningEveryone.Value && User != null && User.GetPermissions(channel).MentionEveryone) | |||||
| MentionedRoles = new Role[] { Server.EveryoneRole }; | |||||
| else | |||||
| MentionedRoles = new Role[0]; | |||||
| } | |||||
| if (model.Content != null) | if (model.Content != null) | ||||
| { | { | ||||
| string text = model.Content; | string text = model.Content; | ||||
| RawText = text; | RawText = text; | ||||
| //var mentionedUsers = new List<User>(); | //var mentionedUsers = new List<User>(); | ||||
| var mentionedChannels = new List<Channel>(); | var mentionedChannels = new List<Channel>(); | ||||
| //var mentionedRoles = new List<Role>(); | |||||
| var mentionedRoles = new List<Role>(); | |||||
| text = CleanUserMentions(Channel, text/*, mentionedUsers*/); | text = CleanUserMentions(Channel, text/*, mentionedUsers*/); | ||||
| if (server != null) | if (server != null) | ||||
| { | { | ||||
| text = CleanChannelMentions(Channel, text, mentionedChannels); | text = CleanChannelMentions(Channel, text, mentionedChannels); | ||||
| //text = CleanRoleMentions(_client, User, channel, text, mentionedRoles); | |||||
| text = CleanRoleMentions(Channel, text, mentionedRoles); | |||||
| if (model.IsMentioningEveryone != null && model.IsMentioningEveryone.Value | |||||
| && User != null && User.GetPermissions(channel).MentionEveryone) | |||||
| mentionedRoles.Add(Server.EveryoneRole); | |||||
| } | } | ||||
| Text = text; | Text = text; | ||||
| //MentionedUsers = mentionedUsers; | //MentionedUsers = mentionedUsers; | ||||
| MentionedChannels = mentionedChannels; | MentionedChannels = mentionedChannels; | ||||
| //MentionedRoles = mentionedRoles; | |||||
| MentionedRoles = mentionedRoles; | |||||
| } | } | ||||
| } | } | ||||
| @@ -28,6 +28,8 @@ namespace Discord | |||||
| public int Position { get; private set; } | public int Position { get; private set; } | ||||
| /// <summary> Gets whether this role is managed by server (e.g. for Twitch integration) </summary> | /// <summary> Gets whether this role is managed by server (e.g. for Twitch integration) </summary> | ||||
| public bool IsManaged { get; private set; } | public bool IsManaged { get; private set; } | ||||
| /// <summary> Gets whether this role is mentionable by anyone. </summary> | |||||
| public bool IsMentionable { get; private set; } | |||||
| /// <summary> Gets the the permissions given to this role. </summary> | /// <summary> Gets the the permissions given to this role. </summary> | ||||
| public ServerPermissions Permissions { get; private set; } | public ServerPermissions Permissions { get; private set; } | ||||
| /// <summary> Gets the color of this role. </summary> | /// <summary> Gets the color of this role. </summary> | ||||
| @@ -41,7 +43,7 @@ namespace Discord | |||||
| public IEnumerable<User> Members => IsEveryone ? Server.Users : Server.Users.Where(x => x.HasRole(this)); | public IEnumerable<User> Members => IsEveryone ? Server.Users : Server.Users.Where(x => x.HasRole(this)); | ||||
| /// <summary> Gets the string used to mention this role. </summary> | /// <summary> Gets the string used to mention this role. </summary> | ||||
| public string Mention => IsEveryone ? "@everyone" : ""; | |||||
| public string Mention => IsMentionable ? $"<@&{Id}>" : ""; | |||||
| internal Role(ulong id, Server server) | internal Role(ulong id, Server server) | ||||
| { | { | ||||
| @@ -60,6 +62,8 @@ namespace Discord | |||||
| IsHoisted = model.Hoist.Value; | IsHoisted = model.Hoist.Value; | ||||
| if (model.Managed != null) | if (model.Managed != null) | ||||
| IsManaged = model.Managed.Value; | IsManaged = model.Managed.Value; | ||||
| if (model.Mentionable != null) | |||||
| IsMentionable = model.Mentionable.Value; | |||||
| if (model.Position != null && !IsEveryone) | if (model.Position != null && !IsEveryone) | ||||
| Position = model.Position.Value; | Position = model.Position.Value; | ||||
| if (model.Color != null) | if (model.Color != null) | ||||
| @@ -75,14 +79,15 @@ namespace Discord | |||||
| } | } | ||||
| } | } | ||||
| public async Task Edit(string name = null, ServerPermissions? permissions = null, Color color = null, bool? isHoisted = null, int? position = null) | |||||
| public async Task Edit(string name = null, ServerPermissions? permissions = null, Color color = null, bool? isHoisted = null, int? position = null, bool? isMentionable = null) | |||||
| { | { | ||||
| var updateRequest = new UpdateRoleRequest(Server.Id, Id) | var updateRequest = new UpdateRoleRequest(Server.Id, Id) | ||||
| { | { | ||||
| Name = name ?? Name, | Name = name ?? Name, | ||||
| Permissions = (permissions ?? Permissions).RawValue, | Permissions = (permissions ?? Permissions).RawValue, | ||||
| Color = (color ?? Color).RawValue, | Color = (color ?? Color).RawValue, | ||||
| IsHoisted = isHoisted ?? IsHoisted | |||||
| IsHoisted = isHoisted ?? IsHoisted, | |||||
| IsMentionable = isMentionable ?? IsMentionable | |||||
| }; | }; | ||||
| var updateResponse = await Client.ClientAPI.Send(updateRequest).ConfigureAwait(false); | var updateResponse = await Client.ClientAPI.Send(updateRequest).ConfigureAwait(false); | ||||
| @@ -366,7 +366,7 @@ namespace Discord | |||||
| } | } | ||||
| /// <summary> Creates a new role. </summary> | /// <summary> Creates a new role. </summary> | ||||
| public async Task<Role> CreateRole(string name, ServerPermissions? permissions = null, Color color = null, bool isHoisted = false) | |||||
| public async Task<Role> CreateRole(string name, ServerPermissions? permissions = null, Color color = null, bool isHoisted = false, bool isMentionable = false) | |||||
| { | { | ||||
| if (name == null) throw new ArgumentNullException(nameof(name)); | if (name == null) throw new ArgumentNullException(nameof(name)); | ||||
| @@ -380,7 +380,8 @@ namespace Discord | |||||
| Name = name, | Name = name, | ||||
| Permissions = (permissions ?? role.Permissions).RawValue, | Permissions = (permissions ?? role.Permissions).RawValue, | ||||
| Color = (color ?? Color.Default).RawValue, | Color = (color ?? Color.Default).RawValue, | ||||
| IsHoisted = isHoisted | |||||
| IsHoisted = isHoisted, | |||||
| IsMentionable = isMentionable | |||||
| }; | }; | ||||
| var editResponse = await Client.ClientAPI.Send(editRequest).ConfigureAwait(false); | var editResponse = await Client.ClientAPI.Send(editRequest).ConfigureAwait(false); | ||||
| role.Update(editResponse, true); | role.Update(editResponse, true); | ||||