const axios = require('axios') const FormData = require('form-data') const { createReadStream } = require('fs') async function toot(data, opts) { const { instance, oauthToken } = opts // contains 'toot', and maybe 'attach' / 'attachDescription' const media_ids = [] if(data.attach) { for await(file of data.attach) { const id = await uploadMedia(file, data.attachDescription, instance, oauthToken) media_ids.push(id) } } // https://docs.joinmastodon.org/methods/statuses/ const result = await axios.post(`${instance}/api/v1/statuses`, { status: data.toot, media_ids: media_ids, }, { headers: { "Authorization": `Bearer ${oauthToken}` } }) console.log(` toot: status result: ${result.status}`) } async function uploadMedia(fileName, description, instance, oauthToken) { const formData = new FormData() formData.append('file', createReadStream(fileName)) formData.append('description', description) // https://docs.joinmastodon.org/methods/statuses/media/ const result = await axios.post(`${instance}/api/v1/media`, formData, { headers: { "Content-Type": `multipart/form-data; boundary=${formData.getBoundary()}`, "Authorization": `Bearer ${oauthToken}` } }); if(result.status !== 200) { throw "something went wrong with " + result.data } console.log(` toot: media result: ${result.status} - media id: ${result.data.id}`) return result.data.id } module.exports = { toot }