From 39587ed3463f038b68c3d29dea17c77722b57e1d Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Mon, 29 Dec 2025 01:49:35 +0800 Subject: [PATCH] :bug: Fix activitypub bugs --- .../ActivityPub/ActivityPubDeliveryService.cs | 49 ++++++++++++- .../ActivityPubDiscoveryService.cs | 69 ++++++++++--------- 2 files changed, 82 insertions(+), 36 deletions(-) diff --git a/DysonNetwork.Sphere/ActivityPub/ActivityPubDeliveryService.cs b/DysonNetwork.Sphere/ActivityPub/ActivityPubDeliveryService.cs index 1ec5ffc..64a45db 100644 --- a/DysonNetwork.Sphere/ActivityPub/ActivityPubDeliveryService.cs +++ b/DysonNetwork.Sphere/ActivityPub/ActivityPubDeliveryService.cs @@ -60,8 +60,9 @@ public class ActivityPubDeliveryService( var actorUrl = $"https://{Domain}/activitypub/actors/{publisher.Name}"; var targetActor = await GetOrFetchActorAsync(targetActorUri); + var localActor = await GetOrCreateLocalActorAsync(publisher); - if (targetActor?.InboxUri == null) + if (targetActor?.InboxUri == null || localActor == null) { logger.LogWarning("Target actor or inbox not found: {Uri}", targetActorUri); return false; @@ -80,7 +81,7 @@ public class ActivityPubDeliveryService( { IsLocalActor = true, LocalPublisherId = publisher.Id, - ActorId = Guid.NewGuid(), + ActorId = localActor.Id, TargetActorId = targetActor.Id, State = RelationshipState.Pending, IsFollowing = true, @@ -278,6 +279,50 @@ public class ActivityPubDeliveryService( .ToListAsync(); } + private async Task GetOrCreateLocalActorAsync(SnPublisher publisher) + { + var actorUrl = $"https://{Domain}/activitypub/actors/{publisher.Name}"; + + var localActor = await db.FediverseActors + .FirstOrDefaultAsync(a => a.Uri == actorUrl); + + if (localActor != null) + return localActor; + + var instance = await db.FediverseInstances + .FirstOrDefaultAsync(i => i.Domain == Domain); + + if (instance == null) + { + instance = new SnFediverseInstance + { + Domain = Domain, + Name = Domain + }; + db.FediverseInstances.Add(instance); + await db.SaveChangesAsync(); + } + + localActor = new SnFediverseActor + { + Uri = actorUrl, + Username = publisher.Name, + DisplayName = publisher.Name, + Bio = null, + InboxUri = $"{actorUrl}/inbox", + OutboxUri = $"{actorUrl}/outbox", + FollowersUri = $"{actorUrl}/followers", + FollowingUri = $"{actorUrl}/following", + AvatarUrl = null, + InstanceId = instance.Id + }; + + db.FediverseActors.Add(localActor); + await db.SaveChangesAsync(); + + return localActor; + } + private async Task GetOrFetchActorAsync(string actorUri) { var actor = await db.FediverseActors diff --git a/DysonNetwork.Sphere/ActivityPub/ActivityPubDiscoveryService.cs b/DysonNetwork.Sphere/ActivityPub/ActivityPubDiscoveryService.cs index 5184e60..6b064c6 100644 --- a/DysonNetwork.Sphere/ActivityPub/ActivityPubDiscoveryService.cs +++ b/DysonNetwork.Sphere/ActivityPub/ActivityPubDiscoveryService.cs @@ -1,6 +1,7 @@ using DysonNetwork.Shared.Models; using Microsoft.EntityFrameworkCore; using System.Text.Json; +using System.Text.Json.Serialization; using System.Text.RegularExpressions; using System.Xml.Linq; @@ -8,67 +9,67 @@ namespace DysonNetwork.Sphere.ActivityPub; public class MastodonInstanceV2Response { - public string Domain { get; set; } = null!; - public string Title { get; set; } = null!; - public string Version { get; set; } = null!; - public string? SourceUrl { get; set; } - public string? Description { get; set; } - public MastodonUsage? Usage { get; set; } - public MastodonThumbnail? Thumbnail { get; set; } - public List? Icon { get; set; } - public List? Languages { get; set; } - public MastodonContact? Contact { get; set; } - public Dictionary? Registrations { get; set; } - public Dictionary? Configuration { get; set; } + [JsonPropertyName("domain")] public string Domain { get; init; } = null!; + [JsonPropertyName("title")] public string Title { get; init; } = null!; + [JsonPropertyName("version")] public string Version { get; init; } = null!; + [JsonPropertyName("source_url")] public string? SourceUrl { get; init; } + [JsonPropertyName("description")] public string? Description { get; init; } + [JsonPropertyName("usage")] public MastodonUsage? Usage { get; init; } + [JsonPropertyName("thumbnail")] public MastodonThumbnail? Thumbnail { get; init; } + [JsonPropertyName("icon")] public List? Icon { get; init; } + [JsonPropertyName("languages")] public List? Languages { get; init; } + [JsonPropertyName("contact")] public MastodonContact? Contact { get; init; } + [JsonPropertyName("registrations")] public Dictionary? Registrations { get; init; } + [JsonPropertyName("configuration")] public Dictionary? Configuration { get; init; } } public class MastodonUsage { - public MastodonUserUsage? Users { get; set; } + [JsonPropertyName("users")] public MastodonUserUsage? Users { get; init; } } public class MastodonUserUsage { - public int ActiveMonth { get; set; } + [JsonPropertyName("active_month")] public int ActiveMonth { get; init; } } public class MastodonThumbnail { - public string? Url { get; set; } + [JsonPropertyName("url")] public string? Url { get; init; } } public class MastodonIcon { - public string? Src { get; set; } - public string? Size { get; set; } + [JsonPropertyName("src")] public string? Src { get; init; } + [JsonPropertyName("size")] public string? Size { get; init; } } public class MastodonContact { - public string? Email { get; set; } - public MastodonContactAccount? Account { get; set; } + [JsonPropertyName("email")] public string? Email { get; init; } + [JsonPropertyName("account")] public MastodonContactAccount? Account { get; init; } } public class MastodonContactAccount { - public string? Username { get; set; } + [JsonPropertyName("username")] public string? Username { get; init; } } public class MisskeyMetaResponse { - public string? Name { get; set; } - public string? Description { get; set; } - public string? Version { get; set; } - public string? Uri { get; set; } - public List? Langs { get; set; } - public string? MaintainerName { get; set; } - public string? MaintainerEmail { get; set; } - public string? IconUrl { get; set; } - public string? BannerUrl { get; set; } - public string? RepositoryUrl { get; set; } - public string? PrivacyPolicyUrl { get; set; } - public string? TosUrl { get; set; } - public int? MaxNoteTextLength { get; set; } + [JsonPropertyName("name")] public string? Name { get; init; } + [JsonPropertyName("description")] public string? Description { get; init; } + [JsonPropertyName("version")] public string? Version { get; init; } + [JsonPropertyName("uri")] public string? Uri { get; init; } + [JsonPropertyName("langs")] public List? Langs { get; init; } + [JsonPropertyName("maintainerName")] public string? MaintainerName { get; init; } + [JsonPropertyName("maintainerEmail")] public string? MaintainerEmail { get; init; } + [JsonPropertyName("iconUrl")] public string? IconUrl { get; init; } + [JsonPropertyName("bannerUrl")] public string? BannerUrl { get; init; } + [JsonPropertyName("repositoryUrl")] public string? RepositoryUrl { get; init; } + [JsonPropertyName("privacyPolicyUrl")] public string? PrivacyPolicyUrl { get; init; } + [JsonPropertyName("tosUrl")] public string? TosUrl { get; init; } + [JsonPropertyName("maxNoteTextLength")] public int? MaxNoteTextLength { get; init; } } public partial class ActivityPubDiscoveryService( @@ -629,4 +630,4 @@ public partial class ActivityPubDiscoveryService( [GeneratedRegex(@"^@?(\w+)@([\w.-]+)$", RegexOptions.Compiled)] private static partial Regex HandleRegex(); -} \ No newline at end of file +}