From 549b32de6d7aa5be4b0245d2ce06aef8adaf2d57 Mon Sep 17 00:00:00 2001 From: Lirusaito Date: Sat, 30 Apr 2016 11:37:04 -0400 Subject: [PATCH] Support Role Mentions `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` --- src/Discord.Net/API/Client/Common/Role.cs | 2 ++ src/Discord.Net/API/Client/Rest/UpdateRole.cs | 2 ++ src/Discord.Net/Models/Message.cs | 44 +++++++++++++++------------ src/Discord.Net/Models/Role.cs | 11 +++++-- src/Discord.Net/Models/Server.cs | 5 +-- 5 files changed, 39 insertions(+), 25 deletions(-) diff --git a/src/Discord.Net/API/Client/Common/Role.cs b/src/Discord.Net/API/Client/Common/Role.cs index 59431989a..7d48748dd 100644 --- a/src/Discord.Net/API/Client/Common/Role.cs +++ b/src/Discord.Net/API/Client/Common/Role.cs @@ -19,5 +19,7 @@ namespace Discord.API.Client public uint? Color { get; set; } [JsonProperty("managed")] public bool? Managed { get; set; } + [JsonProperty("mentionable")] + public bool? Mentionable { get; set; } } } diff --git a/src/Discord.Net/API/Client/Rest/UpdateRole.cs b/src/Discord.Net/API/Client/Rest/UpdateRole.cs index 4bea0b52b..68fb80437 100644 --- a/src/Discord.Net/API/Client/Rest/UpdateRole.cs +++ b/src/Discord.Net/API/Client/Rest/UpdateRole.cs @@ -18,6 +18,8 @@ namespace Discord.API.Client.Rest public uint Permissions { get; set; } [JsonProperty("hoist")] public bool IsHoisted { get; set; } + [JsonProperty("mentionable")] + public bool IsMentionable { get; set; } [JsonProperty("color")] public uint Color { get; set; } diff --git a/src/Discord.Net/Models/Message.cs b/src/Discord.Net/Models/Message.cs index a3e0ed699..bd5792c68 100644 --- a/src/Discord.Net/Models/Message.cs +++ b/src/Discord.Net/Models/Message.cs @@ -25,7 +25,7 @@ namespace Discord private static readonly Regex _userRegex = 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 Embed[] _initialEmbeds = new Embed[0]; @@ -68,28 +68,36 @@ namespace Discord return e.Value; //Channel not found or parse failed })); } - /*internal static string CleanRoleMentions(User user, Channel channel, string text, List roles = null) + internal static string CleanRoleMentions(Channel channel, string text, List roles = null) { var server = channel.Server; 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 private static string Resolve(Channel channel, string text) { if (text == null) throw new ArgumentNullException(nameof(text)); - var client = channel.Client; text = CleanUserMentions(channel, text); text = CleanChannelMentions(channel, text); - //text = CleanRoleMentions(Channel, text); + text = CleanRoleMentions(channel, text); return text; } @@ -281,32 +289,28 @@ namespace Discord .Where(x => x != null) .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) { string text = model.Content; RawText = text; - //var mentionedUsers = new List(); var mentionedChannels = new List(); - //var mentionedRoles = new List(); + var mentionedRoles = new List(); text = CleanUserMentions(Channel, text/*, mentionedUsers*/); if (server != null) { 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; //MentionedUsers = mentionedUsers; MentionedChannels = mentionedChannels; - //MentionedRoles = mentionedRoles; + MentionedRoles = mentionedRoles; } } diff --git a/src/Discord.Net/Models/Role.cs b/src/Discord.Net/Models/Role.cs index 012d2bf36..de89260c1 100644 --- a/src/Discord.Net/Models/Role.cs +++ b/src/Discord.Net/Models/Role.cs @@ -28,6 +28,8 @@ namespace Discord public int Position { get; private set; } /// Gets whether this role is managed by server (e.g. for Twitch integration) public bool IsManaged { get; private set; } + /// Gets whether this role is mentionable by anyone. + public bool IsMentionable { get; private set; } /// Gets the the permissions given to this role. public ServerPermissions Permissions { get; private set; } /// Gets the color of this role. @@ -41,7 +43,7 @@ namespace Discord public IEnumerable Members => IsEveryone ? Server.Users : Server.Users.Where(x => x.HasRole(this)); /// Gets the string used to mention this role. - public string Mention => IsEveryone ? "@everyone" : ""; + public string Mention => IsMentionable ? $"<@&{Id}>" : ""; internal Role(ulong id, Server server) { @@ -60,6 +62,8 @@ namespace Discord IsHoisted = model.Hoist.Value; if (model.Managed != null) IsManaged = model.Managed.Value; + if (model.Mentionable != null) + IsMentionable = model.Mentionable.Value; if (model.Position != null && !IsEveryone) Position = model.Position.Value; 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) { Name = name ?? Name, Permissions = (permissions ?? Permissions).RawValue, Color = (color ?? Color).RawValue, - IsHoisted = isHoisted ?? IsHoisted + IsHoisted = isHoisted ?? IsHoisted, + IsMentionable = isMentionable ?? IsMentionable }; var updateResponse = await Client.ClientAPI.Send(updateRequest).ConfigureAwait(false); diff --git a/src/Discord.Net/Models/Server.cs b/src/Discord.Net/Models/Server.cs index 616e0b5eb..60a92afa5 100644 --- a/src/Discord.Net/Models/Server.cs +++ b/src/Discord.Net/Models/Server.cs @@ -366,7 +366,7 @@ namespace Discord } /// Creates a new role. - public async Task CreateRole(string name, ServerPermissions? permissions = null, Color color = null, bool isHoisted = false) + public async Task CreateRole(string name, ServerPermissions? permissions = null, Color color = null, bool isHoisted = false, bool isMentionable = false) { if (name == null) throw new ArgumentNullException(nameof(name)); @@ -380,7 +380,8 @@ namespace Discord Name = name, Permissions = (permissions ?? role.Permissions).RawValue, Color = (color ?? Color.Default).RawValue, - IsHoisted = isHoisted + IsHoisted = isHoisted, + IsMentionable = isMentionable }; var editResponse = await Client.ClientAPI.Send(editRequest).ConfigureAwait(false); role.Update(editResponse, true);