Refactor MentionedUsers in the SocketMessage (#3096)

This commit is contained in:
Mihail Gribkov
2025-04-26 22:38:07 +03:00
committed by GitHub
parent cce62747c9
commit 0c3e7a861a

View File

@@ -1,5 +1,5 @@
using Discord.Rest; using Discord.Rest;
using Newtonsoft.Json.Linq;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
@@ -142,6 +142,8 @@ namespace Discord.WebSocket
/// Collection of WebSocket-based users. /// Collection of WebSocket-based users.
/// </returns> /// </returns>
public IReadOnlyCollection<SocketUser> MentionedUsers => _userMentions; public IReadOnlyCollection<SocketUser> MentionedUsers => _userMentions;
public IReadOnlyCollection<ulong> MentionedUserIds { get; private set; }
/// <inheritdoc /> /// <inheritdoc />
public DateTimeOffset Timestamp => DateTimeUtils.FromTicks(_timestampTicks); public DateTimeOffset Timestamp => DateTimeUtils.FromTicks(_timestampTicks);
@@ -270,23 +272,30 @@ namespace Discord.WebSocket
if (model.UserMentions.IsSpecified) if (model.UserMentions.IsSpecified)
{ {
var value = model.UserMentions.Value; if (model.UserMentions.Value.Length == 0)
if (value.Length > 0)
{ {
var newMentions = ImmutableArray.CreateBuilder<SocketUser>(value.Length); _userMentions = ImmutableArray<SocketUser>.Empty;
for (int i = 0; i < value.Length; i++) MentionedUserIds = ImmutableArray<ulong>.Empty;
{ }
var val = value[i];
if (val != null)
{
// TODO: this is cursed af and should be yeeted
var user = Channel?.GetUserAsync(val.Id, CacheMode.CacheOnly).GetAwaiter().GetResult() as SocketUser;
if (user != null)
newMentions.Add(user);
else else
newMentions.Add(SocketUnknownUser.Create(Discord, state, val)); {
MentionedUserIds = model.UserMentions.Value.Select(x => x.Id).ToImmutableArray();
// Create a new list of mentions from the API model
var newMentions = ImmutableArray.CreateBuilder<SocketUser>(model.UserMentions.Value.Length);
foreach (var mention in model.UserMentions.Value)
{
if (mention is not null)
{
SocketUser user = null;
if (Channel is SocketChannel socketChannel)
user = socketChannel.GetUser(mention.Id);
newMentions.Add(user ?? SocketUnknownUser.Create(Discord, state, mention));
} }
} }
_userMentions = newMentions.ToImmutable(); _userMentions = newMentions.ToImmutable();
} }
} }
@@ -355,7 +364,7 @@ namespace Discord.WebSocket
/// <inheritdoc /> /// <inheritdoc />
IReadOnlyCollection<ulong> IMessage.MentionedChannelIds => MentionedChannels.Select(x => x.Id).ToImmutableArray(); IReadOnlyCollection<ulong> IMessage.MentionedChannelIds => MentionedChannels.Select(x => x.Id).ToImmutableArray();
/// <inheritdoc /> /// <inheritdoc />
IReadOnlyCollection<ulong> IMessage.MentionedUserIds => MentionedUsers.Select(x => x.Id).ToImmutableArray(); IReadOnlyCollection<ulong> IMessage.MentionedUserIds => MentionedUserIds;
/// <inheritdoc/> /// <inheritdoc/>
IReadOnlyCollection<IMessageComponent> IMessage.Components => Components; IReadOnlyCollection<IMessageComponent> IMessage.Components => Components;