feat: split long posts into replies (#10)

* post split text as reply

---------

Co-authored-by: Maurice Renck <maurice@maurice-renck.de>
This commit is contained in:
René Schimmelpfennig 2024-05-29 09:57:57 +02:00 committed by GitHub
parent 598fb3a7a9
commit b093c7d5fc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

70
main.js
View file

@ -8,8 +8,14 @@ const axios = require("axios");
const mastodonInstance = process.env.MASTODON_INSTANCE; const mastodonInstance = process.env.MASTODON_INSTANCE;
const mastodonUser = process.env.MASTODON_USER; const mastodonUser = process.env.MASTODON_USER;
async function main() {
// Bluesky agent // Bluesky agent
const agent = new BskyAgent({ service: process.env.BLUESKY_ENDPOINT }); const agent = new BskyAgent({ service: process.env.BLUESKY_ENDPOINT });
const loginResponse = await agent.login({
identifier: process.env.BLUESKY_HANDLE,
password: process.env.BLUESKY_PASSWORD,
});
if (!loginResponse.success) console.error("🔒 login failed");
// File to store the last processed Mastodon post ID // File to store the last processed Mastodon post ID
const lastProcessedPostIdFile = path.join( const lastProcessedPostIdFile = path.join(
@ -40,31 +46,62 @@ function saveLastProcessedPostId() {
} }
} }
async function postToBluesky(text) { async function createBlueskyMessage(text) {
await agent.login({
identifier: process.env.BLUESKY_HANDLE,
password: process.env.BLUESKY_PASSWORD,
});
const richText = new RichText({ text }); const richText = new RichText({ text });
await richText.detectFacets(agent); await richText.detectFacets(agent);
await agent.post({
return {
text: richText.text, text: richText.text,
facets: richText.facets, facets: richText.facets
};
}
async function postToBluesky(textParts) {
const rootMessageResponse = await agent.post(await createBlueskyMessage(textParts[0]));
if (textParts.length === 1) return;
let replyMessageResponse = null
for (let index = 1; index < textParts.length; index++) {
replyMessageResponse = await agent.post({
...(await createBlueskyMessage(textParts[index])),
reply: {
root: rootMessageResponse,
parent: replyMessageResponse ?? rootMessageResponse,
}
}); });
} }
}
function removeHtmlTags(input) { function removeHtmlTags(input) {
return input.replace(/<[^>]*>/g, ""); return input.replace(/<[^>]*>/g, "");
} }
function truncate(text, timestampId) { function splitText(text, maxLength) {
if (text.length > 300) { // Split the text by spaces
console.warn(`✂ post '${timestampId}' was truncated`) const words = text.split(" ");
return text.substring(0, 299) + '…'
let result = [];
let currentChunk = "";
for (const word of words) {
// Add the current word to the current chunk
const potentialChunk = `${currentChunk} ${word}`.trim();
if (potentialChunk.length <= maxLength) {
// If the current chunk is still under max length, add the word
currentChunk = potentialChunk;
} else {
// Otherwise, add the current chunk to the result and start a new chunk
result.push(currentChunk);
currentChunk = word;
}
} }
return text // Add the last chunk to the result
result.push(currentChunk);
return result;
} }
// Function to periodically fetch new Mastodon posts // Function to periodically fetch new Mastodon posts
@ -90,8 +127,8 @@ async function fetchNewPosts() {
if (currentTimestampId > lastProcessedPostId && lastProcessedPostId != 0) { if (currentTimestampId > lastProcessedPostId && lastProcessedPostId != 0) {
try { try {
console.log('📧 posting to BlueSky', currentTimestampId) console.log('📧 posting to BlueSky', currentTimestampId)
const text = truncate(removeHtmlTags(item.object.content), currentTimestampId); const textParts = splitText(removeHtmlTags(item.object.content), 300);
postToBluesky(text); postToBluesky(textParts);
} catch (error) { } catch (error) {
console.error('🔥 can\'t post to Bluesky', currentTimestampId, error) console.error('🔥 can\'t post to Bluesky', currentTimestampId, error)
} }
@ -107,3 +144,6 @@ async function fetchNewPosts() {
fetchNewPosts(); fetchNewPosts();
// Fetch new posts every 5 minutes (adjust as needed) // Fetch new posts every 5 minutes (adjust as needed)
setInterval(fetchNewPosts, (process.env.INTERVAL_MINUTES ?? 5) * 60 * 1000); setInterval(fetchNewPosts, (process.env.INTERVAL_MINUTES ?? 5) * 60 * 1000);
}
main()