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", "");
+ }
+ }
}
}