summaryrefslogtreecommitdiffstats
path: root/src/api/mastodon/index.ts
blob: 3bfe9c8a4e658617dbda08bc157fece8b294310e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import got from "got";
import FormData from "form-data";
import fileType from "file-type";
import { nanoid } from "nanoid";
import config from "../../config";

export interface Attachment {
    id: string;
}

export interface Status {
    url: string;
}

export const client = got.extend({
    prefixUrl: config.mastodon.instance,
    headers: {
        Authorization: `Bearer ${config.mastodon.token}`,
    },
});

export async function upload(buf: Buffer, filename: string) {
    const type = await fileType.fromBuffer(buf);

    if (!type) {
        throw new Error("Couldn't determine file type");
    }

    const body = new FormData();
    body.append("file", buf, { filename: `${filename}.${type.ext}`, contentType: type.mime });

    return client.post("api/v1/media", { body }).json<Attachment>();
}

export async function createStatus(
    postUrl: string,
    sourceUrl: string | undefined,
    spoiler: string[],
    attachmentId: string
) {
    let lines = [postUrl];
    if (sourceUrl) {
        lines.push(`Source: ${sourceUrl}`);
    }

    const spoilerText = spoiler.length ? `CW: ${spoiler.join(", ")}` : undefined;

    return client
        .post("api/v1/statuses", {
            headers: {
                "Idempotency-Key": nanoid(),
            },
            json: {
                status: lines.join("\n"),
                media_ids: [attachmentId],
                sensitive: !!spoilerText,
                spoiler_text: spoilerText,
                visibility: "unlisted",
            },
        })
        .json<Status>();
}