diff --git a/src/Discord.Net/DiscordClient.Messages.cs b/src/Discord.Net/DiscordClient.Messages.cs index ccc251b5f..19bbdef18 100644 --- a/src/Discord.Net/DiscordClient.Messages.cs +++ b/src/Discord.Net/DiscordClient.Messages.cs @@ -1,6 +1,7 @@ using Discord.API; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Serialization; using System; using System.Collections.Generic; using System.IO; @@ -33,7 +34,7 @@ namespace Discord } public void Import(Dictionary messages) => base.Import(messages); - } + } public class MessageEventArgs : EventArgs { @@ -274,6 +275,7 @@ namespace Discord var reader = x.CreateReader(); _messageImporter.Populate(reader, msg); + msg.Text = Mention.Resolve(msg, msg.RawText); return msg; }) .ToDictionary(x => x.Id); diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index 1b8e5dced..c9ef3366b 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -171,7 +171,8 @@ namespace Discord #endif _messageImporter = new JsonSerializer(); - } + _messageImporter.ContractResolver = new MessageImporterResolver(); + } internal override VoiceWebSocket CreateVoiceSocket() { var socket = base.CreateVoiceSocket(); diff --git a/src/Discord.Net/Models/Message.cs b/src/Discord.Net/Models/Message.cs index 71c5e83c7..b1bd9ab65 100644 --- a/src/Discord.Net/Models/Message.cs +++ b/src/Discord.Net/Models/Message.cs @@ -1,8 +1,10 @@ using Discord.API; using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; namespace Discord { @@ -12,6 +14,26 @@ namespace Discord Queued, Failed } + internal class MessageImporterResolver : DefaultContractResolver + { + protected override List GetSerializableMembers(Type objectType) + { + return base.GetSerializableMembers(objectType); + } + protected override JsonProperty CreateProperty(System.Reflection.MemberInfo member, MemberSerialization memberSerialization) + { + var property = base.CreateProperty(member, memberSerialization); + if (member is PropertyInfo) + { + if (!(member as PropertyInfo).CanWrite) + return null; + + property.Writable = true; //Handles private setters + } + return property; + } + } + public sealed class Message : CachedObject { public sealed class Attachment : File @@ -108,8 +130,9 @@ namespace Discord public MessageState State { get; internal set; } /// Returns the raw content of this message as it was received from the server. public string RawText { get; private set; } + [JsonIgnore] /// Returns the content of this message with any special references such as mentions converted. - public string Text { get; private set; } + public string Text { get; internal set; } /// Returns the timestamp for when this message was sent. public DateTime Timestamp { get; private set; } /// Returns the timestamp for when this message was last edited.