plerobuddies/src/toot.js

54 lines
1.4 KiB
JavaScript

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
}