Newer
Older
minerva / Meta / toot-commits.js
@minerva minerva on 13 Jul 1 KB Initial commit
const fs = require("fs");
const Mastodon = require("mastodon");
const { ACCESS_TOKEN } = process.env;
const tootLength = 500;
// Mastodon always considers links to be 23 chars, see https://docs.joinmastodon.org/user/posting/#links
const mastodonLinkLength = 23;

const mastodon = new Mastodon({
    access_token: ACCESS_TOKEN,
    timeout_ms: 60 * 1000,
    api_url: "https://minerva.social/api/v1/",
});

(async () => {
    const githubEvent = JSON.parse(fs.readFileSync(0).toString());
    const toots = [];
    for (const commit of githubEvent["commits"]) {
        const authorLine = `Author: ${commit["author"]["name"]}`;
        const maxMessageLength = tootLength - authorLine.length - mastodonLinkLength - 2; // -2 for newlines
        const commitMessage =
            commit["message"].length > maxMessageLength
                ? commit["message"].substring(0, maxMessageLength - 2) + "…" // Ellipsis counts as 2 characters
                : commit["message"];

        toots.push(`${commitMessage}\n${authorLine}\n${commit["url"]}`);
    }
    for (const toot of toots) {
        try {
            await mastodon.post("statuses", { status: toot, visibility: "unlisted" });
        } catch (e) {
            console.error("Failed to post a toot!", e.message);
        }
    }
})();