|
1 | 1 | using Discord.Rest;
|
2 |
| -using Newtonsoft.Json.Linq; |
| 2 | + |
3 | 3 | using System;
|
4 | 4 | using System.Collections.Generic;
|
5 | 5 | using System.Collections.Immutable;
|
@@ -142,6 +142,8 @@ public abstract class SocketMessage : SocketEntity<ulong>, IMessage
|
142 | 142 | /// Collection of WebSocket-based users.
|
143 | 143 | /// </returns>
|
144 | 144 | public IReadOnlyCollection<SocketUser> MentionedUsers => _userMentions;
|
| 145 | + |
| 146 | + public IReadOnlyCollection<ulong> MentionedUserIds { get; private set; } |
145 | 147 | /// <inheritdoc />
|
146 | 148 | public DateTimeOffset Timestamp => DateTimeUtils.FromTicks(_timestampTicks);
|
147 | 149 |
|
@@ -270,23 +272,30 @@ internal virtual void Update(ClientState state, Model model)
|
270 | 272 |
|
271 | 273 | if (model.UserMentions.IsSpecified)
|
272 | 274 | {
|
273 |
| - var value = model.UserMentions.Value; |
274 |
| - if (value.Length > 0) |
| 275 | + if (model.UserMentions.Value.Length == 0) |
| 276 | + { |
| 277 | + _userMentions = ImmutableArray<SocketUser>.Empty; |
| 278 | + MentionedUserIds = ImmutableArray<ulong>.Empty; |
| 279 | + } |
| 280 | + else |
275 | 281 | {
|
276 |
| - var newMentions = ImmutableArray.CreateBuilder<SocketUser>(value.Length); |
277 |
| - for (int i = 0; i < value.Length; i++) |
| 282 | + MentionedUserIds = model.UserMentions.Value.Select(x => x.Id).ToImmutableArray(); |
| 283 | + |
| 284 | + // Create a new list of mentions from the API model |
| 285 | + var newMentions = ImmutableArray.CreateBuilder<SocketUser>(model.UserMentions.Value.Length); |
| 286 | + foreach (var mention in model.UserMentions.Value) |
278 | 287 | {
|
279 |
| - var val = value[i]; |
280 |
| - if (val != null) |
| 288 | + if (mention is not null) |
281 | 289 | {
|
282 |
| - // TODO: this is cursed af and should be yeeted |
283 |
| - var user = Channel?.GetUserAsync(val.Id, CacheMode.CacheOnly).GetAwaiter().GetResult() as SocketUser; |
284 |
| - if (user != null) |
285 |
| - newMentions.Add(user); |
286 |
| - else |
287 |
| - newMentions.Add(SocketUnknownUser.Create(Discord, state, val)); |
| 290 | + SocketUser user = null; |
| 291 | + |
| 292 | + if (Channel is SocketChannel socketChannel) |
| 293 | + user = socketChannel.GetUser(mention.Id); |
| 294 | + |
| 295 | + newMentions.Add(user ?? SocketUnknownUser.Create(Discord, state, mention)); |
288 | 296 | }
|
289 | 297 | }
|
| 298 | + |
290 | 299 | _userMentions = newMentions.ToImmutable();
|
291 | 300 | }
|
292 | 301 | }
|
@@ -355,7 +364,7 @@ public Task DeleteAsync(RequestOptions options = null)
|
355 | 364 | /// <inheritdoc />
|
356 | 365 | IReadOnlyCollection<ulong> IMessage.MentionedChannelIds => MentionedChannels.Select(x => x.Id).ToImmutableArray();
|
357 | 366 | /// <inheritdoc />
|
358 |
| - IReadOnlyCollection<ulong> IMessage.MentionedUserIds => MentionedUsers.Select(x => x.Id).ToImmutableArray(); |
| 367 | + IReadOnlyCollection<ulong> IMessage.MentionedUserIds => MentionedUserIds; |
359 | 368 |
|
360 | 369 | /// <inheritdoc/>
|
361 | 370 | IReadOnlyCollection<IMessageComponent> IMessage.Components => Components;
|
|
0 commit comments