diff --git a/src/Discord.Net.Core/Entities/Messages/IMessage.cs b/src/Discord.Net.Core/Entities/Messages/IMessage.cs
index 4266f893a..1dfd8a095 100644
--- a/src/Discord.Net.Core/Entities/Messages/IMessage.cs
+++ b/src/Discord.Net.Core/Entities/Messages/IMessage.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
namespace Discord
@@ -15,6 +15,8 @@ namespace Discord
bool IsPinned { get; }
/// Returns the content for this message.
string Content { get; }
+ /// Returns a jump url for this message.
+ string GetJumpUrl();
/// Gets the time this message was sent.
DateTimeOffset Timestamp { get; }
/// Gets the time of this message's last edit, if any.
diff --git a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs
index 3dc3e74e9..fbb96687d 100644
--- a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs
+++ b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs
@@ -93,6 +93,12 @@ namespace Discord.Rest
await client.ApiClient.RemovePinAsync(msg.Channel.Id, msg.Id, options).ConfigureAwait(false);
}
+ public static string GetJumpUrl(IMessage msg)
+ {
+ var channel = msg.Channel;
+ return $"https://discordapp.com/channels/{(channel is IDMChannel ? "@me" : $"{(channel as IGuildChannel).GuildId}")}/{channel.Id}/{msg.Id}";
+ }
+
public static ImmutableArray ParseTags(string text, IMessageChannel channel, IGuild guild, IReadOnlyCollection userMentions)
{
var tags = ImmutableArray.CreateBuilder();
diff --git a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs
index 590886886..fe68a4111 100644
--- a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs
+++ b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
@@ -63,6 +63,8 @@ namespace Discord.Rest
public override string ToString() => Content;
+ public string GetJumpUrl() => MessageHelper.GetJumpUrl(this);
+
MessageType IMessage.Type => MessageType.Default;
IUser IMessage.Author => Author;
IReadOnlyCollection IMessage.Attachments => Attachments;
diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs
index 5442c888a..44549ff5e 100644
--- a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs
+++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs
@@ -1,4 +1,4 @@
-using Discord.Rest;
+using Discord.Rest;
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
@@ -58,6 +58,9 @@ namespace Discord.WebSocket
=> MessageHelper.DeleteAsync(this, Discord, options);
public override string ToString() => Content;
+
+ public string GetJumpUrl() => MessageHelper.GetJumpUrl(this);
+
internal SocketMessage Clone() => MemberwiseClone() as SocketMessage;
//IMessage