diff --git a/src/Discord.Net/DiscordClient.Messages.cs b/src/Discord.Net/DiscordClient.Messages.cs index 28b3c068c..5928f4132 100644 --- a/src/Discord.Net/DiscordClient.Messages.cs +++ b/src/Discord.Net/DiscordClient.Messages.cs @@ -125,6 +125,7 @@ namespace Discord var userIds = !channel.IsPrivate ? Mention.GetUserIds(text).Distinct() : new string[0]; if (Config.UseMessageQueue) { + var channelIds = !channel.IsPrivate ? Mention.GetChannelIds(text).Distinct() : new string[0]; var nonce = GenerateNonce(); msg = _messages.GetOrAdd("nonce_" + nonce, channel.Id, _userId); var currentUser = msg.User; @@ -136,9 +137,19 @@ namespace Discord ChannelId = channel.Id, IsTextToSpeech = isTextToSpeech }); - msg.Mentions = userIds.Select(x => _users[x, channel.Server.Id]).Where(x => x != null).ToArray(); - msg.IsQueued = true; msg.Nonce = nonce; + msg.IsQueued = true; + + //IsPrivate check is already done earlier + msg.MentionedUsers = userIds + .Select(x => _users[x, channel.Server.Id]) + .Where(x => x != null) + .ToArray(); + msg.MentionedChannels = channelIds + .Select(x => _channels[x]) + .Where(x => x != null && x.Server == channel.Server) + .ToArray(); + _pendingMessages.Enqueue(msg); } else @@ -258,7 +269,7 @@ namespace Discord SendMessageResponse response = null; try { - response = await _api.SendMessage(msg.Channel.Id, msg.RawText, msg.Mentions.Select(x => x.Id), msg.Nonce, msg.IsTTS).ConfigureAwait(false); + response = await _api.SendMessage(msg.Channel.Id, msg.RawText, msg.MentionedUsers.Select(x => x.Id), msg.Nonce, msg.IsTTS).ConfigureAwait(false); } catch (WebException) { break; } catch (HttpException) { hasFailed = true; } diff --git a/src/Discord.Net/Helpers/Mention.cs b/src/Discord.Net/Helpers/Mention.cs index 3c91a917c..02cdb13f7 100644 --- a/src/Discord.Net/Helpers/Mention.cs +++ b/src/Discord.Net/Helpers/Mention.cs @@ -49,5 +49,12 @@ namespace Discord .Select(x => x.Groups[1].Value) .Where(x => x != null); } + internal static IEnumerable GetChannelIds(string text) + { + return _channelRegex.Matches(text) + .OfType() + .Select(x => x.Groups[1].Value) + .Where(x => x != null); + } } } diff --git a/src/Discord.Net/Models/Message.cs b/src/Discord.Net/Models/Message.cs index e1a676880..5787b749b 100644 --- a/src/Discord.Net/Models/Message.cs +++ b/src/Discord.Net/Models/Message.cs @@ -125,8 +125,12 @@ namespace Discord /// Returns a collection of all users mentioned in this message. [JsonIgnore] - public IEnumerable Mentions { get; internal set; } - + public IEnumerable MentionedUsers { get; internal set; } + + /// Returns a collection of all channels mentioned in this message. + [JsonIgnore] + public IEnumerable MentionedChannels { get; internal set; } + /// Returns the server containing the channel this message was sent to. [JsonIgnore] public Server Server => _channel.Value.Server; @@ -208,13 +212,26 @@ namespace Discord EditedTimestamp = model.EditedTimestamp; if (model.Mentions != null) { - Mentions = model.Mentions.Select(x => _client.Users[x.Id, Channel.Server?.Id]).ToArray(); - IsMentioningMe = model.Mentions.Any(x => x.Id == _client.CurrentUserId); + MentionedUsers = model.Mentions + .Select(x => _client.Users[x.Id, Channel.Server?.Id]) + .ToArray(); + IsMentioningMe = model.Mentions + .Any(x => x.Id == _client.CurrentUserId); } if (model.Content != null) { RawText = model.Content; _cleanText = null; + + if (!Channel.IsPrivate) + { + MentionedChannels = Mention.GetChannelIds(model.Content) + .Select(x => _client.Channels[x]) + .Where(x => x.Server == Channel.Server) + .ToArray(); + } + else + MentionedChannels = new Channel[0]; } }