[backend/federation] Canonicalize MkSummary in UpdateProfileMentions
This commit is contained in:
parent
c30dac0210
commit
89079f09c7
2 changed files with 33 additions and 19 deletions
|
@ -10,9 +10,12 @@ using Microsoft.Extensions.Options;
|
|||
|
||||
namespace Iceshrimp.Backend.Core.Services;
|
||||
|
||||
using MentionTuple = (List<Note.MentionedUser> mentions,
|
||||
Dictionary<(string usernameLower, string webDomain), string> splitDomainMapping);
|
||||
|
||||
public class UserProfileMentionsResolver(ActivityPub.UserResolver userResolver, IOptions<Config.InstanceSection> config)
|
||||
{
|
||||
public async Task<List<Note.MentionedUser>> ResolveMentions(ASActor actor, string? host)
|
||||
public async Task<MentionTuple> ResolveMentions(ASActor actor, string? host)
|
||||
{
|
||||
var fields = actor.Attachments?.OfType<ASField>()
|
||||
.Where(p => p is { Name: not null, Value: not null })
|
||||
|
@ -44,7 +47,7 @@ public class UserProfileMentionsResolver(ActivityPub.UserResolver userResolver,
|
|||
.Select(async p => await userResolver.ResolveAsyncOrNull(p))
|
||||
.AwaitAllNoConcurrencyAsync());
|
||||
|
||||
return users.Where(p => p != null)
|
||||
var mentions = users.Where(p => p != null)
|
||||
.Cast<User>()
|
||||
.DistinctBy(p => p.Id)
|
||||
.Select(p => new Note.MentionedUser
|
||||
|
@ -55,6 +58,14 @@ public class UserProfileMentionsResolver(ActivityPub.UserResolver userResolver,
|
|||
Username = p.Username
|
||||
})
|
||||
.ToList();
|
||||
|
||||
var splitDomainMapping = users.Where(p => p is { Host: not null, Uri: not null })
|
||||
.Cast<User>()
|
||||
.Where(p => new Uri(p.Uri!).Host != p.Host)
|
||||
.DistinctBy(p => p.Host)
|
||||
.ToDictionary(p => (p.UsernameLower, new Uri(p.Uri!).Host), p => p.Host!);
|
||||
|
||||
return (mentions, splitDomainMapping);
|
||||
}
|
||||
|
||||
public async Task<List<Note.MentionedUser>> ResolveMentions(UserProfile.Field[]? fields, string? bio, string? host)
|
||||
|
|
|
@ -28,7 +28,8 @@ public class UserService(
|
|||
DriveService driveSvc,
|
||||
FollowupTaskService followupTaskSvc,
|
||||
NotificationService notificationSvc,
|
||||
EmojiService emojiSvc
|
||||
EmojiService emojiSvc,
|
||||
ActivityPub.MentionsResolver mentionsResolver
|
||||
)
|
||||
{
|
||||
private static readonly AsyncKeyedLocker<string> KeyedLocker = new(o =>
|
||||
|
@ -642,7 +643,7 @@ public class UserService(
|
|||
|
||||
if (actor != null)
|
||||
{
|
||||
var mentions = await bgMentionsResolver.ResolveMentions(actor, bgUser.Host);
|
||||
var (mentions, splitDomainMapping) = await bgMentionsResolver.ResolveMentions(actor, bgUser.Host);
|
||||
var fields = actor.Attachments != null
|
||||
? await actor.Attachments
|
||||
.OfType<ASField>()
|
||||
|
@ -655,11 +656,13 @@ public class UserService(
|
|||
.AwaitAllAsync()
|
||||
: null;
|
||||
|
||||
var description = actor.MkSummary != null
|
||||
? mentionsResolver.ResolveMentions(actor.MkSummary, bgUser.Host, mentions, splitDomainMapping)
|
||||
: await MfmConverter.FromHtmlAsync(actor.Summary, mentions);
|
||||
|
||||
bgUser.UserProfile.Mentions = mentions;
|
||||
bgUser.UserProfile.Fields = fields?.ToArray() ?? [];
|
||||
bgUser.UserProfile.Description = actor.MkSummary ??
|
||||
await MfmConverter.FromHtmlAsync(actor.Summary,
|
||||
bgUser.UserProfile.Mentions);
|
||||
bgUser.UserProfile.Description = description;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue