diff --git a/Iceshrimp.Backend/Controllers/Mastodon/AccountController.cs b/Iceshrimp.Backend/Controllers/Mastodon/AccountController.cs index 513aa7f7..f79d93cd 100644 --- a/Iceshrimp.Backend/Controllers/Mastodon/AccountController.cs +++ b/Iceshrimp.Backend/Controllers/Mastodon/AccountController.cs @@ -45,7 +45,7 @@ public class AccountController( public async Task VerifyUserCredentials() { var user = HttpContext.GetUserOrFail(); - return await userRenderer.RenderAsync(user, user.UserProfile, user, source: true); + return await userRenderer.RenderAsync(user, user.UserProfile, user, source: true, isPleroma: HttpContext.GetOauthToken()!.IsPleroma); } [HttpPatch("update_credentials")] @@ -82,6 +82,8 @@ public class AccountController( user.UserSettings.DefaultNoteVisibility = StatusEntity.DecodeVisibility(request.Source.Privacy); if (request.Source?.Sensitive.HasValue ?? false) user.UserSettings.AlwaysMarkSensitive = request.Source.Sensitive.Value; + if (request.PermitFollowback.HasValue) + user.UserSettings.AutoAcceptFollowed = request.PermitFollowback.Value; if (request.Fields?.Where(p => p is { Name: not null, Value: not null }).ToList() is { Count: > 0 } fields) { @@ -125,7 +127,7 @@ public class AccountController( } user = await userSvc.UpdateLocalUserAsync(user, prevAvatarId, prevBannerId); - return await userRenderer.RenderAsync(user, user.UserProfile, user, source: true); + return await userRenderer.RenderAsync(user, user.UserProfile, user, source: true, isPleroma: HttpContext.GetOauthToken()!.IsPleroma); } [HttpDelete("/api/v1/profile/avatar")] diff --git a/Iceshrimp.Backend/Controllers/Mastodon/Renderers/UserRenderer.cs b/Iceshrimp.Backend/Controllers/Mastodon/Renderers/UserRenderer.cs index 4a947788..9933bfbf 100644 --- a/Iceshrimp.Backend/Controllers/Mastodon/Renderers/UserRenderer.cs +++ b/Iceshrimp.Backend/Controllers/Mastodon/Renderers/UserRenderer.cs @@ -1,3 +1,5 @@ +using System.Configuration; +using Iceshrimp.Backend.Controllers.Mastodon.Schemas; using Iceshrimp.Backend.Controllers.Mastodon.Schemas.Entities; using Iceshrimp.Backend.Core.Configuration; using Iceshrimp.Backend.Core.Database; @@ -18,11 +20,11 @@ public class UserRenderer( { private readonly string _transparent = $"https://{config.Value.WebDomain}/assets/transparent.png"; - public Task RenderAsync(User user, UserProfile? profile, User? localUser, bool source = false) - => RenderAsync(user, profile, localUser, null, source); + public Task RenderAsync(User user, UserProfile? profile, User? localUser, bool source = false, bool isPleroma = false) + => RenderAsync(user, profile, localUser, null, source, isPleroma); private async Task RenderAsync( - User user, UserProfile? profile, User? localUser, UserRendererDto? data = null, bool source = false + User user, UserProfile? profile, User? localUser, UserRendererDto? data = null, bool source = false, bool isPleroma = false ) { var acct = user.Username; @@ -50,7 +52,7 @@ public class UserRenderer( var avatarAlt = data?.AvatarAlt.GetValueOrDefault(user.Id); var bannerAlt = data?.BannerAlt.GetValueOrDefault(user.Id); - + var res = new AccountEntity { Id = user.Id, @@ -77,7 +79,11 @@ public class UserRenderer( IsBot = user.IsBot, IsDiscoverable = user.IsExplorable, Fields = fields?.ToList() ?? [], - Emoji = profileEmoji + Emoji = profileEmoji, + Akkoma = isPleroma + ? new AkkomaInfo() + { PermitFollowback = user.UserSettings?.AutoAcceptFollowed } + : null }; if (localUser is null && security.Value.PublicPreview == Enums.PublicPreview.RestrictedNoMedia) //TODO diff --git a/Iceshrimp.Backend/Controllers/Mastodon/Schemas/AccountSchemas.cs b/Iceshrimp.Backend/Controllers/Mastodon/Schemas/AccountSchemas.cs index eb63606c..82c53f3b 100644 --- a/Iceshrimp.Backend/Controllers/Mastodon/Schemas/AccountSchemas.cs +++ b/Iceshrimp.Backend/Controllers/Mastodon/Schemas/AccountSchemas.cs @@ -40,6 +40,10 @@ public abstract class AccountSchemas [J("fields_attributes")] [B(Name = "fields_attributes")] public List? Fields { get; set; } + + [J("permit_followback")] + [B(Name = "permit_followback")] + public bool? PermitFollowback { get; set; } [J("source")] [B(Name = "source")] public AccountUpdateSource? Source { get; set; } diff --git a/Iceshrimp.Backend/Controllers/Mastodon/Schemas/Entities/AccountEntity.cs b/Iceshrimp.Backend/Controllers/Mastodon/Schemas/Entities/AccountEntity.cs index 576fa109..19a4d963 100644 --- a/Iceshrimp.Backend/Controllers/Mastodon/Schemas/Entities/AccountEntity.cs +++ b/Iceshrimp.Backend/Controllers/Mastodon/Schemas/Entities/AccountEntity.cs @@ -29,6 +29,7 @@ public class AccountEntity : IIdentifiable [J("emojis")] public required List Emoji { get; set; } [J("id")] public required string Id { get; set; } [J("last_status_at")] public string? LastStatusAt { get; set; } + [J("akkoma")] public AkkomaInfo? Akkoma { get; set; } [J("avatar_description")] public required string AvatarDescription { get; set; } [J("header_description")] public required string HeaderDescription { get; set; } @@ -49,4 +50,9 @@ public class AccountSource [J("sensitive")] public required bool Sensitive { get; set; } [J("fields")] public required List Fields { get; set; } [J("follow_requests_count")] public required int FollowRequestCount { get; set; } +} + +public class AkkomaInfo +{ + [J("permit_followback")] public required bool? PermitFollowback { get; set; } } \ No newline at end of file