diff --git a/commands/fediverse/media.js b/commands/fediverse/media.js deleted file mode 100644 index 1c2f131..0000000 --- a/commands/fediverse/media.js +++ /dev/null @@ -1,91 +0,0 @@ -const qs = require('qs'); -const FormData = require('form-data'); - -const emojis = { public: '🌐', unlisted: '📝', private: '🔒️', direct: '✉️' }; -exports.visibilityEmoji = v => emojis[v] || v; - -const getFilename = header => { - if(typeof header !== 'string') return null; - try { - const m = header.match(/inline; filename(?:=(.+)|\*=utf-8''(.+))/); - return !m ? null : m[2] && decodeURIComponent(m[2]) || m[1]; - } catch(e) { - return null; - } -}; - -const mediaDownload = async (url, { whitelist, blacklist }) => { - const media = await axios({ method: 'GET', url, responseType: 'arraybuffer' }); - if (media.statusText !== 'OK' || blacklist.includes(media.headers['content-type'])) throw media; - if(whitelist.length && !whitelist.includes(media.headers['content-type'])) throw media; - return { - data: media.data, - filename: getFilename(media.headers['content-disposition']), - mimetype: media.headers['content-type'] - }; -}; - -const mediaUpload = async ({ domain }, { data, filename, mimetype }) => { - const form = new FormData(); - form.append('file', data, { - filename: filename || 'upload', - contentType: mimetype, - }); - const upload = await axios({ - method: 'POST', - url: `${domain}/api/v1/media`, - headers: form.getHeaders({ Authorization: `Bearer ${fediverse_auth.access_token}` }), - data: form, - }); - if(upload.statusText !== 'OK') throw upload; - return upload.data.id; -}; - -const run = async (matrixClient, { roomId }, content, replyId, mediaURL, subject) => { - let mediaId = null; - const fediverse = config.fediverse; - if(mediaURL) { - const media = await mediaDownload(mediaURL, fediverse.mimetypes); - mediaId = await mediaUpload(fediverse, media); - } - const response = await axios({ - method: 'POST', - url: `${fediverse.domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${fediverse_auth.access_token}`, 'Content-Type': 'application/x-www-form-urlencoded' }, - data : qs.stringify({ - status: content, - content_type: `text/markdown`, - media_ids: mediaURL && [ mediaId ] || undefined, - in_reply_to_id: replyId || undefined, - spoiler_text: subject || undefined - }, { arrayFormat: 'brackets' }) - }); - return matrixClient.sendHtmlNotice(roomId, '', `${response.data.id}`); -} - -exports.runQuery = async (client, room, userInput, { isReply, hasMedia, hasSubject }) => { - try { - const chunks = userInput.trim().split(' '); - if(!chunks.length || chunks.length < !!isReply + !!hasMedia) throw ''; - let replyId = null; - let mediaURL = null; - const subject = hasSubject ? fediverse.subject : null; - if(isReply) { - replyId = chunks[0]; - chunks.shift(); - } - if(hasMedia) { - let url = new URL(chunks[0]); - chunks.shift(); - if(url.protocol === 'mxc:' && url.hostname && url.pathname) - url = new URL(`${config.matrix.domain}/_matrix/media/r0/download/${url.hostname}${url.pathname}`); - if(url.protocol !== 'https:') throw ''; - if(!config.matrix.domains.includes(url.hostname)) throw ''; - if(!/^\/_matrix\/media\/r0\/download\/[^/]+\/[^/]+\/?$/.test(url.pathname)) throw ''; - mediaURL = url.toString(); - } - return await run(client, room, chunks.join(' '), replyId, mediaURL, subject); - } catch(e) { - return client.sendHtmlNotice(room.roomId, 'Sad!', `Sad!`).catch(()=>{}); - } -}; diff --git a/commands/fediverse/reply.js b/commands/fediverse/reply.js deleted file mode 100644 index 19522cd..0000000 --- a/commands/fediverse/reply.js +++ /dev/null @@ -1,16 +0,0 @@ -exports.runQuery = function (matrixClient, room, address, flaggedInput) { - axios({ - method: 'POST', - url: `${config.fediverse.domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, - data: { status: flaggedInput, in_reply_to_id: address, content_type: `text/markdown` }, - }).then((response) => { - matrixClient.sendHtmlNotice(room.roomId, - '', - `${response.data.content} ${response.data.url}`); - }) - .catch((e) => { - matrixClient.sendHtmlNotice(room.roomId, - '', `${e}`); - }); -};