From d34f3f9db11bf9b627dead3de1634f0c8ba47de8 Mon Sep 17 00:00:00 2001 From: Brandon Smith Date: Fri, 21 Aug 2015 20:56:07 -0300 Subject: [PATCH] Renamed Message.Text to RawText and added lazy-loaded Text with mention conversion. --- src/Discord.Net/DiscordClient.cs | 34 ++++++++++++++++++++++++++++++-- src/Discord.Net/Message.cs | 15 ++++++++++---- src/Discord.Net/project.json | 5 +++-- 3 files changed, 46 insertions(+), 8 deletions(-) diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index d59a58beb..93a043076 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; +using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; @@ -16,6 +17,8 @@ namespace Discord { private DiscordWebSocket _webSocket; private ManualResetEventSlim _isStopping; + private readonly Regex _userRegex, _channelRegex; + private readonly MatchEvaluator _userRegexEvaluator, _channelRegexEvaluator; /// Returns the User object for the current logged in user. public User User { get; private set; } @@ -61,6 +64,27 @@ namespace Discord { _isStopping = new ManualResetEventSlim(false); + _userRegex = new Regex(@"<@\d+?>", RegexOptions.Compiled); + _channelRegex = new Regex(@"<#\d+?>", RegexOptions.Compiled); + _userRegexEvaluator = new MatchEvaluator(e => + { + string id = e.Value.Substring(2, e.Value.Length - 3); + var user = _users[id]; + if (user != null) + return '@' + user.Name; + else //User not found + return e.Value; + }); + _channelRegexEvaluator = new MatchEvaluator(e => + { + string id = e.Value.Substring(2, e.Value.Length - 3); + var channel = _channels[id]; + if (channel != null) + return channel.Name; + else //Channel not found + return e.Value; + }); + _servers = new AsyncCache( (key, parentKey) => new Server(key, this), (server, model) => @@ -148,10 +172,10 @@ namespace Discord message.IsTTS = extendedModel.IsTextToSpeech; message.MentionIds = extendedModel.Mentions?.Select(x => x.Id)?.ToArray() ?? new string[0]; message.IsMentioningMe = message.MentionIds.Contains(UserId); + message.RawText = extendedModel.Content; + message.Timestamp = extendedModel.Timestamp; if (extendedModel.Author != null) message.UserId = extendedModel.Author.Id; - message.Timestamp = extendedModel.Timestamp; - message.Text = extendedModel.Content; } }, message => { } @@ -1060,6 +1084,12 @@ namespace Discord { if (!_isReady) throw new InvalidOperationException("The client is not currently connected to Discord"); + } + internal string CleanMessageText(string text) + { + text = _userRegex.Replace(text, _userRegexEvaluator); + text = _channelRegex.Replace(text, _channelRegexEvaluator); + return text; } /// diff --git a/src/Discord.Net/Message.cs b/src/Discord.Net/Message.cs index 20a1c2741..343e65612 100644 --- a/src/Discord.Net/Message.cs +++ b/src/Discord.Net/Message.cs @@ -2,11 +2,14 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text; +using System.Text.RegularExpressions; namespace Discord { public sealed class Message { + public struct Attachment { public string Id; @@ -17,7 +20,8 @@ namespace Discord } private readonly DiscordClient _client; - + private string _cleanText; + /// Returns the unique identifier for this message. public string Id { get; } @@ -28,8 +32,11 @@ namespace Discord public bool IsMentioningEveryone { get; internal set; } /// Returns true if the message was sent as text-to-speech by someone with permissions to do so. public bool IsTTS { get; internal set; } - /// Returns the content of this message. - public string Text { get; internal set; } + /// Returns the raw content of this message as it was received from the server.. + public string RawText { get; internal set; } + /// Returns the content of this message with any special references such as mentions converted. + /// This value is lazy loaded and only processed on first request. Each subsequent request will pull from cache. + public string Text => _cleanText != null ? _cleanText : (_cleanText = _client.CleanMessageText(RawText)); /// Returns the timestamp of this message. public DateTime Timestamp { get; internal set; } /// Returns the attachments included in this message. @@ -68,5 +75,5 @@ namespace Discord { return User.ToString() + ": " + Text; } - } + } } diff --git a/src/Discord.Net/project.json b/src/Discord.Net/project.json index 8ffebbe9d..153d2c2f8 100644 --- a/src/Discord.Net/project.json +++ b/src/Discord.Net/project.json @@ -36,8 +36,9 @@ "System.Linq": "4.0.0", "System.Net.Requests": "4.0.10", "System.Net.WebSockets.Client": "4.0.0-beta-23123", - "System.Runtime": "4.0.20" + "System.Runtime": "4.0.20", + "System.Text.RegularExpressions": "4.0.10" } } } - } +}