Lemmy takes a report only from a person or a service, about one post or comment, addressed to its community, and it answered PrivaPub's Flag (the instance actor's, an Application, with no `to` and the account and posts as its object) 400. A report of a post or comment in a community on a server whose NodeInfo names Lemmy now leaves from `privapub_reports`, a Service with its own key that names nobody: one Flag per post, `to` the community (its own audience, else its thread's), with the persona's words, or the category, in `summary` and `content`, sent to the community's inbox. This is the second exception to "a server's software is for display" (owner decision 2026-10-06, `ReportService.ServiceReportTakers`). Every other server keeps the instance actor's report. An account alone is not reported to Lemmy, which takes no such report, and `forwarded` now says whether anything left. The reporter is read unsigned in SecureMode and answers WebFinger like the instance actor. Nobody follows or mentions it, the Mastodon API has no account for it, and a migration reserves its name. Checked live: Lemmy 1.0 and 0.19 keep the reports of a thread and of a comment, with alice's words, from "Reports from privapub.test", and none names her (69 checks). A sweep of every scenario with this and the next commit: 876 checks pass; Ghost's Network feed listed alice's post too late once, and Ghost passes alone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LsXgEaXee4GCU1hwYgPJXw
96 lines
3.9 KiB
C#
96 lines
3.9 KiB
C#
using MongoDB.Entities;
|
|
|
|
namespace PrivaPub.Models.Jobs
|
|
{
|
|
public class RemoteInstance : Entity
|
|
{
|
|
public string Host { get; set; }
|
|
public int ConsecutiveFailures { get; set; }
|
|
public DateTime? UnavailableUntil { get; set; }
|
|
public DateTime? LastSuccessAt { get; set; }
|
|
public DateTime? LastFailureAt { get; set; }
|
|
public string LastError { get; set; }
|
|
|
|
public string Software { get; set; }//NodeInfo software.name: for display, never for deciding behaviour, but for two
|
|
//owner decisions: a first private message to Lemmy before 1.0 or Mbin is a ChatMessage (2026-10-05), and a report
|
|
//to a Lemmy community leaves from the reporter in Lemmy's shape (2026-10-06, ReportService.ServiceReportTakers)
|
|
public string SoftwareVersion { get; set; }
|
|
public string NodeName { get; set; }
|
|
public List<string> Protocols { get; set; } = new();
|
|
public bool? OpenRegistrations { get; set; }
|
|
public string NodeInfo { get; set; }//the raw document, when small enough
|
|
public DateTime? DescribedAt { get; set; }
|
|
public string DescriptionError { get; set; }
|
|
|
|
public string Seen { get; set; }//"touched": we exchanged something with it; "crawled": only its peers list named it
|
|
public DateTime? FirstSeenAt { get; set; }
|
|
public DateTime? LastSeenAt { get; set; }
|
|
public DateTime? LastCrawledAt { get; set; }
|
|
public string CrawlError { get; set; }
|
|
public bool? RobotsDisallowed { get; set; }
|
|
public int? PeersCount { get; set; }
|
|
|
|
public string NodeInfoVersion { get; set; }
|
|
public string NodeDescription { get; set; }
|
|
public long? UsersTotal { get; set; }//as the server publishes them in its NodeInfo
|
|
public long? UsersActiveMonth { get; set; }
|
|
public long? UsersActiveHalfyear { get; set; }
|
|
public long? LocalPosts { get; set; }
|
|
public long? LocalComments { get; set; }
|
|
|
|
public string InstanceApi { get; set; }//"mastodon-v2" or "mastodon-v1"
|
|
public string InstanceApiRaw { get; set; }//admin only: it names maintainers and contact accounts
|
|
public string Title { get; set; }
|
|
public List<string> Languages { get; set; }
|
|
public string RegistrationMode { get; set; }//open, approval, closed
|
|
public int? MaxPostChars { get; set; }
|
|
public int? MastodonApiVersion { get; set; }
|
|
public string SourceUrl { get; set; }
|
|
|
|
public InstanceGeo Geo { get; set; }
|
|
}
|
|
|
|
public class InstanceGeo
|
|
{
|
|
public string Country { get; set; }
|
|
public string City { get; set; }
|
|
public double? Latitude { get; set; }//rounded to one decimal
|
|
public double? Longitude { get; set; }
|
|
public int? Asn { get; set; }
|
|
public string AsnOrg { get; set; }
|
|
public string Cdn { get; set; }//the CDN in front of it, whose edge address says nothing about where it runs
|
|
public string CdnDomain { get; set; }//the CDN's own domain, which groups its servers (CdnProvider.Key)
|
|
public string CdnSource { get; set; }//how the CDN was found: "ranges", "headers" or "asn"
|
|
public bool? Ipv6 { get; set; }
|
|
public string Source { get; set; }
|
|
public DateTime? LocatedAt { get; set; }
|
|
}
|
|
|
|
public class RemoteInstanceSnapshot : Entity
|
|
{
|
|
public string Host { get; set; }
|
|
public string Week { get; set; }//ISO week, "2026-W40"
|
|
public DateTime TakenAt { get; set; }
|
|
public string Seen { get; set; }
|
|
public bool Reachable { get; set; }
|
|
public string Software { get; set; }
|
|
public string SoftwareVersion { get; set; }
|
|
public long? UsersTotal { get; set; }
|
|
public long? UsersActiveMonth { get; set; }
|
|
public long? UsersActiveHalfyear { get; set; }
|
|
public long? LocalPosts { get; set; }
|
|
public bool? OpenRegistrations { get; set; }
|
|
public string RegistrationMode { get; set; }
|
|
public List<string> Languages { get; set; }
|
|
public string Country { get; set; }
|
|
public string City { get; set; }
|
|
public double? Latitude { get; set; }
|
|
public double? Longitude { get; set; }
|
|
public int? Asn { get; set; }
|
|
public string Cdn { get; set; }
|
|
public string CdnDomain { get; set; }
|
|
public string CdnSource { get; set; }
|
|
public bool? Ipv6 { get; set; }
|
|
}
|
|
}
|