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
|
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);
const body = new FormData();
body.append("i", config.mastodon.token);
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: true,
spoiler_text: spoilerText,
visibility: "unlisted",
},
})
.json<Status>();
}
|