R6 moderation in decePub: users and personas, accounts, report actions, deletions, suspended personas
Administration's Users & personas (administrators): logins searched and opened into their personas and groups; roles, bans, two-factor reset and deletion of a login; silence, suspension and deletion of a persona; a group deleted. Accounts (moderators): local personas and remote accounts searched or listed as moderated, silenced and suspended with a staff note and a warning. Reports resolve with an action. ActDialog asks for the note, the warning or the password and is the act's confirmation. A login deletes its own persona and the groups it owns with its password. Suspended personas can't be chosen; one refused a token mid-session moves the session to another, or to none, once. Warnings show in notifications, limited accounts on their profile, and moderators remove a post from its card. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WpVCoDeM1qUTRp4fXQdfof
This commit is contained in:
1 parent
4c88980374
commit
c572471b88
30 files changed
+2604
-67
No files matched your search
@@ -35,6 +35,7 @@ public static class APIs
|
||||
public const string POST_DeleteAccount = "clientapi/user/delete";
|
||||
public const string GET_Personas = "clientapi/avatar/private/list";
|
||||
public const string POST_InsertPersona = "clientapi/avatar/private/insert";
|
||||
public const string POST_DeletePersona = "clientapi/avatar/private/delete";
|
||||
public const string GET_Groups = "clientapi/group/list";
|
||||
public const string GET_GroupMembers = "clientapi/group/members";
|
||||
public const string POST_InsertGroup = "clientapi/group/insert";
|
||||
@@ -44,6 +45,7 @@ public static class APIs
|
||||
public const string POST_ApproveGroupMember = "clientapi/group/approve";
|
||||
public const string POST_RejectGroupMember = "clientapi/group/reject";
|
||||
public const string POST_RemoveGroupMember = "clientapi/group/remove";
|
||||
public const string POST_DeleteGroup = "clientapi/group/delete";
|
||||
public const string GET_Posts = "clientapi/post/list";
|
||||
public const string GET_Nearby = "clientapi/post/nearby";
|
||||
public const string POST_InsertPost = "clientapi/post/insert";
|
||||
@@ -51,6 +53,20 @@ public static class APIs
|
||||
public const string GET_ModeratorReports = "clientapi/moderator/reports";
|
||||
public static string POST_M_ResolveReport(string reportId) => $"clientapi/moderator/reports/{Uri.EscapeDataString(reportId)}/resolve";
|
||||
public const string GET_ModeratorLog = "clientapi/moderator/log";
|
||||
public const string GET_ModeratorAccounts = "clientapi/moderator/accounts";
|
||||
public const string GET_ModeratedAccounts = "clientapi/moderator/accounts/moderated";
|
||||
public static string GET_M_ModeratorAccount(string accountId) => $"clientapi/moderator/accounts/{Uri.EscapeDataString(accountId)}";
|
||||
public const string POST_ModerateAccount = "clientapi/moderator/accounts/moderate";
|
||||
public const string POST_ModeratorRemovePost = "clientapi/moderator/posts/remove";
|
||||
public const string GET_AdminRoots = "clientapi/admin/roots";
|
||||
public static string GET_M_AdminRoot(string rootId) => $"clientapi/admin/roots/{Uri.EscapeDataString(rootId)}";
|
||||
public static string POST_M_AdminRootRole(string rootId) => $"clientapi/admin/roots/{Uri.EscapeDataString(rootId)}/role";
|
||||
public static string POST_M_AdminRootTotpReset(string rootId) => $"clientapi/admin/roots/{Uri.EscapeDataString(rootId)}/totp/reset";
|
||||
public static string POST_M_AdminPersonaDelete(string personaId) => $"clientapi/admin/personas/{Uri.EscapeDataString(personaId)}/delete";
|
||||
public static string POST_M_AdminGroupDelete(string groupId) => $"clientapi/admin/groups/{Uri.EscapeDataString(groupId)}/delete";
|
||||
public const string POST_AdminBanRoots = "clientapi/admin/ban/users";
|
||||
public const string POST_AdminUnbanRoots = "clientapi/admin/unban/users";
|
||||
public const string DELETE_AdminRemoveRoots = "clientapi/admin/remove/users";
|
||||
public const string GET_AdminSettings = "clientapi/admin/settings";
|
||||
public const string POST_AdminSettings = "clientapi/admin/settings";
|
||||
public const string POST_AdminThumbnail = "clientapi/admin/settings/thumbnail";
|
||||
|
||||
@@ -14,6 +14,9 @@ public static class FailureCodes
|
||||
public const string ServerError = "SERVER-ERROR";
|
||||
public const string ClientError = "CLIENT-ERROR";
|
||||
public const string Unauthorized = "UNAUTHORIZED";
|
||||
/// <summary>PrivaPub refused the current persona a token while the login's own session is good: the staff suspended it,
|
||||
/// or it is gone.</summary>
|
||||
public const string PersonaRefused = "PERSONA-REFUSED";
|
||||
|
||||
public static bool IsConnectivity(string errorCode) =>
|
||||
errorCode is DeviceOffline or Timeout or ApiUnreachable or RetriesExhausted;
|
||||
|
||||
+2
-1
@@ -72,7 +72,8 @@ public class FeedPost
|
||||
Account = sample.FirstOrDefault(),
|
||||
Status = status,
|
||||
Emoji = group.Emoji,
|
||||
GroupKey = group.GroupKey
|
||||
GroupKey = group.GroupKey,
|
||||
ModerationWarning = group.ModerationWarning
|
||||
},
|
||||
GroupCount = Math.Max(1, group.NotificationsCount),
|
||||
GroupAccounts = sample
|
||||
|
||||
@@ -31,6 +31,9 @@ public class Account
|
||||
public bool? Discoverable { get; set; }
|
||||
/// <summary>Whether its public posts may be found by full-text search.</summary>
|
||||
public bool? Indexable { get; set; }
|
||||
/// <summary>Silenced by this server's staff, or its server is (Mastodon's `limited`): kept out of public timelines,
|
||||
/// trends and search, still read by its followers and by whoever opens it. Null otherwise.</summary>
|
||||
public bool? Limited { get; set; }
|
||||
/// <summary>The persona's own account only (verify_credentials, update_credentials): its profile as written and its
|
||||
/// posting defaults.</summary>
|
||||
public AccountSource Source { get; set; }
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
namespace decePubClient.Models.Mastodon;
|
||||
|
||||
/// <summary>
|
||||
/// type: mention, status, reblog, follow, follow_request, favourite, poll, update, quote, quoted_update or
|
||||
/// pleroma:emoji_reaction. Status is null for follows.
|
||||
/// type: mention, status, reblog, follow, follow_request, favourite, poll, update, quote, quoted_update,
|
||||
/// pleroma:emoji_reaction or moderation_warning. Status is null for follows and for most warnings (a removed post is gone).
|
||||
/// </summary>
|
||||
public class Notification
|
||||
{
|
||||
@@ -14,6 +14,22 @@ public class Notification
|
||||
public string Emoji { get; set; }
|
||||
/// <summary>The group it belongs to (likes and boosts of one post, follows within an hour), or ungrouped-{id}.</summary>
|
||||
public string GroupKey { get; set; }
|
||||
/// <summary>A moderation_warning's: what this server's staff did and told the persona. Its Account is the persona
|
||||
/// itself, as Mastodon's are.</summary>
|
||||
public AccountWarning ModerationWarning { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>Mastodon's AccountWarning: what this server's staff did to the persona and why, as they wrote it.</summary>
|
||||
public class AccountWarning
|
||||
{
|
||||
public string Id { get; set; }
|
||||
/// <summary>none, silence, suspend or delete_statuses (PrivaPub's); Mastodon also has disable, mark_statuses_as_sensitive
|
||||
/// and sensitive.</summary>
|
||||
public string Action { get; set; }
|
||||
public string Text { get; set; }
|
||||
/// <summary>The posts it is about (a removed post's id stays named).</summary>
|
||||
public List<string> StatusIds { get; set; } = [];
|
||||
public DateTime? CreatedAt { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>/api/v2/notifications: notifications folded into groups, with the accounts and posts they name.</summary>
|
||||
@@ -36,6 +52,8 @@ public class NotificationGroup
|
||||
public List<string> SampleAccountIds { get; set; } = [];
|
||||
public string StatusId { get; set; }
|
||||
public string Emoji { get; set; }
|
||||
/// <summary>A moderation_warning group's newest warning.</summary>
|
||||
public AccountWarning ModerationWarning { get; set; }
|
||||
}
|
||||
|
||||
public class MarkersForm
|
||||
|
||||
Reference in new issue
Block a user