From 347f6b0196a525453aba051203f9899755bb653e Mon Sep 17 00:00:00 2001 From: RogueException Date: Sun, 14 Aug 2016 11:02:22 -0300 Subject: [PATCH 1/2] Expanded mention resolving options --- .../Entities/Messages/ChannelMentionHandling.cs | 9 +++ .../Entities/Messages/EveryoneMentionHandling.cs | 9 +++ src/Discord.Net/Entities/Messages/IMessage.cs | 12 +++- .../Entities/Messages/RoleMentionHandling.cs | 9 +++ .../Entities/Messages/UserMentionHandling.cs | 10 +++ .../Entities/Messages/UserResolveMode.cs | 8 --- src/Discord.Net/Rest/Entities/Messages/Message.cs | 20 +++--- src/Discord.Net/Utilities/MentionUtils.cs | 73 ++++++++++++++++------ 8 files changed, 114 insertions(+), 36 deletions(-) create mode 100644 src/Discord.Net/Entities/Messages/ChannelMentionHandling.cs create mode 100644 src/Discord.Net/Entities/Messages/EveryoneMentionHandling.cs create mode 100644 src/Discord.Net/Entities/Messages/RoleMentionHandling.cs create mode 100644 src/Discord.Net/Entities/Messages/UserMentionHandling.cs delete mode 100644 src/Discord.Net/Entities/Messages/UserResolveMode.cs diff --git a/src/Discord.Net/Entities/Messages/ChannelMentionHandling.cs b/src/Discord.Net/Entities/Messages/ChannelMentionHandling.cs new file mode 100644 index 000000000..39f9baa6a --- /dev/null +++ b/src/Discord.Net/Entities/Messages/ChannelMentionHandling.cs @@ -0,0 +1,9 @@ +namespace Discord +{ + public enum ChannelMentionHandling + { + Ignore = 0, + Remove, + Name + } +} diff --git a/src/Discord.Net/Entities/Messages/EveryoneMentionHandling.cs b/src/Discord.Net/Entities/Messages/EveryoneMentionHandling.cs new file mode 100644 index 000000000..5e05606e5 --- /dev/null +++ b/src/Discord.Net/Entities/Messages/EveryoneMentionHandling.cs @@ -0,0 +1,9 @@ +namespace Discord +{ + public enum EveryoneMentionHandling + { + Ignore = 0, + Remove, + Sanitize + } +} diff --git a/src/Discord.Net/Entities/Messages/IMessage.cs b/src/Discord.Net/Entities/Messages/IMessage.cs index e9077302b..ad20e5be6 100644 --- a/src/Discord.Net/Entities/Messages/IMessage.cs +++ b/src/Discord.Net/Entities/Messages/IMessage.cs @@ -43,8 +43,16 @@ namespace Discord Task UnpinAsync(); /// Transforms this message's text into a human readable form, resolving things like mentions to that object's name. - string Resolve(int startIndex, int length, UserResolveMode userMode = UserResolveMode.NameOnly); + string Resolve(int startIndex, int length, + UserMentionHandling userHandling = UserMentionHandling.Name, + ChannelMentionHandling channelHandling = ChannelMentionHandling.Name, + RoleMentionHandling roleHandling = RoleMentionHandling.Name, + EveryoneMentionHandling everyoneHandling = EveryoneMentionHandling.Ignore); /// Transforms this message's text into a human readable form, resolving things like mentions to that object's name. - string Resolve(UserResolveMode userMode = UserResolveMode.NameOnly); + string Resolve( + UserMentionHandling userHandling = UserMentionHandling.Name, + ChannelMentionHandling channelHandling = ChannelMentionHandling.Name, + RoleMentionHandling roleHandling = RoleMentionHandling.Name, + EveryoneMentionHandling everyoneHandling = EveryoneMentionHandling.Ignore); } } \ No newline at end of file diff --git a/src/Discord.Net/Entities/Messages/RoleMentionHandling.cs b/src/Discord.Net/Entities/Messages/RoleMentionHandling.cs new file mode 100644 index 000000000..466cf1fd8 --- /dev/null +++ b/src/Discord.Net/Entities/Messages/RoleMentionHandling.cs @@ -0,0 +1,9 @@ +namespace Discord +{ + public enum RoleMentionHandling + { + Ignore = 0, + Remove, + Name + } +} diff --git a/src/Discord.Net/Entities/Messages/UserMentionHandling.cs b/src/Discord.Net/Entities/Messages/UserMentionHandling.cs new file mode 100644 index 000000000..b31a994a2 --- /dev/null +++ b/src/Discord.Net/Entities/Messages/UserMentionHandling.cs @@ -0,0 +1,10 @@ +namespace Discord +{ + public enum UserMentionHandling + { + Ignore = 0, + Remove, + Name, + NameAndDiscriminator + } +} diff --git a/src/Discord.Net/Entities/Messages/UserResolveMode.cs b/src/Discord.Net/Entities/Messages/UserResolveMode.cs deleted file mode 100644 index 210c54f30..000000000 --- a/src/Discord.Net/Entities/Messages/UserResolveMode.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Discord -{ - public enum UserResolveMode - { - NameOnly = 0, - NameAndDiscriminator - } -} diff --git a/src/Discord.Net/Rest/Entities/Messages/Message.cs b/src/Discord.Net/Rest/Entities/Messages/Message.cs index df6bf7e2c..14c4051cd 100644 --- a/src/Discord.Net/Rest/Entities/Messages/Message.cs +++ b/src/Discord.Net/Rest/Entities/Messages/Message.cs @@ -161,19 +161,23 @@ namespace Discord await Discord.ApiClient.RemovePinAsync(Channel.Id, Id).ConfigureAwait(false); } - public string Resolve(int startIndex, int length, UserResolveMode userMode = UserResolveMode.NameOnly) - => Resolve(Content.Substring(startIndex, length), userMode); - public string Resolve(UserResolveMode userMode = UserResolveMode.NameOnly) - => Resolve(Content, userMode); + public string Resolve(int startIndex, int length, UserMentionHandling userHandling, ChannelMentionHandling channelHandling, + RoleMentionHandling roleHandling, EveryoneMentionHandling everyoneHandling) + => Resolve(Content.Substring(startIndex, length), userHandling, channelHandling, roleHandling, everyoneHandling); + public string Resolve(UserMentionHandling userHandling, ChannelMentionHandling channelHandling, + RoleMentionHandling roleHandling, EveryoneMentionHandling everyoneHandling) + => Resolve(Content, userHandling, channelHandling, roleHandling, everyoneHandling); - private string Resolve(string text, UserResolveMode userMode = UserResolveMode.NameOnly) + private string Resolve(string text, UserMentionHandling userHandling, ChannelMentionHandling channelHandling, + RoleMentionHandling roleHandling, EveryoneMentionHandling everyoneHandling) { var guild = (Channel as IGuildChannel)?.Guild; - text = MentionUtils.ResolveUserMentions(text, Channel, MentionedUsers, userMode); + text = MentionUtils.ResolveUserMentions(text, Channel, MentionedUsers, userHandling); if (guild != null) { - text = MentionUtils.ResolveChannelMentions(text, guild); - text = MentionUtils.ResolveRoleMentions(text, guild, MentionedRoles); + text = MentionUtils.ResolveChannelMentions(text, guild, channelHandling); + text = MentionUtils.ResolveRoleMentions(text, guild, MentionedRoles, roleHandling); + text = MentionUtils.ResolveEveryoneMentions(text, everyoneHandling); } return text; } diff --git a/src/Discord.Net/Utilities/MentionUtils.cs b/src/Discord.Net/Utilities/MentionUtils.cs index 1f6fb4280..3f8fefa30 100644 --- a/src/Discord.Net/Utilities/MentionUtils.cs +++ b/src/Discord.Net/Utilities/MentionUtils.cs @@ -154,8 +154,10 @@ namespace Discord return builder.ToImmutable(); } - internal static string ResolveUserMentions(string text, IMessageChannel channel, IReadOnlyCollection mentions, UserResolveMode mode) + internal static string ResolveUserMentions(string text, IMessageChannel channel, IReadOnlyCollection mentions, UserMentionHandling mode) { + if (mode == UserMentionHandling.Ignore) return text; + return _userRegex.Replace(text, new MatchEvaluator(e => { ulong id; @@ -183,10 +185,12 @@ namespace Discord switch (mode) { - case UserResolveMode.NameOnly: + case UserMentionHandling.Remove: default: + return ""; + case UserMentionHandling.Name: return $"@{name}"; - case UserResolveMode.NameAndDiscriminator: + case UserMentionHandling.NameAndDiscriminator: return $"@{name}#{user.Discriminator}"; } } @@ -194,8 +198,10 @@ namespace Discord return e.Value; })); } - internal static string ResolveChannelMentions(string text, IGuild guild) + internal static string ResolveChannelMentions(string text, IGuild guild, ChannelMentionHandling mode) { + if (mode == ChannelMentionHandling.Ignore) return text; + if (guild.IsAttached) //It's too expensive to do a channel lookup in REST mode { return _channelRegex.Replace(text, new MatchEvaluator(e => @@ -203,37 +209,68 @@ namespace Discord ulong id; if (ulong.TryParse(e.Groups[1].Value, NumberStyles.None, CultureInfo.InvariantCulture, out id)) { - IGuildChannel channel = null; - channel = guild.GetChannelAsync(id).GetAwaiter().GetResult(); - if (channel != null) - return '#' + channel.Name; + switch (mode) + { + case ChannelMentionHandling.Remove: + return ""; + case ChannelMentionHandling.Name: + IGuildChannel channel = null; + channel = guild.GetChannelAsync(id).GetAwaiter().GetResult(); + if (channel != null) + return $"#{channel.Name}"; + else + return $"#deleted-channel"; + } } return e.Value; })); } return text; } - internal static string ResolveRoleMentions(string text, IGuild guild, IReadOnlyCollection mentions) + internal static string ResolveRoleMentions(string text, IGuild guild, IReadOnlyCollection mentions, RoleMentionHandling mode) { + if (mode == RoleMentionHandling.Ignore) return text; + return _roleRegex.Replace(text, new MatchEvaluator(e => { ulong id; if (ulong.TryParse(e.Groups[1].Value, NumberStyles.None, CultureInfo.InvariantCulture, out id)) { - IRole role = null; - foreach (var mention in mentions) + switch (mode) { - if (mention.Id == id) - { - role = mention; - break; - } + case RoleMentionHandling.Remove: + return ""; + case RoleMentionHandling.Name: + IRole role = null; + foreach (var mention in mentions) + { + if (mention.Id == id) + { + role = mention; + break; + } + } + if (role != null) + return $"@{role.Name}"; + else + return $"@deleted-role"; } - if (role != null) - return '@' + role.Name; } return e.Value; })); } + internal static string ResolveEveryoneMentions(string text, EveryoneMentionHandling mode) + { + if (mode == EveryoneMentionHandling.Ignore) return text; + + switch (mode) + { + case EveryoneMentionHandling.Sanitize: + return text.Replace("@everyone", "@\x200beveryone").Replace("@here", "@\x200bhere"); + case EveryoneMentionHandling.Remove: + default: + return text.Replace("@everyone", "").Replace("@here", ""); + } + } } } From fc17aa3ea02b4f2d0c3e265267bb2551dbaa5ccf Mon Sep 17 00:00:00 2001 From: RogueException Date: Sun, 14 Aug 2016 11:31:49 -0300 Subject: [PATCH 2/2] Remove guild check from Message.Resolve --- src/Discord.Net.Commands/Command.cs | 2 +- src/Discord.Net.Commands/CommandParser.cs | 1 - src/Discord.Net/Rest/Entities/Messages/Message.cs | 10 +++------- src/Discord.Net/Utilities/MentionUtils.cs | 7 ++++--- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/Discord.Net.Commands/Command.cs b/src/Discord.Net.Commands/Command.cs index b0dd4733c..f89be8b90 100644 --- a/src/Discord.Net.Commands/Command.cs +++ b/src/Discord.Net.Commands/Command.cs @@ -14,11 +14,11 @@ namespace Discord.Commands private readonly Func, Task> _action; public MethodInfo Source { get; } + public Module Module { get; } public string Name { get; } public string Description { get; } public string Summary { get; } public string Text { get; } - public Module Module { get; } public IReadOnlyList Parameters { get; } public IReadOnlyList Preconditions { get; } diff --git a/src/Discord.Net.Commands/CommandParser.cs b/src/Discord.Net.Commands/CommandParser.cs index cceaa4a65..ad43758e3 100644 --- a/src/Discord.Net.Commands/CommandParser.cs +++ b/src/Discord.Net.Commands/CommandParser.cs @@ -2,7 +2,6 @@ using System.Text; using System.Threading.Tasks; using System.Collections.Generic; -using System.Linq; using System; namespace Discord.Commands diff --git a/src/Discord.Net/Rest/Entities/Messages/Message.cs b/src/Discord.Net/Rest/Entities/Messages/Message.cs index 14c4051cd..ac06a61f8 100644 --- a/src/Discord.Net/Rest/Entities/Messages/Message.cs +++ b/src/Discord.Net/Rest/Entities/Messages/Message.cs @@ -171,14 +171,10 @@ namespace Discord private string Resolve(string text, UserMentionHandling userHandling, ChannelMentionHandling channelHandling, RoleMentionHandling roleHandling, EveryoneMentionHandling everyoneHandling) { - var guild = (Channel as IGuildChannel)?.Guild; text = MentionUtils.ResolveUserMentions(text, Channel, MentionedUsers, userHandling); - if (guild != null) - { - text = MentionUtils.ResolveChannelMentions(text, guild, channelHandling); - text = MentionUtils.ResolveRoleMentions(text, guild, MentionedRoles, roleHandling); - text = MentionUtils.ResolveEveryoneMentions(text, everyoneHandling); - } + text = MentionUtils.ResolveChannelMentions(text, (Channel as IGuildChannel)?.Guild, channelHandling); + text = MentionUtils.ResolveRoleMentions(text, MentionedRoles, roleHandling); + text = MentionUtils.ResolveEveryoneMentions(text, everyoneHandling); return text; } diff --git a/src/Discord.Net/Utilities/MentionUtils.cs b/src/Discord.Net/Utilities/MentionUtils.cs index 3f8fefa30..2c32b5ea9 100644 --- a/src/Discord.Net/Utilities/MentionUtils.cs +++ b/src/Discord.Net/Utilities/MentionUtils.cs @@ -1,4 +1,5 @@ -using System; +using Discord.WebSocket; +using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Globalization; @@ -215,7 +216,7 @@ namespace Discord return ""; case ChannelMentionHandling.Name: IGuildChannel channel = null; - channel = guild.GetChannelAsync(id).GetAwaiter().GetResult(); + channel = guild?.GetChannel(id); if (channel != null) return $"#{channel.Name}"; else @@ -227,7 +228,7 @@ namespace Discord } return text; } - internal static string ResolveRoleMentions(string text, IGuild guild, IReadOnlyCollection mentions, RoleMentionHandling mode) + internal static string ResolveRoleMentions(string text, IReadOnlyCollection mentions, RoleMentionHandling mode) { if (mode == RoleMentionHandling.Ignore) return text;