A direct message answers in the form its recipient writes in
Lemmy 0.19 (most of the threadiverse) and Mbin take a private message only as a ChatMessage and refuse a direct Note. A direct message to one account elsewhere that writes to us as ChatMessages now goes out as one: to it alone, without a mention in its text, kept on the post (Post.AsChatMessage) so the served copy and an edit match. No software name decides it. Live against Lemmy 0.19: alice's answer to lemmyuser's private message and another persona's message to lemmyuser arrive (29 checks). A first message to an account that never wrote to anyone here is still a Note, which they refuse; G-0008 keeps that open for the owner. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LsXgEaXee4GCU1hwYgPJXw
This commit is contained in:
1 parent
a85ebd30c0
commit
f38ac73615
10 files changed
+90
-17
No files matched your search
@@ -248,6 +248,9 @@ namespace PrivaPub.Domain.Statuses
|
||||
.Concat(post.Mentions)
|
||||
.DistinctBy(m => m.ActorURI)
|
||||
.ToList();
|
||||
// to someone who writes to us as ChatMessages (Lemmy 0.19 and Mbin take a private message no other way), in kind
|
||||
post.AsChatMessage = recipients is [{ LocalId: null } recipient]
|
||||
&& await _dbEntities.Posts.Match(p => p.ActorURI == recipient.Uri && p.IsFederatedCopy && p.ObjectType == "ChatMessage").ExecuteAnyAsync(token);
|
||||
var note = ActivityPubRenderer.DirectNote(post, author, recipients.Select(r => (r.Uri, r.Handle)).ToList(), dmGroup.ConversationURI);
|
||||
create = ActivityPubRenderer.Create(author, note, $"create-{post.ID}");
|
||||
post.To = Strings(note["to"]);
|
||||
|
||||
@@ -183,7 +183,14 @@ namespace PrivaPub.Federation.Rendering
|
||||
foreach (var recipient in recipients.Where(r => !named.Contains(r.Uri)))
|
||||
tags.Add(new JsonObject { ["type"] = "Mention", ["href"] = recipient.Uri, ["name"] = "@" + recipient.Handle });
|
||||
var unmentioned = recipients.Where(r => !named.Contains(r.Uri)).ToList();
|
||||
if (unmentioned.Count > 0)
|
||||
// a ChatMessage (Pleroma's, which Lemmy 0.19 and Mbin take as their private messages) has one recipient and no
|
||||
// mention of them in its text
|
||||
if (post.AsChatMessage)
|
||||
{
|
||||
note["type"] = "ChatMessage";
|
||||
note.Remove("cc");
|
||||
}
|
||||
else if (unmentioned.Count > 0)
|
||||
note["content"] = "<p>" + string.Join(" ", unmentioned.Select(r =>
|
||||
$"<span class=\"h-card\" translate=\"no\"><a href=\"{WebUtility.HtmlEncode(r.Uri)}\" class=\"u-url mention\">@<span>{WebUtility.HtmlEncode(r.Handle.Split('@')[0])}</span></a></span>"))
|
||||
+ "</p>" + note["content"]!.GetValue<string>();
|
||||
|
||||
@@ -56,6 +56,7 @@ namespace PrivaPub.Models.Post
|
||||
public bool IsFederatedCopy { get; set; }
|
||||
public string ObjectURI { get; set; }//the Note's id
|
||||
public string ObjectType { get; set; }//the remote object's type: Note, Article, Page, Video, Event…; null for local posts
|
||||
public bool AsChatMessage { get; set; }//a local direct message sent as a ChatMessage: its one recipient writes to us that way
|
||||
public string ActivityURI { get; set; }//the Create's id
|
||||
public string ActorURI { get; set; }//attributedTo
|
||||
public string Url { get; set; }
|
||||
|
||||
Reference in new issue
Block a user