Allow user to tag other users in creating a post.

This commit is contained in:
Andrew Pietila 2024-03-15 23:39:30 -05:00
parent 1fbca4e112
commit b314b29b5b

View file

@ -44,8 +44,68 @@ const fs = require('node:fs/promises');
}
}
let parsedPostContent = "";
let tags = [];
let chars = Array.from(postContent);
for ( let i = 0; i < chars.length; i++ ) {
if ( chars[i] !== "@" )
parsedPostContent = `${parsedPostContent}${chars[i]}`;
if ( chars[i] === "@" ) {
let potentialMentionUsername = "";
let fulfilledPotentialMention = false;
let fulfilledReallyLikelyPotentialMention = false;
let potentialMentionDomain = "";
let lameDuckSpacing = "";
i++;
while ( i < chars.length && fulfilledPotentialMention === false ) {
if ( chars[i] !== "@" ) {
potentialMentionUsername = `${potentialMentionUsername}${chars[i]}`;
}
if ( chars[i] === "@" ) {
fulfilledPotentialMention = true;
i++
while ( i < chars.length && fulfilledReallyLikelyPotentialMention === false ) {
potentialMentionDomain = `${potentialMentionDomain}${chars[i]}`;
if ( chars[i].match(/\s/) ) {
fulfilledReallyLikelyPotentialMention = true;
lameDuckSpacing = chars[i];
} else {
i++;
}
}
}
if ( chars[i].match(/\s/) ) {
fulfilledPotentialMention = true;
}
i++;
}
if ( fulfilledPotentialMention ) {
if ( fulfilledReallyLikelyPotentialMention || i === chars.length ) {
const allowTag = await confirm({message: `Tag @${potentialMentionUsername}@${potentialMentionDomain}`, default: true});
if ( allowTag ) {
// TODO: Parse this at post creation time, rather than rely on dynamic content.
// In order to accomplish this, we'll need to be able to create a stub user and signed HTTP requests.
parsedPostContent = `${parsedPostContent}[@${potentialMentionUsername}](https://${domain}/resolveUser?user=${potentialMentionUsername}&domain=${potentialMentionDomain})`;
// TODO: Finger the user at post creation time, rather than rely on dynamic content.
tags.push(`https://${domain}/resolveWebfinger?user=${potentialMentionUsername}&domain=${potentialMentionDomain}`);
} else {
parsedPostContent = `${parsedPostContent}@${potentialMentionUsername}@${potentialMentionDomain}`;
}
if ( fulfilledReallyLikelyPotentialMention ) {
parsedPostContent = `${parsedPostContent}${lameDuckSpacing}`;
}
} else {
parsedPostContent = `${parsedPostContent}@${potentialMentionUsername}`;
}
} else {
parsedPostContent = `${parsedPostContent}@${potentialMentionUsername}`;
}
}
}
// TODO: Support attachments.
let postContentHtml = (new commonmark.HtmlRenderer()).render(new commonmark.Parser().parse(postContent)).replace(/\n$/, "");
let postContentHtml = (new commonmark.HtmlRenderer()).render(new commonmark.Parser().parse(parsedPostContent)).replace(/\n$/, "");
let timestamp = Date.now();
let postId = `${timestamp}`;
@ -71,7 +131,8 @@ const fs = require('node:fs/promises');
"https://www.w3.org/ns/activitystreams#Public"
],
"cc": [
`https://${domain}/users/${user}/followers`
`https://${domain}/users/${user}/followers`,
...tags
],
"sensitive": false,
"content": postContentHtml,