From e95cefafb97e2fd41cfc08a42dbe86b9e17bfb48 Mon Sep 17 00:00:00 2001 From: vulet Date: Thu, 21 May 2020 07:02:27 +0800 Subject: [PATCH 01/89] feat(cmd): Add Mordekai --- .gitignore | 3 +++ commands/mordy.js | 26 ++++++++++++++++++++++++++ main.js | 4 ++++ registrar.js | 1 + 4 files changed, 34 insertions(+) create mode 100644 commands/mordy.js diff --git a/.gitignore b/.gitignore index 8d25863..0cc8fb8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# Patches +*.patch + # Logs logs *.log diff --git a/commands/mordy.js b/commands/mordy.js new file mode 100644 index 0000000..be0c2bd --- /dev/null +++ b/commands/mordy.js @@ -0,0 +1,26 @@ +const axios = require('axios'); + +exports.runQuery = function (matrixClient, room, userInput, registrar) { + axios({ + method: 'POST', + url: `${registrar.config.fediverse}/api/v1/statuses`, + headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + data: { + status: `@mordekai ${userInput}`, + content_type: `text/markdown`, + visibility: 'unlisted', + expires_in: '7200' + }, + }).then((response) => { + matrixClient.sendHtmlNotice(room.roomId, + '', + ` +
${response.data.content}
+ (id: ${response.data.id}) +

`); + }) + .catch((e) => { + matrixClient.sendHtmlNotice(room.roomId, + '', `${e}`); + }); +}; diff --git a/main.js b/main.js index 3c42b2d..5a18e38 100644 --- a/main.js +++ b/main.js @@ -102,6 +102,10 @@ let CreateClient = (token) => { if (command === 'unpin') { registrar.unpin.runQuery(matrixClient, room, userInput, registrar); } + + if (command === 'mordy') { + registrar.mordy.runQuery(matrixClient, room, userInput, registrar); + } } }); diff --git a/registrar.js b/registrar.js index 760869a..85b9840 100644 --- a/registrar.js +++ b/registrar.js @@ -15,4 +15,5 @@ module.exports = { tip: require('./commands/tip.js'), unfren: require('./commands/unfren.js'), unpin: require('./commands/unpin.js'), + mordy: require('./commands/mordy.js'), }; From 8dadc6caa4a23b979c051b521d6592b42aa5d555 Mon Sep 17 00:00:00 2001 From: vulet Date: Wed, 27 May 2020 02:06:34 +0800 Subject: [PATCH 02/89] feat(cmd): Add archive.is --- README.md | 5 ++- commands/archive.js | 90 +++++++++++++++++++++++++++++++++++++++++++++ config.js | 4 ++ main.js | 4 ++ registrar.js | 1 + 5 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 commands/archive.js diff --git a/README.md b/README.md index b913264..f9faf70 100644 --- a/README.md +++ b/README.md @@ -31,4 +31,7 @@ Result: The access_token from the above command is then stored in the [config.js](https://github.com/vulet/plemara/blob/master/config.js) file. # Images -![Bridge](https://civseed.com/_matrix/media/v1/download/civseed.com/wwLEtYGUUfYanovmSSAxdTJI) \ No newline at end of file +![Bridge](https://civseed.com/_matrix/media/v1/download/civseed.com/wwLEtYGUUfYanovmSSAxdTJI) + +# Contributors +CryptoMooners diff --git a/commands/archive.js b/commands/archive.js new file mode 100644 index 0000000..5210769 --- /dev/null +++ b/commands/archive.js @@ -0,0 +1,90 @@ +const qs = require('qs'); +const axios = require('axios'); +const registrar = require('../registrar.js'); + +const sleep = ms => new Promise(r => setTimeout(r, ms)); + +const editNoticeHTML = (client, roomId, eventId, html, plain) => client.sendMessage(roomId, { + body: ` * ${plain || html.replace(/<[^<]+?>/g, '')}`, + formatted_body: ` * ${html}`, + format: 'org.matrix.custom.html', + msgtype: 'm.notice', + 'm.new_content': { + body: plain || html.replace(/<[^<]+?>/g, ''), + formatted_body: html, + format: 'org.matrix.custom.html', + msgtype: 'm.notice' + }, + 'm.relates_to': { + rel_type: 'm.replace', + event_id: eventId + } +}); + +const headers = ({ domain, userAgent }) => ({ + 'Host': `${domain}`, + 'User-Agent': `${userAgent}` +}); + +const archive = async (instance, url) => { + const form = await instance({ method: 'GET', url: '/' }); + if (form.statusText !== 'OK') throw form; + const submitId = form.data.match(/name="submitid" value="([^"]+)/); + const submit = await instance({ + method: 'POST', + url: '/submit/', + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + data: qs.stringify({ submitid: submitId ? submitId[1] : undefined, url }) + }); + if (submit.statusText !== 'OK') throw submit; + if (submit.request.path !== '/submit/') + return { id: submit.request.path }; + if (submit.headers.refresh) + return { refresh: submit.headers.refresh.split(';url=')[1] }; + throw submit; +}; + +const reqStr = str => `Sending archive request for ${str}`; +const arc1Str = str => `Archiving page ${str}`; +const arc2Str = str => `Archived page ${str}`; +const arc3Str = str => `Timed out ${str}`; + +const run = async (matrixClient, { roomId }, userInput, registrar) => { + const config = registrar.config.archive; + const instance = axios.create({ + baseURL: `https://${config.domain}`, + headers: headers(config), + transformResponse: [], + timeout: 10 * 1000 + }); + let reply = null; + try { + reply = await matrixClient.sendHtmlNotice(roomId, '', reqStr(userInput)); + const { refresh, id } = await archive(instance, userInput); + if (id) + return await editNoticeHTML(matrixClient, roomId, reply, arc2Str(`${config.domain}${id}`)); + if (refresh) { + const path = refresh.split(`https://${config.domain}`); + if (!path[1]) throw refresh; + await editNoticeHTML(matrixClient, roomId, reply, arc1Str(refresh)); + let tries = 30; + while (tries--) { + await sleep(10000); + const { request: { path: reqPath } } = await instance({ method: 'HEAD', url: path[1] }) + .catch(e => ({ request: { path: path[1] } })); + if (reqPath !== path[1]) + return await editNoticeHTML(matrixClient, roomId, reply, arc2Str(`${config.domain}${reqPath}`)); + } + return await editNoticeHTML(matrixClient, roomId, reply, arc3Str(refresh)); + } + throw 'sad'; + } catch (e) { + const sad = `Sad!
${`${e}`.replace(/<[^<]+?>/g, '').substr(0, 100)}`; + if (reply) + editNoticeHTML(matrixClient, roomId, reply, sad, 'sad').catch(() => {}); + else + matrixClient.sendHtmlNotice(roomId, 'sad', sad).catch(() => {}); + } +} + +exports.runQuery = run; \ No newline at end of file diff --git a/config.js b/config.js index e6cff93..eca558b 100644 --- a/config.js +++ b/config.js @@ -5,4 +5,8 @@ module.exports = { matrixPass: 'password', fediverse: 'https://server.com', fediverseToken: 'access_token', + archive: { + domain: 'archive.is', + userAgent: 'Mozilla/4.0 (compatible; Beep Boop)' + } }; diff --git a/main.js b/main.js index 5a18e38..01616dc 100644 --- a/main.js +++ b/main.js @@ -106,6 +106,10 @@ let CreateClient = (token) => { if (command === 'mordy') { registrar.mordy.runQuery(matrixClient, room, userInput, registrar); } + + if (command === 'archive') { + registrar.archive.runQuery(matrixClient, room, userInput, registrar); + } } }); diff --git a/registrar.js b/registrar.js index 85b9840..593b5d7 100644 --- a/registrar.js +++ b/registrar.js @@ -16,4 +16,5 @@ module.exports = { unfren: require('./commands/unfren.js'), unpin: require('./commands/unpin.js'), mordy: require('./commands/mordy.js'), + archive: require('./commands/archive.js'), }; From 2c1ef158e9b712743b8b82eebcaa6eec524ca47d Mon Sep 17 00:00:00 2001 From: vulet Date: Wed, 27 May 2020 06:36:34 +0800 Subject: [PATCH 03/89] fix(archive.is): event.id was nested --- commands/archive.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/commands/archive.js b/commands/archive.js index 5210769..2da1f19 100644 --- a/commands/archive.js +++ b/commands/archive.js @@ -4,7 +4,7 @@ const registrar = require('../registrar.js'); const sleep = ms => new Promise(r => setTimeout(r, ms)); -const editNoticeHTML = (client, roomId, eventId, html, plain) => client.sendMessage(roomId, { +const editNoticeHTML = (client, roomId, event, html, plain) => client.sendMessage(roomId, { body: ` * ${plain || html.replace(/<[^<]+?>/g, '')}`, formatted_body: ` * ${html}`, format: 'org.matrix.custom.html', @@ -17,7 +17,7 @@ const editNoticeHTML = (client, roomId, eventId, html, plain) => client.sendMess }, 'm.relates_to': { rel_type: 'm.replace', - event_id: eventId + event_id: event.event_id } }); From 2d23f24a6a15ec3602682db6c77303dee6ba9796 Mon Sep 17 00:00:00 2001 From: vulet Date: Wed, 24 Jun 2020 02:56:08 +0800 Subject: [PATCH 04/89] feat(archive.is): add rearchive, timestamp past archives --- commands/archive.js | 18 +++++++++--------- main.js | 6 +++++- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/commands/archive.js b/commands/archive.js index 2da1f19..e1a4101 100644 --- a/commands/archive.js +++ b/commands/archive.js @@ -26,7 +26,7 @@ const headers = ({ domain, userAgent }) => ({ 'User-Agent': `${userAgent}` }); -const archive = async (instance, url) => { +const archive = async (instance, url, rearchive) => { const form = await instance({ method: 'GET', url: '/' }); if (form.statusText !== 'OK') throw form; const submitId = form.data.match(/name="submitid" value="([^"]+)/); @@ -34,11 +34,11 @@ const archive = async (instance, url) => { method: 'POST', url: '/submit/', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - data: qs.stringify({ submitid: submitId ? submitId[1] : undefined, url }) + data: qs.stringify({ anyway: rearchive ? '1' : undefined, submitid: submitId ? submitId[1] : undefined, url }) }); if (submit.statusText !== 'OK') throw submit; if (submit.request.path !== '/submit/') - return { id: submit.request.path }; + return { id: submit.request.path, date: submit.headers['memento-datetime'] }; if (submit.headers.refresh) return { refresh: submit.headers.refresh.split(';url=')[1] }; throw submit; @@ -46,10 +46,10 @@ const archive = async (instance, url) => { const reqStr = str => `Sending archive request for ${str}`; const arc1Str = str => `Archiving page ${str}`; -const arc2Str = str => `Archived page ${str}`; +const arc2Str = (str, date) => `Archived page ${str} [${date}]`; const arc3Str = str => `Timed out ${str}`; -const run = async (matrixClient, { roomId }, userInput, registrar) => { +const run = async (matrixClient, { roomId }, userInput, rearchive, registrar) => { const config = registrar.config.archive; const instance = axios.create({ baseURL: `https://${config.domain}`, @@ -60,9 +60,9 @@ const run = async (matrixClient, { roomId }, userInput, registrar) => { let reply = null; try { reply = await matrixClient.sendHtmlNotice(roomId, '', reqStr(userInput)); - const { refresh, id } = await archive(instance, userInput); + const { refresh, id, date } = await archive(instance, userInput, rearchive); if (id) - return await editNoticeHTML(matrixClient, roomId, reply, arc2Str(`${config.domain}${id}`)); + return await editNoticeHTML(matrixClient, roomId, reply, arc2Str(`${config.domain}${id}`, date)); if (refresh) { const path = refresh.split(`https://${config.domain}`); if (!path[1]) throw refresh; @@ -70,10 +70,10 @@ const run = async (matrixClient, { roomId }, userInput, registrar) => { let tries = 30; while (tries--) { await sleep(10000); - const { request: { path: reqPath } } = await instance({ method: 'HEAD', url: path[1] }) + const { request: { path: reqPath }, headers: { 'memento-datetime': date } } = await instance({ method: 'HEAD', url: path[1] }) .catch(e => ({ request: { path: path[1] } })); if (reqPath !== path[1]) - return await editNoticeHTML(matrixClient, roomId, reply, arc2Str(`${config.domain}${reqPath}`)); + return await editNoticeHTML(matrixClient, roomId, reply, arc2Str(`${config.domain}${reqPath}`, date)); } return await editNoticeHTML(matrixClient, roomId, reply, arc3Str(refresh)); } diff --git a/main.js b/main.js index 01616dc..e25a996 100644 --- a/main.js +++ b/main.js @@ -108,7 +108,11 @@ let CreateClient = (token) => { } if (command === 'archive') { - registrar.archive.runQuery(matrixClient, room, userInput, registrar); + registrar.archive.runQuery(matrixClient, room, userInput, false, registrar); + } + + if (command === 'rearchive') { + registrar.archive.runQuery(matrixClient, room, userInput, true, registrar); } } }); From 751dbb335f8c3c59997a03147c5c1e68ba7116f9 Mon Sep 17 00:00:00 2001 From: vulet Date: Wed, 24 Jun 2020 04:22:30 +0800 Subject: [PATCH 05/89] feat(cmd): Add Nitter consumption --- commands/nitter.js | 63 ++++++++++++++++++++++++++++++++++++++++++++++ config.js | 5 ++++ main.js | 4 +++ package.json | 3 ++- registrar.js | 1 + 5 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 commands/nitter.js diff --git a/commands/nitter.js b/commands/nitter.js new file mode 100644 index 0000000..9770f08 --- /dev/null +++ b/commands/nitter.js @@ -0,0 +1,63 @@ +const axios = require('axios'); +const { JSDOM } = require("jsdom"); + +const headers = ({ domain, userAgent }) => ({ + 'Host': `${domain}`, + 'User-Agent': `${userAgent}` +}); + +const nitter = async (instance, url) => { + const req = await instance({ method: 'GET', url }); + if (req.statusText !== 'OK') throw req; + const dom = new JSDOM(req.data); + const tweet = dom.window.document.querySelector('#m'); + const stats = tweet.querySelectorAll('.tweet-body > .tweet-stats .icon-container'); + const quote = tweet.querySelector('.tweet-body > .quote a.quote-link'); + return { + text: tweet.querySelector('.tweet-body > .tweet-content').innerHTML, + date: tweet.querySelector('.tweet-body > .tweet-published').textContent, + name: tweet.querySelector('.tweet-body > div .fullname').textContent, + handle: tweet.querySelector('.tweet-body > div .username').textContent, + hasAttachments: !!tweet.querySelector('.tweet-body > .attachments'), + quote: quote ? quote.href : null, + stats: { + replies: stats[0].textContent.trim(), + retweets: stats[1].textContent.trim(), + favorites: stats[2].textContent.trim() + } + }; +}; + +const card = (tweet, base, path) => +`${tweet.name} ` + +`${tweet.date} ` + +`🗨️ ${tweet.stats.replies} ` + +`🔁 ${tweet.stats.retweets} ` + +`❤️ ${tweet.stats.favorites} ` + +`
${tweet.text.replace('\n', '
')}
` + +(tweet.hasAttachments ? '
This tweet has attached media.
' : '') + +(tweet.quote ? `
Quoted Tweet
` : ''); + +const run = async (matrixClient, { roomId }, userInput, registrar) => { + const config = registrar.config.nitter; + const instance = axios.create({ + baseURL: `https://${config.domain}`, + headers: headers(config), + transformResponse: [], + timeout: 10 * 1000 + }); + const tweet = await nitter(instance, userInput); + return await matrixClient.sendHtmlNotice(roomId, '', card(tweet, `https://${config.domain}`, userInput)); +} + +exports.runQuery = (client, room, userInput, registrar) => { + let url = null; + try { + url = new URL(userInput); + if(!registrar.config.nitter.domains.includes(url.hostname)) throw ''; + if(!/^\/[^/]+\/status\/\d+\/?$/.test(url.pathname)) throw ''; + } catch(e) { + return client.sendHtmlNotice(roomId, 'Sad!', `Sad!`).catch(()=>{}); + } + return run(client, room, url.pathname, registrar); +}; diff --git a/config.js b/config.js index eca558b..e3ec895 100644 --- a/config.js +++ b/config.js @@ -8,5 +8,10 @@ module.exports = { archive: { domain: 'archive.is', userAgent: 'Mozilla/4.0 (compatible; Beep Boop)' + }, + nitter: { + domain: 'nitter.net', + userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', + domains: [ 'nitter.net', 'twitter.com' ] } }; diff --git a/main.js b/main.js index e25a996..a402f73 100644 --- a/main.js +++ b/main.js @@ -114,6 +114,10 @@ let CreateClient = (token) => { if (command === 'rearchive') { registrar.archive.runQuery(matrixClient, room, userInput, true, registrar); } + + if (command === 'nitter') { + registrar.nitter.runQuery(matrixClient, room, userInput, registrar); + } } }); diff --git a/package.json b/package.json index 8d3656a..fa6e754 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ "dependencies": { "axios": "^0.19.2", "file-system": "^2.2.2", - "matrix-js-sdk": "^2.4.6" + "matrix-js-sdk": "^2.4.6", + "jsdom": "^16.2.2" }, "devDependencies": { "eslint": "^5.16.0", diff --git a/registrar.js b/registrar.js index 593b5d7..ac9fc6e 100644 --- a/registrar.js +++ b/registrar.js @@ -17,4 +17,5 @@ module.exports = { unpin: require('./commands/unpin.js'), mordy: require('./commands/mordy.js'), archive: require('./commands/archive.js'), + nitter: require('./commands/nitter.js'), }; From d7396b8786af87464a038eef1b87f5241dd420a6 Mon Sep 17 00:00:00 2001 From: vulet Date: Wed, 24 Jun 2020 04:45:09 +0800 Subject: [PATCH 06/89] fix(nitter): error handling --- commands/nitter.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/commands/nitter.js b/commands/nitter.js index 9770f08..e302ea0 100644 --- a/commands/nitter.js +++ b/commands/nitter.js @@ -50,14 +50,13 @@ const run = async (matrixClient, { roomId }, userInput, registrar) => { return await matrixClient.sendHtmlNotice(roomId, '', card(tweet, `https://${config.domain}`, userInput)); } -exports.runQuery = (client, room, userInput, registrar) => { - let url = null; +exports.runQuery = async (client, room, userInput, registrar) => { try { - url = new URL(userInput); + const url = new URL(userInput); if(!registrar.config.nitter.domains.includes(url.hostname)) throw ''; if(!/^\/[^/]+\/status\/\d+\/?$/.test(url.pathname)) throw ''; + return await run(client, room, url.pathname, registrar); } catch(e) { - return client.sendHtmlNotice(roomId, 'Sad!', `Sad!`).catch(()=>{}); + return client.sendHtmlNotice(room.roomId, 'Sad!', `Sad!`).catch(()=>{}); } - return run(client, room, url.pathname, registrar); }; From 2aeea1bc37a92dcafcc876946af00d4d383b7813 Mon Sep 17 00:00:00 2001 From: vulet Date: Wed, 24 Jun 2020 06:00:53 +0800 Subject: [PATCH 07/89] feat(nitter): show content of quoted --- commands/nitter.js | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/commands/nitter.js b/commands/nitter.js index e302ea0..8fd17e0 100644 --- a/commands/nitter.js +++ b/commands/nitter.js @@ -10,17 +10,27 @@ const nitter = async (instance, url) => { const req = await instance({ method: 'GET', url }); if (req.statusText !== 'OK') throw req; const dom = new JSDOM(req.data); - const tweet = dom.window.document.querySelector('#m'); + const document = dom.window.document; + const tweet = document.querySelector('#m'); const stats = tweet.querySelectorAll('.tweet-body > .tweet-stats .icon-container'); - const quote = tweet.querySelector('.tweet-body > .quote a.quote-link'); + const quote = tweet.querySelector('.tweet-body > .quote'); + const isReply = tweet.querySelector('.tweet-body > .replying-to'); + const replies = document.querySelectorAll('.main-thread > .before-tweet > .timeline-item'); return { text: tweet.querySelector('.tweet-body > .tweet-content').innerHTML, date: tweet.querySelector('.tweet-body > .tweet-published').textContent, name: tweet.querySelector('.tweet-body > div .fullname').textContent, handle: tweet.querySelector('.tweet-body > div .username').textContent, hasAttachments: !!tweet.querySelector('.tweet-body > .attachments'), - quote: quote ? quote.href : null, - stats: { + quote: quote ? { + path: quote.querySelector('a.quote-link').href, + text: quote.querySelector('.quote-text').innerHTML, + } : null, + isReply: isReply && replies.length > 0 ? { + path: replies[replies.length - 1].querySelector('a.tweet-link').href, + text: replies[replies.length - 1].querySelector('.tweet-content').innerHTML, + } : null, + stats: { replies: stats[0].textContent.trim(), retweets: stats[1].textContent.trim(), favorites: stats[2].textContent.trim() @@ -36,8 +46,8 @@ const card = (tweet, base, path) => `❤️ ${tweet.stats.favorites} ` + `
${tweet.text.replace('\n', '
')}
` + (tweet.hasAttachments ? '
This tweet has attached media.
' : '') + -(tweet.quote ? `
Quoted Tweet
` : ''); - +(tweet.isReply ? `
Replied Tweet
${tweet.isReply.text.replace('\n', '
')}
` : '') + +(tweet.quote ? `
Quoted Tweet
${tweet.quote.text.replace('\n', '
')}
` : ''); const run = async (matrixClient, { roomId }, userInput, registrar) => { const config = registrar.config.nitter; const instance = axios.create({ @@ -49,7 +59,7 @@ const run = async (matrixClient, { roomId }, userInput, registrar) => { const tweet = await nitter(instance, userInput); return await matrixClient.sendHtmlNotice(roomId, '', card(tweet, `https://${config.domain}`, userInput)); } - + exports.runQuery = async (client, room, userInput, registrar) => { try { const url = new URL(userInput); From 34b1f1b9d8d840dcbc9d9f718d407a2467ad658c Mon Sep 17 00:00:00 2001 From: vulet Date: Thu, 25 Jun 2020 19:32:36 +0800 Subject: [PATCH 08/89] feat(cmd): Add Invidious --- commands/invidious.js | 56 +++++++++++++++++++++++++++++++++++++++++++ config.js | 5 ++++ main.js | 4 ++++ registrar.js | 1 + 4 files changed, 66 insertions(+) create mode 100644 commands/invidious.js diff --git a/commands/invidious.js b/commands/invidious.js new file mode 100644 index 0000000..f47d618 --- /dev/null +++ b/commands/invidious.js @@ -0,0 +1,56 @@ +const axios = require('axios'); + +const headers = ({ domain, userAgent }) => ({ + 'Host': `${domain}`, + 'User-Agent': `${userAgent}` +}); + +const invidious = async (instance, url) => { + const req = await instance({ method: 'GET', url }); + if (req.statusText !== 'OK') throw req; + const video = JSON.parse(req.data); + return { + name: video.title, + date: video.publishedText, + description: video.descriptionHtml, + author: video.author, + views: video.viewCount, + likes: video.likeCount, + dislikes: video.dislikeCount + }; +}; + +const card = (video, base, path) => +`${video.name}
` + +((video.description.length > 300) ? `${video.description.substr(0, 300)}…` : ``)+ +((video.description === '

') ? `No description.`: ``)+ +((video.description.length < 300 && video.description !== '

') ? `${video.description}` : ``)+ +`
🔍️ ${video.views.toLocaleString()} ` + +`❤️ ${video.likes.toLocaleString()} ` + +`❌ ${video.dislikes.toLocaleString()}`+ +`
(${video.date})

+
`; + +const run = async (matrixClient, { roomId }, userInput, registrar) => { + const config = registrar.config.invidious; + const instance = axios.create({ + baseURL: `https://${config.domain}/api/v1/videos/`, + headers: headers(config), + transformResponse: [], + timeout: 10 * 1000 + }); + const video = await invidious(instance, userInput); + return await matrixClient.sendHtmlNotice(roomId, '', card(video, `https://${config.domain}`, userInput)); +} + +exports.runQuery = async (client, room, userInput, registrar) => { + try { + const url = new URL(userInput); + if(!registrar.config.invidious.domains.includes(url.hostname)) throw ''; + const params = new URLSearchParams(url.search).get("v"); + if(!/([a-z0-9_-]{11})?$/.test(params)) throw ''; + return await run(client, room, params, registrar); + } catch(e) { + return client.sendHtmlNotice(room.roomId, 'Sad!', `Sad!`).catch(()=>{}); + } +}; diff --git a/config.js b/config.js index e3ec895..f391a5e 100644 --- a/config.js +++ b/config.js @@ -13,5 +13,10 @@ module.exports = { domain: 'nitter.net', userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', domains: [ 'nitter.net', 'twitter.com' ] + }, + invidious: { + domain: 'invidio.us', + userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', + domains: [ 'invidio.us', 'youtube.com' ] } }; diff --git a/main.js b/main.js index a402f73..35bb0a1 100644 --- a/main.js +++ b/main.js @@ -118,6 +118,10 @@ let CreateClient = (token) => { if (command === 'nitter') { registrar.nitter.runQuery(matrixClient, room, userInput, registrar); } + + if (command === 'invidious') { + registrar.invidious.runQuery(matrixClient, room, userInput, registrar); + } } }); diff --git a/registrar.js b/registrar.js index ac9fc6e..af004af 100644 --- a/registrar.js +++ b/registrar.js @@ -18,4 +18,5 @@ module.exports = { mordy: require('./commands/mordy.js'), archive: require('./commands/archive.js'), nitter: require('./commands/nitter.js'), + invidious: require('./commands/invidious.js'), }; From f28d5655d807d5950bd8c83d7e6f6e38c7ac3ef7 Mon Sep 17 00:00:00 2001 From: vulet Date: Thu, 25 Jun 2020 20:09:07 +0800 Subject: [PATCH 09/89] fix(cmd): add WWW subdomain to whitelist --- config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.js b/config.js index f391a5e..af08d07 100644 --- a/config.js +++ b/config.js @@ -12,11 +12,11 @@ module.exports = { nitter: { domain: 'nitter.net', userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', - domains: [ 'nitter.net', 'twitter.com' ] + domains: [ 'nitter.net', 'www.nitter.net', 'twitter.com', 'www.twitter.com' ] }, invidious: { domain: 'invidio.us', userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', - domains: [ 'invidio.us', 'youtube.com' ] + domains: [ 'invidio.us', 'www.invidio.us', 'youtube.com', 'www.youtube.com'] } }; From dc0a6ff9229492717de46d365ec103e3677ab6bf Mon Sep 17 00:00:00 2001 From: vulet Date: Fri, 26 Jun 2020 01:04:00 +0800 Subject: [PATCH 10/89] chore(md): prepare for release --- README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f9faf70..c600834 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Plemara Plemara acts as a [Matrix](https://matrix.org/docs/spec/) bridge to the Fediverse. This application should allow you to do most actions on the Fediverse including livefeed, posting, subscribing, etc. via Matrix. Configuration for the app can be found in [config.js](https://github.com/vulet/plemara/blob/master/config.js). You will need to provide a Matrix username and password for the bridge to work, this can be done through an account made on @matrix.org, or your own homeserver. For the Fediverse side, you will need an access_token, this can be created through the CURL steps below. You would replace `fediverse.site` with where you would like to run the bridge from. + # Installation 1. `git clone https://github.com/vulet/plemara` 2. `cd plemara && yarn install` @@ -30,8 +31,13 @@ Result: ``` The access_token from the above command is then stored in the [config.js](https://github.com/vulet/plemara/blob/master/config.js) file. -# Images -![Bridge](https://civseed.com/_matrix/media/v1/download/civseed.com/wwLEtYGUUfYanovmSSAxdTJI) + + +# Extra Features +- Nitter.net / Twitter +- Invidio.us / YouTube +- Archive.is + # Contributors CryptoMooners From f013eb1c98e3d32324a331c1d410a373f5215629 Mon Sep 17 00:00:00 2001 From: vulet Date: Sun, 28 Jun 2020 15:07:58 +0800 Subject: [PATCH 11/89] chore(config): tidy up --- commands/beg.js | 4 ++-- commands/boo.js | 4 ++-- commands/clap.js | 4 ++-- commands/copy.js | 4 ++-- commands/flood.js | 10 +++++----- commands/fren.js | 8 ++++---- commands/help.js | 10 ++++++++-- commands/mordy.js | 4 ++-- commands/notify.js | 12 ++++++------ commands/pin.js | 6 +++--- commands/plemara.js | 4 ++-- commands/redact.js | 4 ++-- commands/reply.js | 4 ++-- commands/tip.js | 4 ++-- commands/unfren.js | 8 ++++---- commands/unpin.js | 6 +++--- config.js | 19 +++++++++++-------- main.js | 23 ++++++++++++++--------- 18 files changed, 76 insertions(+), 62 deletions(-) diff --git a/commands/beg.js b/commands/beg.js index 0ddc0e2..4b3d37c 100644 --- a/commands/beg.js +++ b/commands/beg.js @@ -3,8 +3,8 @@ const axios = require('axios'); exports.runQuery = function (matrixClient, room, registrar) { axios({ method: 'POST', - url: `${registrar.config.fediverse}/api/v1/statuses`, - headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + url: `${registrar.config.fediverse.domain}/api/v1/statuses`, + headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, data: { status: `@10grans@fedi.cc beg` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, diff --git a/commands/boo.js b/commands/boo.js index 0801ac2..16c7c77 100644 --- a/commands/boo.js +++ b/commands/boo.js @@ -3,8 +3,8 @@ const axios = require('axios'); exports.runQuery = function (matrixClient, room, userInput, registrar) { axios({ method: 'POST', - url: `${registrar.config.fediverse}/api/v1/statuses/${userInput}/unfavourite`, - headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + url: `${registrar.config.fediverse.domain}/api/v1/statuses/${userInput}/unfavourite`, + headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', diff --git a/commands/clap.js b/commands/clap.js index ea47753..8870d8a 100644 --- a/commands/clap.js +++ b/commands/clap.js @@ -3,8 +3,8 @@ const axios = require('axios'); exports.runQuery = function (matrixClient, room, userInput, registrar) { axios({ method: 'POST', - url: `${registrar.config.fediverse}/api/v1/statuses/${userInput}/favourite`, - headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + url: `${registrar.config.fediverse.domain}/api/v1/statuses/${userInput}/favourite`, + headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', diff --git a/commands/copy.js b/commands/copy.js index 1768cb6..6aa6782 100644 --- a/commands/copy.js +++ b/commands/copy.js @@ -3,8 +3,8 @@ const axios = require('axios'); exports.runQuery = function (matrixClient, room, userInput, registrar) { axios({ method: 'POST', - url: `${registrar.config.fediverse}/api/v1/statuses/${userInput}/reblog`, - headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + url: `${registrar.config.fediverse.domain}/api/v1/statuses/${userInput}/reblog`, + headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', diff --git a/commands/flood.js b/commands/flood.js index d682713..ee33a4d 100644 --- a/commands/flood.js +++ b/commands/flood.js @@ -5,8 +5,8 @@ exports.runQuery = function (matrixClient, room, registrar) { setInterval(() => { axios({ method: 'GET', - url: `${registrar.config.fediverse}/api/v1/timelines/home`, - headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + url: `${registrar.config.fediverse.domain}/api/v1/timelines/home`, + headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, }).then((events) => { const event = fs.readFileSync('timeline.json', 'utf8'); fs.writeFileSync('timeline.json', events.data[0].created_at, 'utf8'); @@ -14,7 +14,7 @@ exports.runQuery = function (matrixClient, room, registrar) { if (events.data[0].reblog === null) { matrixClient.sendHtmlNotice(room.roomId, '', - `${events.data[0].account.acct} + `${events.data[0].account.acct}
${events.data[0].content}
${events.data[0].media_attachments.map(media => ``+`${media.description}`+'' @@ -24,9 +24,9 @@ exports.runQuery = function (matrixClient, room, registrar) { } else { matrixClient.sendHtmlNotice(room.roomId, '', - ` + ` ${events.data[0].account.acct} - has repeated: + has repeated:
${events.data[0].reblog.account.acct}
${events.data[0].content}
${events.data[0].media_attachments.map(media => diff --git a/commands/fren.js b/commands/fren.js index 62ed399..1a1e57e 100644 --- a/commands/fren.js +++ b/commands/fren.js @@ -1,17 +1,17 @@ const axios = require('axios'); exports.runQuery = function (matrixClient, room, userInput, registrar) { - axios.get(`${registrar.config.fediverse}/api/v1/accounts/${userInput}`).then((findUID) => { + axios.get(`${registrar.config.fediverse.domain}/api/v1/accounts/${userInput}`).then((findUID) => { axios({ method: 'POST', - url: `${registrar.config.fediverse}/api/v1/accounts/${findUID.data.id}/follow`, - headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + url: `${registrar.config.fediverse.domain}/api/v1/accounts/${findUID.data.id}/follow`, + headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, }) .then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', `Subscribed: -
${registrar.config.fediverse}/${response.data.id}`); +
${registrar.config.fediverse.domain}/${response.data.id}`); }); }).catch((e) => { matrixClient.sendHtmlNotice(room.roomId, diff --git a/commands/help.js b/commands/help.js index b9a2691..db86db0 100644 --- a/commands/help.js +++ b/commands/help.js @@ -12,7 +12,13 @@ exports.runQuery = function (matrixClient, room) { + '+clap [post id] : favorite
' + '+boo [post id] : unfavorite
' + '
channel commands
' - + '+flood : turn on timeline
' - + '+notify : show notifications
' + + '+flood : turn on timeline in channel
' + + '+notify : show notifications in channel
' + + '+archive [URL] : archive content
' + + '+rearchive [URL] : re-archive content
' + + '+nitter [status URL] : redirect twitter to nitter, also embed tweet
' + + '+invidious [video URL] : redirect youtube to invidious, also embed description
' + + '
--- contributors🐱 ---' + + '--- cryptomooners ---
' + '
--- docs by lint ---
'); }; diff --git a/commands/mordy.js b/commands/mordy.js index be0c2bd..727b06d 100644 --- a/commands/mordy.js +++ b/commands/mordy.js @@ -3,8 +3,8 @@ const axios = require('axios'); exports.runQuery = function (matrixClient, room, userInput, registrar) { axios({ method: 'POST', - url: `${registrar.config.fediverse}/api/v1/statuses`, - headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + url: `${registrar.config.fediverse.domain}/api/v1/statuses`, + headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, data: { status: `@mordekai ${userInput}`, content_type: `text/markdown`, diff --git a/commands/notify.js b/commands/notify.js index 6007964..f9e7fd5 100644 --- a/commands/notify.js +++ b/commands/notify.js @@ -5,8 +5,8 @@ exports.runQuery = function (matrixClient, room, registrar) { setInterval(() => { axios({ method: 'GET', - url: `${registrar.config.fediverse}/api/v1/notifications`, - headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + url: `${registrar.config.fediverse.domain}/api/v1/notifications`, + headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, }).then((notifications) => { const event = fs.readFileSync('notification.json', 'utf8'); fs.writeFileSync('notification.json', notifications.data[0].created_at, 'utf8'); @@ -15,14 +15,14 @@ exports.runQuery = function (matrixClient, room, registrar) { if (notifications.data[0].type === 'follow') { matrixClient.sendHtmlNotice(room.roomId, '', - ` + ` ${notifications.data[0].account.acct} has followed you.
${notifications.data[0].account.note}`); } else if (notifications.data[0].type === 'favourite') { matrixClient.sendHtmlNotice(room.roomId, '', - ` + ` ${notifications.data[0].account.acct} has favorited your post: @@ -30,7 +30,7 @@ exports.runQuery = function (matrixClient, room, registrar) { } else if (notifications.data[0].type === 'mention') { matrixClient.sendHtmlNotice(room.roomId, '', - ` + ` ${notifications.data[0].account.acct} has mentioned you:
${notifications.data[0].status.content} @@ -39,7 +39,7 @@ exports.runQuery = function (matrixClient, room, registrar) { } else if (notifications.data[0].type === 'reblog') { matrixClient.sendHtmlNotice(room.roomId, '', - ` + ` ${notifications.data[0].account.acct} has repeated your post:
diff --git a/commands/pin.js b/commands/pin.js index 7a1e632..074bb03 100644 --- a/commands/pin.js +++ b/commands/pin.js @@ -3,13 +3,13 @@ const axios = require('axios'); exports.runQuery = function (matrixClient, room, userInput, registrar) { axios({ method: 'POST', - url: `${registrar.config.fediverse}/api/v1/statuses/${userInput}/pin`, - headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + url: `${registrar.config.fediverse.domain}/api/v1/statuses/${userInput}/pin`, + headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', `Pinned: -
+
${response.data.content}
`); }) diff --git a/commands/plemara.js b/commands/plemara.js index 550e7e4..342f81b 100644 --- a/commands/plemara.js +++ b/commands/plemara.js @@ -3,8 +3,8 @@ const axios = require('axios'); exports.runQuery = function (matrixClient, room, userInput, registrar) { axios({ method: 'POST', - url: `${registrar.config.fediverse}/api/v1/statuses`, - headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + url: `${registrar.config.fediverse.domain}/api/v1/statuses`, + headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, data: { status: userInput, content_type: `text/markdown` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, diff --git a/commands/redact.js b/commands/redact.js index 52f6b35..8debe4a 100644 --- a/commands/redact.js +++ b/commands/redact.js @@ -3,8 +3,8 @@ const axios = require('axios'); exports.runQuery = function (matrixClient, room, userInput, registrar) { axios({ method: 'DELETE', - url: `${registrar.config.fediverse}/api/v1/statuses/${userInput}`, - headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + url: `${registrar.config.fediverse.domain}/api/v1/statuses/${userInput}`, + headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', diff --git a/commands/reply.js b/commands/reply.js index 3f40162..76fe5d4 100644 --- a/commands/reply.js +++ b/commands/reply.js @@ -3,8 +3,8 @@ const axios = require('axios'); exports.runQuery = function (matrixClient, room, address, flaggedInput, registrar) { axios({ method: 'POST', - url: `${registrar.config.fediverse}/api/v1/statuses`, - headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + url: `${registrar.config.fediverse.domain}/api/v1/statuses`, + headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, data: { status: flaggedInput, in_reply_to_id: address, content_type: `text/markdown` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, diff --git a/commands/tip.js b/commands/tip.js index 44cb095..478b998 100644 --- a/commands/tip.js +++ b/commands/tip.js @@ -3,8 +3,8 @@ const axios = require('axios'); exports.runQuery = function (matrixClient, room, address, flaggedInput, registrar) { axios({ method: 'POST', - url: `${registrar.config.fediverse}/api/v1/statuses`, - headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + url: `${registrar.config.fediverse.domain}/api/v1/statuses`, + headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, data: { status: `@10grans@fedi.cc tip `+ flaggedInput + ` to `+address }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, diff --git a/commands/unfren.js b/commands/unfren.js index c18a671..1d9d124 100644 --- a/commands/unfren.js +++ b/commands/unfren.js @@ -1,17 +1,17 @@ const axios = require('axios'); exports.runQuery = function (matrixClient, room, userInput, registrar) { - axios.get(`${registrar.config.fediverse}/api/v1/accounts/${userInput}`).then((findUID) => { + axios.get(`${registrar.config.fediverse.domain}/api/v1/accounts/${userInput}`).then((findUID) => { axios({ method: 'POST', - url: `${registrar.config.fediverse}/api/v1/accounts/${findUID.data.id}/unfollow`, - headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + url: `${registrar.config.fediverse.domain}/api/v1/accounts/${findUID.data.id}/unfollow`, + headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, }) .then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', `Unsubscribed: -
${registrar.config.fediverse}/${response.data.id}`); +
${registrar.config.fediverse.domain}/${response.data.id}`); }); }).catch((e) => { matrixClient.sendHtmlNotice(room.roomId, diff --git a/commands/unpin.js b/commands/unpin.js index 2871f2e..3ffe2cf 100644 --- a/commands/unpin.js +++ b/commands/unpin.js @@ -3,13 +3,13 @@ const axios = require('axios'); exports.runQuery = function (matrixClient, room, userInput, registrar) { axios({ method: 'POST', - url: `${registrar.config.fediverse}/api/v1/statuses/${userInput}/unpin`, - headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + url: `${registrar.config.fediverse.domain}/api/v1/statuses/${userInput}/unpin`, + headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', `Unpinned: -
+
${response.data.content}
`); }) diff --git a/config.js b/config.js index af08d07..077cb1b 100644 --- a/config.js +++ b/config.js @@ -1,10 +1,13 @@ module.exports = { - matrixServer: 'https://server.com', - userId: '@matrixUser:server.com', - matrixUser: 'hello', - matrixPass: 'password', - fediverse: 'https://server.com', - fediverseToken: 'access_token', + matrix: { + domain: 'https://your_homeserver.com', + user: 'your_user', + password: 'your_password', + }, + fediverse: { + domain: 'https://your_federation.com', + token: 'your_federation_token', + }, archive: { domain: 'archive.is', userAgent: 'Mozilla/4.0 (compatible; Beep Boop)' @@ -12,11 +15,11 @@ module.exports = { nitter: { domain: 'nitter.net', userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', - domains: [ 'nitter.net', 'www.nitter.net', 'twitter.com', 'www.twitter.com' ] + domains: [ 'nitter.net', 'www.nitter.net', 'twitter.com', 'wwww.twitter.com' ] }, invidious: { domain: 'invidio.us', userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', - domains: [ 'invidio.us', 'www.invidio.us', 'youtube.com', 'www.youtube.com'] + domains: [ 'invidio.us', 'www.invidio.us', 'youtube.com', 'www.youtube.com' ] } }; diff --git a/main.js b/main.js index 35bb0a1..5da9ab7 100644 --- a/main.js +++ b/main.js @@ -4,36 +4,41 @@ const registrar = require('./registrar.js'); const auth = { type: 'm.login.password', - user: registrar.config.matrixUser, - password: registrar.config.matrixPass, + user: registrar.config.matrix.user, + password: registrar.config.matrix.password, }; -axios.post(`${registrar.config.matrixServer}/_matrix/client/r0/login`, auth).then((response) => { - CreateClient(response.data.access_token); +axios.post(`${registrar.config.matrix.domain}/_matrix/client/r0/login`, auth).then((response) => { + CreateClient(response.data.access_token, response.data.user_id); }).catch((e) => { console.log(e); }); -let CreateClient = (token) => { +let CreateClient = (token, user_id) => { const matrixClient = sdk.createClient({ - baseUrl: registrar.config.matrixServer, + baseUrl: registrar.config.matrix.domain, accessToken: token, - userId: registrar.config.userId, + userId: user_id, timelineSupport: true, }); matrixClient.on('RoomMember.membership', (event, member) => { - if (member.membership === 'invite' && member.userId === registrar.config.userId) { + if (member.membership === 'invite' && member.userId === matrixClient.credentials.userId) { matrixClient.joinRoom(member.roomId).done(() => { console.log('Auto-joined %s', member.roomId); }); } + if (member.membership === 'leave' && member.userId === matrixClient.credentials.userId) { + matrixClient.forget(member.roomId).then(() => { + console.log('Kicked %s', member.roomId); + }); + } }); matrixClient.on('Room.timeline', (event, room, toStartOfTimeline) => { if (toStartOfTimeline) return; if (event.getType() !== 'm.room.message') return; - if (event.getSender() === registrar.config.userId) return; + if (event.getSender() === matrixClient.credentials.userId) return; if (event.event.unsigned.age > 10000) return; if (event.event.content.body.charAt(0) === '+') { console.log(`Logs: ${event.event.sender} - ${event.event.content.body}`); From 402594f109ea77b35b3747430de6a6a9eb73f765 Mon Sep 17 00:00:00 2001 From: vulet Date: Sun, 28 Jun 2020 15:27:50 +0800 Subject: [PATCH 12/89] chore(docs): tidy up --- commands/help.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/commands/help.js b/commands/help.js index db86db0..5e59bdf 100644 --- a/commands/help.js +++ b/commands/help.js @@ -1,7 +1,8 @@ exports.runQuery = function (matrixClient, room) { matrixClient.sendHtmlNotice(room.roomId, '', - '
+plemara [your message] : post
' + '
fediverse commands
' + + '+plemara [your message] : post
' + '+redact [post id] : delete post
' + '+fren [user id] : follow
' + '+unfren [user id] : unfollow
' @@ -13,12 +14,12 @@ exports.runQuery = function (matrixClient, room) { + '+boo [post id] : unfavorite
' + '
channel commands
' + '+flood : turn on timeline in channel
' - + '+notify : show notifications in channel
' + + '+notify : show notifications in channel
' + '+archive [URL] : archive content
' + '+rearchive [URL] : re-archive content
' + '+nitter [status URL] : redirect twitter to nitter, also embed tweet
' - + '+invidious [video URL] : redirect youtube to invidious, also embed description
' - + '
--- contributors🐱 ---' - + '--- cryptomooners ---
' - + '
--- docs by lint ---
'); + + '+invidious [video URL] : redirect youtube to invidious, also embed description

' + + '
--- Contributors🐱 ---
' + + 'CRYPTOMOONERS
' + + 'docs by LINT
'); }; From 2d714943e7b188865a51286e5561e825b2cb2da6 Mon Sep 17 00:00:00 2001 From: vulet Date: Fri, 3 Jul 2020 17:10:55 +0800 Subject: [PATCH 13/89] feat(fedi): allow media uploads --- commands/media.js | 61 +++++++++++++++++++++++++++++++++++++++++++++++ config.js | 4 +++- main.js | 4 ++++ package.json | 3 ++- registrar.js | 1 + 5 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 commands/media.js diff --git a/commands/media.js b/commands/media.js new file mode 100644 index 0000000..593678f --- /dev/null +++ b/commands/media.js @@ -0,0 +1,61 @@ +const qs = require('qs'); +const axios = require('axios'); +const FormData = require('form-data'); + +const mediaDownload = async (url, types) => { + const media = await axios({ method: 'GET', url, responseType: 'arraybuffer' }); + if (media.statusText !== 'OK' || !types.includes(media.headers['content-type'])) throw media; + return { + data: media.data, + //filename: //TODO, + mimetype: media.headers['content-type'] + }; +}; + +const mediaUpload = async ({ domain, token }, { data, mimetype }) => { + const form = new FormData(); + form.append('file', data, { + filename: 'upload', + contentType: mimetype, + }); + const upload = await axios({ + method: 'POST', + url: `${domain}/api/v1/media`, + headers: form.getHeaders({ Authorization: `Bearer ${token}` }), + data: form, + }); + if(upload.statusText !== 'OK') throw upload; + return upload.data.id; +}; + +const run = async (matrixClient, { roomId }, mediaURL, content, registrar) => { + const fediverse = registrar.config.fediverse; + const media = await mediaDownload(mediaURL, registrar.config.matrix.mimetypes); + const mediaId = await mediaUpload(fediverse, media); + const response = await axios({ + method: 'POST', + url: `${fediverse.domain}/api/v1/statuses`, + headers: { Authorization: `Bearer ${fediverse.token}`, 'Content-Type': 'application/x-www-form-urlencoded' }, + data : qs.stringify({ + status: content, + content_type: `text/markdown`, + media_ids: [ mediaId ], + }, { arrayFormat: 'brackets' }) + }); + return matrixClient.sendHtmlNotice(roomId, '', `${response.data.id}`); +} + +exports.runQuery = async (client, room, userInput, registrar) => { + try { + let chunks = userInput.trim().split(' '); + if(chunks.length < 2) throw ''; + const url = new URL(chunks[0]); + chunks.shift(); + if(url.protocol !== 'https:') throw ''; + if(!registrar.config.matrix.domains.includes(url.hostname)) throw ''; + if(!/^\/_matrix\/media\/r0\/download\/[^/]+\/[^/]+\/?$/.test(url.pathname)) throw ''; + return await run(client, room, url.toString(), chunks.join(' '), registrar); + } catch(e) { + return client.sendHtmlNotice(room.roomId, 'Sad!', `Sad!`).catch(()=>{}); + } +}; diff --git a/config.js b/config.js index 077cb1b..bc1804d 100644 --- a/config.js +++ b/config.js @@ -3,6 +3,8 @@ module.exports = { domain: 'https://your_homeserver.com', user: 'your_user', password: 'your_password', + domains: [ 'your_homeserver.com' ], + mimetypes: [ 'image/png', 'image/jpeg' ] }, fediverse: { domain: 'https://your_federation.com', @@ -22,4 +24,4 @@ module.exports = { userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', domains: [ 'invidio.us', 'www.invidio.us', 'youtube.com', 'www.youtube.com' ] } -}; +}; \ No newline at end of file diff --git a/main.js b/main.js index 5da9ab7..fbdfaeb 100644 --- a/main.js +++ b/main.js @@ -127,6 +127,10 @@ let CreateClient = (token, user_id) => { if (command === 'invidious') { registrar.invidious.runQuery(matrixClient, room, userInput, registrar); } + + if (command === 'media') { + registrar.media.runQuery(matrixClient, room, userInput, registrar); + } } }); diff --git a/package.json b/package.json index fa6e754..3ccae3c 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,8 @@ "axios": "^0.19.2", "file-system": "^2.2.2", "matrix-js-sdk": "^2.4.6", - "jsdom": "^16.2.2" + "jsdom": "^16.2.2", + "form-data": "^3.0.0" }, "devDependencies": { "eslint": "^5.16.0", diff --git a/registrar.js b/registrar.js index af004af..4c9cf12 100644 --- a/registrar.js +++ b/registrar.js @@ -19,4 +19,5 @@ module.exports = { archive: require('./commands/archive.js'), nitter: require('./commands/nitter.js'), invidious: require('./commands/invidious.js'), + media: require('./commands/media.js') }; From 59afdde7d4800dd045fb002f0e56e0847ac49b69 Mon Sep 17 00:00:00 2001 From: vulet Date: Fri, 3 Jul 2020 22:16:41 +0800 Subject: [PATCH 14/89] feat(archive): add title to response --- commands/archive.js | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/commands/archive.js b/commands/archive.js index e1a4101..ce9b2d4 100644 --- a/commands/archive.js +++ b/commands/archive.js @@ -1,5 +1,6 @@ const qs = require('qs'); const axios = require('axios'); +const { JSDOM } = require('jsdom'); const registrar = require('../registrar.js'); const sleep = ms => new Promise(r => setTimeout(r, ms)); @@ -36,9 +37,10 @@ const archive = async (instance, url, rearchive) => { headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, data: qs.stringify({ anyway: rearchive ? '1' : undefined, submitid: submitId ? submitId[1] : undefined, url }) }); + submit.title = new JSDOM(submit.data).window.document.title; if (submit.statusText !== 'OK') throw submit; if (submit.request.path !== '/submit/') - return { id: submit.request.path, date: submit.headers['memento-datetime'] }; + return { id: submit.request.path, date: submit.headers['memento-datetime'], title: submit.title }; if (submit.headers.refresh) return { refresh: submit.headers.refresh.split(';url=')[1] }; throw submit; @@ -46,7 +48,7 @@ const archive = async (instance, url, rearchive) => { const reqStr = str => `Sending archive request for ${str}`; const arc1Str = str => `Archiving page ${str}`; -const arc2Str = (str, date) => `Archived page ${str} [${date}]`; +const arc2Str = (str, title, date) => `Archived page ${str} [${date}]
${title}`; const arc3Str = str => `Timed out ${str}`; const run = async (matrixClient, { roomId }, userInput, rearchive, registrar) => { @@ -57,12 +59,13 @@ const run = async (matrixClient, { roomId }, userInput, rearchive, registrar) => transformResponse: [], timeout: 10 * 1000 }); + let reply = null; try { reply = await matrixClient.sendHtmlNotice(roomId, '', reqStr(userInput)); - const { refresh, id, date } = await archive(instance, userInput, rearchive); + const { refresh, id, title, date } = await archive(instance, userInput, rearchive); if (id) - return await editNoticeHTML(matrixClient, roomId, reply, arc2Str(`${config.domain}${id}`, date)); + return await editNoticeHTML(matrixClient, roomId, reply, arc2Str(`${config.domain}${id}`, title, date)); if (refresh) { const path = refresh.split(`https://${config.domain}`); if (!path[1]) throw refresh; @@ -70,10 +73,13 @@ const run = async (matrixClient, { roomId }, userInput, rearchive, registrar) => let tries = 30; while (tries--) { await sleep(10000); - const { request: { path: reqPath }, headers: { 'memento-datetime': date } } = await instance({ method: 'HEAD', url: path[1] }) - .catch(e => ({ request: { path: path[1] } })); - if (reqPath !== path[1]) - return await editNoticeHTML(matrixClient, roomId, reply, arc2Str(`${config.domain}${reqPath}`, date)); + const { title, date } = await archive(instance, userInput); + if (rearchive == false && title !== undefined) + return await editNoticeHTML(matrixClient, roomId, reply, arc2Str(`${config.domain}`, title, date)); + const { request: { path: reqPath }, headers: { 'memento-datetime': rearchiveDate } } = await instance({ method: 'HEAD', url: path[1] }) + .catch(e => ({ request: { path: path[1] } })); + if (rearchive == true && reqPath !== path[1]) + return await editNoticeHTML(matrixClient, roomId, reply, arc2Str(`${config.domain}${reqPath}`, title, rearchiveDate)); } return await editNoticeHTML(matrixClient, roomId, reply, arc3Str(refresh)); } @@ -85,6 +91,7 @@ const run = async (matrixClient, { roomId }, userInput, rearchive, registrar) => else matrixClient.sendHtmlNotice(roomId, 'sad', sad).catch(() => {}); } -} +}; + +exports.runQuery = run; -exports.runQuery = run; \ No newline at end of file From 38ca35bdd433e43e958436766a3bf43b6d4b2582 Mon Sep 17 00:00:00 2001 From: vulet Date: Fri, 3 Jul 2020 22:45:15 +0800 Subject: [PATCH 15/89] fix(archive): missing id --- commands/archive.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commands/archive.js b/commands/archive.js index ce9b2d4..e2f3030 100644 --- a/commands/archive.js +++ b/commands/archive.js @@ -75,7 +75,7 @@ const run = async (matrixClient, { roomId }, userInput, rearchive, registrar) => await sleep(10000); const { title, date } = await archive(instance, userInput); if (rearchive == false && title !== undefined) - return await editNoticeHTML(matrixClient, roomId, reply, arc2Str(`${config.domain}`, title, date)); + return await editNoticeHTML(matrixClient, roomId, reply, arc2Str(`${config.domain}${id}`, title, date)); const { request: { path: reqPath }, headers: { 'memento-datetime': rearchiveDate } } = await instance({ method: 'HEAD', url: path[1] }) .catch(e => ({ request: { path: path[1] } })); if (rearchive == true && reqPath !== path[1]) From 6fe3c992e757a83fe16a7e75c2421270521d9f76 Mon Sep 17 00:00:00 2001 From: vulet Date: Sat, 4 Jul 2020 01:05:39 +0800 Subject: [PATCH 16/89] feat(fedi): add status query --- commands/status.js | 19 +++++++++++++++++++ main.js | 5 +++++ registrar.js | 7 ++++--- 3 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 commands/status.js diff --git a/commands/status.js b/commands/status.js new file mode 100644 index 0000000..bf512ad --- /dev/null +++ b/commands/status.js @@ -0,0 +1,19 @@ +const axios = require('axios'); + +exports.runQuery = function (matrixClient, room, userInput, registrar) { + axios({ + method: 'GET', + url: `${registrar.config.fediverse.domain}/api/v1/statuses/${userInput}`, + headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, + }).then((response) => { + matrixClient.sendHtmlNotice(room.roomId, + '', + `
${response.data.account.acct} +
${response.data.content}
+ ${response.data.media_attachments.map(media => + `${media.description}`) + .join('
')} + (id: ${response.data.id}) +
`); + }); +}; diff --git a/main.js b/main.js index fbdfaeb..7fe0c7a 100644 --- a/main.js +++ b/main.js @@ -131,6 +131,11 @@ let CreateClient = (token, user_id) => { if (command === 'media') { registrar.media.runQuery(matrixClient, room, userInput, registrar); } + + if (command === 'status') { + registar.status.runQuery(matrixClient, room, userInput, registrar); + } + } }); diff --git a/registrar.js b/registrar.js index 4c9cf12..5421471 100644 --- a/registrar.js +++ b/registrar.js @@ -6,8 +6,8 @@ module.exports = { copy: require('./commands/copy.js'), flood: require('./commands/flood.js'), fren: require('./commands/fren.js'), - help: require('./commands/help.js'), - pin: require('./commands/pin.js'), + help: require('./commands/help.js'), + pin: require('./commands/pin.js'), plemara: require('./commands/plemara.js'), redact: require('./commands/redact.js'), notify: require('./commands/notify.js'), @@ -19,5 +19,6 @@ module.exports = { archive: require('./commands/archive.js'), nitter: require('./commands/nitter.js'), invidious: require('./commands/invidious.js'), - media: require('./commands/media.js') + media: require('./commands/media.js'), + status: require('./commands/status.js') }; From 748ab6ca0ad8f035fb529d4f01d2c1ce824feee9 Mon Sep 17 00:00:00 2001 From: vulet Date: Sat, 4 Jul 2020 01:13:00 +0800 Subject: [PATCH 17/89] chore(cmd): spelling error --- main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.js b/main.js index 7fe0c7a..45ec64d 100644 --- a/main.js +++ b/main.js @@ -133,7 +133,7 @@ let CreateClient = (token, user_id) => { } if (command === 'status') { - registar.status.runQuery(matrixClient, room, userInput, registrar); + registrar.status.runQuery(matrixClient, room, userInput, registrar); } } From 292cca6f297942b37326d404bc7e284c4dc9a0dd Mon Sep 17 00:00:00 2001 From: vulet Date: Wed, 8 Jul 2020 04:54:05 +0800 Subject: [PATCH 18/89] fix(archive): pass id --- commands/archive.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commands/archive.js b/commands/archive.js index e2f3030..6454244 100644 --- a/commands/archive.js +++ b/commands/archive.js @@ -73,7 +73,7 @@ const run = async (matrixClient, { roomId }, userInput, rearchive, registrar) => let tries = 30; while (tries--) { await sleep(10000); - const { title, date } = await archive(instance, userInput); + const { title, date, id } = await archive(instance, userInput); if (rearchive == false && title !== undefined) return await editNoticeHTML(matrixClient, roomId, reply, arc2Str(`${config.domain}${id}`, title, date)); const { request: { path: reqPath }, headers: { 'memento-datetime': rearchiveDate } } = await instance({ method: 'HEAD', url: path[1] }) From 2e483e474422d2f847e201854d9707a1ae123cda Mon Sep 17 00:00:00 2001 From: vulet Date: Sun, 6 Sep 2020 23:10:41 +0800 Subject: [PATCH 19/89] fix(nitter): unavailable tweet error --- commands/nitter.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/commands/nitter.js b/commands/nitter.js index 8fd17e0..2bbaa07 100644 --- a/commands/nitter.js +++ b/commands/nitter.js @@ -26,7 +26,7 @@ const nitter = async (instance, url) => { path: quote.querySelector('a.quote-link').href, text: quote.querySelector('.quote-text').innerHTML, } : null, - isReply: isReply && replies.length > 0 ? { + isReply: isReply && replies.length > 0 ? replies[replies.length - 1].classList.contains('unavailable') ? 'unavailable' : { path: replies[replies.length - 1].querySelector('a.tweet-link').href, text: replies[replies.length - 1].querySelector('.tweet-content').innerHTML, } : null, @@ -46,7 +46,7 @@ const card = (tweet, base, path) => `❤️ ${tweet.stats.favorites} ` + `
${tweet.text.replace('\n', '
')}
` + (tweet.hasAttachments ? '
This tweet has attached media.
' : '') + -(tweet.isReply ? `
Replied Tweet
${tweet.isReply.text.replace('\n', '
')}
` : '') + +(tweet.isReply ? tweet.isReply === 'unavailable' ? '
Replied Tweet is unavailable
' : `
Replied Tweet
${tweet.isReply.text.replace('\n', '
')}
` : '') + (tweet.quote ? `
Quoted Tweet
${tweet.quote.text.replace('\n', '
')}
` : ''); const run = async (matrixClient, { roomId }, userInput, registrar) => { const config = registrar.config.nitter; From a1dc8200bc5fdef7c07f0c982a2a68042fed5e6b Mon Sep 17 00:00:00 2001 From: vulet Date: Sun, 6 Sep 2020 23:11:23 +0800 Subject: [PATCH 20/89] feat(fediverse): add media reply --- commands/media.js | 14 ++++++++++---- main.js | 6 +++++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/commands/media.js b/commands/media.js index 593678f..cda0c47 100644 --- a/commands/media.js +++ b/commands/media.js @@ -28,7 +28,7 @@ const mediaUpload = async ({ domain, token }, { data, mimetype }) => { return upload.data.id; }; -const run = async (matrixClient, { roomId }, mediaURL, content, registrar) => { +const run = async (matrixClient, { roomId }, mediaURL, content, replyId, registrar) => { const fediverse = registrar.config.fediverse; const media = await mediaDownload(mediaURL, registrar.config.matrix.mimetypes); const mediaId = await mediaUpload(fediverse, media); @@ -40,21 +40,27 @@ const run = async (matrixClient, { roomId }, mediaURL, content, registrar) => { status: content, content_type: `text/markdown`, media_ids: [ mediaId ], + in_reply_to_id: replyId || undefined }, { arrayFormat: 'brackets' }) }); return matrixClient.sendHtmlNotice(roomId, '', `${response.data.id}`); } -exports.runQuery = async (client, room, userInput, registrar) => { +exports.runQuery = async (client, room, userInput, isReply, registrar) => { try { - let chunks = userInput.trim().split(' '); + const chunks = userInput.trim().split(' '); if(chunks.length < 2) throw ''; + let replyId = null; + if(isReply) { + replyId = chunks[0]; + chunks.shift(); + } const url = new URL(chunks[0]); chunks.shift(); if(url.protocol !== 'https:') throw ''; if(!registrar.config.matrix.domains.includes(url.hostname)) throw ''; if(!/^\/_matrix\/media\/r0\/download\/[^/]+\/[^/]+\/?$/.test(url.pathname)) throw ''; - return await run(client, room, url.toString(), chunks.join(' '), registrar); + return await run(client, room, url.toString(), chunks.join(' '), replyId, registrar); } catch(e) { return client.sendHtmlNotice(room.roomId, 'Sad!', `Sad!`).catch(()=>{}); } diff --git a/main.js b/main.js index 45ec64d..cf9cdcf 100644 --- a/main.js +++ b/main.js @@ -129,7 +129,11 @@ let CreateClient = (token, user_id) => { } if (command === 'media') { - registrar.media.runQuery(matrixClient, room, userInput, registrar); + registrar.media.runQuery(matrixClient, room, userInput, false, registrar); + } + + if (command === 'mediareply') { + registrar.media.runQuery(matrixClient, room, userInput, true, registrar); } if (command === 'status') { From beb8a4520c72917f41f1b8935083fd938357658b Mon Sep 17 00:00:00 2001 From: vulet Date: Mon, 2 Nov 2020 22:48:07 +0800 Subject: [PATCH 21/89] feat(cmd): add subjects. refactor(cmd): handling. fix(nitter): quotes. chore(config): update invidious instances. update deps. --- commands/media.js | 35 +- commands/nitter.js | 2 +- config.js | 9 +- main.js | 121 ++--- package.json | 4 +- yarn.lock | 1044 ++++++++++++++++++++++++++++++++++---------- 6 files changed, 884 insertions(+), 331 deletions(-) diff --git a/commands/media.js b/commands/media.js index cda0c47..1160ce9 100644 --- a/commands/media.js +++ b/commands/media.js @@ -28,10 +28,13 @@ const mediaUpload = async ({ domain, token }, { data, mimetype }) => { return upload.data.id; }; -const run = async (matrixClient, { roomId }, mediaURL, content, replyId, registrar) => { +const run = async (matrixClient, { roomId }, content, replyId, mediaURL, subject, registrar) => { + let mediaId = null; const fediverse = registrar.config.fediverse; - const media = await mediaDownload(mediaURL, registrar.config.matrix.mimetypes); - const mediaId = await mediaUpload(fediverse, media); + if(mediaURL) { + const media = await mediaDownload(mediaURL, registrar.config.matrix.mimetypes); + mediaId = await mediaUpload(fediverse, media); + } const response = await axios({ method: 'POST', url: `${fediverse.domain}/api/v1/statuses`, @@ -39,28 +42,34 @@ const run = async (matrixClient, { roomId }, mediaURL, content, replyId, registr data : qs.stringify({ status: content, content_type: `text/markdown`, - media_ids: [ mediaId ], - in_reply_to_id: replyId || undefined + 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, registrar) => { +exports.runQuery = async (client, room, userInput, registrar, { isReply, hasMedia, hasSubject }) => { try { const chunks = userInput.trim().split(' '); - if(chunks.length < 2) throw ''; + if(!chunks.length || chunks.length < !!isReply + !!hasMedia) throw ''; let replyId = null; + let mediaURL = null; + const subject = hasSubject ? registrar.config.matrix.subject : null; if(isReply) { replyId = chunks[0]; chunks.shift(); } - const url = new URL(chunks[0]); - chunks.shift(); - if(url.protocol !== 'https:') throw ''; - if(!registrar.config.matrix.domains.includes(url.hostname)) throw ''; - if(!/^\/_matrix\/media\/r0\/download\/[^/]+\/[^/]+\/?$/.test(url.pathname)) throw ''; - return await run(client, room, url.toString(), chunks.join(' '), replyId, registrar); + if(hasMedia) { + const url = new URL(chunks[0]); + chunks.shift(); + if(url.protocol !== 'https:') throw ''; + if(!registrar.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, registrar); } catch(e) { return client.sendHtmlNotice(room.roomId, 'Sad!', `Sad!`).catch(()=>{}); } diff --git a/commands/nitter.js b/commands/nitter.js index 2bbaa07..2ba95dc 100644 --- a/commands/nitter.js +++ b/commands/nitter.js @@ -24,7 +24,7 @@ const nitter = async (instance, url) => { hasAttachments: !!tweet.querySelector('.tweet-body > .attachments'), quote: quote ? { path: quote.querySelector('a.quote-link').href, - text: quote.querySelector('.quote-text').innerHTML, + text: quote.querySelector('.quote-text') ? quote.querySelector('.quote-text').innerHTML : '', } : null, isReply: isReply && replies.length > 0 ? replies[replies.length - 1].classList.contains('unavailable') ? 'unavailable' : { path: replies[replies.length - 1].querySelector('a.tweet-link').href, diff --git a/config.js b/config.js index bc1804d..b1ef675 100644 --- a/config.js +++ b/config.js @@ -4,7 +4,8 @@ module.exports = { user: 'your_user', password: 'your_password', domains: [ 'your_homeserver.com' ], - mimetypes: [ 'image/png', 'image/jpeg' ] + mimetypes: [ 'image/png', 'image/jpeg', 'video/webm', 'image/jpg', 'video/mp4', 'audio/mp3' ], + subject: '' }, fediverse: { domain: 'https://your_federation.com', @@ -20,8 +21,8 @@ module.exports = { domains: [ 'nitter.net', 'www.nitter.net', 'twitter.com', 'wwww.twitter.com' ] }, invidious: { - domain: 'invidio.us', + domain: 'invidious.fdn.fr', userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', - domains: [ 'invidio.us', 'www.invidio.us', 'youtube.com', 'www.youtube.com' ] + domains: [ 'invidious.snopyta.org', 'invidious.xyz', 'youtube.com', 'www.youtube.com' ] } -}; \ No newline at end of file +}; diff --git a/main.js b/main.js index cf9cdcf..43fccc6 100644 --- a/main.js +++ b/main.js @@ -42,104 +42,41 @@ let CreateClient = (token, user_id) => { if (event.event.unsigned.age > 10000) return; if (event.event.content.body.charAt(0) === '+') { console.log(`Logs: ${event.event.sender} - ${event.event.content.body}`); - const args = event.event.content.body.slice(1).trim().split(/ +/g); - const command = args.shift().toLowerCase(); + let args = event.event.content.body.slice(1).trim().split(/ +/g); + let command = args.shift().toLowerCase(); const userInput = args.join(' '); const flaggedInput = userInput.substr(userInput.indexOf(' ') + 1); const address = args.slice(0, 1).join(' ').replace(/"/g, ''); - if (command === 'boo') { - registrar.boo.runQuery(matrixClient, room, userInput, registrar); - } - - if (command === 'beg') { - registrar.beg.runQuery(matrixClient, room, registrar); - } - - if (command === 'clap') { - registrar.clap.runQuery(matrixClient, room, userInput, registrar); - } - - if (command === 'copy') { - registrar.copy.runQuery(matrixClient, room, userInput, registrar); - } - - if (command === 'flood') { - registrar.flood.runQuery(matrixClient, room, registrar); - } - - if (command === 'fren') { - registrar.fren.runQuery(matrixClient, room, userInput, registrar); - } - - if (command === 'help') { - registrar.help.runQuery(matrixClient, room); - } - - if (command === 'pin') { - registrar.pin.runQuery(matrixClient, room, userInput, registrar); - } - - if (command === 'plemara') { - registrar.plemara.runQuery(matrixClient, room, userInput, registrar); - } - - if (command === 'notify') { - registrar.notify.runQuery(matrixClient, room, registrar); - } - - if (command === 'redact') { - registrar.redact.runQuery(matrixClient, room, userInput, registrar); - } - - if (command === 'reply') { - registrar.reply.runQuery(matrixClient, room, address, flaggedInput, registrar); - } - - if (command === 'tip') { - registrar.tip.runQuery(matrixClient, room, address, flaggedInput, registrar); - } - - if (command === 'unfren') { - registrar.unfren.runQuery(matrixClient, room, userInput, registrar); - } - - if (command === 'unpin') { - registrar.unpin.runQuery(matrixClient, room, userInput, registrar); - } - - if (command === 'mordy') { - registrar.mordy.runQuery(matrixClient, room, userInput, registrar); - } - - if (command === 'archive') { - registrar.archive.runQuery(matrixClient, room, userInput, false, registrar); - } - - if (command === 'rearchive') { - registrar.archive.runQuery(matrixClient, room, userInput, true, registrar); - } - - if (command === 'nitter') { - registrar.nitter.runQuery(matrixClient, room, userInput, registrar); - } - - if (command === 'invidious') { - registrar.invidious.runQuery(matrixClient, room, userInput, registrar); - } - - if (command === 'media') { - registrar.media.runQuery(matrixClient, room, userInput, false, registrar); - } - - if (command === 'mediareply') { - registrar.media.runQuery(matrixClient, room, userInput, true, registrar); - } - - if (command === 'status') { - registrar.status.runQuery(matrixClient, room, userInput, registrar); + args = []; + + switch(command) { + case 'config': + return; + case 'help': case 'beg': case 'flood': case 'notify': + args.push(matrixClient, room, registrar); + break; + case 'tip': + args.push(matrixClient, room, address, flaggedInput, registrar); + break; + case 'archive': case 'rearchive': + args.push(matrixClient, room, userInput, !!~command.indexOf('re'), registrar); + command = 'archive'; + break; + case 'plemara': case 'reply': case 'media': case 'mediareply': + case 'random': case 'randomreply': case 'randommedia': case 'randommediareply': + args.push(matrixClient, room, userInput, registrar, { + isReply: !!~command.indexOf('reply'), + hasMedia: !!~command.indexOf('media'), + hasSubject: !!~command.indexOf('random'), + }); + command = 'media'; + break; + default: + args.push(matrixClient, room, userInput, registrar); } + registrar[command] && registrar[command].runQuery.call(null, args); } }); diff --git a/package.json b/package.json index 3ccae3c..ab8dbc0 100644 --- a/package.json +++ b/package.json @@ -20,9 +20,9 @@ "dependencies": { "axios": "^0.19.2", "file-system": "^2.2.2", - "matrix-js-sdk": "^2.4.6", + "form-data": "^3.0.0", "jsdom": "^16.2.2", - "form-data": "^3.0.0" + "matrix-js-sdk": "^2.4.6" }, "devDependencies": { "eslint": "^5.16.0", diff --git a/yarn.lock b/yarn.lock index 19d268d..4a97fcd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,32 +3,70 @@ "@babel/code-frame@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== dependencies: - "@babel/highlight" "^7.0.0" + "@babel/highlight" "^7.10.4" -"@babel/highlight@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== dependencies: + "@babel/helper-validator-identifier" "^7.10.4" chalk "^2.0.0" - esutils "^2.0.2" js-tokens "^4.0.0" +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + +abab@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + acorn-jsx@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== acorn@^6.0.7: - version "6.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -ajv@^6.5.5, ajv@^6.9.1: - version "6.10.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +ajv@^6.10.2, ajv@^6.12.3, ajv@^6.9.1: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: - fast-deep-equal "^2.0.1" + fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" @@ -36,63 +74,85 @@ ajv@^6.5.5, ajv@^6.9.1: another-json@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/another-json/-/another-json-0.2.0.tgz#b5f4019c973b6dd5c6506a2d93469cb6d32aeedc" + integrity sha1-tfQBnJc7bdXGUGotk0acttMq7tw= ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" -array-includes@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" +array-includes@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" + integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== dependencies: - define-properties "^1.1.2" - es-abstract "^1.7.0" + define-properties "^1.1.3" + es-abstract "^1.17.0" + is-string "^1.0.5" + +array.prototype.flat@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" + integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" asn1@~0.2.3: version "0.2.4" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== dependencies: safer-buffer "~2.1.0" assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== axios@^0.19.2: version "0.19.2" @@ -104,6 +164,7 @@ axios@^0.19.2: babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" @@ -111,16 +172,19 @@ babel-runtime@^6.26.0: balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= base-x@^3.0.2: - version "3.0.6" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.6.tgz#de047ec95f5f7b99ae63d830a2a894c96538b2cd" + version "3.0.8" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" + integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== dependencies: safe-buffer "^5.0.1" bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= dependencies: tweetnacl "^0.14.3" @@ -132,31 +196,50 @@ bluebird@3.5.5: brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + browser-request@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/browser-request/-/browser-request-0.3.3.tgz#9ece5b5aca89a29932242e18bf933def9876cc17" + integrity sha1-ns5bWsqJopkyJC4Yv5M975h2zBc= bs58@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= dependencies: base-x "^3.0.2" +call-bind@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce" + integrity sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.0" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" @@ -165,60 +248,73 @@ chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= dependencies: restore-cursor "^2.0.0" cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= confusing-browser-globals@^1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.7.tgz#5ae852bd541a910e7ffb2dbb864a2d21a36ad29b" + version "1.0.10" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz#30d1e7f3d1b882b25ec4933d1d1adac353d20a59" + integrity sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA== contains-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= content-type@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== core-js@^2.4.0: - version "2.6.9" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" + version "2.6.11" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" + integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== dependencies: nice-try "^1.0.4" path-key "^2.0.1" @@ -226,47 +322,86 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= dependencies: assert-plus "^1.0.0" +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + debug@=3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" -debug@^2.6.8, debug@^2.6.9: +debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" debug@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + version "4.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" + integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== dependencies: - ms "^2.1.1" + ms "2.1.2" + +decimal.js@^10.2.0: + version "10.2.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" + integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -define-properties@^1.1.2, define-properties@^1.1.3: +define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== dependencies: object-keys "^1.0.12" delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= doctrine@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= dependencies: esutils "^2.0.2" isarray "^1.0.0" @@ -274,12 +409,21 @@ doctrine@1.5.0: doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= dependencies: jsbn "~0.1.0" safer-buffer "^2.1.0" @@ -287,27 +431,54 @@ ecc-jsbn@~0.1.1: emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== error-ex@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.12.0, es-abstract@^1.7.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: + version "1.17.7" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" + integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== dependencies: - es-to-primitive "^1.2.0" + es-to-primitive "^1.2.1" function-bind "^1.1.1" has "^1.0.3" - is-callable "^1.1.4" - is-regex "^1.0.4" - object-keys "^1.0.12" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" -es-to-primitive@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" +es-abstract@^1.18.0-next.1: + version "1.18.0-next.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" + integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-negative-zero "^2.0.0" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" is-date-object "^1.0.1" @@ -316,65 +487,88 @@ es-to-primitive@^1.2.0: escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escodegen@^1.14.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" eslint-config-airbnb-base@^13.1.0: version "13.2.0" resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.2.0.tgz#f6ea81459ff4dec2dda200c35f1d8f7419d57943" + integrity sha512-1mg/7eoB4AUeB0X1c/ho4vb2gYkNH8Trr/EgCT/aGmKhhG+F6vF5s8+iRBlWAzFIAphxIdp3YfEKgEl0f9Xg+w== dependencies: confusing-browser-globals "^1.0.5" object.assign "^4.1.0" object.entries "^1.1.0" -eslint-import-resolver-node@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" +eslint-import-resolver-node@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" + integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== dependencies: debug "^2.6.9" - resolve "^1.5.0" + resolve "^1.13.1" -eslint-module-utils@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz#8b93499e9b00eab80ccb6614e69f03678e84e09a" +eslint-module-utils@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" + integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== dependencies: - debug "^2.6.8" + debug "^2.6.9" pkg-dir "^2.0.0" eslint-plugin-import@^2.17.3: - version "2.18.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.0.tgz#7a5ba8d32622fb35eb9c8db195c2090bd18a3678" + version "2.22.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" + integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== dependencies: - array-includes "^3.0.3" + array-includes "^3.1.1" + array.prototype.flat "^1.2.3" contains-path "^0.1.0" debug "^2.6.9" doctrine "1.5.0" - eslint-import-resolver-node "^0.3.2" - eslint-module-utils "^2.4.0" + eslint-import-resolver-node "^0.3.4" + eslint-module-utils "^2.6.0" has "^1.0.3" - lodash "^4.17.11" minimatch "^3.0.4" + object.values "^1.1.1" read-pkg-up "^2.0.0" - resolve "^1.11.0" + resolve "^1.17.0" + tsconfig-paths "^3.9.0" eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" eslint-utils@^1.3.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab" + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== dependencies: - eslint-visitor-keys "^1.0.0" + eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== eslint@^5.16.0: version "5.16.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" + integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.9.1" @@ -416,42 +610,55 @@ eslint@^5.16.0: espree@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" + integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== dependencies: acorn "^6.0.7" acorn-jsx "^5.0.0" eslint-visitor-keys "^1.0.0" -esprima@^4.0.0: +esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== dependencies: - estraverse "^4.0.0" + estraverse "^5.1.0" esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - estraverse "^4.1.0" + estraverse "^5.2.0" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" +estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== external-editor@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== dependencies: chardet "^0.7.0" iconv-lite "^0.4.24" @@ -460,44 +667,53 @@ external-editor@^3.0.3: extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= extsprintf@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.4: +fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= dependencies: escape-string-regexp "^1.0.5" file-entry-cache@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== dependencies: flat-cache "^2.0.1" file-match@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/file-match/-/file-match-1.0.2.tgz#c9cad265d2c8adf3a81475b0df475859069faef7" + integrity sha1-ycrSZdLIrfOoFHWw30dYWQafrvc= dependencies: utils-extend "^1.0.6" file-system@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/file-system/-/file-system-2.2.2.tgz#7d65833e3a2347dcd956a813c677153ed3edd987" + integrity sha1-fWWDPjojR9zZVqgTxncVPtPt2Yc= dependencies: file-match "^1.0.1" utils-extend "^1.0.4" @@ -505,34 +721,49 @@ file-system@^2.2.2: find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: locate-path "^2.0.0" flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== dependencies: flatted "^2.0.0" rimraf "2.6.3" write "1.0.3" flatted@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== follow-redirects@1.5.10: version "1.5.10" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== dependencies: debug "=3.1.0" forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" + integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" combined-stream "^1.0.6" @@ -541,24 +772,38 @@ form-data@~2.3.2: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +get-intrinsic@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.1.tgz#94a9768fcbdd0595a1c9273aacf4c89d075631be" + integrity sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= dependencies: assert-plus "^1.0.0" glob@^7.1.2, glob@^7.1.3: - version "7.1.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -570,61 +815,80 @@ glob@^7.1.2, glob@^7.1.3: globals@^11.7.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== graceful-fs@^4.1.2: - version "4.2.0" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.0.tgz#8d8fdc73977cb04104721cb53666c1ca64cd328b" + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= -har-validator@~5.1.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: - ajv "^6.5.5" + ajv "^6.12.3" har-schema "^2.0.0" has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= -has-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" +has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== -has@^1.0.1, has@^1.0.3: +has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" hosted-git-info@^2.1.4: - version "2.7.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" sshpk "^1.7.0" -iconv-lite@^0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== import-fresh@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" + version "3.2.2" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.2.tgz#fc129c160c5d68235507f4331a6baad186bdbc3e" + integrity sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -632,10 +896,12 @@ import-fresh@^3.0.0: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" @@ -643,10 +909,12 @@ inflight@^1.0.4: inherits@2: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inquirer@^6.2.2: - version "6.4.1" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.4.1.tgz#7bd9e5ab0567cd23b41b0180b68e0cfa82fc3c0b" + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== dependencies: ansi-escapes "^3.2.0" chalk "^2.4.2" @@ -654,7 +922,7 @@ inquirer@^6.2.2: cli-width "^2.0.0" external-editor "^3.0.3" figures "^2.0.0" - lodash "^4.17.11" + lodash "^4.17.12" mute-stream "0.0.7" run-async "^2.2.0" rxjs "^6.4.0" @@ -662,61 +930,96 @@ inquirer@^6.2.2: strip-ansi "^5.1.0" through "^2.3.6" +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -is-callable@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" +is-callable@^1.1.4, is-callable@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" + integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== + +is-core-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.0.0.tgz#58531b70aed1db7c0e8d4eb1a0a2d1ddd64bd12d" + integrity sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw== + dependencies: + has "^1.0.3" is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" +is-negative-zero@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" + integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" +is-potential-custom-element-name@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" + integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= + +is-regex@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" + integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== dependencies: - has "^1.0.1" + has-symbols "^1.0.1" + +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== is-symbol@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== dependencies: - has-symbols "^1.0.0" + has-symbols "^1.0.1" is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= isarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.0: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -724,26 +1027,71 @@ js-yaml@^3.13.0: jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^16.2.2: + version "16.4.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.4.0.tgz#36005bde2d136f73eee1a830c6d45e55408edddb" + integrity sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w== + dependencies: + abab "^2.0.3" + acorn "^7.1.1" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.2.0" + data-urls "^2.0.0" + decimal.js "^10.2.0" + domexception "^2.0.1" + escodegen "^1.14.1" + html-encoding-sniffer "^2.0.1" + is-potential-custom-element-name "^1.0.0" + nwsapi "^2.2.0" + parse5 "5.1.1" + request "^2.88.2" + request-promise-native "^1.0.8" + saxes "^5.0.0" + symbol-tree "^3.2.4" + tough-cookie "^3.0.1" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + ws "^7.2.3" + xml-name-validator "^3.0.0" json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= dependencies: assert-plus "1.0.0" extsprintf "1.3.0" @@ -753,6 +1101,7 @@ jsprim@^1.2.2: levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" @@ -760,6 +1109,7 @@ levn@^0.3.0, levn@~0.3.0: load-json-file@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -769,18 +1119,25 @@ load-json-file@^2.0.0: locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= dependencies: p-locate "^2.0.0" path-exists "^3.0.0" -lodash@^4.17.11: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.19: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== loglevel@^1.6.4: - version "1.6.8" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171" - integrity sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA== + version "1.7.0" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.0.tgz#728166855a740d59d38db01cf46f042caa041bb0" + integrity sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ== matrix-js-sdk@^2.4.6: version "2.4.6" @@ -798,217 +1155,278 @@ matrix-js-sdk@^2.4.6: request "^2.88.0" unhomoglyph "^1.0.2" -mime-db@1.40.0: - version "1.40.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" +mime-db@1.44.0: + version "1.44.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.24" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" + version "2.1.27" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== dependencies: - mime-db "1.40.0" + mime-db "1.44.0" mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: - minimist "0.0.8" + minimist "^1.2.5" ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@^2.1.1: +ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== normalize-package-data@^2.3.2: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" resolve "^1.10.0" semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-keys@^1.0.11, object-keys@^1.0.12: +object-inspect@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" + integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== + +object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" +object.assign@^4.1.0, object.assign@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" object.entries@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519" + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add" + integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA== dependencies: define-properties "^1.1.3" - es-abstract "^1.12.0" + es-abstract "^1.17.5" + has "^1.0.3" + +object.values@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" + integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" function-bind "^1.1.1" has "^1.0.3" once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= dependencies: mimic-fn "^1.0.0" -optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" +optionator@^0.8.1, optionator@^0.8.2: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" - fast-levenshtein "~2.0.4" + fast-levenshtein "~2.0.6" levn "~0.3.0" prelude-ls "~1.1.2" type-check "~0.3.2" - wordwrap "~1.0.0" + word-wrap "~1.2.3" os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== dependencies: p-try "^1.0.0" p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= dependencies: p-limit "^1.1.0" p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= dependencies: error-ex "^1.2.0" +parse5@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== path-type@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= dependencies: pify "^2.0.0" performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= dependencies: find-up "^2.1.0" prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -psl@^1.1.24: - version "1.2.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.2.0.tgz#df12b5b1b3a30f51c329eacbdef98f3a6e136dc6" +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== qs@^6.5.2: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + version "6.9.4" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687" + integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ== qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== read-pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= dependencies: find-up "^2.0.0" read-pkg "^2.0.0" @@ -1016,6 +1434,7 @@ read-pkg-up@^2.0.0: read-pkg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= dependencies: load-json-file "^2.0.0" normalize-package-data "^2.3.2" @@ -1024,14 +1443,33 @@ read-pkg@^2.0.0: regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -request@^2.88.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== + dependencies: + lodash "^4.17.19" + +request-promise-native@^1.0.8: + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== + dependencies: + request-promise-core "1.1.4" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.88.0, request@^2.88.2: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -1040,7 +1478,7 @@ request@^2.88.0: extend "~3.0.2" forever-agent "~0.6.1" form-data "~2.3.2" - har-validator "~5.1.0" + har-validator "~5.1.3" http-signature "~1.2.0" is-typedarray "~1.0.0" isstream "~0.1.2" @@ -1050,23 +1488,27 @@ request@^2.88.0: performance-now "^2.1.0" qs "~6.5.2" safe-buffer "^5.1.2" - tough-cookie "~2.4.3" + tough-cookie "~2.5.0" tunnel-agent "^0.6.0" uuid "^3.3.2" resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@^1.10.0, resolve@^1.11.0, resolve@^1.5.0: - version "1.11.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" +resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0: + version "1.18.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" + integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== dependencies: + is-core-module "^2.0.0" path-parse "^1.0.6" restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= dependencies: onetime "^2.0.0" signal-exit "^3.0.2" @@ -1074,84 +1516,110 @@ restore-cursor@^2.0.0: rimraf@2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: glob "^7.1.3" run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - dependencies: - is-promise "^2.1.0" + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== rxjs@^6.4.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7" + version "6.6.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" + integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== dependencies: tslib "^1.9.0" safe-buffer@^5.0.1, safe-buffer@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +saxes@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" "semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.5.1: - version "5.7.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= dependencies: shebang-regex "^1.0.0" shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== slice-ansi@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== dependencies: ansi-styles "^3.2.0" astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz#75ecd1a88de8c184ef015eafb51b5b48bfd11bb1" + version "3.0.6" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz#c80757383c28abf7296744998cbc106ae8b854ce" + integrity sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw== sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sshpk@^1.7.0: version "1.16.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -1163,9 +1631,15 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + string-width@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" @@ -1173,108 +1647,175 @@ string-width@^2.1.0: string-width@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== dependencies: emoji-regex "^7.0.1" is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string.prototype.trimend@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz#6ddd9a8796bc714b489a3ae22246a208f37bfa46" + integrity sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +string.prototype.trimstart@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz#22d45da81015309cd0cdd79787e8919fc5c613e7" + integrity sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" strip-ansi@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: ansi-regex "^4.1.0" strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= strip-json-comments@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + table@^5.2.3: - version "5.4.1" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.1.tgz#0691ae2ebe8259858efb63e550b6d5f9300171e8" + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== dependencies: - ajv "^6.9.1" - lodash "^4.17.11" + ajv "^6.10.2" + lodash "^4.17.14" slice-ansi "^2.1.0" string-width "^3.0.0" text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" +tough-cookie@^2.3.3, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== dependencies: - psl "^1.1.24" - punycode "^1.4.1" + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" + integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== + dependencies: + ip-regex "^2.1.0" + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" + integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== + dependencies: + punycode "^2.1.1" + +tsconfig-paths@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" + integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" tslib@^1.9.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= dependencies: prelude-ls "~1.1.2" unhomoglyph@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unhomoglyph/-/unhomoglyph-1.0.2.tgz#d69e5f5a6a1c6b211941a0889b81eba86595c253" + version "1.0.6" + resolved "https://registry.yarnpkg.com/unhomoglyph/-/unhomoglyph-1.0.6.tgz#ea41f926d0fcf598e3b8bb2980c2ddac66b081d3" + integrity sha512-7uvcWI3hWshSADBu4JpnyYbTVc7YlhF5GDW/oPD5AxIxl34k4wXR3WDkPnzLxkN32LiTCTKMQLtKVZiwki3zGg== uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + version "4.4.0" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" + integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== dependencies: punycode "^2.1.0" utils-extend@^1.0.4, utils-extend@^1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/utils-extend/-/utils-extend-1.0.8.tgz#ccfd7b64540f8e90ee21eec57769d0651cab8a5f" + integrity sha1-zP17ZFQPjpDuIe7Fd2nQZRyril8= uuid@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" @@ -1282,27 +1823,92 @@ validate-npm-package-license@^3.0.1: verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" extsprintf "^1.2.0" +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^8.0.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.4.0.tgz#50fb9615b05469591d2b2bd6dfaed2942ed72837" + integrity sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^2.0.2" + webidl-conversions "^6.1.0" + which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= write@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== dependencies: mkdirp "^0.5.1" + +ws@^7.2.3: + version "7.3.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" + integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== From 4a4cd304dfc62036ea13d6bb8b91dd28385f67e3 Mon Sep 17 00:00:00 2001 From: vulet Date: Mon, 2 Nov 2020 23:22:27 +0800 Subject: [PATCH 22/89] feat(nitter): add bluechecks to config. chore(config): move to config.example.js --- .gitignore | 6 +++--- commands/nitter.js | 6 ++++-- config.example.js | 29 +++++++++++++++++++++++++++++ config.js | 3 ++- 4 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 config.example.js diff --git a/.gitignore b/.gitignore index 0cc8fb8..5d7a8f7 100644 --- a/.gitignore +++ b/.gitignore @@ -9,11 +9,11 @@ yarn-debug.log* yarn-error.log* # Ignore config -/config.js +config.js # Ignore JSON -/timeline.json -/notification.json +timeline.json +notification.json # Runtime data pids diff --git a/commands/nitter.js b/commands/nitter.js index 2ba95dc..f07b6e7 100644 --- a/commands/nitter.js +++ b/commands/nitter.js @@ -20,6 +20,7 @@ const nitter = async (instance, url) => { text: tweet.querySelector('.tweet-body > .tweet-content').innerHTML, date: tweet.querySelector('.tweet-body > .tweet-published').textContent, name: tweet.querySelector('.tweet-body > div .fullname').textContent, + check: !!tweet.querySelector('.tweet-body > div .fullname .icon-ok'), handle: tweet.querySelector('.tweet-body > div .username').textContent, hasAttachments: !!tweet.querySelector('.tweet-body > .attachments'), quote: quote ? { @@ -38,8 +39,9 @@ const nitter = async (instance, url) => { }; }; -const card = (tweet, base, path) => +const card = (tweet, base, check, path) => `${tweet.name} ` + +(tweet.check ? check : '') + `${tweet.date} ` + `🗨️ ${tweet.stats.replies} ` + `🔁 ${tweet.stats.retweets} ` + @@ -57,7 +59,7 @@ const run = async (matrixClient, { roomId }, userInput, registrar) => { timeout: 10 * 1000 }); const tweet = await nitter(instance, userInput); - return await matrixClient.sendHtmlNotice(roomId, '', card(tweet, `https://${config.domain}`, userInput)); + return await matrixClient.sendHtmlNotice(roomId, '', card(tweet, `https://${config.domain}`, config.check, userInput)); } exports.runQuery = async (client, room, userInput, registrar) => { diff --git a/config.example.js b/config.example.js new file mode 100644 index 0000000..6a4769e --- /dev/null +++ b/config.example.js @@ -0,0 +1,29 @@ +module.exports = { + matrix: { + domain: 'https://your_homeserver.com', + user: 'your_user', + password: 'your_password', + domains: [ 'your_homeserver.com' ], + mimetypes: [ 'image/png', 'image/jpeg', 'video/webm', 'image/jpg', 'video/mp4', 'audio/mp3' ], + subject: '' + }, + fediverse: { + domain: 'https://your_federation.com', + token: 'your_federation_token', + }, + archive: { + domain: 'archive.is', + userAgent: 'Mozilla/4.0 (compatible; Beep Boop)' + }, + nitter: { + domain: 'nitter.net', + userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', + domains: [ 'nitter.net', 'www.nitter.net', 'twitter.com', 'wwww.twitter.com' ], + check: '(✓)' + }, + invidious: { + domain: 'invidious.fdn.fr', + userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', + domains: [ 'invidious.snopyta.org', 'invidious.xyz', 'youtube.com', 'www.youtube.com' ] + } +}; diff --git a/config.js b/config.js index b1ef675..6a4769e 100644 --- a/config.js +++ b/config.js @@ -18,7 +18,8 @@ module.exports = { nitter: { domain: 'nitter.net', userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', - domains: [ 'nitter.net', 'www.nitter.net', 'twitter.com', 'wwww.twitter.com' ] + domains: [ 'nitter.net', 'www.nitter.net', 'twitter.com', 'wwww.twitter.com' ], + check: '(✓)' }, invidious: { domain: 'invidious.fdn.fr', From 2310bd29f24338f017a29d6900ccc6f20aeabe0f Mon Sep 17 00:00:00 2001 From: vulet Date: Mon, 2 Nov 2020 23:23:19 +0800 Subject: [PATCH 23/89] chore(config): remove --- config.js | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 config.js diff --git a/config.js b/config.js deleted file mode 100644 index 6a4769e..0000000 --- a/config.js +++ /dev/null @@ -1,29 +0,0 @@ -module.exports = { - matrix: { - domain: 'https://your_homeserver.com', - user: 'your_user', - password: 'your_password', - domains: [ 'your_homeserver.com' ], - mimetypes: [ 'image/png', 'image/jpeg', 'video/webm', 'image/jpg', 'video/mp4', 'audio/mp3' ], - subject: '' - }, - fediverse: { - domain: 'https://your_federation.com', - token: 'your_federation_token', - }, - archive: { - domain: 'archive.is', - userAgent: 'Mozilla/4.0 (compatible; Beep Boop)' - }, - nitter: { - domain: 'nitter.net', - userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', - domains: [ 'nitter.net', 'www.nitter.net', 'twitter.com', 'wwww.twitter.com' ], - check: '(✓)' - }, - invidious: { - domain: 'invidious.fdn.fr', - userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', - domains: [ 'invidious.snopyta.org', 'invidious.xyz', 'youtube.com', 'www.youtube.com' ] - } -}; From a16da9a4cffb0fa51656b5bfe3666ec683d335bb Mon Sep 17 00:00:00 2001 From: vulet Date: Mon, 2 Nov 2020 23:31:07 +0800 Subject: [PATCH 24/89] fix(cmd): call to apply --- main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.js b/main.js index 43fccc6..60cc50e 100644 --- a/main.js +++ b/main.js @@ -76,7 +76,7 @@ let CreateClient = (token, user_id) => { args.push(matrixClient, room, userInput, registrar); } - registrar[command] && registrar[command].runQuery.call(null, args); + registrar[command] && registrar[command].runQuery.apply(null, args); } }); From 5ed4b932d57cdaddc54e4b422b57cdee4790ab4d Mon Sep 17 00:00:00 2001 From: vulet Date: Mon, 2 Nov 2020 23:32:15 +0800 Subject: [PATCH 25/89] chore(all): bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ab8dbc0..9f73123 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "plemara", - "version": "0.2.1", + "version": "0.3.0", "description": "A Matrix to Fediverse client", "main": "main.js", "scripts": { From f20163767723cf87f2c58127d138bee63062bb20 Mon Sep 17 00:00:00 2001 From: vulet Date: Fri, 6 Nov 2020 19:21:01 +0800 Subject: [PATCH 26/89] refactor(invidious/nitter): combine commands. fix(config): spelling error --- config.example.js | 4 ++-- main.js | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/config.example.js b/config.example.js index 6a4769e..8214794 100644 --- a/config.example.js +++ b/config.example.js @@ -18,8 +18,8 @@ module.exports = { nitter: { domain: 'nitter.net', userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', - domains: [ 'nitter.net', 'www.nitter.net', 'twitter.com', 'wwww.twitter.com' ], - check: '(✓)' + domains: [ 'nitter.net', 'www.nitter.net', 'twitter.com', 'www.twitter.com' ], + check: '(✅)' }, invidious: { domain: 'invidious.fdn.fr', diff --git a/main.js b/main.js index 60cc50e..f88a0ec 100644 --- a/main.js +++ b/main.js @@ -72,6 +72,16 @@ let CreateClient = (token, user_id) => { }); command = 'media'; break; + case 'proxy': + try { + const url = new URL(userInput); + command = registrar.config.invidious.domains.includes(url.hostname) + ? 'invidious' + : registrar.config.nitter.domains.includes(url.hostname) + ? 'nitter' + : 'proxy'; + } catch(e) {} + //fallthrough default: args.push(matrixClient, room, userInput, registrar); } From a94c21fdd1e5e98c17e1bf6583dcd1d35f65ffbe Mon Sep 17 00:00:00 2001 From: vulet Date: Fri, 6 Nov 2020 21:00:38 +0800 Subject: [PATCH 27/89] refactor(fediverse): add filename to media uploads --- commands/media.js | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/commands/media.js b/commands/media.js index 1160ce9..15e45eb 100644 --- a/commands/media.js +++ b/commands/media.js @@ -2,20 +2,30 @@ const qs = require('qs'); const axios = require('axios'); const FormData = require('form-data'); +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, types) => { const media = await axios({ method: 'GET', url, responseType: 'arraybuffer' }); if (media.statusText !== 'OK' || !types.includes(media.headers['content-type'])) throw media; return { data: media.data, - //filename: //TODO, + filename: getFilename(media.headers['content-disposition']), mimetype: media.headers['content-type'] }; }; -const mediaUpload = async ({ domain, token }, { data, mimetype }) => { +const mediaUpload = async ({ domain, token }, { data, filename, mimetype }) => { const form = new FormData(); form.append('file', data, { - filename: 'upload', + filename: filename || 'upload', contentType: mimetype, }); const upload = await axios({ From 80dcff044055cda184d6f32aa68e515e51ecd7c7 Mon Sep 17 00:00:00 2001 From: vulet Date: Sun, 8 Nov 2020 14:44:00 +0800 Subject: [PATCH 28/89] refactor(media): mimetypes --- commands/media.js | 5 +++-- config.example.js | 5 ++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/commands/media.js b/commands/media.js index 15e45eb..ef393da 100644 --- a/commands/media.js +++ b/commands/media.js @@ -12,9 +12,10 @@ const getFilename = header => { } }; -const mediaDownload = async (url, types) => { +const mediaDownload = async (url, { whitelist, blacklist }) => { const media = await axios({ method: 'GET', url, responseType: 'arraybuffer' }); - if (media.statusText !== 'OK' || !types.includes(media.headers['content-type'])) throw media; + 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']), diff --git a/config.example.js b/config.example.js index 8214794..a181608 100644 --- a/config.example.js +++ b/config.example.js @@ -4,7 +4,10 @@ module.exports = { user: 'your_user', password: 'your_password', domains: [ 'your_homeserver.com' ], - mimetypes: [ 'image/png', 'image/jpeg', 'video/webm', 'image/jpg', 'video/mp4', 'audio/mp3' ], + mimetypes: { + whitelist: [], + blacklist: [] + }, subject: '' }, fediverse: { From a7e32b5a3f29d709826205661ac79514892f882b Mon Sep 17 00:00:00 2001 From: vulet <> Date: Sun, 27 Dec 2020 17:27:48 +0800 Subject: [PATCH 29/89] feat(pleroma): add post visibility --- commands/flood.js | 6 +++--- commands/media.js | 3 +++ commands/notify.js | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/commands/flood.js b/commands/flood.js index ee33a4d..1fb16b4 100644 --- a/commands/flood.js +++ b/commands/flood.js @@ -15,11 +15,11 @@ exports.runQuery = function (matrixClient, room, registrar) { matrixClient.sendHtmlNotice(room.roomId, '', `${events.data[0].account.acct} -
${events.data[0].content}
+
${events.data[0].content}
${events.data[0].media_attachments.map(media => ``+`${media.description}`+'' ).join('
')} - (id: ${events.data[0].id}) + (id: ${events.data[0].id}) ${registrar.media.visibilityEmoji(events.data[0].visibility)}
`); } else { matrixClient.sendHtmlNotice(room.roomId, @@ -32,7 +32,7 @@ exports.runQuery = function (matrixClient, room, registrar) { ${events.data[0].media_attachments.map(media => ``+`Proxied image, no description available.`+'' ).join('
')} -
(id: ${events.data[0].id}) +
(id: ${events.data[0].id}) ${registrar.media.visibilityEmoji(events.data[0].visibility)}
`); } } diff --git a/commands/media.js b/commands/media.js index ef393da..87ed425 100644 --- a/commands/media.js +++ b/commands/media.js @@ -2,6 +2,9 @@ const qs = require('qs'); const axios = require('axios'); 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 { diff --git a/commands/notify.js b/commands/notify.js index f9e7fd5..782dfb2 100644 --- a/commands/notify.js +++ b/commands/notify.js @@ -34,7 +34,7 @@ exports.runQuery = function (matrixClient, room, registrar) { ${notifications.data[0].account.acct}
has mentioned you:
`); } else if (notifications.data[0].type === 'reblog') { matrixClient.sendHtmlNotice(room.roomId, From c1e8a44dd0407bce880afb0f15d8c6f1f4e2f158 Mon Sep 17 00:00:00 2001 From: vulet <38090089+vulet@users.noreply.github.com> Date: Fri, 1 Jan 2021 17:30:26 +0800 Subject: [PATCH 30/89] fix(pleroma): unicode --- commands/media.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commands/media.js b/commands/media.js index 87ed425..ee1e7c7 100644 --- a/commands/media.js +++ b/commands/media.js @@ -2,7 +2,7 @@ const qs = require('qs'); const axios = require('axios'); const FormData = require('form-data'); -const emojis = { public: 'ðŸŒ', unlisted: 'ðŸ“', private: '🔒ï¸', direct: '✉ï¸' }; +const emojis = { public: '🌐', unlisted: '📝', private: '🔒️', direct: '✉️' }; exports.visibilityEmoji = v => emojis[v] || v; const getFilename = header => { From cdd442954974ab301e12c6cbc37453bb0ee00020 Mon Sep 17 00:00:00 2001 From: vulet Date: Thu, 14 Jan 2021 18:52:37 +0800 Subject: [PATCH 31/89] feat(fedi): add mxc regex for media --- commands/media.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/commands/media.js b/commands/media.js index ee1e7c7..c458726 100644 --- a/commands/media.js +++ b/commands/media.js @@ -76,8 +76,10 @@ exports.runQuery = async (client, room, userInput, registrar, { isReply, hasMedi chunks.shift(); } if(hasMedia) { - const url = new URL(chunks[0]); + let url = new URL(chunks[0]); chunks.shift(); + if(url.protocol === 'mxc:' && url.hostname && url.pathname) + url = new URL(`${registrar.config.matrix.domain}/_matrix/media/r0/download/${url.hostname}${url.pathname}`); if(url.protocol !== 'https:') throw ''; if(!registrar.config.matrix.domains.includes(url.hostname)) throw ''; if(!/^\/_matrix\/media\/r0\/download\/[^/]+\/[^/]+\/?$/.test(url.pathname)) throw ''; From b287d961f3888f2fd430103f41d72b02f40a689c Mon Sep 17 00:00:00 2001 From: vulet Date: Thu, 14 Jan 2021 18:58:29 +0800 Subject: [PATCH 32/89] refactor(cmd): separate commands by functionality --- commands/{ => fediverse}/beg.js | 0 commands/{ => fediverse}/boo.js | 0 commands/{ => fediverse}/clap.js | 0 commands/{ => fediverse}/copy.js | 0 commands/{ => fediverse}/flood.js | 0 commands/{fren.js => fediverse/follow.js} | 0 commands/{ => fediverse}/media.js | 0 commands/{ => fediverse}/mordy.js | 0 commands/{ => fediverse}/notify.js | 0 commands/{ => fediverse}/pin.js | 0 commands/{plemara.js => fediverse/post.js} | 0 commands/{ => fediverse}/redact.js | 0 commands/{ => fediverse}/reply.js | 0 commands/{ => fediverse}/status.js | 0 commands/{ => fediverse}/tip.js | 0 commands/{unfren.js => fediverse/unfollow.js} | 0 commands/{ => fediverse}/unpin.js | 0 commands/help.js | 8 ++-- registrar.js | 38 +++++++++---------- 19 files changed, 23 insertions(+), 23 deletions(-) rename commands/{ => fediverse}/beg.js (100%) rename commands/{ => fediverse}/boo.js (100%) rename commands/{ => fediverse}/clap.js (100%) rename commands/{ => fediverse}/copy.js (100%) rename commands/{ => fediverse}/flood.js (100%) rename commands/{fren.js => fediverse/follow.js} (100%) rename commands/{ => fediverse}/media.js (100%) rename commands/{ => fediverse}/mordy.js (100%) rename commands/{ => fediverse}/notify.js (100%) rename commands/{ => fediverse}/pin.js (100%) rename commands/{plemara.js => fediverse/post.js} (100%) rename commands/{ => fediverse}/redact.js (100%) rename commands/{ => fediverse}/reply.js (100%) rename commands/{ => fediverse}/status.js (100%) rename commands/{ => fediverse}/tip.js (100%) rename commands/{unfren.js => fediverse/unfollow.js} (100%) rename commands/{ => fediverse}/unpin.js (100%) diff --git a/commands/beg.js b/commands/fediverse/beg.js similarity index 100% rename from commands/beg.js rename to commands/fediverse/beg.js diff --git a/commands/boo.js b/commands/fediverse/boo.js similarity index 100% rename from commands/boo.js rename to commands/fediverse/boo.js diff --git a/commands/clap.js b/commands/fediverse/clap.js similarity index 100% rename from commands/clap.js rename to commands/fediverse/clap.js diff --git a/commands/copy.js b/commands/fediverse/copy.js similarity index 100% rename from commands/copy.js rename to commands/fediverse/copy.js diff --git a/commands/flood.js b/commands/fediverse/flood.js similarity index 100% rename from commands/flood.js rename to commands/fediverse/flood.js diff --git a/commands/fren.js b/commands/fediverse/follow.js similarity index 100% rename from commands/fren.js rename to commands/fediverse/follow.js diff --git a/commands/media.js b/commands/fediverse/media.js similarity index 100% rename from commands/media.js rename to commands/fediverse/media.js diff --git a/commands/mordy.js b/commands/fediverse/mordy.js similarity index 100% rename from commands/mordy.js rename to commands/fediverse/mordy.js diff --git a/commands/notify.js b/commands/fediverse/notify.js similarity index 100% rename from commands/notify.js rename to commands/fediverse/notify.js diff --git a/commands/pin.js b/commands/fediverse/pin.js similarity index 100% rename from commands/pin.js rename to commands/fediverse/pin.js diff --git a/commands/plemara.js b/commands/fediverse/post.js similarity index 100% rename from commands/plemara.js rename to commands/fediverse/post.js diff --git a/commands/redact.js b/commands/fediverse/redact.js similarity index 100% rename from commands/redact.js rename to commands/fediverse/redact.js diff --git a/commands/reply.js b/commands/fediverse/reply.js similarity index 100% rename from commands/reply.js rename to commands/fediverse/reply.js diff --git a/commands/status.js b/commands/fediverse/status.js similarity index 100% rename from commands/status.js rename to commands/fediverse/status.js diff --git a/commands/tip.js b/commands/fediverse/tip.js similarity index 100% rename from commands/tip.js rename to commands/fediverse/tip.js diff --git a/commands/unfren.js b/commands/fediverse/unfollow.js similarity index 100% rename from commands/unfren.js rename to commands/fediverse/unfollow.js diff --git a/commands/unpin.js b/commands/fediverse/unpin.js similarity index 100% rename from commands/unpin.js rename to commands/fediverse/unpin.js diff --git a/commands/help.js b/commands/help.js index 5e59bdf..f07555c 100644 --- a/commands/help.js +++ b/commands/help.js @@ -4,12 +4,12 @@ exports.runQuery = function (matrixClient, room) { '
fediverse commands
' + '+plemara [your message] : post
' + '+redact [post id] : delete post
' - + '+fren [user id] : follow
' - + '+unfren [user id] : unfollow
' + + '+follow [user id] : follow
' + + '+unfollow [user id] : unfollow
' + '+copy [post id] : repeat/repost/retweet
' + '+reply [post id] [content] : reply to post
' - + '+tip [@user@fedi.url] [amount] : tip 10grans' - + '+beg : beg for 10grans' + + '+tip [@user@fedi.url] [amount] : tip 10grans
' + + '+beg : beg for 10grans
' + '+clap [post id] : favorite
' + '+boo [post id] : unfavorite
' + '
channel commands
' diff --git a/registrar.js b/registrar.js index 5421471..c617944 100644 --- a/registrar.js +++ b/registrar.js @@ -1,24 +1,24 @@ module.exports = { config: require('./config.js'), - boo: require('./commands/boo.js'), - beg: require('./commands/beg.js'), - clap: require('./commands/clap.js'), - copy: require('./commands/copy.js'), - flood: require('./commands/flood.js'), - fren: require('./commands/fren.js'), - help: require('./commands/help.js'), - pin: require('./commands/pin.js'), - plemara: require('./commands/plemara.js'), - redact: require('./commands/redact.js'), - notify: require('./commands/notify.js'), - reply: require('./commands/reply.js'), - tip: require('./commands/tip.js'), - unfren: require('./commands/unfren.js'), - unpin: require('./commands/unpin.js'), - mordy: require('./commands/mordy.js'), archive: require('./commands/archive.js'), - nitter: require('./commands/nitter.js'), invidious: require('./commands/invidious.js'), - media: require('./commands/media.js'), - status: require('./commands/status.js') + nitter: require('./commands/nitter.js'), + beg: require('./commands/fediverse/beg.js'), + boo: require('./commands/fediverse/boo.js'), + clap: require('./commands/fediverse/clap.js'), + copy: require('./commands/fediverse/copy.js'), + flood: require('./commands/fediverse/flood.js'), + follow: require('./commands/fediverse/follow.js'), + help: require('./commands/fediverse/help.js'), + media: require('./commands/fediverse/media.js'), + mordy: require('./commands/fediverse/mordy.js'), + notify: require('./commands/fediverse/notify.js'), + pin: require('./commands/fediverse/pin.js'), + post: require('./commands/fediverse/post.js'), + redact: require('./commands/fediverse/redact.js'), + reply: require('./commands/fediverse/reply.js'), + status: require('./commands/fediverse/status.js'), + tip: require('./commands/fediverse/tip.js'), + unfollow: require('./commands/fediverse/unfollow.js'), + unpin: require('./commands/fediverse/unpin.js') }; From 78c45451c67a690be0437814b34e70b9e2829db1 Mon Sep 17 00:00:00 2001 From: vulet Date: Thu, 14 Jan 2021 19:00:29 +0800 Subject: [PATCH 33/89] refactor(config): move mimetype --- commands/fediverse/media.js | 2 +- config.example.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/commands/fediverse/media.js b/commands/fediverse/media.js index c458726..a789a49 100644 --- a/commands/fediverse/media.js +++ b/commands/fediverse/media.js @@ -46,7 +46,7 @@ const run = async (matrixClient, { roomId }, content, replyId, mediaURL, subject let mediaId = null; const fediverse = registrar.config.fediverse; if(mediaURL) { - const media = await mediaDownload(mediaURL, registrar.config.matrix.mimetypes); + const media = await mediaDownload(mediaURL, registrar.config.fediverse.mimetypes); mediaId = await mediaUpload(fediverse, media); } const response = await axios({ diff --git a/config.example.js b/config.example.js index a181608..5efd344 100644 --- a/config.example.js +++ b/config.example.js @@ -4,15 +4,15 @@ module.exports = { user: 'your_user', password: 'your_password', domains: [ 'your_homeserver.com' ], - mimetypes: { - whitelist: [], - blacklist: [] - }, subject: '' }, fediverse: { domain: 'https://your_federation.com', token: 'your_federation_token', + mimetypes: { + whitelist: [], + blacklist: [] + }, }, archive: { domain: 'archive.is', From 65809d235b42e2ad510505fad9705dc17e34823b Mon Sep 17 00:00:00 2001 From: vulet Date: Thu, 14 Jan 2021 19:03:54 +0800 Subject: [PATCH 34/89] bug(cmd): fix pathing --- registrar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/registrar.js b/registrar.js index c617944..669b47d 100644 --- a/registrar.js +++ b/registrar.js @@ -9,7 +9,7 @@ module.exports = { copy: require('./commands/fediverse/copy.js'), flood: require('./commands/fediverse/flood.js'), follow: require('./commands/fediverse/follow.js'), - help: require('./commands/fediverse/help.js'), + help: require('./commands/help.js'), media: require('./commands/fediverse/media.js'), mordy: require('./commands/fediverse/mordy.js'), notify: require('./commands/fediverse/notify.js'), From 57fe623ebe1bcdb7a52e7330570c045a57a667e1 Mon Sep 17 00:00:00 2001 From: vulet Date: Thu, 14 Jan 2021 20:00:03 +0800 Subject: [PATCH 35/89] refactor(config): move subject --- commands/fediverse/media.js | 2 +- config.example.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/commands/fediverse/media.js b/commands/fediverse/media.js index a789a49..ca5c8fa 100644 --- a/commands/fediverse/media.js +++ b/commands/fediverse/media.js @@ -70,7 +70,7 @@ exports.runQuery = async (client, room, userInput, registrar, { isReply, hasMedi if(!chunks.length || chunks.length < !!isReply + !!hasMedia) throw ''; let replyId = null; let mediaURL = null; - const subject = hasSubject ? registrar.config.matrix.subject : null; + const subject = hasSubject ? registrar.config.fediverse.subject : null; if(isReply) { replyId = chunks[0]; chunks.shift(); diff --git a/config.example.js b/config.example.js index 5efd344..9244035 100644 --- a/config.example.js +++ b/config.example.js @@ -3,16 +3,16 @@ module.exports = { domain: 'https://your_homeserver.com', user: 'your_user', password: 'your_password', - domains: [ 'your_homeserver.com' ], - subject: '' + domains: [ 'your_homeserver.com' ] }, fediverse: { domain: 'https://your_federation.com', token: 'your_federation_token', + subject: '', mimetypes: { whitelist: [], blacklist: [] - }, + } }, archive: { domain: 'archive.is', From 01e43916f2f23b666347f8e4e1799892f4f0b4c4 Mon Sep 17 00:00:00 2001 From: vulet Date: Thu, 14 Jan 2021 20:04:47 +0800 Subject: [PATCH 36/89] refactor(config): user formatting --- config.example.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.example.js b/config.example.js index 9244035..1de5fad 100644 --- a/config.example.js +++ b/config.example.js @@ -1,7 +1,7 @@ module.exports = { matrix: { domain: 'https://your_homeserver.com', - user: 'your_user', + user: '@your_user:your_homeserver.com', password: 'your_password', domains: [ 'your_homeserver.com' ] }, From 9e17440abcfb5860b5d492d595e695d684df40a1 Mon Sep 17 00:00:00 2001 From: vulet Date: Fri, 15 Jan 2021 01:10:53 +0800 Subject: [PATCH 37/89] feat(proxy): add more handling --- commands/invidious.js | 4 +++- config.example.js | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/commands/invidious.js b/commands/invidious.js index f47d618..8e53b50 100644 --- a/commands/invidious.js +++ b/commands/invidious.js @@ -47,8 +47,10 @@ exports.runQuery = async (client, room, userInput, registrar) => { try { const url = new URL(userInput); if(!registrar.config.invidious.domains.includes(url.hostname)) throw ''; + if(/^\/[\w-]{11}$/.test(url.pathname)) + return await run(client, room, url.pathname.slice(1), registrar); const params = new URLSearchParams(url.search).get("v"); - if(!/([a-z0-9_-]{11})?$/.test(params)) throw ''; + if(!/^[\w-]{11}$/.test(params)) throw ''; return await run(client, room, params, registrar); } catch(e) { return client.sendHtmlNotice(room.roomId, 'Sad!', `Sad!`).catch(()=>{}); diff --git a/config.example.js b/config.example.js index 1de5fad..a660d62 100644 --- a/config.example.js +++ b/config.example.js @@ -27,6 +27,6 @@ module.exports = { invidious: { domain: 'invidious.fdn.fr', userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', - domains: [ 'invidious.snopyta.org', 'invidious.xyz', 'youtube.com', 'www.youtube.com' ] + domains: [ 'invidious.snopyta.org', 'invidious.xyz', 'youtube.com', 'www.youtube.com', 'youtu.be' ] } }; From f69b52261a551f3b20e03a0c78cfbaea92d0f049 Mon Sep 17 00:00:00 2001 From: vulet Date: Sun, 17 Jan 2021 17:58:02 +0800 Subject: [PATCH 38/89] refactor(all): prefer token-based authentication --- auth.js | 52 +++++++++++ commands/fediverse/beg.js | 4 +- commands/fediverse/boo.js | 2 +- commands/fediverse/clap.js | 2 +- commands/fediverse/copy.js | 2 +- commands/fediverse/flood.js | 2 +- commands/fediverse/follow.js | 2 +- commands/fediverse/media.js | 8 +- commands/fediverse/mordy.js | 6 +- commands/fediverse/notify.js | 2 +- commands/fediverse/pin.js | 2 +- commands/fediverse/post.js | 2 +- commands/fediverse/redact.js | 2 +- commands/fediverse/reply.js | 2 +- commands/fediverse/status.js | 2 +- commands/fediverse/tip.js | 4 +- commands/fediverse/unfollow.js | 2 +- commands/fediverse/unpin.js | 2 +- config.example.js | 4 +- fediverse_auth.json | 9 ++ main.js | 152 ++++++++++++++------------------- matrix_auth.json | 6 ++ package.json | 10 +-- registrar.js | 2 + 24 files changed, 166 insertions(+), 117 deletions(-) create mode 100644 auth.js create mode 100644 fediverse_auth.json create mode 100644 matrix_auth.json diff --git a/auth.js b/auth.js new file mode 100644 index 0000000..ddcd12f --- /dev/null +++ b/auth.js @@ -0,0 +1,52 @@ +const sdk = require('matrix-js-sdk'); +const axios = require('axios'); +const fs = require('fs'); +const registrar = require('./registrar.js'); + +module.exports.getMatrixToken = async () => { + matrixClient = sdk.createClient(registrar.config.matrix.domain); + matrixClient.loginWithPassword(registrar.config.matrix.user, registrar.config.matrix.password) + .then((response) => { + fs.writeFileSync('matrix_auth.json', JSON.stringify(response, null, 2)); + matrixClient.startClient(); + }); +}; + +module.exports.matrixTokenLogin = async () => { + matrixClient = sdk.createClient({ + baseUrl: registrar.config.matrix.domain, + accessToken: registrar.matrix_auth.access_token, + userId: registrar.matrix_auth.user_id, + timelineSupport: true, + }); + matrixClient.startClient(); +}; + +module.exports.registerFediverseApp = async () => { + axios.post(`${registrar.config.fediverse.domain}/api/v1/apps`, + { + client_name: registrar.config.fediverse.client_name, + redirect_uris: 'urn:ietf:wg:oauth:2.0:oob', + scopes: 'read write follow push', + }) + .then((response) => { + axios.post(`${registrar.config.fediverse.domain}/oauth/token`, + { + username: registrar.config.fediverse.username, + password: registrar.config.fediverse.password, + client_id: response.data.client_id, + client_secret: response.data.client_secret, + scope: 'read write follow push', + grant_type: 'password', + redirect_uri: 'urn:ietf:wg:oauth:2.0:oob', + }) + .then((tokens) => { + fs.writeFileSync('fediverse_auth.json', JSON.stringify(tokens.data, null, 2)); + }) + .catch((e) => { + console.log(e); + }); + }).catch((e) => { + console.log(e); + }); +}; diff --git a/commands/fediverse/beg.js b/commands/fediverse/beg.js index 4b3d37c..3affea7 100644 --- a/commands/fediverse/beg.js +++ b/commands/fediverse/beg.js @@ -4,7 +4,7 @@ exports.runQuery = function (matrixClient, room, registrar) { axios({ method: 'POST', url: `${registrar.config.fediverse.domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, + headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, data: { status: `@10grans@fedi.cc beg` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, @@ -18,4 +18,4 @@ exports.runQuery = function (matrixClient, room, registrar) { matrixClient.sendHtmlNotice(room.roomId, '', `${e}`); }); -}; \ No newline at end of file +}; diff --git a/commands/fediverse/boo.js b/commands/fediverse/boo.js index 16c7c77..24c6510 100644 --- a/commands/fediverse/boo.js +++ b/commands/fediverse/boo.js @@ -4,7 +4,7 @@ exports.runQuery = function (matrixClient, room, userInput, registrar) { axios({ method: 'POST', url: `${registrar.config.fediverse.domain}/api/v1/statuses/${userInput}/unfavourite`, - headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, + headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', diff --git a/commands/fediverse/clap.js b/commands/fediverse/clap.js index 8870d8a..3d63f4d 100644 --- a/commands/fediverse/clap.js +++ b/commands/fediverse/clap.js @@ -4,7 +4,7 @@ exports.runQuery = function (matrixClient, room, userInput, registrar) { axios({ method: 'POST', url: `${registrar.config.fediverse.domain}/api/v1/statuses/${userInput}/favourite`, - headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, + headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', diff --git a/commands/fediverse/copy.js b/commands/fediverse/copy.js index 6aa6782..dd5ce41 100644 --- a/commands/fediverse/copy.js +++ b/commands/fediverse/copy.js @@ -4,7 +4,7 @@ exports.runQuery = function (matrixClient, room, userInput, registrar) { axios({ method: 'POST', url: `${registrar.config.fediverse.domain}/api/v1/statuses/${userInput}/reblog`, - headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, + headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', diff --git a/commands/fediverse/flood.js b/commands/fediverse/flood.js index 1fb16b4..a52e23a 100644 --- a/commands/fediverse/flood.js +++ b/commands/fediverse/flood.js @@ -6,7 +6,7 @@ exports.runQuery = function (matrixClient, room, registrar) { axios({ method: 'GET', url: `${registrar.config.fediverse.domain}/api/v1/timelines/home`, - headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, + headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, }).then((events) => { const event = fs.readFileSync('timeline.json', 'utf8'); fs.writeFileSync('timeline.json', events.data[0].created_at, 'utf8'); diff --git a/commands/fediverse/follow.js b/commands/fediverse/follow.js index 1a1e57e..cec6f80 100644 --- a/commands/fediverse/follow.js +++ b/commands/fediverse/follow.js @@ -5,7 +5,7 @@ exports.runQuery = function (matrixClient, room, userInput, registrar) { axios({ method: 'POST', url: `${registrar.config.fediverse.domain}/api/v1/accounts/${findUID.data.id}/follow`, - headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, + headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, }) .then((response) => { matrixClient.sendHtmlNotice(room.roomId, diff --git a/commands/fediverse/media.js b/commands/fediverse/media.js index ca5c8fa..35c162b 100644 --- a/commands/fediverse/media.js +++ b/commands/fediverse/media.js @@ -26,7 +26,7 @@ const mediaDownload = async (url, { whitelist, blacklist }) => { }; }; -const mediaUpload = async ({ domain, token }, { data, filename, mimetype }) => { +const mediaUpload = async ({ domain }, { data, filename, mimetype }, registrar) => { const form = new FormData(); form.append('file', data, { filename: filename || 'upload', @@ -35,7 +35,7 @@ const mediaUpload = async ({ domain, token }, { data, filename, mimetype }) => { const upload = await axios({ method: 'POST', url: `${domain}/api/v1/media`, - headers: form.getHeaders({ Authorization: `Bearer ${token}` }), + headers: form.getHeaders({ Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }), data: form, }); if(upload.statusText !== 'OK') throw upload; @@ -47,12 +47,12 @@ const run = async (matrixClient, { roomId }, content, replyId, mediaURL, subject const fediverse = registrar.config.fediverse; if(mediaURL) { const media = await mediaDownload(mediaURL, registrar.config.fediverse.mimetypes); - mediaId = await mediaUpload(fediverse, media); + mediaId = await mediaUpload(fediverse, media, registrar); } const response = await axios({ method: 'POST', url: `${fediverse.domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${fediverse.token}`, 'Content-Type': 'application/x-www-form-urlencoded' }, + headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}`, 'Content-Type': 'application/x-www-form-urlencoded' }, data : qs.stringify({ status: content, content_type: `text/markdown`, diff --git a/commands/fediverse/mordy.js b/commands/fediverse/mordy.js index 727b06d..80e6afb 100644 --- a/commands/fediverse/mordy.js +++ b/commands/fediverse/mordy.js @@ -4,9 +4,9 @@ exports.runQuery = function (matrixClient, room, userInput, registrar) { axios({ method: 'POST', url: `${registrar.config.fediverse.domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, - data: { - status: `@mordekai ${userInput}`, + headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, + data: { + status: `@mordekai ${userInput}`, content_type: `text/markdown`, visibility: 'unlisted', expires_in: '7200' diff --git a/commands/fediverse/notify.js b/commands/fediverse/notify.js index 782dfb2..fdc1246 100644 --- a/commands/fediverse/notify.js +++ b/commands/fediverse/notify.js @@ -6,7 +6,7 @@ exports.runQuery = function (matrixClient, room, registrar) { axios({ method: 'GET', url: `${registrar.config.fediverse.domain}/api/v1/notifications`, - headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, + headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, }).then((notifications) => { const event = fs.readFileSync('notification.json', 'utf8'); fs.writeFileSync('notification.json', notifications.data[0].created_at, 'utf8'); diff --git a/commands/fediverse/pin.js b/commands/fediverse/pin.js index 074bb03..958cfa6 100644 --- a/commands/fediverse/pin.js +++ b/commands/fediverse/pin.js @@ -4,7 +4,7 @@ exports.runQuery = function (matrixClient, room, userInput, registrar) { axios({ method: 'POST', url: `${registrar.config.fediverse.domain}/api/v1/statuses/${userInput}/pin`, - headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, + headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', diff --git a/commands/fediverse/post.js b/commands/fediverse/post.js index 342f81b..41177b1 100644 --- a/commands/fediverse/post.js +++ b/commands/fediverse/post.js @@ -4,7 +4,7 @@ exports.runQuery = function (matrixClient, room, userInput, registrar) { axios({ method: 'POST', url: `${registrar.config.fediverse.domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, + headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, data: { status: userInput, content_type: `text/markdown` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, diff --git a/commands/fediverse/redact.js b/commands/fediverse/redact.js index 8debe4a..619a266 100644 --- a/commands/fediverse/redact.js +++ b/commands/fediverse/redact.js @@ -4,7 +4,7 @@ exports.runQuery = function (matrixClient, room, userInput, registrar) { axios({ method: 'DELETE', url: `${registrar.config.fediverse.domain}/api/v1/statuses/${userInput}`, - headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, + headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', diff --git a/commands/fediverse/reply.js b/commands/fediverse/reply.js index 76fe5d4..a9b0968 100644 --- a/commands/fediverse/reply.js +++ b/commands/fediverse/reply.js @@ -4,7 +4,7 @@ exports.runQuery = function (matrixClient, room, address, flaggedInput, registra axios({ method: 'POST', url: `${registrar.config.fediverse.domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, + headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, data: { status: flaggedInput, in_reply_to_id: address, content_type: `text/markdown` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, diff --git a/commands/fediverse/status.js b/commands/fediverse/status.js index bf512ad..60dd991 100644 --- a/commands/fediverse/status.js +++ b/commands/fediverse/status.js @@ -4,7 +4,7 @@ exports.runQuery = function (matrixClient, room, userInput, registrar) { axios({ method: 'GET', url: `${registrar.config.fediverse.domain}/api/v1/statuses/${userInput}`, - headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, + headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', diff --git a/commands/fediverse/tip.js b/commands/fediverse/tip.js index 478b998..32bc46b 100644 --- a/commands/fediverse/tip.js +++ b/commands/fediverse/tip.js @@ -4,7 +4,7 @@ exports.runQuery = function (matrixClient, room, address, flaggedInput, registra axios({ method: 'POST', url: `${registrar.config.fediverse.domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, + headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, data: { status: `@10grans@fedi.cc tip `+ flaggedInput + ` to `+address }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, @@ -18,4 +18,4 @@ exports.runQuery = function (matrixClient, room, address, flaggedInput, registra matrixClient.sendHtmlNotice(room.roomId, '', `${e}`); }); -}; \ No newline at end of file +}; diff --git a/commands/fediverse/unfollow.js b/commands/fediverse/unfollow.js index 1d9d124..7cff9d5 100644 --- a/commands/fediverse/unfollow.js +++ b/commands/fediverse/unfollow.js @@ -5,7 +5,7 @@ exports.runQuery = function (matrixClient, room, userInput, registrar) { axios({ method: 'POST', url: `${registrar.config.fediverse.domain}/api/v1/accounts/${findUID.data.id}/unfollow`, - headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, + headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, }) .then((response) => { matrixClient.sendHtmlNotice(room.roomId, diff --git a/commands/fediverse/unpin.js b/commands/fediverse/unpin.js index 3ffe2cf..eb4730c 100644 --- a/commands/fediverse/unpin.js +++ b/commands/fediverse/unpin.js @@ -4,7 +4,7 @@ exports.runQuery = function (matrixClient, room, userInput, registrar) { axios({ method: 'POST', url: `${registrar.config.fediverse.domain}/api/v1/statuses/${userInput}/unpin`, - headers: { Authorization: `Bearer ${registrar.config.fediverse.token}` }, + headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', diff --git a/config.example.js b/config.example.js index a660d62..9710ed1 100644 --- a/config.example.js +++ b/config.example.js @@ -7,7 +7,9 @@ module.exports = { }, fediverse: { domain: 'https://your_federation.com', - token: 'your_federation_token', + username: '', + password: '', + client_name: '', subject: '', mimetypes: { whitelist: [], diff --git a/fediverse_auth.json b/fediverse_auth.json new file mode 100644 index 0000000..d6c5e87 --- /dev/null +++ b/fediverse_auth.json @@ -0,0 +1,9 @@ +{ + "access_token": "", + "created_at": 0, + "expires_in": 0, + "me": "", + "refresh_token": "", + "scope": "", + "token_type": "" +} diff --git a/main.js b/main.js index f88a0ec..ee1aec1 100644 --- a/main.js +++ b/main.js @@ -1,95 +1,73 @@ -const sdk = require('matrix-js-sdk'); -const axios = require('axios'); const registrar = require('./registrar.js'); +const auth = require('./auth.js'); -const auth = { - type: 'm.login.password', - user: registrar.config.matrix.user, - password: registrar.config.matrix.password, -}; +registrar.matrix_auth.access_token ? auth.matrixTokenLogin() : auth.getMatrixToken(); +if (!registrar.fediverse_auth.access_token && registrar.config.fediverse.username) auth.registerFediverseApp(); -axios.post(`${registrar.config.matrix.domain}/_matrix/client/r0/login`, auth).then((response) => { - CreateClient(response.data.access_token, response.data.user_id); -}).catch((e) => { - console.log(e); +matrixClient.on('RoomMember.membership', (event, member) => { + if (member.membership === 'invite' && member.userId === matrixClient.credentials.userId) { + matrixClient.joinRoom(member.roomId).done(() => { + console.log('Auto-joined %s', member.roomId); + }); + } + if (member.membership === 'leave' && member.userId === matrixClient.credentials.userId) { + matrixClient.forget(member.roomId).then(() => { + console.log('Kicked %s', member.roomId); + }); + } }); -let CreateClient = (token, user_id) => { - const matrixClient = sdk.createClient({ - baseUrl: registrar.config.matrix.domain, - accessToken: token, - userId: user_id, - timelineSupport: true, - }); +matrixClient.on('Room.timeline', (event, room, toStartOfTimeline) => { + if (toStartOfTimeline) return; + if (event.getType() !== 'm.room.message') return; + if (event.getSender() === matrixClient.credentials.userId) return; + if (event.event.unsigned.age > 10000) return; + if (event.event.content.body.charAt(0) === '+') { + console.log(`Logs: ${event.event.sender} - ${event.event.content.body}`); + let args = event.event.content.body.slice(1).trim().split(/ +/g); + let command = args.shift().toLowerCase(); + const userInput = args.join(' '); + const flaggedInput = userInput.substr(userInput.indexOf(' ') + 1); + const address = args.slice(0, 1).join(' ').replace(/"/g, ''); - matrixClient.on('RoomMember.membership', (event, member) => { - if (member.membership === 'invite' && member.userId === matrixClient.credentials.userId) { - matrixClient.joinRoom(member.roomId).done(() => { - console.log('Auto-joined %s', member.roomId); - }); + args = []; + + switch(command) { + case 'config': + return; + case 'help': case 'beg': case 'flood': case 'notify': + args.push(matrixClient, room, registrar); + break; + case 'tip': + args.push(matrixClient, room, address, flaggedInput, registrar); + break; + case 'archive': case 'rearchive': + args.push(matrixClient, room, userInput, !!~command.indexOf('re'), registrar); + command = 'archive'; + break; + case 'post': case 'reply': case 'media': case 'mediareply': + case 'random': case 'randomreply': case 'randommedia': case 'randommediareply': + args.push(matrixClient, room, userInput, registrar, { + isReply: !!~command.indexOf('reply'), + hasMedia: !!~command.indexOf('media'), + hasSubject: !!~command.indexOf('random'), + }); + command = 'media'; + break; + case 'proxy': + try { + const url = new URL(userInput); + command = registrar.config.invidious.domains.includes(url.hostname) + ? 'invidious' + : registrar.config.nitter.domains.includes(url.hostname) + ? 'nitter' + : 'proxy'; + } catch(e) {} + //fallthrough + default: + args.push(matrixClient, room, userInput, registrar); } - if (member.membership === 'leave' && member.userId === matrixClient.credentials.userId) { - matrixClient.forget(member.roomId).then(() => { - console.log('Kicked %s', member.roomId); - }); - } - }); - matrixClient.on('Room.timeline', (event, room, toStartOfTimeline) => { - if (toStartOfTimeline) return; - if (event.getType() !== 'm.room.message') return; - if (event.getSender() === matrixClient.credentials.userId) return; - if (event.event.unsigned.age > 10000) return; - if (event.event.content.body.charAt(0) === '+') { - console.log(`Logs: ${event.event.sender} - ${event.event.content.body}`); - let args = event.event.content.body.slice(1).trim().split(/ +/g); - let command = args.shift().toLowerCase(); - const userInput = args.join(' '); - const flaggedInput = userInput.substr(userInput.indexOf(' ') + 1); - const address = args.slice(0, 1).join(' ').replace(/"/g, ''); - - args = []; - - switch(command) { - case 'config': - return; - case 'help': case 'beg': case 'flood': case 'notify': - args.push(matrixClient, room, registrar); - break; - case 'tip': - args.push(matrixClient, room, address, flaggedInput, registrar); - break; - case 'archive': case 'rearchive': - args.push(matrixClient, room, userInput, !!~command.indexOf('re'), registrar); - command = 'archive'; - break; - case 'plemara': case 'reply': case 'media': case 'mediareply': - case 'random': case 'randomreply': case 'randommedia': case 'randommediareply': - args.push(matrixClient, room, userInput, registrar, { - isReply: !!~command.indexOf('reply'), - hasMedia: !!~command.indexOf('media'), - hasSubject: !!~command.indexOf('random'), - }); - command = 'media'; - break; - case 'proxy': - try { - const url = new URL(userInput); - command = registrar.config.invidious.domains.includes(url.hostname) - ? 'invidious' - : registrar.config.nitter.domains.includes(url.hostname) - ? 'nitter' - : 'proxy'; - } catch(e) {} - //fallthrough - default: - args.push(matrixClient, room, userInput, registrar); - } - - registrar[command] && registrar[command].runQuery.apply(null, args); - } - }); - - matrixClient.startClient(); - module.exports = matrixClient; -}; + registrar[command] && registrar[command].runQuery.apply(null, args); + } +}); diff --git a/matrix_auth.json b/matrix_auth.json new file mode 100644 index 0000000..2400a69 --- /dev/null +++ b/matrix_auth.json @@ -0,0 +1,6 @@ +{ + "user_id": "", + "access_token": "", + "home_server": "", + "device_id": "" +} diff --git a/package.json b/package.json index 9f73123..364f25c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "plemara", - "version": "0.3.0", + "name": "ligh7hau5", + "version": "0.4.0", "description": "A Matrix to Fediverse client", "main": "main.js", "scripts": { @@ -9,14 +9,14 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/vulet/plemara.git" + "url": "git+https://github.com/vulet/ligh7hau5.git" }, "author": "vul", "license": "AGPL-3.0-only", "bugs": { - "url": "https://github.com/vulet/plemara/issues" + "url": "https://github.com/vulet/lighthau5/issues" }, - "homepage": "https://github.com/vulet/plemara#readme", + "homepage": "https://github.com/vulet/lighthau5#readme", "dependencies": { "axios": "^0.19.2", "file-system": "^2.2.2", diff --git a/registrar.js b/registrar.js index 669b47d..9e77ca7 100644 --- a/registrar.js +++ b/registrar.js @@ -1,5 +1,7 @@ module.exports = { config: require('./config.js'), + fediverse_auth: require('./fediverse_auth.json'), + matrix_auth: require('./matrix_auth.json'), archive: require('./commands/archive.js'), invidious: require('./commands/invidious.js'), nitter: require('./commands/nitter.js'), From 66e751abd5bd459a71835bd4a6e9d63e7357aafb Mon Sep 17 00:00:00 2001 From: vulet Date: Sun, 17 Jan 2021 18:05:13 +0800 Subject: [PATCH 39/89] chore(ignore): add matrix/fediverse auth --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 5d7a8f7..d9a57e9 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,8 @@ config.js # Ignore JSON timeline.json notification.json +matrix_auth.json +fediverse_auth.json # Runtime data pids From 65b0a07c4a965e7929a79b339dc9671032ce1b3b Mon Sep 17 00:00:00 2001 From: vulet Date: Sun, 17 Jan 2021 19:18:17 +0800 Subject: [PATCH 40/89] chore(readme): prefer token-based authentication --- README.md | 75 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 39 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index c600834..0d866c0 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,46 @@ -# Plemara -Plemara acts as a [Matrix](https://matrix.org/docs/spec/) bridge to the Fediverse. This application should allow you to do most actions on the Fediverse including livefeed, posting, subscribing, etc. via Matrix. Configuration for the app can be found in [config.js](https://github.com/vulet/plemara/blob/master/config.js). You will need to provide a Matrix username and password for the bridge to work, this can be done through an account made on @matrix.org, or your own homeserver. For the Fediverse side, you will need an access_token, this can be created through the CURL steps below. You would replace `fediverse.site` with where you would like to run the bridge from. +# ligh7hau5 +The ligh7hau5 project is used on the Matrix protocol to communicate with the Fediverse. It is also used to proxy popular media networks(Twitter, YouTube, etc) to alternative front ends(Nitter, Invidious, etc). This repository can be ran locally, as on a RPi, or on a VPS. +# Archive (+archive URL) + +This command will send a given URL to archive.is, and return an archive.is URL. This can be beneficial in two ways. One, archive.is receives your traffic instead of the URL that you wish to archive. Two, you are creating a historical context of a given URL with a dated attribute. Additionally, if there are changes that have occurred on a page, since the time of last archive, you can also use the rearchive(+rearchive URL) command. If you wish to use a different archiver, this can be configured, see the config.example.js file. +# Social Media (+proxy URL) + +This command is given a Twitter or YouTube post, and then returned a respective Nitter/Invidious URL. Additionally, some data is returned about what the URL is, such as: title, description, etc. Instances can also be configured like in the above, see the config.example.js file. +# Fediverse + +The ligh7hau5 works as a lite client for the Fediverse. It was built to communicate with a Pleroma instance, but it most likely works on Mastodon as well. Assuming you already have a registered account in regards to the bot, just change the config.js file and fediverse_auth.json will fill out once the bot starts. + +Commands for the Fediverse include: + +`+flood : turn on timeline in channel` + +`+notify : show notifications in channel` + +`+post : post` + +`+reply : reply to message` + +`+media : post media` + +`+redact : delete post` + +`+follow : follow` + +`+unfollow : unfollow` + +`+copy : repeat/repost/retweet` + +`+clap : favorite` + +`+boo : unfavorite` # Installation -1. `git clone https://github.com/vulet/plemara` -2. `cd plemara && yarn install` + +First, set up your config.js file, you can see config.example.js as an example. The Matrix & Fediverse login information is used to populate matrix_auth.json and fediverse_auth.json during your initial login. These tokens are then used on sequential logins. +1. `git clone https://github.com/vulet/ligh7hau5` +2. `cd ligh7hau5 && yarn install` 3. `node main.js` -# Generating an access_token -1. `curl -X POST -d "client_name=&redirect_uris=urn:ietf:wg:oauth:2.0:oob&scopes=write follow read&website=http://fediverse.site" https://fediverse.site/api/v1/apps` - -Result: -```json -{"client_id":"result", -"client_secret":"result", -"id":"result", -"name":"result", -"redirect_uri":"urn:ietf:wg:oauth:2.0:oob", -"website":"http://fediverse.site", -"vapid_key":"vapid_key"} -``` - -2. `curl -X POST -d "client_id=sekret&client_secret=sekret&scope=write follow read&grant_type=password&username=sekret@email.com&password=sekret" https://fediverse.site/oauth/token` - -Result: -```json -{"token_type":"Bearer", -"scope":"write read", -"me":"https://fediverse.site/users/", -"access_token":"result"} -``` - -The access_token from the above command is then stored in the [config.js](https://github.com/vulet/plemara/blob/master/config.js) file. - - -# Extra Features -- Nitter.net / Twitter -- Invidio.us / YouTube -- Archive.is - # Contributors CryptoMooners From 854323cbc48cb7f5679bb37353ab27a7422374a2 Mon Sep 17 00:00:00 2001 From: vulet Date: Sun, 17 Jan 2021 19:25:24 +0800 Subject: [PATCH 41/89] chore(config): add default client name --- config.example.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.example.js b/config.example.js index 9710ed1..2f7dd52 100644 --- a/config.example.js +++ b/config.example.js @@ -9,7 +9,7 @@ module.exports = { domain: 'https://your_federation.com', username: '', password: '', - client_name: '', + client_name: 'ligh7hau5', subject: '', mimetypes: { whitelist: [], From c1b8e37e70ffb85cb4aad2557560cfe4536f3699 Mon Sep 17 00:00:00 2001 From: vulet Date: Sun, 17 Jan 2021 19:36:01 +0800 Subject: [PATCH 42/89] chore(deps): bump versions --- package.json | 4 +- yarn.lock | 224 +++++++++++++++++++++++---------------------------- 2 files changed, 103 insertions(+), 125 deletions(-) diff --git a/package.json b/package.json index 364f25c..1a82636 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ligh7hau5", - "version": "0.4.0", + "version": "1.0.0", "description": "A Matrix to Fediverse client", "main": "main.js", "scripts": { @@ -18,7 +18,7 @@ }, "homepage": "https://github.com/vulet/lighthau5#readme", "dependencies": { - "axios": "^0.19.2", + "axios": "^0.21.1", "file-system": "^2.2.2", "form-data": "^3.0.0", "jsdom": "^16.2.2", diff --git a/yarn.lock b/yarn.lock index 4a97fcd..1e41207 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,16 +3,16 @@ "@babel/code-frame@^7.0.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: "@babel/highlight" "^7.10.4" "@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== "@babel/highlight@^7.10.4": version "7.10.4" @@ -106,21 +106,24 @@ argparse@^1.0.7: sprintf-js "~1.0.2" array-includes@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" - integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== + version "3.1.2" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.2.tgz#a8db03e0b88c8c6aeddc49cb132f9bcab4ebf9c8" + integrity sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0" + es-abstract "^1.18.0-next.1" + get-intrinsic "^1.0.1" is-string "^1.0.5" array.prototype.flat@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" - integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" + integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.18.0-next.1" asn1@~0.2.3: version "0.2.4" @@ -154,12 +157,12 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -axios@^0.19.2: - version "0.19.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" - integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== +axios@^0.21.1: + version "0.21.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" + integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== dependencies: - follow-redirects "1.5.10" + follow-redirects "^1.10.0" babel-runtime@^6.26.0: version "6.26.0" @@ -219,12 +222,12 @@ bs58@^4.0.1: base-x "^3.0.2" call-bind@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce" - integrity sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w== + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" - get-intrinsic "^1.0.0" + get-intrinsic "^1.0.2" callsites@^3.0.0: version "3.1.0" @@ -302,9 +305,9 @@ content-type@^1.0.2: integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== core-js@^2.4.0: - version "2.6.11" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" - integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-util-is@1.0.2: version "1.0.2" @@ -355,13 +358,6 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -debug@=3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -370,9 +366,9 @@ debug@^2.6.9: ms "2.0.0" debug@^4.0.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" - integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: ms "2.1.2" @@ -440,23 +436,6 @@ error-ex@^1.2.0: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: - version "1.17.7" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" - integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" - is-regex "^1.1.1" - object-inspect "^1.8.0" - object-keys "^1.1.1" - object.assign "^4.1.1" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - es-abstract@^1.18.0-next.1: version "1.18.0-next.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" @@ -739,12 +718,10 @@ flatted@^2.0.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== -follow-redirects@1.5.10: - version "1.5.10" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" - integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== - dependencies: - debug "=3.1.0" +follow-redirects@^1.10.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.1.tgz#5f69b813376cee4fd0474a3aba835df04ab763b7" + integrity sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg== forever-agent@~0.6.1: version "0.6.1" @@ -784,10 +761,10 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -get-intrinsic@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.1.tgz#94a9768fcbdd0595a1c9273aacf4c89d075631be" - integrity sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg== +get-intrinsic@^1.0.1, get-intrinsic@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.2.tgz#6820da226e50b24894e08859469dc68361545d49" + integrity sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg== dependencies: function-bind "^1.1.1" has "^1.0.3" @@ -886,9 +863,9 @@ ignore@^4.0.6: integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== import-fresh@^3.0.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.2.tgz#fc129c160c5d68235507f4331a6baad186bdbc3e" - integrity sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw== + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -945,10 +922,10 @@ is-callable@^1.1.4, is-callable@^1.2.2: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== -is-core-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.0.0.tgz#58531b70aed1db7c0e8d4eb1a0a2d1ddd64bd12d" - integrity sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw== +is-core-module@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== dependencies: has "^1.0.3" @@ -963,9 +940,9 @@ is-fullwidth-code-point@^2.0.0: integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= is-negative-zero@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" - integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== is-potential-custom-element-name@^1.0.0: version "1.0.0" @@ -1017,9 +994,9 @@ js-tokens@^4.0.0: integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.0: - version "3.14.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" - integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -1135,9 +1112,9 @@ lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.19: integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== loglevel@^1.6.4: - version "1.7.0" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.0.tgz#728166855a740d59d38db01cf46f042caa041bb0" - integrity sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ== + version "1.7.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" + integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== matrix-js-sdk@^2.4.6: version "2.4.6" @@ -1155,17 +1132,17 @@ matrix-js-sdk@^2.4.6: request "^2.88.0" unhomoglyph "^1.0.2" -mime-db@1.44.0: - version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== +mime-db@1.45.0: + version "1.45.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" + integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + version "2.1.28" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" + integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== dependencies: - mime-db "1.44.0" + mime-db "1.45.0" mimic-fn@^1.0.0: version "1.2.0" @@ -1237,9 +1214,9 @@ oauth-sign@~0.9.0: integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== object-inspect@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" - integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" @@ -1257,22 +1234,23 @@ object.assign@^4.1.0, object.assign@^4.1.1: object-keys "^1.1.1" object.entries@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add" - integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA== + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.3.tgz#c601c7f168b62374541a07ddbd3e2d5e4f7711a6" + integrity sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.5" + es-abstract "^1.18.0-next.1" has "^1.0.3" object.values@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" + integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.18.0-next.1" has "^1.0.3" once@^1.3.0: @@ -1414,9 +1392,9 @@ punycode@^2.1.0, punycode@^2.1.1: integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== qs@^6.5.2: - version "6.9.4" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687" - integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ== + version "6.9.6" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" + integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== qs@~6.5.2: version "6.5.2" @@ -1498,11 +1476,11 @@ resolve-from@^4.0.0: integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0: - version "1.18.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" - integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== + version "1.19.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" + integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== dependencies: - is-core-module "^2.0.0" + is-core-module "^2.1.0" path-parse "^1.0.6" restore-cursor@^2.0.0: @@ -1607,9 +1585,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.6" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz#c80757383c28abf7296744998cbc106ae8b854ce" - integrity sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw== + version "3.0.7" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" + integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== sprintf-js@~1.0.2: version "1.0.3" @@ -1654,20 +1632,20 @@ string-width@^3.0.0: strip-ansi "^5.1.0" string.prototype.trimend@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz#6ddd9a8796bc714b489a3ae22246a208f37bfa46" - integrity sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw== + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" + integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" string.prototype.trimstart@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz#22d45da81015309cd0cdd79787e8919fc5c613e7" - integrity sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg== + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" + integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" strip-ansi@^4.0.0: version "4.0.0" @@ -1796,9 +1774,9 @@ unhomoglyph@^1.0.2: integrity sha512-7uvcWI3hWshSADBu4JpnyYbTVc7YlhF5GDW/oPD5AxIxl34k4wXR3WDkPnzLxkN32LiTCTKMQLtKVZiwki3zGg== uri-js@^4.2.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" - integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" @@ -1899,9 +1877,9 @@ write@1.0.3: mkdirp "^0.5.1" ws@^7.2.3: - version "7.3.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" - integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== + version "7.4.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.2.tgz#782100048e54eb36fe9843363ab1c68672b261dd" + integrity sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA== xml-name-validator@^3.0.0: version "3.0.0" From ab86f0a3e1f9f3eb18d9c54afb555b04605c0e25 Mon Sep 17 00:00:00 2001 From: vulet Date: Sun, 17 Jan 2021 21:41:11 +0800 Subject: [PATCH 43/89] refactor(registrar): add initializers --- registrar.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/registrar.js b/registrar.js index 9e77ca7..51c9399 100644 --- a/registrar.js +++ b/registrar.js @@ -1,3 +1,12 @@ +const fs = require('fs'); + +//initializers +if (!fs.existsSync('fediverse_auth.json')) fs.copyFileSync('fediverse_auth.example.json', 'fediverse_auth.json'); +if (!fs.existsSync('matrix_auth.json')) fs.copyFileSync('matrix_auth.example.json', 'matrix_auth.json'); +if (!fs.existsSync('config.js')) fs.copyFileSync('config.example.js', 'config.js'); +if (!fs.existsSync('timeline.json')) fs.writeFileSync('timeline.json', 0); +if (!fs.existsSync('notification.json')) fs.writeFileSync('notification.json', 0); + module.exports = { config: require('./config.js'), fediverse_auth: require('./fediverse_auth.json'), From a0d7852e90f612c937c2e1ea2c40881177a217a3 Mon Sep 17 00:00:00 2001 From: vulet Date: Sun, 17 Jan 2021 21:48:05 +0800 Subject: [PATCH 44/89] fix(ignore): move cache --- fediverse_auth.json => fediverse_auth.example.json | 0 matrix_auth.json => matrix_auth.example.json | 0 notification.json | 0 timeline.json | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename fediverse_auth.json => fediverse_auth.example.json (100%) rename matrix_auth.json => matrix_auth.example.json (100%) delete mode 100644 notification.json delete mode 100644 timeline.json diff --git a/fediverse_auth.json b/fediverse_auth.example.json similarity index 100% rename from fediverse_auth.json rename to fediverse_auth.example.json diff --git a/matrix_auth.json b/matrix_auth.example.json similarity index 100% rename from matrix_auth.json rename to matrix_auth.example.json diff --git a/notification.json b/notification.json deleted file mode 100644 index e69de29..0000000 diff --git a/timeline.json b/timeline.json deleted file mode 100644 index e69de29..0000000 From ef00f3c8d5ef2dabf4f420a474816219eae12571 Mon Sep 17 00:00:00 2001 From: vulet Date: Sun, 17 Jan 2021 22:29:19 +0800 Subject: [PATCH 45/89] fix(auth): pass tokens on initial startup --- auth.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/auth.js b/auth.js index ddcd12f..054a21f 100644 --- a/auth.js +++ b/auth.js @@ -7,6 +7,8 @@ module.exports.getMatrixToken = async () => { matrixClient = sdk.createClient(registrar.config.matrix.domain); matrixClient.loginWithPassword(registrar.config.matrix.user, registrar.config.matrix.password) .then((response) => { + registrar.matrix_auth.access_token = response.access_token; + registrar.matrix_auth.user_id = response.user_id; fs.writeFileSync('matrix_auth.json', JSON.stringify(response, null, 2)); matrixClient.startClient(); }); @@ -41,6 +43,7 @@ module.exports.registerFediverseApp = async () => { redirect_uri: 'urn:ietf:wg:oauth:2.0:oob', }) .then((tokens) => { + registrar.fediverse_auth.access_token = tokens.data.access_token; fs.writeFileSync('fediverse_auth.json', JSON.stringify(tokens.data, null, 2)); }) .catch((e) => { From 0cd373fb8a813dd1f6de1c6ef1e1cc695e20c609 Mon Sep 17 00:00:00 2001 From: vulet Date: Sun, 17 Jan 2021 23:15:26 +0800 Subject: [PATCH 46/89] chore(help): update commands --- commands/help.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/commands/help.js b/commands/help.js index f07555c..652c7a1 100644 --- a/commands/help.js +++ b/commands/help.js @@ -2,10 +2,11 @@ exports.runQuery = function (matrixClient, room) { matrixClient.sendHtmlNotice(room.roomId, '', '
fediverse commands
' - + '+plemara [your message] : post
' + + '+post [your message] : post
' + '+redact [post id] : delete post
' + '+follow [user id] : follow
' + '+unfollow [user id] : unfollow
' + + '+media [homeserver image URL or MXC] [optional message] : post media
' + '+copy [post id] : repeat/repost/retweet
' + '+reply [post id] [content] : reply to post
' + '+tip [@user@fedi.url] [amount] : tip 10grans
' @@ -18,7 +19,8 @@ exports.runQuery = function (matrixClient, room) { + '+archive [URL] : archive content
' + '+rearchive [URL] : re-archive content
' + '+nitter [status URL] : redirect twitter to nitter, also embed tweet
' - + '+invidious [video URL] : redirect youtube to invidious, also embed description

' + + '+invidious [video URL] : redirect youtube to invidious, also embed description
' + + '+proxy [twitter/youtube]: both +nitter and +invidious commands combined

' + '
--- Contributors🐱 ---
' + 'CRYPTOMOONERS
' + 'docs by LINT
'); From 67b88f9c96d5ce101fd8e8bb7872157c6b65286d Mon Sep 17 00:00:00 2001 From: vulet Date: Mon, 1 Feb 2021 16:58:59 +0800 Subject: [PATCH 47/89] feat(e2ee): introduce OLM encryption. refactor(storage): moved from fs to localstorage. refactor(config): added as global to registrar. chore(npm): upgraded matrix-js-sdk from 2.4.6 release to 9.5.1 release. --- auth.js | 66 +- commands/archive.js | 20 +- commands/fediverse/beg.js | 8 +- commands/fediverse/boo.js | 8 +- commands/fediverse/clap.js | 8 +- commands/fediverse/copy.js | 8 +- commands/fediverse/flood.js | 22 +- commands/fediverse/follow.js | 11 +- commands/fediverse/media.js | 25 +- commands/fediverse/mordy.js | 8 +- commands/fediverse/notify.js | 58 +- commands/fediverse/pin.js | 10 +- commands/fediverse/post.js | 8 +- commands/fediverse/redact.js | 8 +- commands/fediverse/reply.js | 8 +- commands/fediverse/status.js | 10 +- commands/fediverse/tip.js | 8 +- commands/fediverse/unfollow.js | 12 +- commands/fediverse/unpin.js | 10 +- commands/help.js | 6 +- commands/invidious.js | 20 +- commands/nitter.js | 16 +- fediverse_auth.example.json | 9 - main.js | 38 +- matrix_auth.example.json | 6 - package.json | 16 +- registrar.js | 26 +- yarn.lock | 1224 ++------------------------------ 28 files changed, 264 insertions(+), 1413 deletions(-) delete mode 100644 fediverse_auth.example.json delete mode 100644 matrix_auth.example.json diff --git a/auth.js b/auth.js index 054a21f..16063de 100644 --- a/auth.js +++ b/auth.js @@ -1,41 +1,58 @@ -const sdk = require('matrix-js-sdk'); -const axios = require('axios'); -const fs = require('fs'); -const registrar = require('./registrar.js'); +const { LocalStorageCryptoStore } = require('matrix-js-sdk/lib/crypto/store/localStorage-crypto-store'); module.exports.getMatrixToken = async () => { - matrixClient = sdk.createClient(registrar.config.matrix.domain); - matrixClient.loginWithPassword(registrar.config.matrix.user, registrar.config.matrix.password) + matrixClient = sdk.createClient(config.matrix.domain); + matrixClient.loginWithPassword(config.matrix.user, config.matrix.password) .then((response) => { - registrar.matrix_auth.access_token = response.access_token; - registrar.matrix_auth.user_id = response.user_id; - fs.writeFileSync('matrix_auth.json', JSON.stringify(response, null, 2)); + matrix_auth = { + user_id: response.user_id, + access_token: response.access_token, + device_id: response.device_id, + }; + localStorage.setItem('matrix_auth', JSON.stringify(response, null, 2)); + }).then(() => { + matrixTokenLogin(); + }) + .catch((e) => { + console.log(e); + }); +}; + +matrixTokenLogin = async () => { + matrixClient = sdk.createClient({ + baseUrl: config.matrix.domain, + accessToken: matrix_auth.access_token, + userId: matrix_auth.user_id, + deviceId: matrix_auth.device_id, + sessionStore: new sdk.WebStorageSessionStore(localStorage), + cryptoStore: new LocalStorageCryptoStore(localStorage), + }); + matrixClient.initCrypto() + .then(() => { + if(!localStorage.getItem('crypto.device_data')) + return console.log( + '====================================================\n'+ + 'New OLM Encryption Keys created, please restart ligh7hau5.\n'+ + '====================================================' + ); matrixClient.startClient(); }); }; -module.exports.matrixTokenLogin = async () => { - matrixClient = sdk.createClient({ - baseUrl: registrar.config.matrix.domain, - accessToken: registrar.matrix_auth.access_token, - userId: registrar.matrix_auth.user_id, - timelineSupport: true, - }); - matrixClient.startClient(); -}; +module.exports.matrixTokenLogin = matrixTokenLogin; module.exports.registerFediverseApp = async () => { - axios.post(`${registrar.config.fediverse.domain}/api/v1/apps`, + axios.post(`${config.fediverse.domain}/api/v1/apps`, { - client_name: registrar.config.fediverse.client_name, + client_name: config.fediverse.client_name, redirect_uris: 'urn:ietf:wg:oauth:2.0:oob', scopes: 'read write follow push', }) .then((response) => { - axios.post(`${registrar.config.fediverse.domain}/oauth/token`, + axios.post(`${config.fediverse.domain}/oauth/token`, { - username: registrar.config.fediverse.username, - password: registrar.config.fediverse.password, + username: config.fediverse.username, + password: config.fediverse.password, client_id: response.data.client_id, client_secret: response.data.client_secret, scope: 'read write follow push', @@ -43,8 +60,7 @@ module.exports.registerFediverseApp = async () => { redirect_uri: 'urn:ietf:wg:oauth:2.0:oob', }) .then((tokens) => { - registrar.fediverse_auth.access_token = tokens.data.access_token; - fs.writeFileSync('fediverse_auth.json', JSON.stringify(tokens.data, null, 2)); + localStorage.setItem('fediverse_auth', JSON.stringify(tokens.data, null, 2)); }) .catch((e) => { console.log(e); diff --git a/commands/archive.js b/commands/archive.js index 6454244..6ca99dd 100644 --- a/commands/archive.js +++ b/commands/archive.js @@ -1,7 +1,5 @@ -const qs = require('qs'); -const axios = require('axios'); const { JSDOM } = require('jsdom'); -const registrar = require('../registrar.js'); +const qs = require('qs'); const sleep = ms => new Promise(r => setTimeout(r, ms)); @@ -51,11 +49,10 @@ const arc1Str = str => `Archiving page ${str}`; const arc2Str = (str, title, date) => `Archived page ${str} [${date}]
${title}`; const arc3Str = str => `Timed out ${str}`; -const run = async (matrixClient, { roomId }, userInput, rearchive, registrar) => { - const config = registrar.config.archive; +const run = async (matrixClient, { roomId }, userInput, rearchive) => { const instance = axios.create({ - baseURL: `https://${config.domain}`, - headers: headers(config), + baseURL: `https://${config.archive.domain}`, + headers: headers(config.archive), transformResponse: [], timeout: 10 * 1000 }); @@ -65,9 +62,9 @@ const run = async (matrixClient, { roomId }, userInput, rearchive, registrar) => reply = await matrixClient.sendHtmlNotice(roomId, '', reqStr(userInput)); const { refresh, id, title, date } = await archive(instance, userInput, rearchive); if (id) - return await editNoticeHTML(matrixClient, roomId, reply, arc2Str(`${config.domain}${id}`, title, date)); + return await editNoticeHTML(matrixClient, roomId, reply, arc2Str(`${config.archive.domain}${id}`, title, date)); if (refresh) { - const path = refresh.split(`https://${config.domain}`); + const path = refresh.split(`https://${config.archive.domain}`); if (!path[1]) throw refresh; await editNoticeHTML(matrixClient, roomId, reply, arc1Str(refresh)); let tries = 30; @@ -75,11 +72,11 @@ const run = async (matrixClient, { roomId }, userInput, rearchive, registrar) => await sleep(10000); const { title, date, id } = await archive(instance, userInput); if (rearchive == false && title !== undefined) - return await editNoticeHTML(matrixClient, roomId, reply, arc2Str(`${config.domain}${id}`, title, date)); + return await editNoticeHTML(matrixClient, roomId, reply, arc2Str(`${config.archive.domain}${id}`, title, date)); const { request: { path: reqPath }, headers: { 'memento-datetime': rearchiveDate } } = await instance({ method: 'HEAD', url: path[1] }) .catch(e => ({ request: { path: path[1] } })); if (rearchive == true && reqPath !== path[1]) - return await editNoticeHTML(matrixClient, roomId, reply, arc2Str(`${config.domain}${reqPath}`, title, rearchiveDate)); + return await editNoticeHTML(matrixClient, roomId, reply, arc2Str(`${config.archive.domain}${reqPath}`, title, rearchiveDate)); } return await editNoticeHTML(matrixClient, roomId, reply, arc3Str(refresh)); } @@ -94,4 +91,3 @@ const run = async (matrixClient, { roomId }, userInput, rearchive, registrar) => }; exports.runQuery = run; - diff --git a/commands/fediverse/beg.js b/commands/fediverse/beg.js index 3affea7..a59b0bf 100644 --- a/commands/fediverse/beg.js +++ b/commands/fediverse/beg.js @@ -1,10 +1,8 @@ -const axios = require('axios'); - -exports.runQuery = function (matrixClient, room, registrar) { +exports.runQuery = function (matrixClient, room) { axios({ method: 'POST', - url: `${registrar.config.fediverse.domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, + url: `${config.fediverse.domain}/api/v1/statuses`, + headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, data: { status: `@10grans@fedi.cc beg` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, diff --git a/commands/fediverse/boo.js b/commands/fediverse/boo.js index 24c6510..a77b3a0 100644 --- a/commands/fediverse/boo.js +++ b/commands/fediverse/boo.js @@ -1,10 +1,8 @@ -const axios = require('axios'); - -exports.runQuery = function (matrixClient, room, userInput, registrar) { +exports.runQuery = function (matrixClient, room, userInput) { axios({ method: 'POST', - url: `${registrar.config.fediverse.domain}/api/v1/statuses/${userInput}/unfavourite`, - headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, + url: `${config.fediverse.domain}/api/v1/statuses/${userInput}/unfavourite`, + headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', diff --git a/commands/fediverse/clap.js b/commands/fediverse/clap.js index 3d63f4d..7664855 100644 --- a/commands/fediverse/clap.js +++ b/commands/fediverse/clap.js @@ -1,10 +1,8 @@ -const axios = require('axios'); - -exports.runQuery = function (matrixClient, room, userInput, registrar) { +exports.runQuery = function (matrixClient, room, userInput) { axios({ method: 'POST', - url: `${registrar.config.fediverse.domain}/api/v1/statuses/${userInput}/favourite`, - headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, + url: `${config.fediverse.domain}/api/v1/statuses/${userInput}/favourite`, + headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', diff --git a/commands/fediverse/copy.js b/commands/fediverse/copy.js index dd5ce41..e15341e 100644 --- a/commands/fediverse/copy.js +++ b/commands/fediverse/copy.js @@ -1,10 +1,8 @@ -const axios = require('axios'); - -exports.runQuery = function (matrixClient, room, userInput, registrar) { +exports.runQuery = function (matrixClient, room, userInput) { axios({ method: 'POST', - url: `${registrar.config.fediverse.domain}/api/v1/statuses/${userInput}/reblog`, - headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, + url: `${config.fediverse.domain}/api/v1/statuses/${userInput}/reblog`, + headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', diff --git a/commands/fediverse/flood.js b/commands/fediverse/flood.js index a52e23a..8d214a5 100644 --- a/commands/fediverse/flood.js +++ b/commands/fediverse/flood.js @@ -1,20 +1,18 @@ -const axios = require('axios'); -const fs = require('fs'); - -exports.runQuery = function (matrixClient, room, registrar) { +exports.runQuery = function (matrixClient, room) { setInterval(() => { axios({ method: 'GET', - url: `${registrar.config.fediverse.domain}/api/v1/timelines/home`, - headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, + url: `${config.fediverse.domain}/api/v1/timelines/home`, + headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, }).then((events) => { - const event = fs.readFileSync('timeline.json', 'utf8'); - fs.writeFileSync('timeline.json', events.data[0].created_at, 'utf8'); - if (event !== events.data[0].created_at) { + let lastEvent = JSON.parse(localStorage.getItem('timeline')); + localStorage.setItem('timeline', JSON.stringify(events.data[0].created_at, null, 2)); + + if (lastEvent !== events.data[0].created_at) { if (events.data[0].reblog === null) { matrixClient.sendHtmlNotice(room.roomId, '', - `
${events.data[0].account.acct} + `${events.data[0].account.acct}
${events.data[0].content}
${events.data[0].media_attachments.map(media => ``+`${media.description}`+'' @@ -24,9 +22,9 @@ exports.runQuery = function (matrixClient, room, registrar) { } else { matrixClient.sendHtmlNotice(room.roomId, '', - ` + ` ${events.data[0].account.acct} - has repeated: + has repeated:
${events.data[0].reblog.account.acct}
${events.data[0].content}
${events.data[0].media_attachments.map(media => diff --git a/commands/fediverse/follow.js b/commands/fediverse/follow.js index cec6f80..a60cd1e 100644 --- a/commands/fediverse/follow.js +++ b/commands/fediverse/follow.js @@ -1,17 +1,18 @@ const axios = require('axios'); +const fediverse_auth = JSON.parse(localStorage.getItem('fediverse_auth')); -exports.runQuery = function (matrixClient, room, userInput, registrar) { - axios.get(`${registrar.config.fediverse.domain}/api/v1/accounts/${userInput}`).then((findUID) => { +exports.runQuery = function (matrixClient, room, userInput) { + axios.get(`${config.fediverse.domain}/api/v1/accounts/${userInput}`).then((findUID) => { axios({ method: 'POST', - url: `${registrar.config.fediverse.domain}/api/v1/accounts/${findUID.data.id}/follow`, - headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, + url: `${config.fediverse.domain}/api/v1/accounts/${findUID.data.id}/follow`, + headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, }) .then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', `Subscribed: -
${registrar.config.fediverse.domain}/${response.data.id}`); +
${config.fediverse.domain}/${response.data.id}`); }); }).catch((e) => { matrixClient.sendHtmlNotice(room.roomId, diff --git a/commands/fediverse/media.js b/commands/fediverse/media.js index 35c162b..1c2f131 100644 --- a/commands/fediverse/media.js +++ b/commands/fediverse/media.js @@ -1,5 +1,4 @@ const qs = require('qs'); -const axios = require('axios'); const FormData = require('form-data'); const emojis = { public: '🌐', unlisted: '📝', private: '🔒️', direct: '✉️' }; @@ -26,7 +25,7 @@ const mediaDownload = async (url, { whitelist, blacklist }) => { }; }; -const mediaUpload = async ({ domain }, { data, filename, mimetype }, registrar) => { +const mediaUpload = async ({ domain }, { data, filename, mimetype }) => { const form = new FormData(); form.append('file', data, { filename: filename || 'upload', @@ -35,24 +34,24 @@ const mediaUpload = async ({ domain }, { data, filename, mimetype }, registrar) const upload = await axios({ method: 'POST', url: `${domain}/api/v1/media`, - headers: form.getHeaders({ Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }), + 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, registrar) => { +const run = async (matrixClient, { roomId }, content, replyId, mediaURL, subject) => { let mediaId = null; - const fediverse = registrar.config.fediverse; + const fediverse = config.fediverse; if(mediaURL) { - const media = await mediaDownload(mediaURL, registrar.config.fediverse.mimetypes); - mediaId = await mediaUpload(fediverse, media, registrar); + 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 ${registrar.fediverse_auth.access_token}`, 'Content-Type': 'application/x-www-form-urlencoded' }, + headers: { Authorization: `Bearer ${fediverse_auth.access_token}`, 'Content-Type': 'application/x-www-form-urlencoded' }, data : qs.stringify({ status: content, content_type: `text/markdown`, @@ -64,13 +63,13 @@ const run = async (matrixClient, { roomId }, content, replyId, mediaURL, subject return matrixClient.sendHtmlNotice(roomId, '', `${response.data.id}`); } -exports.runQuery = async (client, room, userInput, registrar, { isReply, hasMedia, hasSubject }) => { +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 ? registrar.config.fediverse.subject : null; + const subject = hasSubject ? fediverse.subject : null; if(isReply) { replyId = chunks[0]; chunks.shift(); @@ -79,13 +78,13 @@ exports.runQuery = async (client, room, userInput, registrar, { isReply, hasMedi let url = new URL(chunks[0]); chunks.shift(); if(url.protocol === 'mxc:' && url.hostname && url.pathname) - url = new URL(`${registrar.config.matrix.domain}/_matrix/media/r0/download/${url.hostname}${url.pathname}`); + url = new URL(`${config.matrix.domain}/_matrix/media/r0/download/${url.hostname}${url.pathname}`); if(url.protocol !== 'https:') throw ''; - if(!registrar.config.matrix.domains.includes(url.hostname)) 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, registrar); + 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/mordy.js b/commands/fediverse/mordy.js index 80e6afb..88a4ae0 100644 --- a/commands/fediverse/mordy.js +++ b/commands/fediverse/mordy.js @@ -1,10 +1,8 @@ -const axios = require('axios'); - -exports.runQuery = function (matrixClient, room, userInput, registrar) { +exports.runQuery = function (matrixClient, room, userInput) { axios({ method: 'POST', - url: `${registrar.config.fediverse.domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, + url: `${config.fediverse.domain}/api/v1/statuses`, + headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, data: { status: `@mordekai ${userInput}`, content_type: `text/markdown`, diff --git a/commands/fediverse/notify.js b/commands/fediverse/notify.js index fdc1246..e725ac2 100644 --- a/commands/fediverse/notify.js +++ b/commands/fediverse/notify.js @@ -1,49 +1,45 @@ -const axios = require('axios'); -const fs = require('fs'); - -exports.runQuery = function (matrixClient, room, registrar) { +exports.runQuery = function (matrixClient, room) { setInterval(() => { axios({ method: 'GET', - url: `${registrar.config.fediverse.domain}/api/v1/notifications`, - headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, - }).then((notifications) => { - const event = fs.readFileSync('notification.json', 'utf8'); - fs.writeFileSync('notification.json', notifications.data[0].created_at, 'utf8'); - - if (event !== notifications.data[0].created_at) { - if (notifications.data[0].type === 'follow') { + url: `${config.fediverse.domain}/api/v1/notifications`, + headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, + }).then((events) => { + let lastEvent = JSON.parse(localStorage.getItem('notifications')); + localStorage.setItem('notifications', JSON.stringify(events.data[0].created_at, null, 2)); + if (lastEvent !== events.data[0].created_at) { + if (events.data[0].type === 'follow') { matrixClient.sendHtmlNotice(room.roomId, '', - ` - ${notifications.data[0].account.acct} + ` + ${events.data[0].account.acct} has followed you. -
${notifications.data[0].account.note}`); - } else if (notifications.data[0].type === 'favourite') { +
${events.data[0].account.note}`); + } else if (events.data[0].type === 'favourite') { matrixClient.sendHtmlNotice(room.roomId, '', - ` - ${notifications.data[0].account.acct} - has favorited + ` + ${events.data[0].account.acct} + has favorited your post: -
${notifications.data[0].status.content}
`); - } else if (notifications.data[0].type === 'mention') { +
${events.data[0].status.content}
`); + } else if (events.data[0].type === 'mention') { matrixClient.sendHtmlNotice(room.roomId, '', - ` - ${notifications.data[0].account.acct} - has mentioned - you:
${notifications.data[0].status.content} -
(id: ${notifications.data[0].status.id}) ${registrar.media.visibilityEmoji(notifications.data[0].status.visibility)}
+ ` + ${events.data[0].account.acct} + has mentioned + you:
${events.data[0].status.content} +
(id: ${events.data[0].status.id}) ${registrar.media.visibilityEmoji(events.data[0].status.visibility)}
`); - } else if (notifications.data[0].type === 'reblog') { + } else if (events.data[0].type === 'reblog') { matrixClient.sendHtmlNotice(room.roomId, '', - ` - ${notifications.data[0].account.acct} - has repeated + ` + ${events.data[0].account.acct} + has repeated your post:
-
${notifications.data[0].status.content}
`); +
${events.data[0].status.content}
`); } } }); diff --git a/commands/fediverse/pin.js b/commands/fediverse/pin.js index 958cfa6..0b45912 100644 --- a/commands/fediverse/pin.js +++ b/commands/fediverse/pin.js @@ -1,15 +1,13 @@ -const axios = require('axios'); - -exports.runQuery = function (matrixClient, room, userInput, registrar) { +exports.runQuery = function (matrixClient, room, userInput) { axios({ method: 'POST', - url: `${registrar.config.fediverse.domain}/api/v1/statuses/${userInput}/pin`, - headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, + url: `${config.fediverse.domain}/api/v1/statuses/${userInput}/pin`, + headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', `Pinned: -
+
${response.data.content}
`); }) diff --git a/commands/fediverse/post.js b/commands/fediverse/post.js index 41177b1..7f0b0db 100644 --- a/commands/fediverse/post.js +++ b/commands/fediverse/post.js @@ -1,10 +1,8 @@ -const axios = require('axios'); - -exports.runQuery = function (matrixClient, room, userInput, registrar) { +exports.runQuery = function (matrixClient, room, userInput) { axios({ method: 'POST', - url: `${registrar.config.fediverse.domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, + url: `${config.fediverse.domain}/api/v1/statuses`, + headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, data: { status: userInput, content_type: `text/markdown` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, diff --git a/commands/fediverse/redact.js b/commands/fediverse/redact.js index 619a266..75ead79 100644 --- a/commands/fediverse/redact.js +++ b/commands/fediverse/redact.js @@ -1,10 +1,8 @@ -const axios = require('axios'); - -exports.runQuery = function (matrixClient, room, userInput, registrar) { +exports.runQuery = function (matrixClient, room, userInput) { axios({ method: 'DELETE', - url: `${registrar.config.fediverse.domain}/api/v1/statuses/${userInput}`, - headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, + url: `${config.fediverse.domain}/api/v1/statuses/${userInput}`, + headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', diff --git a/commands/fediverse/reply.js b/commands/fediverse/reply.js index a9b0968..19522cd 100644 --- a/commands/fediverse/reply.js +++ b/commands/fediverse/reply.js @@ -1,10 +1,8 @@ -const axios = require('axios'); - -exports.runQuery = function (matrixClient, room, address, flaggedInput, registrar) { +exports.runQuery = function (matrixClient, room, address, flaggedInput) { axios({ method: 'POST', - url: `${registrar.config.fediverse.domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, + 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, diff --git a/commands/fediverse/status.js b/commands/fediverse/status.js index 60dd991..0c042a8 100644 --- a/commands/fediverse/status.js +++ b/commands/fediverse/status.js @@ -1,14 +1,12 @@ -const axios = require('axios'); - -exports.runQuery = function (matrixClient, room, userInput, registrar) { +exports.runQuery = function (matrixClient, room, userInput, ) { axios({ method: 'GET', - url: `${registrar.config.fediverse.domain}/api/v1/statuses/${userInput}`, - headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, + url: `${config.fediverse.domain}/api/v1/statuses/${userInput}`, + headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', - `${response.data.account.acct} + `${response.data.account.acct}
${response.data.content}
${response.data.media_attachments.map(media => `${media.description}`) diff --git a/commands/fediverse/tip.js b/commands/fediverse/tip.js index 32bc46b..0ddbb38 100644 --- a/commands/fediverse/tip.js +++ b/commands/fediverse/tip.js @@ -1,10 +1,8 @@ -const axios = require('axios'); - -exports.runQuery = function (matrixClient, room, address, flaggedInput, registrar) { +exports.runQuery = function (matrixClient, room, address, flaggedInput) { axios({ method: 'POST', - url: `${registrar.config.fediverse.domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, + url: `${config.fediverse.domain}/api/v1/statuses`, + headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, data: { status: `@10grans@fedi.cc tip `+ flaggedInput + ` to `+address }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, diff --git a/commands/fediverse/unfollow.js b/commands/fediverse/unfollow.js index 7cff9d5..e45923f 100644 --- a/commands/fediverse/unfollow.js +++ b/commands/fediverse/unfollow.js @@ -1,17 +1,15 @@ -const axios = require('axios'); - -exports.runQuery = function (matrixClient, room, userInput, registrar) { - axios.get(`${registrar.config.fediverse.domain}/api/v1/accounts/${userInput}`).then((findUID) => { +exports.runQuery = function (matrixClient, room, userInput) { + axios.get(`${config.fediverse.domain}/api/v1/accounts/${userInput}`).then((findUID) => { axios({ method: 'POST', - url: `${registrar.config.fediverse.domain}/api/v1/accounts/${findUID.data.id}/unfollow`, - headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, + url: `${config.fediverse.domain}/api/v1/accounts/${findUID.data.id}/unfollow`, + headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, }) .then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', `Unsubscribed: -
${registrar.config.fediverse.domain}/${response.data.id}`); +
${config.fediverse.domain}/${response.data.id}`); }); }).catch((e) => { matrixClient.sendHtmlNotice(room.roomId, diff --git a/commands/fediverse/unpin.js b/commands/fediverse/unpin.js index eb4730c..2e14690 100644 --- a/commands/fediverse/unpin.js +++ b/commands/fediverse/unpin.js @@ -1,15 +1,13 @@ -const axios = require('axios'); - -exports.runQuery = function (matrixClient, room, userInput, registrar) { +exports.runQuery = function (matrixClient, room, userInput) { axios({ method: 'POST', - url: `${registrar.config.fediverse.domain}/api/v1/statuses/${userInput}/unpin`, - headers: { Authorization: `Bearer ${registrar.fediverse_auth.access_token}` }, + url: `${config.fediverse.domain}/api/v1/statuses/${userInput}/unpin`, + headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, }).then((response) => { matrixClient.sendHtmlNotice(room.roomId, '', `Unpinned: -
+
${response.data.content}
`); }) diff --git a/commands/help.js b/commands/help.js index 652c7a1..f07555c 100644 --- a/commands/help.js +++ b/commands/help.js @@ -2,11 +2,10 @@ exports.runQuery = function (matrixClient, room) { matrixClient.sendHtmlNotice(room.roomId, '', '
fediverse commands
' - + '+post [your message] : post
' + + '+plemara [your message] : post
' + '+redact [post id] : delete post
' + '+follow [user id] : follow
' + '+unfollow [user id] : unfollow
' - + '+media [homeserver image URL or MXC] [optional message] : post media
' + '+copy [post id] : repeat/repost/retweet
' + '+reply [post id] [content] : reply to post
' + '+tip [@user@fedi.url] [amount] : tip 10grans
' @@ -19,8 +18,7 @@ exports.runQuery = function (matrixClient, room) { + '+archive [URL] : archive content
' + '+rearchive [URL] : re-archive content
' + '+nitter [status URL] : redirect twitter to nitter, also embed tweet
' - + '+invidious [video URL] : redirect youtube to invidious, also embed description
' - + '+proxy [twitter/youtube]: both +nitter and +invidious commands combined

' + + '+invidious [video URL] : redirect youtube to invidious, also embed description

' + '
--- Contributors🐱 ---
' + 'CRYPTOMOONERS
' + 'docs by LINT
'); diff --git a/commands/invidious.js b/commands/invidious.js index 8e53b50..2f5f09e 100644 --- a/commands/invidious.js +++ b/commands/invidious.js @@ -1,5 +1,3 @@ -const axios = require('axios'); - const headers = ({ domain, userAgent }) => ({ 'Host': `${domain}`, 'User-Agent': `${userAgent}` @@ -31,28 +29,28 @@ const card = (video, base, path) => `
(${video.date})

`; -const run = async (matrixClient, { roomId }, userInput, registrar) => { - const config = registrar.config.invidious; +const run = async (matrixClient, { roomId }, userInput) => { const instance = axios.create({ - baseURL: `https://${config.domain}/api/v1/videos/`, - headers: headers(config), + baseURL: `https://${config.invidious.domain}/api/v1/videos/`, + headers: headers(config.invidious), transformResponse: [], timeout: 10 * 1000 }); const video = await invidious(instance, userInput); - return await matrixClient.sendHtmlNotice(roomId, '', card(video, `https://${config.domain}`, userInput)); + return await matrixClient.sendHtmlNotice(roomId, '', card(video, `https://${config.invidious.domain}`, userInput)); } -exports.runQuery = async (client, room, userInput, registrar) => { +exports.runQuery = async (client, room, userInput) => { try { const url = new URL(userInput); - if(!registrar.config.invidious.domains.includes(url.hostname)) throw ''; + if(!config.invidious.domains.includes(url.hostname)) throw ''; if(/^\/[\w-]{11}$/.test(url.pathname)) - return await run(client, room, url.pathname.slice(1), registrar); + return await run(client, room, url.pathname.slice(1)); const params = new URLSearchParams(url.search).get("v"); if(!/^[\w-]{11}$/.test(params)) throw ''; - return await run(client, room, params, registrar); + return await run(client, room, params); } catch(e) { + console.log(e); return client.sendHtmlNotice(room.roomId, 'Sad!', `Sad!`).catch(()=>{}); } }; diff --git a/commands/nitter.js b/commands/nitter.js index f07b6e7..d85dee4 100644 --- a/commands/nitter.js +++ b/commands/nitter.js @@ -1,4 +1,3 @@ -const axios = require('axios'); const { JSDOM } = require("jsdom"); const headers = ({ domain, userAgent }) => ({ @@ -50,24 +49,23 @@ const card = (tweet, base, check, path) => (tweet.hasAttachments ? '
This tweet has attached media.
' : '') + (tweet.isReply ? tweet.isReply === 'unavailable' ? '
Replied Tweet is unavailable
' : `
Replied Tweet
${tweet.isReply.text.replace('\n', '
')}
` : '') + (tweet.quote ? `
Quoted Tweet
${tweet.quote.text.replace('\n', '
')}
` : ''); -const run = async (matrixClient, { roomId }, userInput, registrar) => { - const config = registrar.config.nitter; +const run = async (matrixClient, { roomId }, userInput) => { const instance = axios.create({ - baseURL: `https://${config.domain}`, - headers: headers(config), + baseURL: `https://${config.nitter.domain}`, + headers: headers(config.nitter), transformResponse: [], timeout: 10 * 1000 }); const tweet = await nitter(instance, userInput); - return await matrixClient.sendHtmlNotice(roomId, '', card(tweet, `https://${config.domain}`, config.check, userInput)); + return await matrixClient.sendHtmlNotice(roomId, '', card(tweet, `https://${config.nitter.domain}`, config.nitter.check, userInput)); } -exports.runQuery = async (client, room, userInput, registrar) => { +exports.runQuery = async (client, room, userInput) => { try { const url = new URL(userInput); - if(!registrar.config.nitter.domains.includes(url.hostname)) throw ''; + if(!config.nitter.domains.includes(url.hostname)) throw ''; if(!/^\/[^/]+\/status\/\d+\/?$/.test(url.pathname)) throw ''; - return await run(client, room, url.pathname, registrar); + return await run(client, room, url.pathname); } catch(e) { return client.sendHtmlNotice(room.roomId, 'Sad!', `Sad!`).catch(()=>{}); } diff --git a/fediverse_auth.example.json b/fediverse_auth.example.json deleted file mode 100644 index d6c5e87..0000000 --- a/fediverse_auth.example.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "access_token": "", - "created_at": 0, - "expires_in": 0, - "me": "", - "refresh_token": "", - "scope": "", - "token_type": "" -} diff --git a/main.js b/main.js index ee1aec1..18f76dd 100644 --- a/main.js +++ b/main.js @@ -1,15 +1,15 @@ -const registrar = require('./registrar.js'); -const auth = require('./auth.js'); +global.registrar = require('./registrar.js'); -registrar.matrix_auth.access_token ? auth.matrixTokenLogin() : auth.getMatrixToken(); -if (!registrar.fediverse_auth.access_token && registrar.config.fediverse.username) auth.registerFediverseApp(); +matrix_auth.access_token ? auth.matrixTokenLogin() : auth.getMatrixToken(); +if (!fediverse_auth.access_token && config.fediverse.username) auth.registerFediverseApp(); matrixClient.on('RoomMember.membership', (event, member) => { if (member.membership === 'invite' && member.userId === matrixClient.credentials.userId) { - matrixClient.joinRoom(member.roomId).done(() => { + matrixClient.joinRoom(member.roomId).then(() => { console.log('Auto-joined %s', member.roomId); }); } + if (member.membership === 'leave' && member.userId === matrixClient.credentials.userId) { matrixClient.forget(member.roomId).then(() => { console.log('Kicked %s', member.roomId); @@ -17,14 +17,15 @@ matrixClient.on('RoomMember.membership', (event, member) => { } }); -matrixClient.on('Room.timeline', (event, room, toStartOfTimeline) => { +matrixClient.on('Room.timeline', async function (event, room, member, toStartOfTimeline) { if (toStartOfTimeline) return; + if (event.isEncrypted()) await event._decryptionPromise; if (event.getType() !== 'm.room.message') return; if (event.getSender() === matrixClient.credentials.userId) return; if (event.event.unsigned.age > 10000) return; - if (event.event.content.body.charAt(0) === '+') { - console.log(`Logs: ${event.event.sender} - ${event.event.content.body}`); - let args = event.event.content.body.slice(1).trim().split(/ +/g); + if (event.getContent().body.charAt(0) === '+') { + console.log(`Logs: ${event.event.sender} - ${event.getContent().body}`); + let args = event.getContent().body.slice(1).trim().split(/ +/g); let command = args.shift().toLowerCase(); const userInput = args.join(' '); const flaggedInput = userInput.substr(userInput.indexOf(' ') + 1); @@ -35,19 +36,19 @@ matrixClient.on('Room.timeline', (event, room, toStartOfTimeline) => { switch(command) { case 'config': return; - case 'help': case 'beg': case 'flood': case 'notify': - args.push(matrixClient, room, registrar); + case 'help': case 'beg': case 'flood': case 'asdf': + args.push(matrixClient, room); break; case 'tip': - args.push(matrixClient, room, address, flaggedInput, registrar); + args.push(matrixClient, room, address, flaggedInput); break; case 'archive': case 'rearchive': - args.push(matrixClient, room, userInput, !!~command.indexOf('re'), registrar); + args.push(matrixClient, room, userInput, !!~command.indexOf('re')); command = 'archive'; break; case 'post': case 'reply': case 'media': case 'mediareply': case 'random': case 'randomreply': case 'randommedia': case 'randommediareply': - args.push(matrixClient, room, userInput, registrar, { + args.push(matrixClient, room, userInput, { isReply: !!~command.indexOf('reply'), hasMedia: !!~command.indexOf('media'), hasSubject: !!~command.indexOf('random'), @@ -57,17 +58,16 @@ matrixClient.on('Room.timeline', (event, room, toStartOfTimeline) => { case 'proxy': try { const url = new URL(userInput); - command = registrar.config.invidious.domains.includes(url.hostname) - ? 'invidious' - : registrar.config.nitter.domains.includes(url.hostname) + command = config.invidious.domains.includes(url.hostname) + ? 'invidious' + : config.nitter.domains.includes(url.hostname) ? 'nitter' : 'proxy'; } catch(e) {} //fallthrough default: - args.push(matrixClient, room, userInput, registrar); + args.push(matrixClient, room, userInput); } - registrar[command] && registrar[command].runQuery.apply(null, args); } }); diff --git a/matrix_auth.example.json b/matrix_auth.example.json deleted file mode 100644 index 2400a69..0000000 --- a/matrix_auth.example.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "user_id": "", - "access_token": "", - "home_server": "", - "device_id": "" -} diff --git a/package.json b/package.json index 1a82636..90d3be9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ligh7hau5", - "version": "1.0.0", + "version": "1.1.0", "description": "A Matrix to Fediverse client", "main": "main.js", "scripts": { @@ -19,14 +19,12 @@ "homepage": "https://github.com/vulet/lighthau5#readme", "dependencies": { "axios": "^0.21.1", - "file-system": "^2.2.2", "form-data": "^3.0.0", - "jsdom": "^16.2.2", - "matrix-js-sdk": "^2.4.6" + "jsdom": "^16.4.0", + "matrix-js-sdk": "^9.5.1", + "node-localstorage": "^2.1.6", + "olm": "https://packages.matrix.org/npm/olm/olm-3.2.1.tgz", + "qs": "^6.9.6" }, - "devDependencies": { - "eslint": "^5.16.0", - "eslint-config-airbnb-base": "^13.1.0", - "eslint-plugin-import": "^2.17.3" - } + "devDependencies": {} } diff --git a/registrar.js b/registrar.js index 51c9399..65cf232 100644 --- a/registrar.js +++ b/registrar.js @@ -1,16 +1,24 @@ -const fs = require('fs'); +global.Olm = require('olm'); +global.sdk = require('matrix-js-sdk'); +global.axios = require('axios'); +global.config = require('./config.js'); +global.auth = require('./auth.js'); -//initializers -if (!fs.existsSync('fediverse_auth.json')) fs.copyFileSync('fediverse_auth.example.json', 'fediverse_auth.json'); -if (!fs.existsSync('matrix_auth.json')) fs.copyFileSync('matrix_auth.example.json', 'matrix_auth.json'); -if (!fs.existsSync('config.js')) fs.copyFileSync('config.example.js', 'config.js'); -if (!fs.existsSync('timeline.json')) fs.writeFileSync('timeline.json', 0); -if (!fs.existsSync('notification.json')) fs.writeFileSync('notification.json', 0); +const { LocalStorage } = require('node-localstorage'); +global.localStorage = new LocalStorage('./keys'); +if (!localStorage.getItem('matrix_auth')){ + localStorage.clear(); + localStorage.setItem('matrix_auth', "{}"); +} +if (!localStorage.getItem('fediverse_auth')) localStorage.setItem('fediverse_auth', "{}"); +if (!localStorage.getItem('timeline')) localStorage.setItem('timeline', "{}"); +if (!localStorage.getItem('notifications')) localStorage.setItem('notifications', "{}"); + +global.matrix_auth = JSON.parse(localStorage.getItem('matrix_auth')); +global.fediverse_auth = JSON.parse(localStorage.getItem('fediverse_auth')); module.exports = { config: require('./config.js'), - fediverse_auth: require('./fediverse_auth.json'), - matrix_auth: require('./matrix_auth.json'), archive: require('./commands/archive.js'), invidious: require('./commands/invidious.js'), nitter: require('./commands/nitter.js'), diff --git a/yarn.lock b/yarn.lock index 1e41207..21deb07 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,31 +2,12 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== +"@babel/runtime@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" + integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/helper-validator-identifier@^7.10.4": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" - integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== - -"@babel/highlight@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + regenerator-runtime "^0.13.4" abab@^2.0.3: version "2.0.5" @@ -41,27 +22,17 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-jsx@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" - integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== - acorn-walk@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn@^6.0.7: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - acorn@^7.1.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -ajv@^6.10.2, ajv@^6.12.3, ajv@^6.9.1: +ajv@^6.12.3: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -76,55 +47,6 @@ another-json@^0.2.0: resolved "https://registry.yarnpkg.com/another-json/-/another-json-0.2.0.tgz#b5f4019c973b6dd5c6506a2d93469cb6d32aeedc" integrity sha1-tfQBnJc7bdXGUGotk0acttMq7tw= -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -array-includes@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.2.tgz#a8db03e0b88c8c6aeddc49cb132f9bcab4ebf9c8" - integrity sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - get-intrinsic "^1.0.1" - is-string "^1.0.5" - -array.prototype.flat@^1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" - integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - asn1@~0.2.3: version "0.2.4" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" @@ -137,11 +59,6 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -164,19 +81,6 @@ axios@^0.21.1: dependencies: follow-redirects "^1.10.0" -babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - base-x@^3.0.2: version "3.0.8" resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" @@ -191,19 +95,6 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -bluebird@3.5.5: - version "3.5.5" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" - integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - browser-process-hrtime@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" @@ -221,62 +112,11 @@ bs58@^4.0.1: dependencies: base-x "^3.0.2" -call-bind@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" - -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -284,47 +124,16 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -confusing-browser-globals@^1.0.5: - version "1.0.10" - resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz#30d1e7f3d1b882b25ec4933d1d1adac353d20a59" - integrity sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA== - -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= - -content-type@^1.0.2: +content-type@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -core-js@^2.4.0: - version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" - integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== - core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - cssom@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" @@ -358,20 +167,6 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^4.0.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - decimal.js@^10.2.0: version "10.2.1" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" @@ -382,33 +177,11 @@ deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - domexception@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" @@ -424,50 +197,6 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -error-ex@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.18.0-next.1: - version "1.18.0-next.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" - integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" - is-negative-zero "^2.0.0" - is-regex "^1.1.1" - object-inspect "^1.8.0" - object-keys "^1.1.1" - object.assign "^4.1.1" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - escodegen@^1.14.1: version "1.14.3" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" @@ -480,150 +209,16 @@ escodegen@^1.14.1: optionalDependencies: source-map "~0.6.1" -eslint-config-airbnb-base@^13.1.0: - version "13.2.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.2.0.tgz#f6ea81459ff4dec2dda200c35f1d8f7419d57943" - integrity sha512-1mg/7eoB4AUeB0X1c/ho4vb2gYkNH8Trr/EgCT/aGmKhhG+F6vF5s8+iRBlWAzFIAphxIdp3YfEKgEl0f9Xg+w== - dependencies: - confusing-browser-globals "^1.0.5" - object.assign "^4.1.0" - object.entries "^1.1.0" - -eslint-import-resolver-node@^0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" - integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== - dependencies: - debug "^2.6.9" - resolve "^1.13.1" - -eslint-module-utils@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" - integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== - dependencies: - debug "^2.6.9" - pkg-dir "^2.0.0" - -eslint-plugin-import@^2.17.3: - version "2.22.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" - integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== - dependencies: - array-includes "^3.1.1" - array.prototype.flat "^1.2.3" - contains-path "^0.1.0" - debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.4" - eslint-module-utils "^2.6.0" - has "^1.0.3" - minimatch "^3.0.4" - object.values "^1.1.1" - read-pkg-up "^2.0.0" - resolve "^1.17.0" - tsconfig-paths "^3.9.0" - -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-utils@^1.3.1: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint@^5.16.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" - integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.9.1" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^4.0.3" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^5.0.1" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.7.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^6.2.2" - js-yaml "^3.13.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.11" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" - table "^5.2.3" - text-table "^0.2.0" - -espree@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" - integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== - dependencies: - acorn "^6.0.7" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" - -esprima@^4.0.0, esprima@^4.0.1: +esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== - esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -634,15 +229,6 @@ extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -668,60 +254,10 @@ fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - -file-match@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/file-match/-/file-match-1.0.2.tgz#c9cad265d2c8adf3a81475b0df475859069faef7" - integrity sha1-ycrSZdLIrfOoFHWw30dYWQafrvc= - dependencies: - utils-extend "^1.0.6" - -file-system@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/file-system/-/file-system-2.2.2.tgz#7d65833e3a2347dcd956a813c677153ed3edd987" - integrity sha1-fWWDPjojR9zZVqgTxncVPtPt2Yc= - dependencies: - file-match "^1.0.1" - utils-extend "^1.0.4" - -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - follow-redirects@^1.10.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.1.tgz#5f69b813376cee4fd0474a3aba835df04ab763b7" - integrity sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg== + version "1.13.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.2.tgz#dd73c8effc12728ba5cf4259d760ea5fb83e3147" + integrity sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA== forever-agent@~0.6.1: version "0.6.1" @@ -746,30 +282,6 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -get-intrinsic@^1.0.1, get-intrinsic@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.2.tgz#6820da226e50b24894e08859469dc68361545d49" - integrity sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -777,24 +289,7 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -glob@^7.1.2, glob@^7.1.3: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.7.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -graceful-fs@^4.1.2: +graceful-fs@^4.1.11: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== @@ -812,28 +307,6 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== - html-encoding-sniffer@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" @@ -850,163 +323,44 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -import-fresh@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inquirer@^6.2.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" - integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - ip-regex@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-callable@^1.1.4, is-callable@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" - integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== - -is-core-module@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-negative-zero@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== - is-potential-custom-element-name@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= -is-regex@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" - integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== - dependencies: - has-symbols "^1.0.1" - -is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== - -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== - dependencies: - has-symbols "^1.0.1" - is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -isarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.0: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsdom@^16.2.2: +jsdom@^16.4.0: version "16.4.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.4.0.tgz#36005bde2d136f73eee1a830c6d45e55408edddb" integrity sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w== @@ -1048,23 +402,11 @@ json-schema@0.2.3: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -1075,7 +417,7 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -levn@^0.3.0, levn@~0.3.0: +levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= @@ -1083,54 +425,35 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= -lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.19: +lodash@^4.17.19: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== -loglevel@^1.6.4: +loglevel@^1.7.1: version "1.7.1" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== -matrix-js-sdk@^2.4.6: - version "2.4.6" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-2.4.6.tgz#162e46dccc880889312b056e4a7b4b91c17a5842" - integrity sha512-ydU64WwAYFjaTJ7JTv/JM3HmSY7leHWm3x3j0J4KWVhDDxsLoQ/v8Tc6FwlVom9/B9VvGTk+AG3aY0zgNk8LQg== +matrix-js-sdk@^9.5.1: + version "9.5.1" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-9.5.1.tgz#f2e27b7131a8d1a75fd2a803434e63fe672415ef" + integrity sha512-01YbRuU50BDYytTZ5fdmdoQLqOGDT2F7X6vDBrYHpdaRN2jWuLCspQlOKFJKgv73gNhw9V9jfoZN+NxuwuUpUQ== dependencies: + "@babel/runtime" "^7.12.5" another-json "^0.2.0" - babel-runtime "^6.26.0" - bluebird "3.5.5" browser-request "^0.3.3" bs58 "^4.0.1" - content-type "^1.0.2" - loglevel "^1.6.4" - qs "^6.5.2" - request "^2.88.0" - unhomoglyph "^1.0.2" + content-type "^1.0.4" + loglevel "^1.7.1" + qs "^6.9.4" + request "^2.88.2" + unhomoglyph "^1.0.6" mime-db@1.45.0: version "1.45.0" @@ -1144,64 +467,12 @@ mime-types@^2.1.12, mime-types@~2.1.19: dependencies: mime-db "1.45.0" -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== +node-localstorage@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/node-localstorage/-/node-localstorage-2.1.6.tgz#7c62120beff8abbf960c858da70fddcfc336898a" + integrity sha512-yE7AycE5G2hU55d+F7Ona9nx97C+enJzWWx6jrsji7fuPZFJOvuW3X/LKKAcXRBcEIJPDOKt8ZiFWFmShR/irg== dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mkdirp@^0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" + write-file-atomic "^1.1.4" nwsapi@^2.2.0: version "2.2.0" @@ -1213,61 +484,11 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-inspect@^1.8.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" - integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== +"olm@https://packages.matrix.org/npm/olm/olm-3.2.1.tgz": + version "3.2.1" + resolved "https://packages.matrix.org/npm/olm/olm-3.2.1.tgz#d623d76f99c3518dde68be8c86618d68bc7b004a" -object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.0, object.assign@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.entries@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.3.tgz#c601c7f168b62374541a07ddbd3e2d5e4f7711a6" - integrity sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - has "^1.0.3" - -object.values@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" - integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - has "^1.0.3" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - -optionator@^0.8.1, optionator@^0.8.2: +optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -1279,108 +500,21 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" word-wrap "~1.2.3" -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - parse5@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - dependencies: - find-up "^2.1.0" - prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - psl@^1.1.28: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" @@ -1391,7 +525,7 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@^6.5.2: +qs@^6.9.4, qs@^6.9.6: version "6.9.6" resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== @@ -1401,32 +535,10 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== +regenerator-runtime@^0.13.4: + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== request-promise-core@1.1.4: version "1.1.4" @@ -1444,7 +556,7 @@ request-promise-native@^1.0.8: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.88.0, request@^2.88.2: +request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -1470,46 +582,6 @@ request@^2.88.0, request@^2.88.2: tunnel-agent "^0.6.0" uuid "^3.3.2" -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" - integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== - dependencies: - is-core-module "^2.1.0" - path-parse "^1.0.6" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - -run-async@^2.2.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -rxjs@^6.4.0: - version "6.6.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" - integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== - dependencies: - tslib "^1.9.0" - safe-buffer@^5.0.1, safe-buffer@^5.1.2: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -1527,73 +599,16 @@ saxes@^5.0.0: dependencies: xmlchars "^2.2.0" -"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.5.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" +slide@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.7" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" - integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - sshpk@^1.7.0: version "1.16.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" @@ -1614,102 +629,11 @@ stealthy-require@^1.1.1: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= -string-width@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string.prototype.trimend@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" - integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - -string.prototype.trimstart@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" - integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -strip-json-comments@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - tough-cookie@^2.3.3, tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" @@ -1734,21 +658,6 @@ tr46@^2.0.2: dependencies: punycode "^2.1.1" -tsconfig-paths@^3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" - integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.0" - strip-bom "^3.0.0" - -tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -1768,7 +677,7 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -unhomoglyph@^1.0.2: +unhomoglyph@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/unhomoglyph/-/unhomoglyph-1.0.6.tgz#ea41f926d0fcf598e3b8bb2980c2ddac66b081d3" integrity sha512-7uvcWI3hWshSADBu4JpnyYbTVc7YlhF5GDW/oPD5AxIxl34k4wXR3WDkPnzLxkN32LiTCTKMQLtKVZiwki3zGg== @@ -1780,24 +689,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -utils-extend@^1.0.4, utils-extend@^1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/utils-extend/-/utils-extend-1.0.8.tgz#ccfd7b64540f8e90ee21eec57769d0651cab8a5f" - integrity sha1-zP17ZFQPjpDuIe7Fd2nQZRyril8= - uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -1852,29 +748,19 @@ whatwg-url@^8.0.0: tr46 "^2.0.2" webidl-conversions "^6.1.0" -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== +write-file-atomic@^1.1.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" + integrity sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8= dependencies: - mkdirp "^0.5.1" + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" ws@^7.2.3: version "7.4.2" From 35899957eb0da944aa9c13afeafe3d16b272d265 Mon Sep 17 00:00:00 2001 From: vulet Date: Mon, 1 Feb 2021 17:15:01 +0800 Subject: [PATCH 48/89] chore(all): update for OLM refactor --- .gitignore | 7 ++----- README.md | 3 ++- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index d9a57e9..5fb4776 100644 --- a/.gitignore +++ b/.gitignore @@ -11,11 +11,8 @@ yarn-error.log* # Ignore config config.js -# Ignore JSON -timeline.json -notification.json -matrix_auth.json -fediverse_auth.json +# Ignore localstorage +keys # Runtime data pids diff --git a/README.md b/README.md index 0d866c0..1d07ae4 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,8 @@ Commands for the Fediverse include: # Installation -First, set up your config.js file, you can see config.example.js as an example. The Matrix & Fediverse login information is used to populate matrix_auth.json and fediverse_auth.json during your initial login. These tokens are then used on sequential logins. +First, set up your config.js file, you can see config.example.js as an example. The Matrix & Fediverse login information is then used to populate keys/matrix_auth and keys/fediverse_auth during your initial login. These tokens are then used on sequential logins. + 1. `git clone https://github.com/vulet/ligh7hau5` 2. `cd ligh7hau5 && yarn install` 3. `node main.js` From 33a262990c00d20424ad11244994403eb036a37e Mon Sep 17 00:00:00 2001 From: vulet Date: Mon, 1 Feb 2021 17:58:17 +0800 Subject: [PATCH 49/89] chore(help): update help commands --- commands/help.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/commands/help.js b/commands/help.js index f07555c..2139fc4 100644 --- a/commands/help.js +++ b/commands/help.js @@ -1,11 +1,13 @@ exports.runQuery = function (matrixClient, room) { matrixClient.sendHtmlNotice(room.roomId, '', - '
fediverse commands
' - + '+plemara [your message] : post
' + '
ligh7hau5 version 1.1.0
' + + 'fediverse commands
' + + '+post [your message] : post
' + '+redact [post id] : delete post
' + '+follow [user id] : follow
' + '+unfollow [user id] : unfollow
' + + '+media [homeserver image URL or MXC] [optional message] : post media
' + '+copy [post id] : repeat/repost/retweet
' + '+reply [post id] [content] : reply to post
' + '+tip [@user@fedi.url] [amount] : tip 10grans
' @@ -18,7 +20,8 @@ exports.runQuery = function (matrixClient, room) { + '+archive [URL] : archive content
' + '+rearchive [URL] : re-archive content
' + '+nitter [status URL] : redirect twitter to nitter, also embed tweet
' - + '+invidious [video URL] : redirect youtube to invidious, also embed description

' + + '+invidious [video URL] : redirect youtube to invidious, also embed description
' + + '+proxy [twitter/youtube]: both +nitter and +invidious commands combined

' + '
--- Contributors🐱 ---
' + 'CRYPTOMOONERS
' + 'docs by LINT
'); From 695a3bd0ee493ef04a0144471a05d9b6f2c86577 Mon Sep 17 00:00:00 2001 From: vulet Date: Mon, 1 Feb 2021 21:21:53 +0800 Subject: [PATCH 50/89] chore(readme): styling --- commands/help.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/commands/help.js b/commands/help.js index 2139fc4..d160760 100644 --- a/commands/help.js +++ b/commands/help.js @@ -1,8 +1,7 @@ exports.runQuery = function (matrixClient, room) { matrixClient.sendHtmlNotice(room.roomId, '', - '
ligh7hau5 version 1.1.0
' - + 'fediverse commands
' + '
fediverse commands
' + '+post [your message] : post
' + '+redact [post id] : delete post
' + '+follow [user id] : follow
' @@ -22,7 +21,9 @@ exports.runQuery = function (matrixClient, room) { + '+nitter [status URL] : redirect twitter to nitter, also embed tweet
' + '+invidious [video URL] : redirect youtube to invidious, also embed description
' + '+proxy [twitter/youtube]: both +nitter and +invidious commands combined

' - + '
--- Contributors🐱 ---
' + + `
ligh7hau5 version ${require('../package.json').version}
` + + '--- Contributors🐱 ---
' + 'CRYPTOMOONERS
' - + 'docs by LINT
'); + + 'docs by LINT
' +); }; From 430fb350c15ead06553f089ccf12ae8ffac434a3 Mon Sep 17 00:00:00 2001 From: vulet Date: Wed, 3 Feb 2021 12:13:05 +0800 Subject: [PATCH 51/89] fix(429): our nitter instance it too populated, switch defaults until instance bounce handling. fix(styling): use checkmark in config. --- commands/nitter.js | 2 +- config.example.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/commands/nitter.js b/commands/nitter.js index d85dee4..4146fdd 100644 --- a/commands/nitter.js +++ b/commands/nitter.js @@ -40,7 +40,7 @@ const nitter = async (instance, url) => { const card = (tweet, base, check, path) => `${tweet.name} ` + -(tweet.check ? check : '') + +(tweet.check ? `${check} ` : '') + `${tweet.date} ` + `🗨️ ${tweet.stats.replies} ` + `🔁 ${tweet.stats.retweets} ` + diff --git a/config.example.js b/config.example.js index 2f7dd52..2f909fd 100644 --- a/config.example.js +++ b/config.example.js @@ -21,7 +21,7 @@ module.exports = { userAgent: 'Mozilla/4.0 (compatible; Beep Boop)' }, nitter: { - domain: 'nitter.net', + domain: 'nitter.fdn.fr', userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', domains: [ 'nitter.net', 'www.nitter.net', 'twitter.com', 'www.twitter.com' ], check: '(✅)' From 42563ebc35fdc30ba112f17b3b1108d8c40b163d Mon Sep 17 00:00:00 2001 From: vulet Date: Sun, 14 Feb 2021 15:57:35 +0800 Subject: [PATCH 52/89] feat(matrix/fediverse): allow users to directly reply on Fediverse posts from Matrix, using on our new meta field. feat(matrix/fediverse): allow users to favorite, reblog, and redact Fediverse posts from Matrix, using m.reaction on our new meta field. feat(fediverse): add suggestions for follow/unfollow commands. refactor(matrix/fediverse): add meta field for commands by reaction, and commands by reply. refactor(fediverse): relax polling on timeline/notifs thru new handling. --- auth.js | 53 +++++++------ commands/archive.js | 31 ++------ commands/fediverse/beg.js | 20 ++--- commands/fediverse/boo.js | 16 ++-- commands/fediverse/clap.js | 16 ++-- commands/fediverse/copy.js | 16 ++-- commands/fediverse/flood.js | 53 +++++-------- commands/fediverse/follow.js | 36 +++++---- commands/fediverse/mordy.js | 22 +++--- commands/fediverse/notify.js | 61 +++++---------- commands/fediverse/pin.js | 18 ++--- commands/fediverse/post.js | 103 +++++++++++++++++++++---- commands/fediverse/redact.js | 15 ++-- commands/fediverse/status.js | 22 +++--- commands/fediverse/tip.js | 20 ++--- commands/fediverse/unfollow.js | 33 ++++---- commands/fediverse/unpin.js | 18 ++--- commands/fediverse/unreblog.js | 14 ++++ commands/fediverse/utils.js | 136 +++++++++++++++++++++++++++++++++ commands/help.js | 4 +- commands/invidious.js | 30 ++++---- commands/nitter.js | 31 ++++---- main.js | 67 +++++----------- package.json | 2 +- registrar.js | 26 ++++--- utils.js | 131 +++++++++++++++++++++++++++++++ 26 files changed, 619 insertions(+), 375 deletions(-) create mode 100644 commands/fediverse/unreblog.js create mode 100644 commands/fediverse/utils.js create mode 100644 utils.js diff --git a/auth.js b/auth.js index 16063de..ea5769c 100644 --- a/auth.js +++ b/auth.js @@ -1,46 +1,45 @@ const { LocalStorageCryptoStore } = require('matrix-js-sdk/lib/crypto/store/localStorage-crypto-store'); -module.exports.getMatrixToken = async () => { - matrixClient = sdk.createClient(config.matrix.domain); - matrixClient.loginWithPassword(config.matrix.user, config.matrix.password) - .then((response) => { - matrix_auth = { - user_id: response.user_id, - access_token: response.access_token, - device_id: response.device_id, - }; - localStorage.setItem('matrix_auth', JSON.stringify(response, null, 2)); - }).then(() => { - matrixTokenLogin(); - }) - .catch((e) => { - console.log(e); - }); -}; - -matrixTokenLogin = async () => { +const matrixTokenLogin = async () => { matrixClient = sdk.createClient({ baseUrl: config.matrix.domain, - accessToken: matrix_auth.access_token, - userId: matrix_auth.user_id, - deviceId: matrix_auth.device_id, + accessToken: matrix.auth.access_token, + userId: matrix.auth.user_id, + deviceId: matrix.auth.device_id, sessionStore: new sdk.WebStorageSessionStore(localStorage), cryptoStore: new LocalStorageCryptoStore(localStorage), }); matrixClient.initCrypto() - .then(() => { - if(!localStorage.getItem('crypto.device_data')) + .then(() => { + if (!localStorage.getItem('crypto.device_data')) { return console.log( - '====================================================\n'+ - 'New OLM Encryption Keys created, please restart ligh7hau5.\n'+ - '====================================================' + '====================================================\n' + + 'New OLM Encryption Keys created, please restart ligh7hau5.\n' + + '====================================================', ); + } matrixClient.startClient(); }); }; module.exports.matrixTokenLogin = matrixTokenLogin; +module.exports.getMatrixToken = async () => { + matrixClient = sdk.createClient(config.matrix.domain); + matrixClient.loginWithPassword(config.matrix.user, config.matrix.password) + .then((response) => { + matrix.auth = { + user_id: response.user_id, + access_token: response.access_token, + device_id: response.device_id, + }; + localStorage.setItem('matrix_auth', JSON.stringify(response, null, 2)); + }).then(() => matrixTokenLogin()) + .catch((e) => { + console.log(e); + }); +}; + module.exports.registerFediverseApp = async () => { axios.post(`${config.fediverse.domain}/api/v1/apps`, { diff --git a/commands/archive.js b/commands/archive.js index 6ca99dd..a8802c3 100644 --- a/commands/archive.js +++ b/commands/archive.js @@ -3,23 +3,6 @@ const qs = require('qs'); const sleep = ms => new Promise(r => setTimeout(r, ms)); -const editNoticeHTML = (client, roomId, event, html, plain) => client.sendMessage(roomId, { - body: ` * ${plain || html.replace(/<[^<]+?>/g, '')}`, - formatted_body: ` * ${html}`, - format: 'org.matrix.custom.html', - msgtype: 'm.notice', - 'm.new_content': { - body: plain || html.replace(/<[^<]+?>/g, ''), - formatted_body: html, - format: 'org.matrix.custom.html', - msgtype: 'm.notice' - }, - 'm.relates_to': { - rel_type: 'm.replace', - event_id: event.event_id - } -}); - const headers = ({ domain, userAgent }) => ({ 'Host': `${domain}`, 'User-Agent': `${userAgent}` @@ -49,7 +32,7 @@ const arc1Str = str => `Archiving page ${str}`; const arc2Str = (str, title, date) => `Archived page ${str} [${date}]
${title}`; const arc3Str = str => `Timed out ${str}`; -const run = async (matrixClient, { roomId }, userInput, rearchive) => { +const run = async (roomId, userInput, rearchive) => { const instance = axios.create({ baseURL: `https://${config.archive.domain}`, headers: headers(config.archive), @@ -62,29 +45,29 @@ const run = async (matrixClient, { roomId }, userInput, rearchive) => { reply = await matrixClient.sendHtmlNotice(roomId, '', reqStr(userInput)); const { refresh, id, title, date } = await archive(instance, userInput, rearchive); if (id) - return await editNoticeHTML(matrixClient, roomId, reply, arc2Str(`${config.archive.domain}${id}`, title, date)); + return await matrix.utils.editNoticeHTML(roomId, reply, arc2Str(`${config.archive.domain}${id}`, title, date)); if (refresh) { const path = refresh.split(`https://${config.archive.domain}`); if (!path[1]) throw refresh; - await editNoticeHTML(matrixClient, roomId, reply, arc1Str(refresh)); + await matrix.utils.editNoticeHTML(roomId, reply, arc1Str(refresh)); let tries = 30; while (tries--) { await sleep(10000); const { title, date, id } = await archive(instance, userInput); if (rearchive == false && title !== undefined) - return await editNoticeHTML(matrixClient, roomId, reply, arc2Str(`${config.archive.domain}${id}`, title, date)); + return await matrix.utils.editNoticeHTML(roomId, reply, arc2Str(`${config.archive.domain}${id}`, title, date)); const { request: { path: reqPath }, headers: { 'memento-datetime': rearchiveDate } } = await instance({ method: 'HEAD', url: path[1] }) .catch(e => ({ request: { path: path[1] } })); if (rearchive == true && reqPath !== path[1]) - return await editNoticeHTML(matrixClient, roomId, reply, arc2Str(`${config.archive.domain}${reqPath}`, title, rearchiveDate)); + return await matrix.utils.editNoticeHTML(roomId, reply, arc2Str(`${config.archive.domain}${reqPath}`, title, rearchiveDate)); } - return await editNoticeHTML(matrixClient, roomId, reply, arc3Str(refresh)); + return await matrix.utils.editNoticeHTML(roomId, reply, arc3Str(refresh)); } throw 'sad'; } catch (e) { const sad = `Sad!
${`${e}`.replace(/<[^<]+?>/g, '').substr(0, 100)}`; if (reply) - editNoticeHTML(matrixClient, roomId, reply, sad, 'sad').catch(() => {}); + matrix.utils.editNoticeHTML(roomId, reply, sad, 'sad').catch(() => {}); else matrixClient.sendHtmlNotice(roomId, 'sad', sad).catch(() => {}); } diff --git a/commands/fediverse/beg.js b/commands/fediverse/beg.js index a59b0bf..773b1d6 100644 --- a/commands/fediverse/beg.js +++ b/commands/fediverse/beg.js @@ -1,19 +1,15 @@ -exports.runQuery = function (matrixClient, room) { +exports.runQuery = function (roomId, event) { axios({ method: 'POST', url: `${config.fediverse.domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, - data: { status: `@10grans@fedi.cc beg` }, - }).then((response) => { - matrixClient.sendHtmlNotice(room.roomId, - '', - ` -
You have begged for 10grans.
- (id: ${response.data.id}
) -

`); + headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + data: { status: '@10grans@fedi.cc beg' }, }) + .then(() => { + matrix.utils.addReact(event, '✅'); + }) .catch((e) => { - matrixClient.sendHtmlNotice(room.roomId, - '', `${e}`); + matrix.utils.addReact(event, '❌'); + matrix.utils.sendError(event, roomId, e); }); }; diff --git a/commands/fediverse/boo.js b/commands/fediverse/boo.js index a77b3a0..5605eef 100644 --- a/commands/fediverse/boo.js +++ b/commands/fediverse/boo.js @@ -1,16 +1,14 @@ -exports.runQuery = function (matrixClient, room, userInput) { +exports.runQuery = function (roomId, event, userInput) { axios({ method: 'POST', url: `${config.fediverse.domain}/api/v1/statuses/${userInput}/unfavourite`, - headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, - }).then((response) => { - matrixClient.sendHtmlNotice(room.roomId, - '', - `You have boo'd: ${response.data.account.acct} -
${response.data.content}`); + headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, }) + .then(() => { + matrix.utils.addReact(event, '✅'); + }) .catch((e) => { - matrixClient.sendHtmlNotice(room.roomId, - '', `${e}`); + matrix.utils.addReact(event, '❌'); + matrix.utils.sendError(event, roomId, e); }); }; diff --git a/commands/fediverse/clap.js b/commands/fediverse/clap.js index 7664855..715c9ad 100644 --- a/commands/fediverse/clap.js +++ b/commands/fediverse/clap.js @@ -1,16 +1,14 @@ -exports.runQuery = function (matrixClient, room, userInput) { +exports.runQuery = function (roomId, event, userInput) { axios({ method: 'POST', url: `${config.fediverse.domain}/api/v1/statuses/${userInput}/favourite`, - headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, - }).then((response) => { - matrixClient.sendHtmlNotice(room.roomId, - '', - `You have clapped: ${response.data.account.acct}: -
${response.data.content}`); + headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, }) + .then(() => { + matrix.utils.addReact(event, '✅'); + }) .catch((e) => { - matrixClient.sendHtmlNotice(room.roomId, - '', `${e}`); + matrix.utils.addReact(event, '❌'); + matrix.utils.sendError(event, roomId, e); }); }; diff --git a/commands/fediverse/copy.js b/commands/fediverse/copy.js index e15341e..974a11b 100644 --- a/commands/fediverse/copy.js +++ b/commands/fediverse/copy.js @@ -1,16 +1,14 @@ -exports.runQuery = function (matrixClient, room, userInput) { +exports.runQuery = function (roomId, event, userInput) { axios({ method: 'POST', url: `${config.fediverse.domain}/api/v1/statuses/${userInput}/reblog`, - headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, - }).then((response) => { - matrixClient.sendHtmlNotice(room.roomId, - '', - `You have repeated: -
${response.data.content}`); + headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, }) + .then(() => { + matrix.utils.addReact(event, '✅'); + }) .catch((e) => { - matrixClient.sendHtmlNotice(room.roomId, - '', `${e}`); + matrix.utils.addReact(event, '❌'); + matrix.utils.sendError(event, roomId, e); }); }; diff --git a/commands/fediverse/flood.js b/commands/fediverse/flood.js index 8d214a5..eec2f4a 100644 --- a/commands/fediverse/flood.js +++ b/commands/fediverse/flood.js @@ -1,39 +1,26 @@ -exports.runQuery = function (matrixClient, room) { +exports.runQuery = function (roomId) { setInterval(() => { axios({ method: 'GET', url: `${config.fediverse.domain}/api/v1/timelines/home`, - headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, - }).then((events) => { - let lastEvent = JSON.parse(localStorage.getItem('timeline')); - localStorage.setItem('timeline', JSON.stringify(events.data[0].created_at, null, 2)); - - if (lastEvent !== events.data[0].created_at) { - if (events.data[0].reblog === null) { - matrixClient.sendHtmlNotice(room.roomId, - '', - `${events.data[0].account.acct} -
${events.data[0].content}
- ${events.data[0].media_attachments.map(media => - ``+`${media.description}`+'' - ).join('
')} - (id: ${events.data[0].id}) ${registrar.media.visibilityEmoji(events.data[0].visibility)} -
`); - } else { - matrixClient.sendHtmlNotice(room.roomId, - '', - ` - ${events.data[0].account.acct} - has repeated: -
${events.data[0].reblog.account.acct}
-
${events.data[0].content}
- ${events.data[0].media_attachments.map(media => - ``+`Proxied image, no description available.`+'' - ).join('
')} -
(id: ${events.data[0].id}) ${registrar.media.visibilityEmoji(events.data[0].visibility)} -
`); + headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + }) + .then((res) => { + let past = JSON.parse(localStorage.getItem('timeline')); + if (past.length === 0) past = res.data; + const events = res.data; + const len = events.length; + for (let i = len - 1; i >= 0; i--) { + if (past.findIndex((x) => x.created_at === events[i].created_at) === -1) { + if (events[i].created_at < past.slice(18, 19)[0].created_at) return; + events[i].label = 'status'; + fediverse.utils.formatter(events[i], roomId); + } } - } - }); - }, 8000); + localStorage.setItem('timeline', JSON.stringify(events, null, 2)); + }) + .catch((e) => { + matrix.utils.sendError(null, roomId, e); + }); + }, 30000); }; diff --git a/commands/fediverse/follow.js b/commands/fediverse/follow.js index a60cd1e..ebebcd0 100644 --- a/commands/fediverse/follow.js +++ b/commands/fediverse/follow.js @@ -1,21 +1,19 @@ -const axios = require('axios'); -const fediverse_auth = JSON.parse(localStorage.getItem('fediverse_auth')); - -exports.runQuery = function (matrixClient, room, userInput) { - axios.get(`${config.fediverse.domain}/api/v1/accounts/${userInput}`).then((findUID) => { - axios({ - method: 'POST', - url: `${config.fediverse.domain}/api/v1/accounts/${findUID.data.id}/follow`, - headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, - }) - .then((response) => { - matrixClient.sendHtmlNotice(room.roomId, - '', - `Subscribed: -
${config.fediverse.domain}/${response.data.id}`); - }); - }).catch((e) => { - matrixClient.sendHtmlNotice(room.roomId, - '', `${e}`); +exports.runQuery = async function (roomId, event, userInput) { + const loadingString = `Searching for ${userInput}...`; + const original = await matrixClient.sendHtmlNotice(roomId, `${loadingString}`, `${loadingString}`); + const found = []; + const suggest = []; + axios({ + method: 'GET', + url: `${config.fediverse.domain}/api/v2/search?q=${userInput}&type=accounts`, + headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + }).then((findUserId) => { + const results = findUserId.data.accounts; + const len = results.length; + for (let i = 0; i < len; i++) results[i].acct !== userInput ? suggest.push(results[i].acct) : found.push(results[i]); + if (found.length > 0) return fediverse.utils.follow(roomId, found, event, original); + if (suggest.length > 0) msg = `${userInput} was not found, suggesting:
${suggest.join('
')}
`; + if (suggest.length === 0) msg = `No results found for: ${userInput}.`; + return matrix.utils.editNoticeHTML(roomId, original, msg); }); }; diff --git a/commands/fediverse/mordy.js b/commands/fediverse/mordy.js index 88a4ae0..0b0ce33 100644 --- a/commands/fediverse/mordy.js +++ b/commands/fediverse/mordy.js @@ -1,24 +1,20 @@ -exports.runQuery = function (matrixClient, room, userInput) { +exports.runQuery = function (roomId, event, userInput) { axios({ method: 'POST', url: `${config.fediverse.domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, + headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, data: { status: `@mordekai ${userInput}`, - content_type: `text/markdown`, + content_type: 'text/markdown', visibility: 'unlisted', - expires_in: '7200' + expires_in: '7200', }, - }).then((response) => { - matrixClient.sendHtmlNotice(room.roomId, - '', - ` -
${response.data.content}
- (id: ${response.data.id}) -

`); }) + .then(() => { + matrix.utils.addReact(event, '✅'); + }) .catch((e) => { - matrixClient.sendHtmlNotice(room.roomId, - '', `${e}`); + matrix.utils.addReact(event, '❌'); + matrix.utils.sendError(event, roomId, e); }); }; diff --git a/commands/fediverse/notify.js b/commands/fediverse/notify.js index e725ac2..04a3f18 100644 --- a/commands/fediverse/notify.js +++ b/commands/fediverse/notify.js @@ -1,47 +1,26 @@ -exports.runQuery = function (matrixClient, room) { +exports.runQuery = function (roomId) { setInterval(() => { axios({ method: 'GET', url: `${config.fediverse.domain}/api/v1/notifications`, - headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, - }).then((events) => { - let lastEvent = JSON.parse(localStorage.getItem('notifications')); - localStorage.setItem('notifications', JSON.stringify(events.data[0].created_at, null, 2)); - if (lastEvent !== events.data[0].created_at) { - if (events.data[0].type === 'follow') { - matrixClient.sendHtmlNotice(room.roomId, - '', - ` - ${events.data[0].account.acct} - has followed you. -
${events.data[0].account.note}`); - } else if (events.data[0].type === 'favourite') { - matrixClient.sendHtmlNotice(room.roomId, - '', - ` - ${events.data[0].account.acct} - has favorited - your post: -
${events.data[0].status.content}
`); - } else if (events.data[0].type === 'mention') { - matrixClient.sendHtmlNotice(room.roomId, - '', - ` - ${events.data[0].account.acct} - has mentioned - you:
${events.data[0].status.content} -
(id: ${events.data[0].status.id}) ${registrar.media.visibilityEmoji(events.data[0].status.visibility)}
-
`); - } else if (events.data[0].type === 'reblog') { - matrixClient.sendHtmlNotice(room.roomId, - '', - ` - ${events.data[0].account.acct} - has repeated - your post:
-
${events.data[0].status.content}
`); + headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + }) + .then((res) => { + let past = JSON.parse(localStorage.getItem('notifications')); + if (past.length === 0) past = res.data; + const events = res.data; + const len = events.length; + for (let i = len - 1; i >= 0; i--) { + if (past.findIndex((x) => x.created_at === events[i].created_at) === -1) { + if (events[i].created_at < past.slice(18, 19)[0].created_at) return; + events[i].label = 'notifications'; + fediverse.utils.formatter(events[i], roomId); + } } - } - }); - }, 8000); + localStorage.setItem('notifications', JSON.stringify(events, null, 2)); + }) + .catch((e) => { + matrix.utils.sendError(null, roomId, e); + }); + }, 30000); }; diff --git a/commands/fediverse/pin.js b/commands/fediverse/pin.js index 0b45912..ebca9ca 100644 --- a/commands/fediverse/pin.js +++ b/commands/fediverse/pin.js @@ -1,18 +1,14 @@ -exports.runQuery = function (matrixClient, room, userInput) { +exports.runQuery = function (roomId, event, userInput) { axios({ method: 'POST', url: `${config.fediverse.domain}/api/v1/statuses/${userInput}/pin`, - headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, - }).then((response) => { - matrixClient.sendHtmlNotice(room.roomId, - '', - `Pinned: -
- ${response.data.content} -
`); + headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, }) + .then(() => { + matrix.utils.addReact(event, '✅'); + }) .catch((e) => { - matrixClient.sendHtmlNotice(room.roomId, - '', `${e}`); + matrix.utils.addReact(event, '❌'); + matrix.utils.sendError(event, roomId, e); }); }; diff --git a/commands/fediverse/post.js b/commands/fediverse/post.js index 7f0b0db..2536333 100644 --- a/commands/fediverse/post.js +++ b/commands/fediverse/post.js @@ -1,19 +1,90 @@ -exports.runQuery = function (matrixClient, room, userInput) { - axios({ +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 (roomId, content, replyId, mediaURL, subject) => { + let mediaId = null; + if (mediaURL) { + const media = await mediaDownload(mediaURL, config.fediverse.mimetypes); + mediaId = await mediaUpload(config.fediverse, media); + } + const response = await axios({ method: 'POST', url: `${config.fediverse.domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, - data: { status: userInput, content_type: `text/markdown` }, - }).then((response) => { - matrixClient.sendHtmlNotice(room.roomId, - '', - ` -
${response.data.content}
- (id: ${response.data.id}) -

`); - }) - .catch((e) => { - matrixClient.sendHtmlNotice(room.roomId, - '', `${e}`); - }); + 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 fediverse.utils.sendEventWithMeta(roomId, `${response.data.id}`, `redact ${response.data.id}`); +}; + +exports.runQuery = async (roomId, 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 ? config.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(roomId, chunks.join(' '), replyId, mediaURL, subject); + } catch (e) { + return matrixClient.sendHtmlNotice(roomId, 'Sad!', 'Sad!').catch(() => {}); + } }; diff --git a/commands/fediverse/redact.js b/commands/fediverse/redact.js index 75ead79..d1ca217 100644 --- a/commands/fediverse/redact.js +++ b/commands/fediverse/redact.js @@ -1,15 +1,14 @@ -exports.runQuery = function (matrixClient, room, userInput) { +exports.runQuery = function (roomId, event, userInput) { axios({ method: 'DELETE', url: `${config.fediverse.domain}/api/v1/statuses/${userInput}`, - headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, - }).then((response) => { - matrixClient.sendHtmlNotice(room.roomId, - '', - '
Redacted. { + matrix.utils.addReact(event, '✅'); + }) .catch((e) => { - matrixClient.sendHtmlNotice(room.roomId, - '', `${e}`); + matrix.utils.addReact(event, '❌'); + matrix.utils.sendError(event, roomId, e); }); }; diff --git a/commands/fediverse/status.js b/commands/fediverse/status.js index 0c042a8..a15845e 100644 --- a/commands/fediverse/status.js +++ b/commands/fediverse/status.js @@ -1,17 +1,15 @@ -exports.runQuery = function (matrixClient, room, userInput, ) { +exports.runQuery = function (roomId, event, userInput) { axios({ method: 'GET', url: `${config.fediverse.domain}/api/v1/statuses/${userInput}`, - headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, - }).then((response) => { - matrixClient.sendHtmlNotice(room.roomId, - '', - `${response.data.account.acct} -
${response.data.content}
- ${response.data.media_attachments.map(media => - `${media.description}`) - .join('
')} - (id: ${response.data.id}) -
`); + headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + }) + .then((response) => { + response.label = 'status'; + fediverse.utils.formatter(response, roomId); + }) + .catch((e) => { + matrix.utils.addReact(event, '❌'); + matrix.utils.sendError(event, roomId, e); }); }; diff --git a/commands/fediverse/tip.js b/commands/fediverse/tip.js index 0ddbb38..d75932d 100644 --- a/commands/fediverse/tip.js +++ b/commands/fediverse/tip.js @@ -1,19 +1,15 @@ -exports.runQuery = function (matrixClient, room, address, flaggedInput) { +exports.runQuery = function (roomId, address, flaggedInput, event) { axios({ method: 'POST', url: `${config.fediverse.domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, - data: { status: `@10grans@fedi.cc tip `+ flaggedInput + ` to `+address }, - }).then((response) => { - matrixClient.sendHtmlNotice(room.roomId, - '', - ` -
Tipping ${response.data.content}
- (id: ${response.data.id}) -

`); + headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + data: { status: `@10grans@fedi.cc tip ${flaggedInput} to ${address}` }, }) + .then(() => { + matrix.utils.addReact(event, '✅'); + }) .catch((e) => { - matrixClient.sendHtmlNotice(room.roomId, - '', `${e}`); + matrix.utils.addReact(event, '❌'); + matrix.utils.sendError(event, roomId, e); }); }; diff --git a/commands/fediverse/unfollow.js b/commands/fediverse/unfollow.js index e45923f..9f5cd6b 100644 --- a/commands/fediverse/unfollow.js +++ b/commands/fediverse/unfollow.js @@ -1,18 +1,19 @@ -exports.runQuery = function (matrixClient, room, userInput) { - axios.get(`${config.fediverse.domain}/api/v1/accounts/${userInput}`).then((findUID) => { - axios({ - method: 'POST', - url: `${config.fediverse.domain}/api/v1/accounts/${findUID.data.id}/unfollow`, - headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, - }) - .then((response) => { - matrixClient.sendHtmlNotice(room.roomId, - '', - `Unsubscribed: -
${config.fediverse.domain}/${response.data.id}`); - }); - }).catch((e) => { - matrixClient.sendHtmlNotice(room.roomId, - '', `${e}`); +exports.runQuery = async function (roomId, event, userInput) { + const loadingString = `Searching for ${userInput}...`; + const original = await matrixClient.sendHtmlNotice(roomId, `${loadingString}`, `${loadingString}`); + const found = []; + const suggest = []; + axios({ + method: 'GET', + url: `${config.fediverse.domain}/api/v2/search?q=${userInput}&type=accounts`, + headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + }).then((findUserId) => { + const results = findUserId.data.accounts; + const len = results.length; + for (let i = 0; i < len; i++) results[i].acct !== userInput ? suggest.push(results[i].acct) : found.push(results[i]); + if (found.length > 0) return fediverse.utils.unfollow(roomId, found, event, original); + if (suggest.length > 0) msg = `${userInput} was not found, suggesting:
${suggest.join('
')}
`; + if (suggest.length === 0) msg = `No results found for: ${userInput}.`; + return matrix.utils.editNoticeHTML(roomId, original, msg); }); }; diff --git a/commands/fediverse/unpin.js b/commands/fediverse/unpin.js index 2e14690..de032a1 100644 --- a/commands/fediverse/unpin.js +++ b/commands/fediverse/unpin.js @@ -1,18 +1,14 @@ -exports.runQuery = function (matrixClient, room, userInput) { +exports.runQuery = function (roomId, event, userInput) { axios({ method: 'POST', url: `${config.fediverse.domain}/api/v1/statuses/${userInput}/unpin`, - headers: { Authorization: `Bearer ${fediverse_auth.access_token}` }, - }).then((response) => { - matrixClient.sendHtmlNotice(room.roomId, - '', - `Unpinned: -
- ${response.data.content} -
`); + headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, }) + .then(() => { + matrix.utils.addReact(event, '✅'); + }) .catch((e) => { - matrixClient.sendHtmlNotice(room.roomId, - '', `${e}`); + matrix.utils.addReact(event, '❌'); + matrix.utils.sendError(event, roomId, e); }); }; diff --git a/commands/fediverse/unreblog.js b/commands/fediverse/unreblog.js new file mode 100644 index 0000000..8c7dee8 --- /dev/null +++ b/commands/fediverse/unreblog.js @@ -0,0 +1,14 @@ +exports.runQuery = function (roomId, event, userInput) { + axios({ + method: 'POST', + url: `${config.fediverse.domain}/api/v1/statuses/${userInput}/unreblog`, + headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + }) + .then(() => { + matrix.utils.addReact(event, '✅'); + }) + .catch((e) => { + matrix.utils.addReact(event, '❌'); + matrix.utils.sendError(event, roomId, e); + }); +}; diff --git a/commands/fediverse/utils.js b/commands/fediverse/utils.js new file mode 100644 index 0000000..782428b --- /dev/null +++ b/commands/fediverse/utils.js @@ -0,0 +1,136 @@ +const sendEventWithMeta = async (roomId, content, meta) => { + await matrixClient.sendEvent(roomId, 'm.room.message', { + body: content.replace(/<[^<]+?>/g, ''), + msgtype: 'm.notice', + formatted_body: content, + meta: meta, + format: 'org.matrix.custom.html', + }); +}; + +const hasAttachment = (res) => { + if (!res.media_attachments) return '
'; + return res.media_attachments.map((media) => { + const mediaURL = new URL(media.remote_url); + media.name = new URLSearchParams(mediaURL.search).get('name') || 'Unknown file name.'; + return `File attachment: ${media.name}
`; + }).join('
'); +}; + +const notifyFormatter = (res, roomId) => { + userDetails = ` + ${res.account.acct}`; + switch (res.type) { + case 'follow': + fediverse.auth.me !== res.account.url ? res.meta = 'follow' : res.meta = 'redact'; + meta = `${res.meta} ${res.account.id}`; + content = `${userDetails} + has followed you. +
${res.account.note}
`; + sendEventWithMeta(roomId, content, meta); + break; + case 'favourite': + fediverse.auth.me !== res.account.url ? res.meta = 'favourite' : res.meta = 'redact'; + meta = `${res.meta} ${res.status.id}`; + content = `${userDetails} + has favorited + your post: +
${res.status.content}
`; + sendEventWithMeta(roomId, content, res.meta); + break; + case 'mention': + fediverse.auth.me !== res.account.url ? res.meta = 'mention' : res.meta = 'redact'; + meta = `${res.meta} ${res.status.id}`; + content = `${userDetails} + has mentioned + you:
${res.status.content} +
(id: ${res.status.id}) ${registrar.post.visibilityEmoji(res.status.visibility)}
+
`; + sendEventWithMeta(roomId, content, meta); + break; + case 'reblog': + fediverse.auth.me !== res.account.url ? res.meta = 'reblog' : res.meta = 'redact'; + meta = `${res.meta} ${res.status.id}`; + content = `${userDetails} + has repeated + your post:
+
${res.status.content}
`; + sendEventWithMeta(roomId, content, meta); + break; + default: + throw 'Unknown notification type.'; + } +}; + +const isOriginal = (res, roomId) => { + if (res.data) res = res.data; + userDetails = ` + ${res.account.acct}`; + fediverse.auth.me !== res.account.url ? res.meta = 'status' : res.meta = 'redact'; + meta = `${res.meta} ${res.id}`; + content = `${userDetails} +
${res.content}
+ ${hasAttachment(res)} +
(id: ${res.id}) ${registrar.post.visibilityEmoji(res.visibility)} +
`; + sendEventWithMeta(roomId, content, meta); +}; + +const isReblog = (res, roomId) => { + if (res.data) res = res.data; + userDetails = ` + ${res.account.acct}`; + fediverse.auth.me !== res.account.url ? res.meta = 'status' : res.meta = 'unreblog'; + meta = `${res.meta} ${res.reblog.id}`; + content = `${userDetails} + has repeated + ${res.reblog.account.acct}'s post: +
${res.content}
+ ${hasAttachment(res)} +
(id: ${res.reblog.id}) ${registrar.post.visibilityEmoji(res.visibility)} +
`; + sendEventWithMeta(roomId, content, meta); +}; + +module.exports.sendEventWithMeta = sendEventWithMeta; + +module.exports.formatter = (res, roomId) => { + const filtered = (res.label === 'notifications') + ? notifyFormatter(res, roomId) + : (res.reblog == null) + ? isOriginal(res, roomId) + : isReblog(res, roomId); + return filtered; +}; + +module.exports.follow = (roomId, account, event, original) => { + axios({ + method: 'POST', + url: `${config.fediverse.domain}/api/v1/accounts/${account[0].id}/follow`, + headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + }) + .then(() => { + matrix.utils.addReact(event, '✅'); + matrix.utils.editNoticeHTML(roomId, original, `Followed ${account[0].acct}.`); + }) + .catch((e) => { + matrix.utils.addReact(event, '❌'); + matrix.utils.sendError(event, roomId, e); + }); +}; + +module.exports.unfollow = (roomId, account, event, original) => { + axios({ + method: 'POST', + url: `${config.fediverse.domain}/api/v1/accounts/${account[0].id}/unfollow`, + headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + }) + .then(() => { + matrix.utils.addReact(event, '✅'); + matrix.utils.editNoticeHTML(roomId, original, `Unfollowed ${account[0].acct}.`); + }) + .catch((e) => { + matrix.utils.addReact(event, '❌'); + matrix.utils.sendError(event, roomId, e); + }); +}; diff --git a/commands/help.js b/commands/help.js index d160760..678e7f1 100644 --- a/commands/help.js +++ b/commands/help.js @@ -1,5 +1,5 @@ -exports.runQuery = function (matrixClient, room) { - matrixClient.sendHtmlNotice(room.roomId, +exports.runQuery = function (roomId) { + matrixClient.sendHtmlNotice(roomId, '', '
fediverse commands
' + '+post [your message] : post
' diff --git a/commands/invidious.js b/commands/invidious.js index 2f5f09e..c1fe773 100644 --- a/commands/invidious.js +++ b/commands/invidious.js @@ -1,6 +1,6 @@ const headers = ({ domain, userAgent }) => ({ - 'Host': `${domain}`, - 'User-Agent': `${userAgent}` + Host: `${domain}`, + 'User-Agent': `${userAgent}`, }); const invidious = async (instance, url) => { @@ -14,7 +14,7 @@ const invidious = async (instance, url) => { author: video.author, views: video.viewCount, likes: video.likeCount, - dislikes: video.dislikeCount + dislikes: video.dislikeCount, }; }; @@ -29,28 +29,26 @@ const card = (video, base, path) => `
(${video.date})

`; -const run = async (matrixClient, { roomId }, userInput) => { +const run = async (roomId, userInput) => { const instance = axios.create({ baseURL: `https://${config.invidious.domain}/api/v1/videos/`, headers: headers(config.invidious), transformResponse: [], - timeout: 10 * 1000 + timeout: 10 * 1000, }); const video = await invidious(instance, userInput); return await matrixClient.sendHtmlNotice(roomId, '', card(video, `https://${config.invidious.domain}`, userInput)); -} +}; -exports.runQuery = async (client, room, userInput) => { +exports.runQuery = async (roomId, event, userInput) => { try { const url = new URL(userInput); - if(!config.invidious.domains.includes(url.hostname)) throw ''; - if(/^\/[\w-]{11}$/.test(url.pathname)) - return await run(client, room, url.pathname.slice(1)); - const params = new URLSearchParams(url.search).get("v"); - if(!/^[\w-]{11}$/.test(params)) throw ''; - return await run(client, room, params); - } catch(e) { - console.log(e); - return client.sendHtmlNotice(room.roomId, 'Sad!', `Sad!`).catch(()=>{}); + if (!config.invidious.domains.includes(url.hostname)) throw ''; + if (/^\/[\w-]{11}$/.test(url.pathname)) return await run(roomId, url.pathname.slice(1)); + const params = new URLSearchParams(url.search).get('v'); + if (!/^[\w-]{11}$/.test(params)) throw ''; + return await run(roomId, params); + } catch (e) { + return matrixClient.sendHtmlNotice(roomId, 'Sad!', 'Sad!').catch(() => {}); } }; diff --git a/commands/nitter.js b/commands/nitter.js index 4146fdd..823272d 100644 --- a/commands/nitter.js +++ b/commands/nitter.js @@ -1,15 +1,15 @@ -const { JSDOM } = require("jsdom"); +const { JSDOM } = require('jsdom'); const headers = ({ domain, userAgent }) => ({ - 'Host': `${domain}`, - 'User-Agent': `${userAgent}` + Host: `${domain}`, + 'User-Agent': `${userAgent}`, }); const nitter = async (instance, url) => { const req = await instance({ method: 'GET', url }); if (req.statusText !== 'OK') throw req; const dom = new JSDOM(req.data); - const document = dom.window.document; + const { document } = dom.window; const tweet = document.querySelector('#m'); const stats = tweet.querySelectorAll('.tweet-body > .tweet-stats .icon-container'); const quote = tweet.querySelector('.tweet-body > .quote'); @@ -33,8 +33,8 @@ const nitter = async (instance, url) => { stats: { replies: stats[0].textContent.trim(), retweets: stats[1].textContent.trim(), - favorites: stats[2].textContent.trim() - } + favorites: stats[2].textContent.trim(), + }, }; }; @@ -49,24 +49,25 @@ const card = (tweet, base, check, path) => (tweet.hasAttachments ? '
This tweet has attached media.
' : '') + (tweet.isReply ? tweet.isReply === 'unavailable' ? '
Replied Tweet is unavailable
' : `
Replied Tweet
${tweet.isReply.text.replace('\n', '
')}
` : '') + (tweet.quote ? `
Quoted Tweet
${tweet.quote.text.replace('\n', '
')}
` : ''); -const run = async (matrixClient, { roomId }, userInput) => { + +const run = async (roomId, userInput) => { const instance = axios.create({ baseURL: `https://${config.nitter.domain}`, headers: headers(config.nitter), transformResponse: [], - timeout: 10 * 1000 + timeout: 10 * 1000, }); const tweet = await nitter(instance, userInput); return await matrixClient.sendHtmlNotice(roomId, '', card(tweet, `https://${config.nitter.domain}`, config.nitter.check, userInput)); -} +}; -exports.runQuery = async (client, room, userInput) => { +exports.runQuery = async (roomId, event, userInput) => { try { const url = new URL(userInput); - if(!config.nitter.domains.includes(url.hostname)) throw ''; - if(!/^\/[^/]+\/status\/\d+\/?$/.test(url.pathname)) throw ''; - return await run(client, room, url.pathname); - } catch(e) { - return client.sendHtmlNotice(room.roomId, 'Sad!', `Sad!`).catch(()=>{}); + if (!config.nitter.domains.includes(url.hostname)) throw ''; + if (!/^\/[^/]+\/status\/\d+\/?$/.test(url.pathname)) throw ''; + return await run(roomId, url.pathname); + } catch (e) { + return matrixClient.sendHtmlNotice(roomId, 'Sad!', 'Sad!').catch(() => {}); } }; diff --git a/main.js b/main.js index 18f76dd..e96f1f5 100644 --- a/main.js +++ b/main.js @@ -1,7 +1,7 @@ global.registrar = require('./registrar.js'); -matrix_auth.access_token ? auth.matrixTokenLogin() : auth.getMatrixToken(); -if (!fediverse_auth.access_token && config.fediverse.username) auth.registerFediverseApp(); +matrix.auth.access_token ? auth.matrixTokenLogin() : auth.getMatrixToken(); +if (!fediverse.auth.access_token && config.fediverse.username) auth.registerFediverseApp(); matrixClient.on('RoomMember.membership', (event, member) => { if (member.membership === 'invite' && member.userId === matrixClient.credentials.userId) { @@ -17,57 +17,26 @@ matrixClient.on('RoomMember.membership', (event, member) => { } }); -matrixClient.on('Room.timeline', async function (event, room, member, toStartOfTimeline) { +matrixClient.on('event', async (event) => { + if (event.getSender() === matrixClient.credentials.userId) return matrix.utils.selfReact(event); + if (!event.getContent()['m.relates_to']) return; + if (event.event.unsigned.age > 10000) return; + return event.getType() === 'm.room.message' + ? matrix.utils.handleReply(event) : matrix.utils.handleReact(event); +}); + +matrixClient.on('Room.timeline', async (event, member, toStartOfTimeline) => { if (toStartOfTimeline) return; if (event.isEncrypted()) await event._decryptionPromise; if (event.getType() !== 'm.room.message') return; if (event.getSender() === matrixClient.credentials.userId) return; if (event.event.unsigned.age > 10000) return; - if (event.getContent().body.charAt(0) === '+') { - console.log(`Logs: ${event.event.sender} - ${event.getContent().body}`); - let args = event.getContent().body.slice(1).trim().split(/ +/g); - let command = args.shift().toLowerCase(); - const userInput = args.join(' '); - const flaggedInput = userInput.substr(userInput.indexOf(' ') + 1); - const address = args.slice(0, 1).join(' ').replace(/"/g, ''); - - args = []; - - switch(command) { - case 'config': - return; - case 'help': case 'beg': case 'flood': case 'asdf': - args.push(matrixClient, room); - break; - case 'tip': - args.push(matrixClient, room, address, flaggedInput); - break; - case 'archive': case 'rearchive': - args.push(matrixClient, room, userInput, !!~command.indexOf('re')); - command = 'archive'; - break; - case 'post': case 'reply': case 'media': case 'mediareply': - case 'random': case 'randomreply': case 'randommedia': case 'randommediareply': - args.push(matrixClient, room, userInput, { - isReply: !!~command.indexOf('reply'), - hasMedia: !!~command.indexOf('media'), - hasSubject: !!~command.indexOf('random'), - }); - command = 'media'; - break; - case 'proxy': - try { - const url = new URL(userInput); - command = config.invidious.domains.includes(url.hostname) - ? 'invidious' - : config.nitter.domains.includes(url.hostname) - ? 'nitter' - : 'proxy'; - } catch(e) {} - //fallthrough - default: - args.push(matrixClient, room, userInput); - } - registrar[command] && registrar[command].runQuery.apply(null, args); + roomId = event.event.room_id; + content = event.getContent().body; + if (content.charAt(0) === '+') { + const args = content.slice(1).trim().split(/ +/g); + const command = args.shift().toLowerCase(); + console.log(`Logs: ${event.event.sender} - ${content}`); + matrix.utils.eventHandler(args, roomId, command, event); } }); diff --git a/package.json b/package.json index 90d3be9..8c2b7fb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ligh7hau5", - "version": "1.1.0", + "version": "1.2.0", "description": "A Matrix to Fediverse client", "main": "main.js", "scripts": { diff --git a/registrar.js b/registrar.js index 65cf232..817f90c 100644 --- a/registrar.js +++ b/registrar.js @@ -6,16 +6,23 @@ global.auth = require('./auth.js'); const { LocalStorage } = require('node-localstorage'); global.localStorage = new LocalStorage('./keys'); -if (!localStorage.getItem('matrix_auth')){ +if (!localStorage.getItem('matrix_auth')) { localStorage.clear(); - localStorage.setItem('matrix_auth', "{}"); + localStorage.setItem('matrix_auth', '[]'); } -if (!localStorage.getItem('fediverse_auth')) localStorage.setItem('fediverse_auth', "{}"); -if (!localStorage.getItem('timeline')) localStorage.setItem('timeline', "{}"); -if (!localStorage.getItem('notifications')) localStorage.setItem('notifications', "{}"); +if (!localStorage.getItem('fediverse_auth')) localStorage.setItem('fediverse_auth', '[]'); +if (!localStorage.getItem('timeline')) localStorage.setItem('timeline', '[]'); +if (!localStorage.getItem('notifications')) localStorage.setItem('notifications', '[]'); -global.matrix_auth = JSON.parse(localStorage.getItem('matrix_auth')); -global.fediverse_auth = JSON.parse(localStorage.getItem('fediverse_auth')); + +global.fediverse = { + auth: JSON.parse(localStorage.getItem('fediverse_auth')), + utils: require('./commands/fediverse/utils.js'), +}; +global.matrix = { + auth: JSON.parse(localStorage.getItem('matrix_auth')), + utils: require('./utils.js'), +}; module.exports = { config: require('./config.js'), @@ -29,15 +36,14 @@ module.exports = { flood: require('./commands/fediverse/flood.js'), follow: require('./commands/fediverse/follow.js'), help: require('./commands/help.js'), - media: require('./commands/fediverse/media.js'), mordy: require('./commands/fediverse/mordy.js'), notify: require('./commands/fediverse/notify.js'), pin: require('./commands/fediverse/pin.js'), post: require('./commands/fediverse/post.js'), redact: require('./commands/fediverse/redact.js'), - reply: require('./commands/fediverse/reply.js'), status: require('./commands/fediverse/status.js'), tip: require('./commands/fediverse/tip.js'), unfollow: require('./commands/fediverse/unfollow.js'), - unpin: require('./commands/fediverse/unpin.js') + unpin: require('./commands/fediverse/unpin.js'), + unreblog: require('./commands/fediverse/unreblog.js') }; diff --git a/utils.js b/utils.js new file mode 100644 index 0000000..4f920af --- /dev/null +++ b/utils.js @@ -0,0 +1,131 @@ +const sendError = async (event, roomId, e) => { + e.response ? error = `Error(${e.response.status}): ${e.response.data.error}` + : e.data ? error = `Error(${e.errcode}): ${e.data.error}` + : error = `Error: ${e.syscall}, ${e.code}`; + return matrixClient.sendHtmlNotice(roomId, + '', error); +}; + +const addReact = async (event, key) => { + const roomId = event.event.room_id; + return matrixClient.sendEvent(event.event.room_id, 'm.reaction', { + 'm.relates_to': { + rel_type: 'm.annotation', + event_id: event.getId(), + key, + }, + }).catch((e) => sendError(null, roomId, e)); +}; + +const eventHandler = (args, roomId, command, event) => { + const userInput = args.join(' '); + const flaggedInput = userInput.substr(userInput.indexOf(' ') + 1); + const address = args.slice(0, 1).join(' ').replace(/"/g, ''); + + args = []; + + switch (command) { + case 'config': + return; + case 'help': case 'flood': case 'notify': + args.push(roomId); + break; + case 'tip': + args.push(roomId, address, flaggedInput); + break; + case 'archive': case 'rearchive': + args.push(roomId, userInput, !!~command.indexOf('re')); + command = 'archive'; + break; + case 'post': case 'reply': case 'media': case 'mediareply': + case 'random': case 'randomreply': case 'randommedia': case 'randommediareply': + args.push(roomId, userInput, { + isReply: !!~command.indexOf('reply'), + hasMedia: !!~command.indexOf('media'), + hasSubject: !!~command.indexOf('random'), + }); + command = 'post'; + break; + case 'proxy': + try { + const url = new URL(userInput); + command = config.invidious.domains.includes(url.hostname) + ? 'invidious' + : config.nitter.domains.includes(url.hostname) + ? 'nitter' + : 'proxy'; + } catch (e) { sendError(event, roomId, e); } + // fallthrough + default: + args.push(roomId, event, userInput); + } + registrar[command] && registrar[command].runQuery.apply(null, args); +}; + +module.exports.sendError = sendError; + +module.exports.addReact = addReact; + +module.exports.eventHandler = eventHandler; + +module.exports.editNoticeHTML = (roomId, event, html, plain) => matrixClient.sendMessage(roomId, { + body: ` * ${plain || html.replace(/<[^<]+?>/g, '')}`, + formatted_body: ` * ${html}`, + format: 'org.matrix.custom.html', + msgtype: 'm.notice', + 'm.new_content': { + body: plain || html.replace(/<[^<]+?>/g, ''), + formatted_body: html, + format: 'org.matrix.custom.html', + msgtype: 'm.notice', + }, + 'm.relates_to': { + rel_type: 'm.replace', + event_id: event.event_id, + }, +}); + +module.exports.handleReact = async (event) => { + const roomId = event.event.room_id; + const reaction = event.getContent()['m.relates_to']; + if (!reaction) return; + const metaEvent = await matrixClient.fetchRoomEvent(roomId, reaction.event_id); + if (!metaEvent.content.meta || metaEvent.sender !== config.matrix.user) return; + const args = metaEvent.content.meta.split(' '); + isMeta = ['status', 'reblog', 'mention', 'redact', 'unreblog']; + if (!isMeta.includes(args[0])) return; + let command = []; + args.shift().toLowerCase(); + if (reaction.key === '🔃') command = 'copy'; + if (reaction.key === '👏') command = 'clap'; + if (reaction.key === '🗑') command = 'redact'; + eventHandler(args, roomId, command, event); +}; + +module.exports.handleReply = async (event) => { + const roomId = event.event.room_id; + const reply = event.getContent()['m.relates_to']['m.in_reply_to']; + if (!reply) return; + const metaEvent = await matrixClient.fetchRoomEvent(roomId, reply.event_id); + if (!metaEvent.content.meta || metaEvent.sender !== config.matrix.user) return; + const args = metaEvent.content.meta.split(' '); + args.push(event.event.content.formatted_body.trim().split('')[1]); + isMeta = ['status', 'reblog', 'mention', 'redact', 'unreblog']; + if (!isMeta.includes(args[0])) return; + args.shift().toLowerCase(); + command = 'reply'; + eventHandler(args, roomId, command, event); +}; + +module.exports.selfReact = async (event) => { + if (event.getType() !== 'm.room.message') return; + if (event.event.unsigned.age > 10000) return; + const { meta } = event.getContent(); + if (!meta) return; + const type = meta.split(' ')[0]; + if (type === 'redact' || type === 'unreblog') addReact(event, '🗑️'); + if (type === 'status' || type === 'reblog' || type === 'mention') { + addReact(event, '🔃'); + addReact(event, '👏'); + } +}; From 1e2d15905334a8c06d501039d1c29f3e13c7fa92 Mon Sep 17 00:00:00 2001 From: vulet Date: Sun, 14 Feb 2021 16:06:18 +0800 Subject: [PATCH 53/89] chore(fediverse): remove old commands --- commands/fediverse/media.js | 91 ------------------------------------- commands/fediverse/reply.js | 16 ------- 2 files changed, 107 deletions(-) delete mode 100644 commands/fediverse/media.js delete mode 100644 commands/fediverse/reply.js 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}`); - }); -}; From a9073b0b9d6988a22eb8159a1c8fce98877e0927 Mon Sep 17 00:00:00 2001 From: vulet Date: Fri, 19 Feb 2021 14:09:40 +0800 Subject: [PATCH 54/89] fix(reactions): match redaction codepoint. && fix/styling(feed): bad pathing, cleanup. --- commands/fediverse/utils.js | 31 +++++++++++++++++++------------ utils.js | 8 ++++---- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/commands/fediverse/utils.js b/commands/fediverse/utils.js index 782428b..d55f676 100644 --- a/commands/fediverse/utils.js +++ b/commands/fediverse/utils.js @@ -9,6 +9,7 @@ const sendEventWithMeta = async (roomId, content, meta) => { }; const hasAttachment = (res) => { + if (res.status) res = res.status; if (!res.media_attachments) return '
'; return res.media_attachments.map((media) => { const mediaURL = new URL(media.remote_url); @@ -19,14 +20,14 @@ const hasAttachment = (res) => { const notifyFormatter = (res, roomId) => { userDetails = ` - ${res.account.acct}`; + ${res.account.acct}`; switch (res.type) { case 'follow': fediverse.auth.me !== res.account.url ? res.meta = 'follow' : res.meta = 'redact'; meta = `${res.meta} ${res.account.id}`; content = `${userDetails} - has followed you. -
${res.account.note}
`; + has followed you. +
${res.account.note}
`; sendEventWithMeta(roomId, content, meta); break; case 'favourite': @@ -34,8 +35,11 @@ const notifyFormatter = (res, roomId) => { meta = `${res.meta} ${res.status.id}`; content = `${userDetails} has favorited - your post: -
${res.status.content}
`; + your post:
+
${res.status.content}
+ ${hasAttachment(res)} +
(id: ${res.id}) ${registrar.post.visibilityEmoji(res.status.visibility)} +
`; sendEventWithMeta(roomId, content, res.meta); break; case 'mention': @@ -43,9 +47,10 @@ const notifyFormatter = (res, roomId) => { meta = `${res.meta} ${res.status.id}`; content = `${userDetails} has mentioned - you:
${res.status.content} -
(id: ${res.status.id}) ${registrar.post.visibilityEmoji(res.status.visibility)}
-
`; + you:
${res.status.content}
+ ${hasAttachment(res)} +
(id: ${res.id}) ${registrar.post.visibilityEmoji(res.status.visibility)} +
`; sendEventWithMeta(roomId, content, meta); break; case 'reblog': @@ -53,8 +58,10 @@ const notifyFormatter = (res, roomId) => { meta = `${res.meta} ${res.status.id}`; content = `${userDetails} has repeated - your post:
-
${res.status.content}
`; + your post:
${res.status.content}
+ ${hasAttachment(res)} +
(id: ${res.id}) ${registrar.post.visibilityEmoji(res.status.visibility)} +
`; sendEventWithMeta(roomId, content, meta); break; default: @@ -83,8 +90,8 @@ const isReblog = (res, roomId) => { fediverse.auth.me !== res.account.url ? res.meta = 'status' : res.meta = 'unreblog'; meta = `${res.meta} ${res.reblog.id}`; content = `${userDetails} - has repeated - ${res.reblog.account.acct}'s post: + has repeated + ${res.reblog.account.acct}'s post:
${res.content}
${hasAttachment(res)}
(id: ${res.reblog.id}) ${registrar.post.visibilityEmoji(res.visibility)} diff --git a/utils.js b/utils.js index 4f920af..cc453f7 100644 --- a/utils.js +++ b/utils.js @@ -96,9 +96,9 @@ module.exports.handleReact = async (event) => { if (!isMeta.includes(args[0])) return; let command = []; args.shift().toLowerCase(); - if (reaction.key === '🔃') command = 'copy'; + if (reaction.key === '🔁') command = 'copy'; if (reaction.key === '👏') command = 'clap'; - if (reaction.key === '🗑') command = 'redact'; + if (reaction.key === '🗑️️') command = 'redact'; eventHandler(args, roomId, command, event); }; @@ -123,9 +123,9 @@ module.exports.selfReact = async (event) => { const { meta } = event.getContent(); if (!meta) return; const type = meta.split(' ')[0]; - if (type === 'redact' || type === 'unreblog') addReact(event, '🗑️'); + if (type === 'redact' || type === 'unreblog') addReact(event, '🗑️️'); if (type === 'status' || type === 'reblog' || type === 'mention') { - addReact(event, '🔃'); + addReact(event, '🔁'); addReact(event, '👏'); } }; From 9da2d13dbf3a4708287da5f08149a655aec552fd Mon Sep 17 00:00:00 2001 From: vulet Date: Sun, 21 Feb 2021 14:10:32 +0800 Subject: [PATCH 55/89] fix(feed): use domestic homeserver --- commands/fediverse/utils.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/commands/fediverse/utils.js b/commands/fediverse/utils.js index d55f676..7232554 100644 --- a/commands/fediverse/utils.js +++ b/commands/fediverse/utils.js @@ -34,11 +34,11 @@ const notifyFormatter = (res, roomId) => { fediverse.auth.me !== res.account.url ? res.meta = 'favourite' : res.meta = 'redact'; meta = `${res.meta} ${res.status.id}`; content = `${userDetails} - has favorited + has favorited your post:
${res.status.content}
${hasAttachment(res)} -
(id: ${res.id}) ${registrar.post.visibilityEmoji(res.status.visibility)} +
(id: ${res.status.id}) ${registrar.post.visibilityEmoji(res.status.visibility)}
`; sendEventWithMeta(roomId, content, res.meta); break; @@ -46,10 +46,10 @@ const notifyFormatter = (res, roomId) => { fediverse.auth.me !== res.account.url ? res.meta = 'mention' : res.meta = 'redact'; meta = `${res.meta} ${res.status.id}`; content = `${userDetails} - has mentioned + has mentioned you:
${res.status.content}
- ${hasAttachment(res)} -
(id: ${res.id}) ${registrar.post.visibilityEmoji(res.status.visibility)} + ${hasAttachment(res.status.id)} +
(id: ${res.status.id}) ${registrar.post.visibilityEmoji(res.status.visibility)}
`; sendEventWithMeta(roomId, content, meta); break; @@ -57,10 +57,10 @@ const notifyFormatter = (res, roomId) => { fediverse.auth.me !== res.account.url ? res.meta = 'reblog' : res.meta = 'redact'; meta = `${res.meta} ${res.status.id}`; content = `${userDetails} - has repeated + has repeated your post:
${res.status.content}
${hasAttachment(res)} -
(id: ${res.id}) ${registrar.post.visibilityEmoji(res.status.visibility)} +
(id: ${res.status.id}) ${registrar.post.visibilityEmoji(res.status.visibility)}
`; sendEventWithMeta(roomId, content, meta); break; @@ -71,7 +71,7 @@ const notifyFormatter = (res, roomId) => { const isOriginal = (res, roomId) => { if (res.data) res = res.data; - userDetails = ` + userDetails = ` ${res.account.acct}`; fediverse.auth.me !== res.account.url ? res.meta = 'status' : res.meta = 'redact'; meta = `${res.meta} ${res.id}`; @@ -85,13 +85,13 @@ const isOriginal = (res, roomId) => { const isReblog = (res, roomId) => { if (res.data) res = res.data; - userDetails = ` + userDetails = ` ${res.account.acct}`; fediverse.auth.me !== res.account.url ? res.meta = 'status' : res.meta = 'unreblog'; meta = `${res.meta} ${res.reblog.id}`; content = `${userDetails} - has repeated - ${res.reblog.account.acct}'s post: + has repeated + ${res.reblog.account.acct}'s post:
${res.content}
${hasAttachment(res)}
(id: ${res.reblog.id}) ${registrar.post.visibilityEmoji(res.visibility)} From fcadc5addc1dc63dcb5176a0b635f4e366c0479c Mon Sep 17 00:00:00 2001 From: vulet Date: Sun, 21 Feb 2021 19:07:56 +0800 Subject: [PATCH 56/89] refactor(e2ee): session management in config --- config.example.js | 7 ++++--- main.js | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/config.example.js b/config.example.js index 2f909fd..fac0ba1 100644 --- a/config.example.js +++ b/config.example.js @@ -3,7 +3,8 @@ module.exports = { domain: 'https://your_homeserver.com', user: '@your_user:your_homeserver.com', password: 'your_password', - domains: [ 'your_homeserver.com' ] + domains: [ 'your_homeserver.com' ], + manualVerify: false, }, fediverse: { domain: 'https://your_federation.com', @@ -23,12 +24,12 @@ module.exports = { nitter: { domain: 'nitter.fdn.fr', userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', - domains: [ 'nitter.net', 'www.nitter.net', 'twitter.com', 'www.twitter.com' ], + domains: [ 'nitter.net', 'www.nitter.net', 'twitter.com', 'www.twitter.com', 'mobile.twitter.com', 'm.twitter.com' ], check: '(✅)' }, invidious: { domain: 'invidious.fdn.fr', userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', - domains: [ 'invidious.snopyta.org', 'invidious.xyz', 'youtube.com', 'www.youtube.com', 'youtu.be' ] + domains: [ 'invidious.snopyta.org', 'invidious.xyz', 'youtube.com', 'www.youtube.com', 'youtu.be', 'm.youtube.com' ] } }; diff --git a/main.js b/main.js index e96f1f5..15c0d1e 100644 --- a/main.js +++ b/main.js @@ -26,6 +26,7 @@ matrixClient.on('event', async (event) => { }); matrixClient.on('Room.timeline', async (event, member, toStartOfTimeline) => { + matrixClient.setGlobalErrorOnUnknownDevices(config.matrix.manualVerify); if (toStartOfTimeline) return; if (event.isEncrypted()) await event._decryptionPromise; if (event.getType() !== 'm.room.message') return; From 58ef31356a3e7e1b3e6cc7e2e1422cef7fa67c56 Mon Sep 17 00:00:00 2001 From: vulet Date: Mon, 22 Feb 2021 17:48:10 +0800 Subject: [PATCH 57/89] feat(10grans): add make-it-rain --- commands/fediverse/makeitrain.js | 29 +++++++++++++++++++++++++++++ commands/fediverse/tip.js | 3 ++- commands/fediverse/utils.js | 22 ++++++++++++++++++++++ commands/help.js | 1 + config.example.js | 1 + registrar.js | 1 + utils.js | 6 ++++-- 7 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 commands/fediverse/makeitrain.js diff --git a/commands/fediverse/makeitrain.js b/commands/fediverse/makeitrain.js new file mode 100644 index 0000000..a5961a7 --- /dev/null +++ b/commands/fediverse/makeitrain.js @@ -0,0 +1,29 @@ +exports.runQuery = async function (roomId, event, notice) { + if (config.fediverse.tipping === false) return matrixClient.sendHtmlNotice(roomId, `Tipping is not enabled.`, `Tipping is not enabled.`); + const loadingString = `Making it rain for notice: ${notice}...`; + const original = await matrixClient.sendHtmlNotice(roomId, `${loadingString}`, `${loadingString}`); + const users = await fediverse.utils.getStatusMentions(notice, event, original); + if (!users) return matrix.utils.editNoticeHTML(roomId, original, `No eligible users found.`); + const rain = (users) => { + amount = users.length * 0.00000001337 + if (users.length === 1) return amount * 10000 + if (users.length <= 5) return amount * 1000 + if (users.length <= 10) return amount * 100 + if (users.length <= 100) return amount * 10 + return amount + } + axios({ + method: 'POST', + url: `${config.fediverse.domain}/api/v1/statuses`, + headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + data: { status: `@10grans@fedi.cc makeitrain ${rain(users)} to ${users.join(' ')}` }, + }) + .then(() => { + matrix.utils.addReact(event, '✅'); + return matrix.utils.editNoticeHTML(roomId, original, `Raining ${rain(users)} 10grans on: 🌧${users.join(', ')}🌧`); + }) + .catch((e) => { + matrix.utils.addReact(event, '❌'); + return matrix.utils.editNoticeHTML(roomId, original, `${e}`) + }); +}; diff --git a/commands/fediverse/tip.js b/commands/fediverse/tip.js index d75932d..b9ac597 100644 --- a/commands/fediverse/tip.js +++ b/commands/fediverse/tip.js @@ -1,4 +1,5 @@ -exports.runQuery = function (roomId, address, flaggedInput, event) { +exports.runQuery = function (roomId, event, address, flaggedInput) { + if (config.fediverse.tipping === false) return matrixClient.sendHtmlNotice(roomId, `Tipping is not enabled.`, `Tipping is not enabled.`); axios({ method: 'POST', url: `${config.fediverse.domain}/api/v1/statuses`, diff --git a/commands/fediverse/utils.js b/commands/fediverse/utils.js index 7232554..a0a5993 100644 --- a/commands/fediverse/utils.js +++ b/commands/fediverse/utils.js @@ -141,3 +141,25 @@ module.exports.unfollow = (roomId, account, event, original) => { matrix.utils.sendError(event, roomId, e); }); }; + +module.exports.getStatusMentions = (notice, event, original) => { + const posters = []; + const prefix = '@'; + const users = axios({ + method: 'GET', + url: `${config.fediverse.domain}/api/v1/statuses/${notice}`, + headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + }).then((notice) => { + const citizens = []; + citizens.push(notice.data.account.acct); + for (let i = 0; i < notice.data.mentions.length; i++) citizens.push(notice.data.mentions[i].acct); + const filtered = citizens.filter(users => !config.fediverse.username.includes(users)) + for (let i = 0; i < filtered.length; i++) posters.push(prefix.concat(filtered[i])); + return posters; + }) + .catch((e) => { + matrix.utils.addReact(event, '❌'); + matrix.utils.sendError(event, roomId, e); + }); + return users; +}; diff --git a/commands/help.js b/commands/help.js index 678e7f1..44904dd 100644 --- a/commands/help.js +++ b/commands/help.js @@ -10,6 +10,7 @@ exports.runQuery = function (roomId) { + '+copy [post id] : repeat/repost/retweet
' + '+reply [post id] [content] : reply to post
' + '+tip [@user@fedi.url] [amount] : tip 10grans
' + + '+makeitrain [post id] : make it rain 10grans
' + '+beg : beg for 10grans
' + '+clap [post id] : favorite
' + '+boo [post id] : unfavorite
' diff --git a/config.example.js b/config.example.js index fac0ba1..3524c62 100644 --- a/config.example.js +++ b/config.example.js @@ -12,6 +12,7 @@ module.exports = { password: '', client_name: 'ligh7hau5', subject: '', + tipping: false, mimetypes: { whitelist: [], blacklist: [] diff --git a/registrar.js b/registrar.js index 817f90c..a4540d5 100644 --- a/registrar.js +++ b/registrar.js @@ -36,6 +36,7 @@ module.exports = { flood: require('./commands/fediverse/flood.js'), follow: require('./commands/fediverse/follow.js'), help: require('./commands/help.js'), + makeitrain: require('./commands/fediverse/makeitrain.js'), mordy: require('./commands/fediverse/mordy.js'), notify: require('./commands/fediverse/notify.js'), pin: require('./commands/fediverse/pin.js'), diff --git a/utils.js b/utils.js index cc453f7..234d3a2 100644 --- a/utils.js +++ b/utils.js @@ -30,8 +30,8 @@ const eventHandler = (args, roomId, command, event) => { case 'help': case 'flood': case 'notify': args.push(roomId); break; - case 'tip': - args.push(roomId, address, flaggedInput); + case 'tip': case 'makeitrain': + args.push(roomId, event, address, flaggedInput); break; case 'archive': case 'rearchive': args.push(roomId, userInput, !!~command.indexOf('re')); @@ -99,6 +99,7 @@ module.exports.handleReact = async (event) => { if (reaction.key === '🔁') command = 'copy'; if (reaction.key === '👏') command = 'clap'; if (reaction.key === '🗑️️') command = 'redact'; + if (reaction.key === '🌧️') command = 'makeitrain'; eventHandler(args, roomId, command, event); }; @@ -127,5 +128,6 @@ module.exports.selfReact = async (event) => { if (type === 'status' || type === 'reblog' || type === 'mention') { addReact(event, '🔁'); addReact(event, '👏'); + if (config.fediverse.tipping === true) addReact(event, '🌧️'); } }; From 14006d9209a56e142be6502660ba5fa2f1a0fe28 Mon Sep 17 00:00:00 2001 From: vulet Date: Tue, 23 Feb 2021 11:06:23 +0800 Subject: [PATCH 58/89] fix(feed): don't throw on unknown notification types. --- commands/fediverse/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commands/fediverse/utils.js b/commands/fediverse/utils.js index a0a5993..41add17 100644 --- a/commands/fediverse/utils.js +++ b/commands/fediverse/utils.js @@ -65,7 +65,7 @@ const notifyFormatter = (res, roomId) => { sendEventWithMeta(roomId, content, meta); break; default: - throw 'Unknown notification type.'; + return console.log('Unknown notification type.'); } }; From e916778c499aa440febf6c82d562adb78f05a4cd Mon Sep 17 00:00:00 2001 From: vulet Date: Tue, 23 Feb 2021 11:07:00 +0800 Subject: [PATCH 59/89] refactor(10grans): adjust forecast --- commands/fediverse/makeitrain.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/commands/fediverse/makeitrain.js b/commands/fediverse/makeitrain.js index a5961a7..de78019 100644 --- a/commands/fediverse/makeitrain.js +++ b/commands/fediverse/makeitrain.js @@ -5,11 +5,11 @@ exports.runQuery = async function (roomId, event, notice) { const users = await fediverse.utils.getStatusMentions(notice, event, original); if (!users) return matrix.utils.editNoticeHTML(roomId, original, `No eligible users found.`); const rain = (users) => { - amount = users.length * 0.00000001337 - if (users.length === 1) return amount * 10000 - if (users.length <= 5) return amount * 1000 - if (users.length <= 10) return amount * 100 - if (users.length <= 100) return amount * 10 + amount = users.length * 0.00000001337 // by per user: + if (users.length === 1) return amount * 100000 // 0.001337 + if (users.length <= 5) return amount * 10000 // 0.0001337 + if (users.length <= 10) return amount * 1000 // 0.00001337 + if (users.length <= 100) return amount * 100 // 0.000001337 return amount } axios({ From 7a9bac2bf48652efbbc7cbe0dc704dbb2f4bcab1 Mon Sep 17 00:00:00 2001 From: vulet Date: Thu, 25 Feb 2021 11:31:55 +0800 Subject: [PATCH 60/89] fix(10grans): don't allow rain on tipbot --- commands/fediverse/makeitrain.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/commands/fediverse/makeitrain.js b/commands/fediverse/makeitrain.js index de78019..876ba7a 100644 --- a/commands/fediverse/makeitrain.js +++ b/commands/fediverse/makeitrain.js @@ -2,7 +2,9 @@ exports.runQuery = async function (roomId, event, notice) { if (config.fediverse.tipping === false) return matrixClient.sendHtmlNotice(roomId, `Tipping is not enabled.`, `Tipping is not enabled.`); const loadingString = `Making it rain for notice: ${notice}...`; const original = await matrixClient.sendHtmlNotice(roomId, `${loadingString}`, `${loadingString}`); - const users = await fediverse.utils.getStatusMentions(notice, event, original); + const findAllUsers = await fediverse.utils.getStatusMentions(notice, event, original); + const exclude = "@10grans@fedi.cc"; + const users = users.filter(users => !exclude.includes(findAllUsers)) if (!users) return matrix.utils.editNoticeHTML(roomId, original, `No eligible users found.`); const rain = (users) => { amount = users.length * 0.00000001337 // by per user: From f37e2471c0a52a19e8226b168bf2a76a26ab4da7 Mon Sep 17 00:00:00 2001 From: vulet Date: Thu, 25 Feb 2021 16:43:08 +0800 Subject: [PATCH 61/89] fix(10grans): forecast regression --- commands/fediverse/makeitrain.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commands/fediverse/makeitrain.js b/commands/fediverse/makeitrain.js index 876ba7a..7af0dcd 100644 --- a/commands/fediverse/makeitrain.js +++ b/commands/fediverse/makeitrain.js @@ -4,7 +4,7 @@ exports.runQuery = async function (roomId, event, notice) { const original = await matrixClient.sendHtmlNotice(roomId, `${loadingString}`, `${loadingString}`); const findAllUsers = await fediverse.utils.getStatusMentions(notice, event, original); const exclude = "@10grans@fedi.cc"; - const users = users.filter(users => !exclude.includes(findAllUsers)) + const users = findAllUsers.filter(users => !exclude.includes(findAllUsers)) if (!users) return matrix.utils.editNoticeHTML(roomId, original, `No eligible users found.`); const rain = (users) => { amount = users.length * 0.00000001337 // by per user: From 1e8577f86522552dc20168fd0452cc8cffa766d1 Mon Sep 17 00:00:00 2001 From: vulet Date: Fri, 26 Feb 2021 12:21:41 +0800 Subject: [PATCH 62/89] feat(fediverse): automatically attach mentions to reply. refactor(mentions): clean-up. --- commands/fediverse/post.js | 1 + commands/fediverse/utils.js | 17 ++++++++--------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/commands/fediverse/post.js b/commands/fediverse/post.js index 2536333..1ff31df 100644 --- a/commands/fediverse/post.js +++ b/commands/fediverse/post.js @@ -47,6 +47,7 @@ const run = async (roomId, content, replyId, mediaURL, subject) => { const media = await mediaDownload(mediaURL, config.fediverse.mimetypes); mediaId = await mediaUpload(config.fediverse, media); } + if (replyId) content = await fediverse.utils.getStatusMentions(replyId).then(m => m.concat(content)); const response = await axios({ method: 'POST', url: `${config.fediverse.domain}/api/v1/statuses`, diff --git a/commands/fediverse/utils.js b/commands/fediverse/utils.js index 41add17..1243dbc 100644 --- a/commands/fediverse/utils.js +++ b/commands/fediverse/utils.js @@ -142,20 +142,19 @@ module.exports.unfollow = (roomId, account, event, original) => { }); }; -module.exports.getStatusMentions = (notice, event, original) => { - const posters = []; - const prefix = '@'; +module.exports.getStatusMentions = (notice, event) => { const users = axios({ method: 'GET', url: `${config.fediverse.domain}/api/v1/statuses/${notice}`, headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, }).then((notice) => { - const citizens = []; - citizens.push(notice.data.account.acct); - for (let i = 0; i < notice.data.mentions.length; i++) citizens.push(notice.data.mentions[i].acct); - const filtered = citizens.filter(users => !config.fediverse.username.includes(users)) - for (let i = 0; i < filtered.length; i++) posters.push(prefix.concat(filtered[i])); - return posters; + const users = []; + users.push('@' + notice.data.account.acct); + for(let i = 0; i < notice.data.mentions.length; i++) { + if(!config.fediverse.username.includes(notice.data.mentions[i].acct)) + users.push('@' + notice.data.mentions[i].acct) + } + return users; }) .catch((e) => { matrix.utils.addReact(event, '❌'); From dddb8ad014c81910daad1cb409edfb0fe278e751 Mon Sep 17 00:00:00 2001 From: vulet Date: Fri, 26 Feb 2021 12:32:16 +0800 Subject: [PATCH 63/89] chore(deps): bump versions --- package.json | 4 ++-- yarn.lock | 58 ++++++++++++++++++++++++++-------------------------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/package.json b/package.json index 8c2b7fb..4185dbd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ligh7hau5", - "version": "1.2.0", + "version": "1.2.1", "description": "A Matrix to Fediverse client", "main": "main.js", "scripts": { @@ -21,7 +21,7 @@ "axios": "^0.21.1", "form-data": "^3.0.0", "jsdom": "^16.4.0", - "matrix-js-sdk": "^9.5.1", + "matrix-js-sdk": "^9.7.0", "node-localstorage": "^2.1.6", "olm": "https://packages.matrix.org/npm/olm/olm-3.2.1.tgz", "qs": "^6.9.6" diff --git a/yarn.lock b/yarn.lock index 21deb07..3fc8bdd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,9 +3,9 @@ "@babel/runtime@^7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" - integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== + version "7.13.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.7.tgz#d494e39d198ee9ca04f4dcb76d25d9d7a1dc961a" + integrity sha512-h+ilqoX998mRVM5FtB5ijRuHUDVt5l3yfoOi2uh18Z/O3hvyaHQ39NpxVkCIG5yFs+mLq/ewFp8Bss6zmWv6ZA== dependencies: regenerator-runtime "^0.13.4" @@ -265,9 +265,9 @@ forever-agent@~0.6.1: integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= form-data@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" - integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" @@ -290,9 +290,9 @@ getpass@^0.1.1: assert-plus "^1.0.0" graceful-fs@^4.1.11: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== har-schema@^2.0.0: version "2.0.0" @@ -431,19 +431,19 @@ lodash.sortby@^4.7.0: integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= lodash@^4.17.19: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== loglevel@^1.7.1: version "1.7.1" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== -matrix-js-sdk@^9.5.1: - version "9.5.1" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-9.5.1.tgz#f2e27b7131a8d1a75fd2a803434e63fe672415ef" - integrity sha512-01YbRuU50BDYytTZ5fdmdoQLqOGDT2F7X6vDBrYHpdaRN2jWuLCspQlOKFJKgv73gNhw9V9jfoZN+NxuwuUpUQ== +matrix-js-sdk@^9.7.0: + version "9.7.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-9.7.0.tgz#fbd03c188546f9733b28ea1752476b22ca63d2f2" + integrity sha512-cVBHhQVGk2WWQ2kv0Ov8CTcgZVJhMuZBejXZnKqp6qEgSpmb4xQRxewbxjF53ixO7uRUzGFtAlDiW4BeHZnN/g== dependencies: "@babel/runtime" "^7.12.5" another-json "^0.2.0" @@ -451,21 +451,21 @@ matrix-js-sdk@^9.5.1: bs58 "^4.0.1" content-type "^1.0.4" loglevel "^1.7.1" - qs "^6.9.4" + qs "^6.9.6" request "^2.88.2" unhomoglyph "^1.0.6" -mime-db@1.45.0: - version "1.45.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" - integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== +mime-db@1.46.0: + version "1.46.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" + integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.28" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" - integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== + version "2.1.29" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2" + integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== dependencies: - mime-db "1.45.0" + mime-db "1.46.0" node-localstorage@^2.1.6: version "2.1.6" @@ -525,7 +525,7 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@^6.9.4, qs@^6.9.6: +qs@^6.9.6: version "6.9.6" resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== @@ -763,9 +763,9 @@ write-file-atomic@^1.1.4: slide "^1.1.5" ws@^7.2.3: - version "7.4.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.2.tgz#782100048e54eb36fe9843363ab1c68672b261dd" - integrity sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA== + version "7.4.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.3.tgz#1f9643de34a543b8edb124bdcbc457ae55a6e5cd" + integrity sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA== xml-name-validator@^3.0.0: version "3.0.0" From 50e9f808da2800bb390853a00b4508873e3c0de4 Mon Sep 17 00:00:00 2001 From: vulet Date: Fri, 26 Feb 2021 13:54:30 +0800 Subject: [PATCH 64/89] fix(fediverse): move mentions array to string. allow events for error handling. --- commands/fediverse/post.js | 8 ++++---- utils.js | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/commands/fediverse/post.js b/commands/fediverse/post.js index 1ff31df..a53a95d 100644 --- a/commands/fediverse/post.js +++ b/commands/fediverse/post.js @@ -41,13 +41,13 @@ const mediaUpload = async ({ domain }, { data, filename, mimetype }) => { return upload.data.id; }; -const run = async (roomId, content, replyId, mediaURL, subject) => { +const run = async (roomId, event, content, replyId, mediaURL, subject) => { let mediaId = null; if (mediaURL) { const media = await mediaDownload(mediaURL, config.fediverse.mimetypes); mediaId = await mediaUpload(config.fediverse, media); } - if (replyId) content = await fediverse.utils.getStatusMentions(replyId).then(m => m.concat(content)); + if (replyId) content = await fediverse.utils.getStatusMentions(replyId, event).then(m => m.concat(content).join(' ')); const response = await axios({ method: 'POST', url: `${config.fediverse.domain}/api/v1/statuses`, @@ -63,7 +63,7 @@ const run = async (roomId, content, replyId, mediaURL, subject) => { return fediverse.utils.sendEventWithMeta(roomId, `${response.data.id}`, `redact ${response.data.id}`); }; -exports.runQuery = async (roomId, userInput, { isReply, hasMedia, hasSubject }) => { +exports.runQuery = async (roomId, event, userInput, { isReply, hasMedia, hasSubject }) => { try { const chunks = userInput.trim().split(' '); if (!chunks.length || chunks.length < !!isReply + !!hasMedia) throw ''; @@ -84,7 +84,7 @@ exports.runQuery = async (roomId, userInput, { isReply, hasMedia, hasSubject }) if (!/^\/_matrix\/media\/r0\/download\/[^/]+\/[^/]+\/?$/.test(url.pathname)) throw ''; mediaURL = url.toString(); } - return await run(roomId, chunks.join(' '), replyId, mediaURL, subject); + return await run(roomId, event, chunks.join(' '), replyId, mediaURL, subject); } catch (e) { return matrixClient.sendHtmlNotice(roomId, 'Sad!', 'Sad!').catch(() => {}); } diff --git a/utils.js b/utils.js index 234d3a2..6d92a8d 100644 --- a/utils.js +++ b/utils.js @@ -39,7 +39,7 @@ const eventHandler = (args, roomId, command, event) => { break; case 'post': case 'reply': case 'media': case 'mediareply': case 'random': case 'randomreply': case 'randommedia': case 'randommediareply': - args.push(roomId, userInput, { + args.push(roomId, event, userInput, { isReply: !!~command.indexOf('reply'), hasMedia: !!~command.indexOf('media'), hasSubject: !!~command.indexOf('random'), From bfde4265c6c9affa93a610cf260830aaf3bf85c9 Mon Sep 17 00:00:00 2001 From: vulet Date: Fri, 26 Feb 2021 13:56:40 +0800 Subject: [PATCH 65/89] chore(all): bump version 1.2.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4185dbd..b7e9aaa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ligh7hau5", - "version": "1.2.1", + "version": "1.2.2", "description": "A Matrix to Fediverse client", "main": "main.js", "scripts": { From 340fed634646f7f83418e6eeac378b9599b5e0f1 Mon Sep 17 00:00:00 2001 From: vulet Date: Mon, 1 Mar 2021 14:06:28 +0800 Subject: [PATCH 66/89] fix(feed): attached content on mentions --- commands/fediverse/makeitrain.js | 2 +- commands/fediverse/utils.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/commands/fediverse/makeitrain.js b/commands/fediverse/makeitrain.js index 7af0dcd..33fdd3f 100644 --- a/commands/fediverse/makeitrain.js +++ b/commands/fediverse/makeitrain.js @@ -4,7 +4,7 @@ exports.runQuery = async function (roomId, event, notice) { const original = await matrixClient.sendHtmlNotice(roomId, `${loadingString}`, `${loadingString}`); const findAllUsers = await fediverse.utils.getStatusMentions(notice, event, original); const exclude = "@10grans@fedi.cc"; - const users = findAllUsers.filter(users => !exclude.includes(findAllUsers)) + const users = findAllUsers.filter(users => !exclude.includes(findAllUsers)); if (!users) return matrix.utils.editNoticeHTML(roomId, original, `No eligible users found.`); const rain = (users) => { amount = users.length * 0.00000001337 // by per user: diff --git a/commands/fediverse/utils.js b/commands/fediverse/utils.js index 1243dbc..fc87803 100644 --- a/commands/fediverse/utils.js +++ b/commands/fediverse/utils.js @@ -48,7 +48,7 @@ const notifyFormatter = (res, roomId) => { content = `${userDetails} has mentioned you:
${res.status.content}
- ${hasAttachment(res.status.id)} + ${hasAttachment(res)}
(id: ${res.status.id}) ${registrar.post.visibilityEmoji(res.status.visibility)}
`; sendEventWithMeta(roomId, content, meta); From 39a88b27223a4cc6955e7c0a288d9422d201a5a9 Mon Sep 17 00:00:00 2001 From: vulet Date: Sun, 25 Apr 2021 15:53:23 +0800 Subject: [PATCH 67/89] fix(notifications/timeline): low lengths. chore(config): add invidious.fdn.fr. --- commands/fediverse/flood.js | 3 ++- commands/fediverse/notify.js | 3 ++- config.example.js | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/commands/fediverse/flood.js b/commands/fediverse/flood.js index eec2f4a..b016abd 100644 --- a/commands/fediverse/flood.js +++ b/commands/fediverse/flood.js @@ -12,7 +12,8 @@ exports.runQuery = function (roomId) { const len = events.length; for (let i = len - 1; i >= 0; i--) { if (past.findIndex((x) => x.created_at === events[i].created_at) === -1) { - if (events[i].created_at < past.slice(18, 19)[0].created_at) return; + const lastStored = past.slice(past.length - 1, past.length); + if (events[i].created_at < lastStored[0].created_at) return; events[i].label = 'status'; fediverse.utils.formatter(events[i], roomId); } diff --git a/commands/fediverse/notify.js b/commands/fediverse/notify.js index 04a3f18..c77c6b1 100644 --- a/commands/fediverse/notify.js +++ b/commands/fediverse/notify.js @@ -12,7 +12,8 @@ exports.runQuery = function (roomId) { const len = events.length; for (let i = len - 1; i >= 0; i--) { if (past.findIndex((x) => x.created_at === events[i].created_at) === -1) { - if (events[i].created_at < past.slice(18, 19)[0].created_at) return; + const lastStored = past.slice(past.length - 1, past.length); + if (events[i].created_at < lastStored[0].created_at) return; events[i].label = 'notifications'; fediverse.utils.formatter(events[i], roomId); } diff --git a/config.example.js b/config.example.js index 3524c62..ebc4c85 100644 --- a/config.example.js +++ b/config.example.js @@ -25,12 +25,12 @@ module.exports = { nitter: { domain: 'nitter.fdn.fr', userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', - domains: [ 'nitter.net', 'www.nitter.net', 'twitter.com', 'www.twitter.com', 'mobile.twitter.com', 'm.twitter.com' ], + domains: [ 'nitter.net', 'www.nitter.net', 'twitter.com', 'www.twitter.com', 'mobile.twitter.com', 'm.twitter.com', 'nitter.fdn.fr' ], check: '(✅)' }, invidious: { domain: 'invidious.fdn.fr', userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', - domains: [ 'invidious.snopyta.org', 'invidious.xyz', 'youtube.com', 'www.youtube.com', 'youtu.be', 'm.youtube.com' ] + domains: [ 'invidious.snopyta.org', 'invidious.xyz', 'youtube.com', 'www.youtube.com', 'youtu.be', 'm.youtube.com', 'invidious.fdn.fr' ] } }; From a371b7c50140bf93b0665093902008d2de9cf3bb Mon Sep 17 00:00:00 2001 From: vulet Date: Sun, 25 Apr 2021 16:04:01 +0800 Subject: [PATCH 68/89] fix(e2ee): self-react after decryption promise --- main.js | 1 + 1 file changed, 1 insertion(+) diff --git a/main.js b/main.js index 15c0d1e..f4d6e39 100644 --- a/main.js +++ b/main.js @@ -18,6 +18,7 @@ matrixClient.on('RoomMember.membership', (event, member) => { }); matrixClient.on('event', async (event) => { + if (event.isEncrypted()) await event._decryptionPromise; if (event.getSender() === matrixClient.credentials.userId) return matrix.utils.selfReact(event); if (!event.getContent()['m.relates_to']) return; if (event.event.unsigned.age > 10000) return; From c7e3f26f60f3a768bfd7c3a4003b039a5e3d2edf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 30 May 2021 22:30:38 +0000 Subject: [PATCH 69/89] chore(deps): bump ws from 7.4.3 to 7.4.6 Bumps [ws](https://github.com/websockets/ws) from 7.4.3 to 7.4.6. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/7.4.3...7.4.6) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3fc8bdd..4309337 100644 --- a/yarn.lock +++ b/yarn.lock @@ -763,9 +763,9 @@ write-file-atomic@^1.1.4: slide "^1.1.5" ws@^7.2.3: - version "7.4.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.3.tgz#1f9643de34a543b8edb124bdcbc457ae55a6e5cd" - integrity sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA== + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== xml-name-validator@^3.0.0: version "3.0.0" From 54631f5c2a0d4a10a9a8cf310c502704546fea7b Mon Sep 17 00:00:00 2001 From: vulet Date: Mon, 7 Jun 2021 15:30:40 +0800 Subject: [PATCH 70/89] refactor(invidious/nitter): add instance fallback. chore(readme): update instances. --- commands/invidious.js | 29 +++++++++++++++++------------ commands/nitter.js | 27 ++++++++++++++++----------- config.example.js | 4 +++- 3 files changed, 36 insertions(+), 24 deletions(-) diff --git a/commands/invidious.js b/commands/invidious.js index c1fe773..0b49329 100644 --- a/commands/invidious.js +++ b/commands/invidious.js @@ -6,8 +6,10 @@ const headers = ({ domain, userAgent }) => ({ const invidious = async (instance, url) => { const req = await instance({ method: 'GET', url }); if (req.statusText !== 'OK') throw req; + const { headers } = instance.defaults; const video = JSON.parse(req.data); return { + url: headers['Host'], name: video.title, date: video.publishedText, description: video.descriptionHtml, @@ -18,8 +20,8 @@ const invidious = async (instance, url) => { }; }; -const card = (video, base, path) => -`${video.name}
` + +const card = (video, path) => +`${video.name}
` + ((video.description.length > 300) ? `${video.description.substr(0, 300)}…` : ``)+ ((video.description === '

') ? `No description.`: ``)+ ((video.description.length < 300 && video.description !== '

') ? `${video.description}` : ``)+ @@ -29,16 +31,19 @@ const card = (video, base, path) => `
(${video.date})

`; -const run = async (roomId, userInput) => { - const instance = axios.create({ - baseURL: `https://${config.invidious.domain}/api/v1/videos/`, - headers: headers(config.invidious), - transformResponse: [], - timeout: 10 * 1000, - }); - const video = await invidious(instance, userInput); - return await matrixClient.sendHtmlNotice(roomId, '', card(video, `https://${config.invidious.domain}`, userInput)); -}; + const getInstance = config => + axios.create({ + baseURL: `https://${config.domain}/api/v1/videos`, + headers: headers(config), + transformResponse: [], + timeout: 10 * 1000, + }); + + const run = async (roomId, userInput) => { + const video = await invidious(getInstance(config.invidious), userInput) + .catch(_ => invidious(getInstance(Object.assign(config.invidious, { domain: config.invidious.fallback })), userInput)); + return matrixClient.sendHtmlNotice(roomId, '', card(video, userInput)); + }; exports.runQuery = async (roomId, event, userInput) => { try { diff --git a/commands/nitter.js b/commands/nitter.js index 823272d..aa470e6 100644 --- a/commands/nitter.js +++ b/commands/nitter.js @@ -15,7 +15,9 @@ const nitter = async (instance, url) => { const quote = tweet.querySelector('.tweet-body > .quote'); const isReply = tweet.querySelector('.tweet-body > .replying-to'); const replies = document.querySelectorAll('.main-thread > .before-tweet > .timeline-item'); + const { defaults } = instance; return { + url: defaults.baseURL, text: tweet.querySelector('.tweet-body > .tweet-content').innerHTML, date: tweet.querySelector('.tweet-body > .tweet-published').textContent, name: tweet.querySelector('.tweet-body > div .fullname').textContent, @@ -38,27 +40,30 @@ const nitter = async (instance, url) => { }; }; -const card = (tweet, base, check, path) => -`${tweet.name} ` + +const card = (tweet, check, path) => +`${tweet.name} ` + (tweet.check ? `${check} ` : '') + -`${tweet.date} ` + +`${tweet.date} ` + `🗨️ ${tweet.stats.replies} ` + `🔁 ${tweet.stats.retweets} ` + `❤️ ${tweet.stats.favorites} ` + `
${tweet.text.replace('\n', '
')}
` + (tweet.hasAttachments ? '
This tweet has attached media.
' : '') + -(tweet.isReply ? tweet.isReply === 'unavailable' ? '
Replied Tweet is unavailable
' : `
Replied Tweet
${tweet.isReply.text.replace('\n', '
')}
` : '') + -(tweet.quote ? `
Quoted Tweet
${tweet.quote.text.replace('\n', '
')}
` : ''); +(tweet.isReply ? tweet.isReply === 'unavailable' ? '
Replied Tweet is unavailable
' : `
Replied Tweet
${tweet.isReply.text.replace('\n', '
')}
` : '') + +(tweet.quote ? `
Quoted Tweet
${tweet.quote.text.replace('\n', '
')}
` : ''); -const run = async (roomId, userInput) => { - const instance = axios.create({ - baseURL: `https://${config.nitter.domain}`, - headers: headers(config.nitter), +const getInstance = config => + axios.create({ + baseURL: `https://${config.domain}`, + headers: headers(config), transformResponse: [], timeout: 10 * 1000, }); - const tweet = await nitter(instance, userInput); - return await matrixClient.sendHtmlNotice(roomId, '', card(tweet, `https://${config.nitter.domain}`, config.nitter.check, userInput)); + +const run = async (roomId, userInput) => { + const tweet = await nitter(getInstance(config.nitter), userInput) + .catch(_ => nitter(getInstance(Object.assign(config.nitter, { domain: config.nitter.fallback })), userInput)); + return matrixClient.sendHtmlNotice(roomId, '', card(tweet, config.nitter.check, userInput)); }; exports.runQuery = async (roomId, event, userInput) => { diff --git a/config.example.js b/config.example.js index ebc4c85..a216d7d 100644 --- a/config.example.js +++ b/config.example.js @@ -24,12 +24,14 @@ module.exports = { }, nitter: { domain: 'nitter.fdn.fr', + fallback: 'nitter.snopyta.org', userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', - domains: [ 'nitter.net', 'www.nitter.net', 'twitter.com', 'www.twitter.com', 'mobile.twitter.com', 'm.twitter.com', 'nitter.fdn.fr' ], + domains: [ 'nitter.snopyta.org', 'nitter.net', 'www.nitter.net', 'twitter.com', 'www.twitter.com', 'mobile.twitter.com', 'm.twitter.com', 'nitter.fdn.fr' ], check: '(✅)' }, invidious: { domain: 'invidious.fdn.fr', + fallback: 'invidious.snopyta.org', userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', domains: [ 'invidious.snopyta.org', 'invidious.xyz', 'youtube.com', 'www.youtube.com', 'youtu.be', 'm.youtube.com', 'invidious.fdn.fr' ] } From 472552c33bd3286f9efd650e0d8c27c55f22fc0e Mon Sep 17 00:00:00 2001 From: vulet Date: Mon, 7 Jun 2021 15:36:07 +0800 Subject: [PATCH 71/89] chore(cmd): add proxy shorthand --- utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils.js b/utils.js index 6d92a8d..ac60bb7 100644 --- a/utils.js +++ b/utils.js @@ -46,7 +46,7 @@ const eventHandler = (args, roomId, command, event) => { }); command = 'post'; break; - case 'proxy': + case 'proxy': case 'p': try { const url = new URL(userInput); command = config.invidious.domains.includes(url.hostname) From 2f58d6bb845dcc671c3692cb77702aba5b1bec1e Mon Sep 17 00:00:00 2001 From: vulet Date: Tue, 15 Jun 2021 10:44:32 +0800 Subject: [PATCH 72/89] chore(deps): update OLM dist. upgrade all. --- package.json | 12 +- yarn.lock | 313 +++++++++++++++++++++++++++++++-------------------- 2 files changed, 198 insertions(+), 127 deletions(-) diff --git a/package.json b/package.json index b7e9aaa..79e9042 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ligh7hau5", - "version": "1.2.2", + "version": "1.2.3", "description": "A Matrix to Fediverse client", "main": "main.js", "scripts": { @@ -20,11 +20,11 @@ "dependencies": { "axios": "^0.21.1", "form-data": "^3.0.0", - "jsdom": "^16.4.0", - "matrix-js-sdk": "^9.7.0", - "node-localstorage": "^2.1.6", - "olm": "https://packages.matrix.org/npm/olm/olm-3.2.1.tgz", - "qs": "^6.9.6" + "jsdom": "^16.6.0", + "matrix-js-sdk": "^9.11.0", + "node-localstorage": "^2.2.1", + "olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.4.tgz", + "qs": "^6.10.1" }, "devDependencies": {} } diff --git a/yarn.lock b/yarn.lock index 4309337..2fac860 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,13 +3,18 @@ "@babel/runtime@^7.12.5": - version "7.13.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.7.tgz#d494e39d198ee9ca04f4dcb76d25d9d7a1dc961a" - integrity sha512-h+ilqoX998mRVM5FtB5ijRuHUDVt5l3yfoOi2uh18Z/O3hvyaHQ39NpxVkCIG5yFs+mLq/ewFp8Bss6zmWv6ZA== + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.6.tgz#535203bc0892efc7dec60bdc27b2ecf6e409062d" + integrity sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg== dependencies: regenerator-runtime "^0.13.4" -abab@^2.0.3: +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +abab@^2.0.3, abab@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== @@ -32,6 +37,18 @@ acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^8.2.4: + version "8.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.0.tgz#af53266e698d7cffa416714b503066a82221be60" + integrity sha512-ULr0LDaEqQrMFGyQ3bhJkLsbtrQ8QibAseGZeaSUiT/6zb9IvIkomWHJIvgvwad+hinRAgsI51JcWk2yvwyL+w== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + ajv@^6.12.3: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -112,6 +129,14 @@ bs58@^4.0.1: dependencies: base-x "^3.0.2" +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -144,7 +169,7 @@ cssom@~0.3.6: resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== -cssstyle@^2.2.0: +cssstyle@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== @@ -167,7 +192,14 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -decimal.js@^10.2.0: +debug@4: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +decimal.js@^10.2.1: version "10.2.1" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== @@ -197,13 +229,13 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -escodegen@^1.14.1: - version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== dependencies: esprima "^4.0.1" - estraverse "^4.2.0" + estraverse "^5.2.0" esutils "^2.0.2" optionator "^0.8.1" optionalDependencies: @@ -214,10 +246,10 @@ esprima@^4.0.1: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -estraverse@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== esutils@^2.0.2: version "2.0.3" @@ -255,9 +287,9 @@ fast-levenshtein@~2.0.6: integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= follow-redirects@^1.10.0: - version "1.13.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.2.tgz#dd73c8effc12728ba5cf4259d760ea5fb83e3147" - integrity sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA== + version "1.14.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" + integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== forever-agent@~0.6.1: version "0.6.1" @@ -282,6 +314,20 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +get-intrinsic@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -307,6 +353,18 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" +has-symbols@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + html-encoding-sniffer@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" @@ -314,6 +372,15 @@ html-encoding-sniffer@^2.0.1: dependencies: whatwg-encoding "^1.0.5" +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -323,6 +390,14 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -335,15 +410,10 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -ip-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= - -is-potential-custom-element-name@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" - integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== is-typedarray@~1.0.0: version "1.0.0" @@ -360,36 +430,37 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsdom@^16.4.0: - version "16.4.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.4.0.tgz#36005bde2d136f73eee1a830c6d45e55408edddb" - integrity sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w== +jsdom@^16.6.0: + version "16.6.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" + integrity sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== dependencies: - abab "^2.0.3" - acorn "^7.1.1" + abab "^2.0.5" + acorn "^8.2.4" acorn-globals "^6.0.0" cssom "^0.4.4" - cssstyle "^2.2.0" + cssstyle "^2.3.0" data-urls "^2.0.0" - decimal.js "^10.2.0" + decimal.js "^10.2.1" domexception "^2.0.1" - escodegen "^1.14.1" + escodegen "^2.0.0" + form-data "^3.0.0" html-encoding-sniffer "^2.0.1" - is-potential-custom-element-name "^1.0.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" nwsapi "^2.2.0" - parse5 "5.1.1" - request "^2.88.2" - request-promise-native "^1.0.8" - saxes "^5.0.0" + parse5 "6.0.1" + saxes "^5.0.1" symbol-tree "^3.2.4" - tough-cookie "^3.0.1" + tough-cookie "^4.0.0" w3c-hr-time "^1.0.2" w3c-xmlserializer "^2.0.0" webidl-conversions "^6.1.0" whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - ws "^7.2.3" + whatwg-url "^8.5.0" + ws "^7.4.5" xml-name-validator "^3.0.0" json-schema-traverse@^0.4.1: @@ -425,12 +496,7 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - -lodash@^4.17.19: +lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -440,10 +506,10 @@ loglevel@^1.7.1: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== -matrix-js-sdk@^9.7.0: - version "9.7.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-9.7.0.tgz#fbd03c188546f9733b28ea1752476b22ca63d2f2" - integrity sha512-cVBHhQVGk2WWQ2kv0Ov8CTcgZVJhMuZBejXZnKqp6qEgSpmb4xQRxewbxjF53ixO7uRUzGFtAlDiW4BeHZnN/g== +matrix-js-sdk@^9.11.0: + version "9.11.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-9.11.0.tgz#57ba60dfbcf2b32917eb6d7232d0e81cf0de0d3a" + integrity sha512-wP28ybOxyQ7lbC48QddRORYr8atEwbTqDOsu8H6u9jTTgB2qqczI/bkSoXHtutODuSeLY5x0UuwLcxVCy4yxVQ== dependencies: "@babel/runtime" "^7.12.5" another-json "^0.2.0" @@ -455,22 +521,27 @@ matrix-js-sdk@^9.7.0: request "^2.88.2" unhomoglyph "^1.0.6" -mime-db@1.46.0: - version "1.46.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" - integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== +mime-db@1.48.0: + version "1.48.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" + integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.29" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2" - integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== + version "2.1.31" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" + integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== dependencies: - mime-db "1.46.0" + mime-db "1.48.0" -node-localstorage@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/node-localstorage/-/node-localstorage-2.1.6.tgz#7c62120beff8abbf960c858da70fddcfc336898a" - integrity sha512-yE7AycE5G2hU55d+F7Ona9nx97C+enJzWWx6jrsji7fuPZFJOvuW3X/LKKAcXRBcEIJPDOKt8ZiFWFmShR/irg== +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +node-localstorage@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-localstorage/-/node-localstorage-2.2.1.tgz#869723550a4883e426cb391d2df0b563a51c7c1c" + integrity sha512-vv8fJuOUCCvSPjDjBLlMqYMHob4aGjkmrkaE42/mZr0VT+ZAU10jRF8oTnX9+pgU9/vYJ8P7YT3Vd6ajkmzSCw== dependencies: write-file-atomic "^1.1.4" @@ -484,9 +555,14 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -"olm@https://packages.matrix.org/npm/olm/olm-3.2.1.tgz": - version "3.2.1" - resolved "https://packages.matrix.org/npm/olm/olm-3.2.1.tgz#d623d76f99c3518dde68be8c86618d68bc7b004a" +object-inspect@^1.9.0: + version "1.10.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" + integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== + +"olm@https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.4.tgz": + version "3.2.4" + resolved "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.4.tgz#edc0156a17eb1087df44f6e0b153ef0c9d454495" optionator@^0.8.1: version "0.8.3" @@ -500,10 +576,10 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" -parse5@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" - integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== performance-now@^2.1.0: version "2.1.0" @@ -515,7 +591,7 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -psl@^1.1.28: +psl@^1.1.28, psl@^1.1.33: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== @@ -525,10 +601,12 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@^6.9.6: - version "6.9.6" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" - integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== +qs@^6.10.1, qs@^6.9.6: + version "6.10.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" + integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== + dependencies: + side-channel "^1.0.4" qs@~6.5.2: version "6.5.2" @@ -540,22 +618,6 @@ regenerator-runtime@^0.13.4: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== -request-promise-core@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" - integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== - dependencies: - lodash "^4.17.19" - -request-promise-native@^1.0.8: - version "1.0.9" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" - integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== - dependencies: - request-promise-core "1.1.4" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" @@ -592,13 +654,22 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.2: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -saxes@^5.0.0: +saxes@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== dependencies: xmlchars "^2.2.0" +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + slide@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" @@ -624,17 +695,21 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= - symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -tough-cookie@^2.3.3, tough-cookie@~2.5.0: +tough-cookie@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.1.2" + +tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== @@ -642,19 +717,10 @@ tough-cookie@^2.3.3, tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" -tough-cookie@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" - integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== - dependencies: - ip-regex "^2.1.0" - psl "^1.1.28" - punycode "^2.1.1" - -tr46@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" - integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== dependencies: punycode "^2.1.1" @@ -682,6 +748,11 @@ unhomoglyph@^1.0.6: resolved "https://registry.yarnpkg.com/unhomoglyph/-/unhomoglyph-1.0.6.tgz#ea41f926d0fcf598e3b8bb2980c2ddac66b081d3" integrity sha512-7uvcWI3hWshSADBu4JpnyYbTVc7YlhF5GDW/oPD5AxIxl34k4wXR3WDkPnzLxkN32LiTCTKMQLtKVZiwki3zGg== +universalify@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -739,13 +810,13 @@ whatwg-mimetype@^2.3.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== -whatwg-url@^8.0.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.4.0.tgz#50fb9615b05469591d2b2bd6dfaed2942ed72837" - integrity sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw== +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.6.0.tgz#27c0205a4902084b872aecb97cf0f2a7a3011f4c" + integrity sha512-os0KkeeqUOl7ccdDT1qqUcS4KH4tcBTSKK5Nl5WKb2lyxInIZ/CpjkqKa1Ss12mjfdcRX9mHmPPs7/SxG1Hbdw== dependencies: - lodash.sortby "^4.7.0" - tr46 "^2.0.2" + lodash "^4.7.0" + tr46 "^2.1.0" webidl-conversions "^6.1.0" word-wrap@~1.2.3: @@ -762,7 +833,7 @@ write-file-atomic@^1.1.4: imurmurhash "^0.1.4" slide "^1.1.5" -ws@^7.2.3: +ws@^7.4.5: version "7.4.6" resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== From b7e73fc533137cfc464b7be9024589cef3625d3c Mon Sep 17 00:00:00 2001 From: vulet Date: Fri, 23 Jul 2021 14:02:32 +0800 Subject: [PATCH 73/89] refactor(proxy): w/ cycling, rm fallback. refactor(config): adjust for cycling. --- commands/invidious.js | 35 +++++++++++++++++------------------ commands/nitter.js | 23 +++++++++++------------ commands/proxy.js | 4 ++++ config.example.js | 16 +++++++++------- utils.js | 16 ++++++++++++++-- 5 files changed, 55 insertions(+), 39 deletions(-) create mode 100644 commands/proxy.js diff --git a/commands/invidious.js b/commands/invidious.js index 0b49329..90d6dd4 100644 --- a/commands/invidious.js +++ b/commands/invidious.js @@ -1,8 +1,3 @@ -const headers = ({ domain, userAgent }) => ({ - Host: `${domain}`, - 'User-Agent': `${userAgent}`, -}); - const invidious = async (instance, url) => { const req = await instance({ method: 'GET', url }); if (req.statusText !== 'OK') throw req; @@ -31,24 +26,28 @@ const card = (video, path) => `
(${video.date})

`; - const getInstance = config => - axios.create({ - baseURL: `https://${config.domain}/api/v1/videos`, - headers: headers(config), - transformResponse: [], - timeout: 10 * 1000, - }); +const getInstance = (domain, config) => + axios.create({ + baseURL: `https://${domain}/api/v1/videos`, + headers: { + Host: `${domain}`, + 'User-Agent': `${config.userAgent}`, + }, + transformResponse: [], + timeout: 10 * 1000, + }); - const run = async (roomId, userInput) => { - const video = await invidious(getInstance(config.invidious), userInput) - .catch(_ => invidious(getInstance(Object.assign(config.invidious, { domain: config.invidious.fallback })), userInput)); - return matrixClient.sendHtmlNotice(roomId, '', card(video, userInput)); - }; +const run = async (roomId, userInput) => { + const cfg = config.invidious; + const video = await matrix.utils.retryPromise(cfg.domains.redirect, domain => invidious(getInstance(domain, cfg), userInput)); + return matrixClient.sendHtmlNotice(roomId, '', card(video, userInput)); +}; exports.runQuery = async (roomId, event, userInput) => { try { const url = new URL(userInput); - if (!config.invidious.domains.includes(url.hostname)) throw ''; + const { redirect, original } = config.invidious.domains; + if (!redirect.includes(url.hostname) && !original.includes(url.hostname)) throw ''; if (/^\/[\w-]{11}$/.test(url.pathname)) return await run(roomId, url.pathname.slice(1)); const params = new URLSearchParams(url.search).get('v'); if (!/^[\w-]{11}$/.test(params)) throw ''; diff --git a/commands/nitter.js b/commands/nitter.js index aa470e6..5651b59 100644 --- a/commands/nitter.js +++ b/commands/nitter.js @@ -1,10 +1,5 @@ const { JSDOM } = require('jsdom'); -const headers = ({ domain, userAgent }) => ({ - Host: `${domain}`, - 'User-Agent': `${userAgent}`, -}); - const nitter = async (instance, url) => { const req = await instance({ method: 'GET', url }); if (req.statusText !== 'OK') throw req; @@ -52,24 +47,28 @@ const card = (tweet, check, path) => (tweet.isReply ? tweet.isReply === 'unavailable' ? '
Replied Tweet is unavailable
' : `
Replied Tweet
${tweet.isReply.text.replace('\n', '
')}
` : '') + (tweet.quote ? `
Quoted Tweet
${tweet.quote.text.replace('\n', '
')}
` : ''); -const getInstance = config => +const getInstance = (domain, config) => axios.create({ - baseURL: `https://${config.domain}`, - headers: headers(config), + baseURL: `https://${domain}`, + headers: { + Host: `${domain}`, + 'User-Agent': `${config.userAgent}`, + }, transformResponse: [], timeout: 10 * 1000, }); const run = async (roomId, userInput) => { - const tweet = await nitter(getInstance(config.nitter), userInput) - .catch(_ => nitter(getInstance(Object.assign(config.nitter, { domain: config.nitter.fallback })), userInput)); - return matrixClient.sendHtmlNotice(roomId, '', card(tweet, config.nitter.check, userInput)); + const cfg = config.nitter; + const tweet = await matrix.utils.retryPromise(cfg.domains.redirect, domain => nitter(getInstance(domain, cfg), userInput)); + return matrixClient.sendHtmlNotice(roomId, '', card(tweet, cfg.check, userInput)); }; exports.runQuery = async (roomId, event, userInput) => { try { const url = new URL(userInput); - if (!config.nitter.domains.includes(url.hostname)) throw ''; + const { redirect, original } = config.nitter.domains; + if (!redirect.includes(url.hostname) && !original.includes(url.hostname)) throw ''; if (!/^\/[^/]+\/status\/\d+\/?$/.test(url.pathname)) throw ''; return await run(roomId, url.pathname); } catch (e) { diff --git a/commands/proxy.js b/commands/proxy.js new file mode 100644 index 0000000..0b5b431 --- /dev/null +++ b/commands/proxy.js @@ -0,0 +1,4 @@ + +const msg = 'Invalid proxy domain!'; +exports.runQuery = (roomId, event, userInput) => + matrixClient.sendHtmlNotice(roomId, msg, `${msg}`).catch(() => {}); diff --git a/config.example.js b/config.example.js index a216d7d..26e6f4d 100644 --- a/config.example.js +++ b/config.example.js @@ -23,16 +23,18 @@ module.exports = { userAgent: 'Mozilla/4.0 (compatible; Beep Boop)' }, nitter: { - domain: 'nitter.fdn.fr', - fallback: 'nitter.snopyta.org', userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', - domains: [ 'nitter.snopyta.org', 'nitter.net', 'www.nitter.net', 'twitter.com', 'www.twitter.com', 'mobile.twitter.com', 'm.twitter.com', 'nitter.fdn.fr' ], - check: '(✅)' + domains: { + redirect: [ 'nitter.fdn.fr', 'nitter.snopyta.org', 'nitter.net' ], + original: [ 'nitter.net', 'www.nitter.net', 'twitter.com', 'www.twitter.com', 'mobile.twitter.com', 'm.twitter.com' ] + }, + check: '(✅)', }, invidious: { - domain: 'invidious.fdn.fr', - fallback: 'invidious.snopyta.org', userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', - domains: [ 'invidious.snopyta.org', 'invidious.xyz', 'youtube.com', 'www.youtube.com', 'youtu.be', 'm.youtube.com', 'invidious.fdn.fr' ] + domains: { + redirect: [ 'invidious.fdn.fr', 'invidious.snopyta.org', 'invidious.xyz', 'inv.riverside.rocks', 'vid.puffyan.us', 'y.com.cm' ], + original: [ 'youtube.com', 'www.youtube.com', 'youtu.be', 'm.youtube.com' ] + } } }; diff --git a/utils.js b/utils.js index ac60bb7..5bde1d2 100644 --- a/utils.js +++ b/utils.js @@ -49,9 +49,11 @@ const eventHandler = (args, roomId, command, event) => { case 'proxy': case 'p': try { const url = new URL(userInput); - command = config.invidious.domains.includes(url.hostname) + const invidio = config.invidious.domains; + const nitter = config.nitter.domains; + command = invidio.redirect.includes(url.hostname) || invidio.original.includes(url.hostname) ? 'invidious' - : config.nitter.domains.includes(url.hostname) + : nitter.redirect.includes(url.hostname) || nitter.original.includes(url.hostname) ? 'nitter' : 'proxy'; } catch (e) { sendError(event, roomId, e); } @@ -131,3 +133,13 @@ module.exports.selfReact = async (event) => { if (config.fediverse.tipping === true) addReact(event, '🌧️'); } }; + +module.exports.retryPromise = async (argList, promiseFn) => { + let err; + for(var arg of argList) { + try { + return await promiseFn(arg); + } catch(e) { err = e; } + } + throw err || new Error('retryPromise error'); +}; From be3e68f22190ed141e95cc33c9f5186b460b8a5a Mon Sep 17 00:00:00 2001 From: vulet Date: Fri, 23 Jul 2021 16:27:06 +0800 Subject: [PATCH 74/89] fix(nitter): missing threading. fix(proxy): add into registrar. --- commands/nitter.js | 5 +++++ registrar.js | 1 + 2 files changed, 6 insertions(+) diff --git a/commands/nitter.js b/commands/nitter.js index 5651b59..33d1252 100644 --- a/commands/nitter.js +++ b/commands/nitter.js @@ -27,6 +27,10 @@ const nitter = async (instance, url) => { path: replies[replies.length - 1].querySelector('a.tweet-link').href, text: replies[replies.length - 1].querySelector('.tweet-content').innerHTML, } : null, + isThread: !isReply && replies.length > 0 ? replies[replies.length - 1].classList.contains('unavailable') ? 'unavailable' : { + path: replies[replies.length - 1].querySelector('a.tweet-link').href, + text: replies[replies.length - 1].querySelector('.tweet-content').innerHTML, + } : null, stats: { replies: stats[0].textContent.trim(), retweets: stats[1].textContent.trim(), @@ -45,6 +49,7 @@ const card = (tweet, check, path) => `
${tweet.text.replace('\n', '
')}
` + (tweet.hasAttachments ? '
This tweet has attached media.
' : '') + (tweet.isReply ? tweet.isReply === 'unavailable' ? '
Replied Tweet is unavailable
' : `
Replied Tweet
${tweet.isReply.text.replace('\n', '
')}
` : '') + +(tweet.isThread ? tweet.isThread === 'unavailable' ? '
Previous Tweet is unavailable
' : `
Previous Tweet
${tweet.isThread.text.replace('\n', '
')}
` : '') + (tweet.quote ? `
Quoted Tweet
${tweet.quote.text.replace('\n', '
')}
` : ''); const getInstance = (domain, config) => diff --git a/registrar.js b/registrar.js index a4540d5..24aff32 100644 --- a/registrar.js +++ b/registrar.js @@ -27,6 +27,7 @@ global.matrix = { module.exports = { config: require('./config.js'), archive: require('./commands/archive.js'), + proxy: require('./commands/proxy.js'), invidious: require('./commands/invidious.js'), nitter: require('./commands/nitter.js'), beg: require('./commands/fediverse/beg.js'), From 44e4138b8038a22abf370469fb8690de7bdba8b8 Mon Sep 17 00:00:00 2001 From: vulet Date: Fri, 23 Jul 2021 16:37:14 +0800 Subject: [PATCH 75/89] chore(all): bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 79e9042..eb0b99b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ligh7hau5", - "version": "1.2.3", + "version": "2.0.0", "description": "A Matrix to Fediverse client", "main": "main.js", "scripts": { From 6273452876b64b33059af6d6c1467e2d0eaff2fa Mon Sep 17 00:00:00 2001 From: vulet Date: Fri, 6 Aug 2021 20:13:36 +0800 Subject: [PATCH 76/89] fix(e2ee): command-by-reaction/emote and reply by . chore(deps): upgrade matrix-js-sdk, and refactor for it. bump version. --- auth.js | 1 + main.js | 5 ++--- package.json | 4 ++-- utils.js | 34 ++++++++++++++++++++++++++-------- yarn.lock | 27 +++++++++++++++++++++++---- 5 files changed, 54 insertions(+), 17 deletions(-) diff --git a/auth.js b/auth.js index ea5769c..91e17f2 100644 --- a/auth.js +++ b/auth.js @@ -18,6 +18,7 @@ const matrixTokenLogin = async () => { + '====================================================', ); } + matrixClient.setGlobalErrorOnUnknownDevices(config.matrix.manualVerify); matrixClient.startClient(); }); }; diff --git a/main.js b/main.js index f4d6e39..bb8ced0 100644 --- a/main.js +++ b/main.js @@ -18,7 +18,7 @@ matrixClient.on('RoomMember.membership', (event, member) => { }); matrixClient.on('event', async (event) => { - if (event.isEncrypted()) await event._decryptionPromise; + if (event.isEncrypted()) await matrixClient.decryptEventIfNeeded(event, { emit: false, isRetry: false }); if (event.getSender() === matrixClient.credentials.userId) return matrix.utils.selfReact(event); if (!event.getContent()['m.relates_to']) return; if (event.event.unsigned.age > 10000) return; @@ -27,9 +27,8 @@ matrixClient.on('event', async (event) => { }); matrixClient.on('Room.timeline', async (event, member, toStartOfTimeline) => { - matrixClient.setGlobalErrorOnUnknownDevices(config.matrix.manualVerify); if (toStartOfTimeline) return; - if (event.isEncrypted()) await event._decryptionPromise; + if (event.isEncrypted()) await matrixClient.decryptEventIfNeeded(event, { emit: false, isRetry: false }); if (event.getType() !== 'm.room.message') return; if (event.getSender() === matrixClient.credentials.userId) return; if (event.event.unsigned.age > 10000) return; diff --git a/package.json b/package.json index eb0b99b..52f274c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ligh7hau5", - "version": "2.0.0", + "version": "2.1.0", "description": "A Matrix to Fediverse client", "main": "main.js", "scripts": { @@ -21,7 +21,7 @@ "axios": "^0.21.1", "form-data": "^3.0.0", "jsdom": "^16.6.0", - "matrix-js-sdk": "^9.11.0", + "matrix-js-sdk": "^12.2.0", "node-localstorage": "^2.2.1", "olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.4.tgz", "qs": "^6.10.1" diff --git a/utils.js b/utils.js index 5bde1d2..8472cac 100644 --- a/utils.js +++ b/utils.js @@ -1,3 +1,5 @@ +const { MatrixEvent } = require('matrix-js-sdk/lib/models/event'); + const sendError = async (event, roomId, e) => { e.response ? error = `Error(${e.response.status}): ${e.response.data.error}` : e.data ? error = `Error(${e.errcode}): ${e.data.error}` @@ -64,12 +66,28 @@ const eventHandler = (args, roomId, command, event) => { registrar[command] && registrar[command].runQuery.apply(null, args); }; +/** +matrixClient.fetchRoomEvent() does not return an Event class +however, this class is necessary for decryption, so reinstate it. +afterwards, decrypt. +*/ +const fetchEncryptedOrNot = async (roomId, event) => { + const fetchedEvent = await matrixClient.fetchRoomEvent(roomId, event.event_id) + const realEvent = new MatrixEvent(fetchedEvent); + if (realEvent.isEncrypted()) { + await matrixClient.decryptEventIfNeeded(realEvent, { emit: false, isRetry: false }); + } + return realEvent; +} + module.exports.sendError = sendError; module.exports.addReact = addReact; module.exports.eventHandler = eventHandler; +module.exports.fetchEncryptedOrNot = fetchEncryptedOrNot + module.exports.editNoticeHTML = (roomId, event, html, plain) => matrixClient.sendMessage(roomId, { body: ` * ${plain || html.replace(/<[^<]+?>/g, '')}`, formatted_body: ` * ${html}`, @@ -89,11 +107,11 @@ module.exports.editNoticeHTML = (roomId, event, html, plain) => matrixClient.sen module.exports.handleReact = async (event) => { const roomId = event.event.room_id; + if (!event.getContent()['m.relates_to']) return; const reaction = event.getContent()['m.relates_to']; - if (!reaction) return; - const metaEvent = await matrixClient.fetchRoomEvent(roomId, reaction.event_id); - if (!metaEvent.content.meta || metaEvent.sender !== config.matrix.user) return; - const args = metaEvent.content.meta.split(' '); + const metaEvent = await fetchEncryptedOrNot(roomId, reaction); + if (!metaEvent.getContent().meta || metaEvent.sender !== config.matrix.user) return; + const args = metaEvent.getContent().meta.split(' '); isMeta = ['status', 'reblog', 'mention', 'redact', 'unreblog']; if (!isMeta.includes(args[0])) return; let command = []; @@ -107,10 +125,10 @@ module.exports.handleReact = async (event) => { module.exports.handleReply = async (event) => { const roomId = event.event.room_id; + if(!event.getContent()['m.relates_to']['m.in_reply_to']) return; const reply = event.getContent()['m.relates_to']['m.in_reply_to']; - if (!reply) return; - const metaEvent = await matrixClient.fetchRoomEvent(roomId, reply.event_id); - if (!metaEvent.content.meta || metaEvent.sender !== config.matrix.user) return; + const metaEvent = await fetchEncryptedOrNot(roomId, reply); + if (!metaEvent.getContent().meta || metaEvent.sender !== config.matrix.user) return; const args = metaEvent.content.meta.split(' '); args.push(event.event.content.formatted_body.trim().split('')[1]); isMeta = ['status', 'reblog', 'mention', 'redact', 'unreblog']; @@ -123,8 +141,8 @@ module.exports.handleReply = async (event) => { module.exports.selfReact = async (event) => { if (event.getType() !== 'm.room.message') return; if (event.event.unsigned.age > 10000) return; + if (!event.getContent().meta) return; const { meta } = event.getContent(); - if (!meta) return; const type = meta.split(' ')[0]; if (type === 'redact' || type === 'unreblog') addReact(event, '🗑️️'); if (type === 'status' || type === 'reblog' || type === 'mention') { diff --git a/yarn.lock b/yarn.lock index 2fac860..c2c2a9d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14,6 +14,11 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@types/retry@^0.12.0": + version "0.12.1" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" + integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== + abab@^2.0.3, abab@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" @@ -506,10 +511,10 @@ loglevel@^1.7.1: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== -matrix-js-sdk@^9.11.0: - version "9.11.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-9.11.0.tgz#57ba60dfbcf2b32917eb6d7232d0e81cf0de0d3a" - integrity sha512-wP28ybOxyQ7lbC48QddRORYr8atEwbTqDOsu8H6u9jTTgB2qqczI/bkSoXHtutODuSeLY5x0UuwLcxVCy4yxVQ== +matrix-js-sdk@^12.2.0: + version "12.2.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-12.2.0.tgz#e1dc7ddac054289cb24ee3d11dba8a5ba5ddecf5" + integrity sha512-foSs3uKRc6uvFNhgY35eErBvLWVDd5RNIxxsdFKlmU3B+70YUf3BP3petyBNW34ORyOqNdX36IiApfLo3npNEw== dependencies: "@babel/runtime" "^7.12.5" another-json "^0.2.0" @@ -517,6 +522,7 @@ matrix-js-sdk@^9.11.0: bs58 "^4.0.1" content-type "^1.0.4" loglevel "^1.7.1" + p-retry "^4.5.0" qs "^6.9.6" request "^2.88.2" unhomoglyph "^1.0.6" @@ -576,6 +582,14 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" +p-retry@^4.5.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" + integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== + dependencies: + "@types/retry" "^0.12.0" + retry "^0.13.1" + parse5@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" @@ -644,6 +658,11 @@ request@^2.88.2: tunnel-agent "^0.6.0" uuid "^3.3.2" +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + safe-buffer@^5.0.1, safe-buffer@^5.1.2: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" From 06e0ce26a92ad971a9b3e9dfc14548554d025969 Mon Sep 17 00:00:00 2001 From: vulet Date: Mon, 9 Aug 2021 17:14:46 +0800 Subject: [PATCH 77/89] fix(archive): The latest version of the `matrix-js-sdk` dependency requires a Node version of at least: 12.9. Node 12 introduced TLSv1.3 as default, which `axios` then uses. This is causing the archive command to break, so the particular command will continue forward with TLSv1.2 for now. --- commands/archive.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/commands/archive.js b/commands/archive.js index a8802c3..c91e725 100644 --- a/commands/archive.js +++ b/commands/archive.js @@ -1,5 +1,6 @@ const { JSDOM } = require('jsdom'); const qs = require('qs'); +const https = require('https'); const sleep = ms => new Promise(r => setTimeout(r, ms)); @@ -35,6 +36,7 @@ const arc3Str = str => `Timed out ${str}`; const run = async (roomId, userInput, rearchive) => { const instance = axios.create({ baseURL: `https://${config.archive.domain}`, + httpsAgent: https.Agent({ maxVersion: "TLSv1.2"}), headers: headers(config.archive), transformResponse: [], timeout: 10 * 1000 From dded6570092dcce051374ae47f4674d75bd24bc9 Mon Sep 17 00:00:00 2001 From: vulet Date: Mon, 9 Aug 2021 17:34:40 +0800 Subject: [PATCH 78/89] chore(package): bump version. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 52f274c..54214f0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ligh7hau5", - "version": "2.1.0", + "version": "2.1.1", "description": "A Matrix to Fediverse client", "main": "main.js", "scripts": { From ccdcf69bea574eaf426d75c31e377e01ff8dc615 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Sep 2021 20:25:01 +0000 Subject: [PATCH 79/89] chore(deps): bump matrix-js-sdk from 12.2.0 to 12.4.1 Bumps [matrix-js-sdk](https://github.com/matrix-org/matrix-js-sdk) from 12.2.0 to 12.4.1. - [Release notes](https://github.com/matrix-org/matrix-js-sdk/releases) - [Changelog](https://github.com/matrix-org/matrix-js-sdk/blob/develop/CHANGELOG.md) - [Commits](https://github.com/matrix-org/matrix-js-sdk/compare/v12.2.0...v12.4.1) --- updated-dependencies: - dependency-name: matrix-js-sdk dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 54214f0..1891c50 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "axios": "^0.21.1", "form-data": "^3.0.0", "jsdom": "^16.6.0", - "matrix-js-sdk": "^12.2.0", + "matrix-js-sdk": "^12.4.1", "node-localstorage": "^2.2.1", "olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.4.tgz", "qs": "^6.10.1" diff --git a/yarn.lock b/yarn.lock index c2c2a9d..e90eab0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -511,10 +511,10 @@ loglevel@^1.7.1: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== -matrix-js-sdk@^12.2.0: - version "12.2.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-12.2.0.tgz#e1dc7ddac054289cb24ee3d11dba8a5ba5ddecf5" - integrity sha512-foSs3uKRc6uvFNhgY35eErBvLWVDd5RNIxxsdFKlmU3B+70YUf3BP3petyBNW34ORyOqNdX36IiApfLo3npNEw== +matrix-js-sdk@^12.4.1: + version "12.4.1" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-12.4.1.tgz#966f506b4146e4fafffa5bbe80f5c53515e1bc78" + integrity sha512-C9aSGX9e4GoCm0Rli+iGBXmcnRxnwETw7MvgNcSBfPaLHOMZi/wz4YOV7HEZK8R+OXuDrDYyglncWSJkkoDpAQ== dependencies: "@babel/runtime" "^7.12.5" another-json "^0.2.0" From 9067ae600bb20b98775c137254e87a3007445112 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Sep 2021 06:35:31 +0000 Subject: [PATCH 80/89] chore(deps): bump axios from 0.21.1 to 0.21.2 Bumps [axios](https://github.com/axios/axios) from 0.21.1 to 0.21.2. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v0.21.1...v0.21.2) --- updated-dependencies: - dependency-name: axios dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 1891c50..14d2a02 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ }, "homepage": "https://github.com/vulet/lighthau5#readme", "dependencies": { - "axios": "^0.21.1", + "axios": "^0.21.2", "form-data": "^3.0.0", "jsdom": "^16.6.0", "matrix-js-sdk": "^12.4.1", diff --git a/yarn.lock b/yarn.lock index e90eab0..933e4a7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -96,12 +96,12 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -axios@^0.21.1: - version "0.21.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" - integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== +axios@^0.21.2: + version "0.21.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.2.tgz#21297d5084b2aeeb422f5d38e7be4fbb82239017" + integrity sha512-87otirqUw3e8CzHTMO+/9kh/FSgXt/eVDvipijwDtEuwbkySWZ9SBm6VEubmJ/kLKEoLQV/POhxXFb66bfekfg== dependencies: - follow-redirects "^1.10.0" + follow-redirects "^1.14.0" base-x@^3.0.2: version "3.0.8" @@ -291,10 +291,10 @@ fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= -follow-redirects@^1.10.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" - integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== +follow-redirects@^1.14.0: + version "1.14.4" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" + integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== forever-agent@~0.6.1: version "0.6.1" From 3b16a0495c63e18b02a680829411916192fb612d Mon Sep 17 00:00:00 2001 From: vulet Date: Mon, 24 Jan 2022 17:53:34 +0800 Subject: [PATCH 81/89] feat(cmd): stop flood/notify. fix(cmd): bad return. chore(deps): upgrade all. --- commands/fediverse/flood.js | 14 +- commands/fediverse/notify.js | 14 +- commands/help.js | 2 + package.json | 12 +- utils.js | 8 +- yarn.lock | 369 +++++++++++++++++------------------ 6 files changed, 217 insertions(+), 202 deletions(-) diff --git a/commands/fediverse/flood.js b/commands/fediverse/flood.js index b016abd..c3b28ff 100644 --- a/commands/fediverse/flood.js +++ b/commands/fediverse/flood.js @@ -1,5 +1,15 @@ -exports.runQuery = function (roomId) { - setInterval(() => { +let intervalId = null; + +exports.runQuery = function (roomId, disable) { + + if (intervalId) { + clearInterval(intervalId); + intervalId = null; + } + + if (disable) return; + + intervalId = setInterval(() => { axios({ method: 'GET', url: `${config.fediverse.domain}/api/v1/timelines/home`, diff --git a/commands/fediverse/notify.js b/commands/fediverse/notify.js index c77c6b1..37079a7 100644 --- a/commands/fediverse/notify.js +++ b/commands/fediverse/notify.js @@ -1,5 +1,15 @@ -exports.runQuery = function (roomId) { - setInterval(() => { +let intervalId = null; + +exports.runQuery = function (roomId, disable) { + + if (intervalId) { + clearInterval(intervalId); + intervalId = null; + } + + if (disable) return; + + intervalId = setInterval(() => { axios({ method: 'GET', url: `${config.fediverse.domain}/api/v1/notifications`, diff --git a/commands/help.js b/commands/help.js index 44904dd..d08b59b 100644 --- a/commands/help.js +++ b/commands/help.js @@ -17,6 +17,8 @@ exports.runQuery = function (roomId) { + '
channel commands
' + '+flood : turn on timeline in channel
' + '+notify : show notifications in channel
' + + '+unflood : stop timeline in channel
' + + '+unnotify : stop notifications in channel
' + '+archive [URL] : archive content
' + '+rearchive [URL] : re-archive content
' + '+nitter [status URL] : redirect twitter to nitter, also embed tweet
' diff --git a/package.json b/package.json index 14d2a02..bc5adcd 100644 --- a/package.json +++ b/package.json @@ -18,13 +18,13 @@ }, "homepage": "https://github.com/vulet/lighthau5#readme", "dependencies": { - "axios": "^0.21.2", - "form-data": "^3.0.0", - "jsdom": "^16.6.0", - "matrix-js-sdk": "^12.4.1", + "axios": "^0.25.0", + "form-data": "^4.0.0", + "jsdom": "^19.0.0", + "matrix-js-sdk": "^15.4.0", "node-localstorage": "^2.2.1", - "olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.4.tgz", - "qs": "^6.10.1" + "olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz", + "qs": "^6.10.3" }, "devDependencies": {} } diff --git a/utils.js b/utils.js index 8472cac..98c3db2 100644 --- a/utils.js +++ b/utils.js @@ -32,6 +32,10 @@ const eventHandler = (args, roomId, command, event) => { case 'help': case 'flood': case 'notify': args.push(roomId); break; + case 'unflood': case 'unnotify': + args.push(roomId, true); + command = command.substring(2); + break; case 'tip': case 'makeitrain': args.push(roomId, event, address, flaggedInput); break; @@ -110,7 +114,7 @@ module.exports.handleReact = async (event) => { if (!event.getContent()['m.relates_to']) return; const reaction = event.getContent()['m.relates_to']; const metaEvent = await fetchEncryptedOrNot(roomId, reaction); - if (!metaEvent.getContent().meta || metaEvent.sender !== config.matrix.user) return; + if (!metaEvent.getContent().meta || metaEvent.event.sender !== config.matrix.user) return; const args = metaEvent.getContent().meta.split(' '); isMeta = ['status', 'reblog', 'mention', 'redact', 'unreblog']; if (!isMeta.includes(args[0])) return; @@ -128,7 +132,7 @@ module.exports.handleReply = async (event) => { if(!event.getContent()['m.relates_to']['m.in_reply_to']) return; const reply = event.getContent()['m.relates_to']['m.in_reply_to']; const metaEvent = await fetchEncryptedOrNot(roomId, reply); - if (!metaEvent.getContent().meta || metaEvent.sender !== config.matrix.user) return; + if (!metaEvent.getContent().meta || metaEvent.event.sender !== config.matrix.user) return; const args = metaEvent.content.meta.split(' '); args.push(event.event.content.formatted_body.trim().split('')[1]); isMeta = ['status', 'reblog', 'mention', 'redact', 'unreblog']; diff --git a/yarn.lock b/yarn.lock index 933e4a7..4f9e917 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,16 +3,16 @@ "@babel/runtime@^7.12.5": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.6.tgz#535203bc0892efc7dec60bdc27b2ecf6e409062d" - integrity sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" + integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== dependencies: regenerator-runtime "^0.13.4" -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== "@types/retry@^0.12.0": version "0.12.1" @@ -42,10 +42,10 @@ acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4: - version "8.4.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.0.tgz#af53266e698d7cffa416714b503066a82221be60" - integrity sha512-ULr0LDaEqQrMFGyQ3bhJkLsbtrQ8QibAseGZeaSUiT/6zb9IvIkomWHJIvgvwad+hinRAgsI51JcWk2yvwyL+w== +acorn@^8.5.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== agent-base@6: version "6.0.2" @@ -70,9 +70,9 @@ another-json@^0.2.0: integrity sha1-tfQBnJc7bdXGUGotk0acttMq7tw= asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== dependencies: safer-buffer "~2.1.0" @@ -96,17 +96,17 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -axios@^0.21.2: - version "0.21.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.2.tgz#21297d5084b2aeeb422f5d38e7be4fbb82239017" - integrity sha512-87otirqUw3e8CzHTMO+/9kh/FSgXt/eVDvipijwDtEuwbkySWZ9SBm6VEubmJ/kLKEoLQV/POhxXFb66bfekfg== +axios@^0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" + integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== dependencies: - follow-redirects "^1.14.0" + follow-redirects "^1.14.7" base-x@^3.0.2: - version "3.0.8" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" - integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== dependencies: safe-buffer "^5.0.1" @@ -164,10 +164,10 @@ core-util-is@1.0.2: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== cssom@~0.3.6: version "0.3.8" @@ -188,43 +188,43 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== +data-urls@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.1.tgz#597fc2ae30f8bc4dbcf731fcd1b1954353afc6f8" + integrity sha512-Ds554NeT5Gennfoo9KN50Vh6tpgtvYEwraYjejXnyTpu1C7oXKxdFk75REooENHE8ndTVOJuv+BEs4/J/xcozw== dependencies: abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^10.0.0" debug@4: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== dependencies: ms "2.1.2" -decimal.js@^10.2.1: - version "10.2.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" - integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== +decimal.js@^10.3.1: + version "10.3.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" + integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== dependencies: - webidl-conversions "^5.0.0" + webidl-conversions "^7.0.0" ecc-jsbn@~0.1.1: version "0.1.2" @@ -252,9 +252,9 @@ esprima@^4.0.1: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" @@ -272,9 +272,9 @@ extsprintf@1.3.0: integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== fast-deep-equal@^3.1.1: version "3.1.3" @@ -291,20 +291,20 @@ fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= -follow-redirects@^1.14.0: - version "1.14.4" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" - integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== +follow-redirects@^1.14.7: + version "1.14.7" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685" + integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" @@ -341,9 +341,9 @@ getpass@^0.1.1: assert-plus "^1.0.0" graceful-fs@^4.1.11: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== har-schema@^2.0.0: version "2.0.0" @@ -370,19 +370,19 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== dependencies: - whatwg-encoding "^1.0.5" + whatwg-encoding "^2.0.0" -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== dependencies: - "@tootallnate/once" "1" + "@tootallnate/once" "2" agent-base "6" debug "4" @@ -403,12 +403,12 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: - safer-buffer ">= 2.1.2 < 3" + safer-buffer ">= 2.1.2 < 3.0.0" imurmurhash@^0.1.4: version "0.1.4" @@ -435,23 +435,23 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsdom@^16.6.0: - version "16.6.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" - integrity sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== +jsdom@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-19.0.0.tgz#93e67c149fe26816d38a849ea30ac93677e16b6a" + integrity sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A== dependencies: abab "^2.0.5" - acorn "^8.2.4" + acorn "^8.5.0" acorn-globals "^6.0.0" - cssom "^0.4.4" + cssom "^0.5.0" cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" + data-urls "^3.0.1" + decimal.js "^10.3.1" + domexception "^4.0.0" escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" is-potential-custom-element-name "^1.0.1" nwsapi "^2.2.0" @@ -460,23 +460,23 @@ jsdom@^16.6.0: symbol-tree "^3.2.4" tough-cookie "^4.0.0" w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.5" - xml-name-validator "^3.0.0" + w3c-xmlserializer "^3.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^10.0.0" + ws "^8.2.3" + xml-name-validator "^4.0.0" json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== json-stringify-safe@~5.0.1: version "5.0.1" @@ -484,13 +484,13 @@ json-stringify-safe@~5.0.1: integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== dependencies: assert-plus "1.0.0" extsprintf "1.3.0" - json-schema "0.2.3" + json-schema "0.4.0" verror "1.10.0" levn@~0.3.0: @@ -501,20 +501,15 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -lodash@^4.7.0: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - loglevel@^1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" - integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== + version "1.8.0" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" + integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== -matrix-js-sdk@^12.4.1: - version "12.4.1" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-12.4.1.tgz#966f506b4146e4fafffa5bbe80f5c53515e1bc78" - integrity sha512-C9aSGX9e4GoCm0Rli+iGBXmcnRxnwETw7MvgNcSBfPaLHOMZi/wz4YOV7HEZK8R+OXuDrDYyglncWSJkkoDpAQ== +matrix-js-sdk@^15.4.0: + version "15.4.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-15.4.0.tgz#3bc7638c8c9313f64cf4410e0e83a376facc3e41" + integrity sha512-4iFYnIYEzRwM8W+D3wwcpcv3EspxlYgBNZN3pxWUoYqsTL8PnPSsq2wYFWsoKfEt27EEWour5jwEoP8vjlwYOw== dependencies: "@babel/runtime" "^7.12.5" another-json "^0.2.0" @@ -527,17 +522,17 @@ matrix-js-sdk@^12.4.1: request "^2.88.2" unhomoglyph "^1.0.6" -mime-db@1.48.0: - version "1.48.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" - integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== +mime-db@1.51.0: + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.31" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" - integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== dependencies: - mime-db "1.48.0" + mime-db "1.51.0" ms@2.1.2: version "2.1.2" @@ -562,13 +557,13 @@ oauth-sign@~0.9.0: integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== object-inspect@^1.9.0: - version "1.10.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" - integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== -"olm@https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.4.tgz": - version "3.2.4" - resolved "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.4.tgz#edc0156a17eb1087df44f6e0b153ef0c9d454495" +"olm@https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz": + version "3.2.8" + resolved "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz#8d53636d045e1776e2a2ec6613e57330dd9ce856" optionator@^0.8.1: version "0.8.3" @@ -615,22 +610,22 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@^6.10.1, qs@^6.9.6: - version "6.10.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" - integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== +qs@^6.10.3, qs@^6.9.6: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== dependencies: side-channel "^1.0.4" qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== regenerator-runtime@^0.13.4: - version "0.13.7" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" - integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== request@^2.88.2: version "2.88.2" @@ -668,7 +663,7 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.2: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -700,9 +695,9 @@ source-map@~0.6.1: integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -736,10 +731,10 @@ tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== dependencies: punycode "^2.1.1" @@ -800,43 +795,37 @@ w3c-hr-time@^1.0.2: dependencies: browser-process-hrtime "^1.0.0" -w3c-xmlserializer@^2.0.0: +w3c-xmlserializer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz#06cdc3eefb7e4d0b20a560a5a3aeb0d2d9a65923" + integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg== + dependencies: + xml-name-validator "^4.0.0" + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +whatwg-encoding@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== dependencies: - xml-name-validator "^3.0.0" + iconv-lite "0.6.3" -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== +whatwg-url@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-10.0.0.tgz#37264f720b575b4a311bd4094ed8c760caaa05da" + integrity sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w== dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.6.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.6.0.tgz#27c0205a4902084b872aecb97cf0f2a7a3011f4c" - integrity sha512-os0KkeeqUOl7ccdDT1qqUcS4KH4tcBTSKK5Nl5WKb2lyxInIZ/CpjkqKa1Ss12mjfdcRX9mHmPPs7/SxG1Hbdw== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" + tr46 "^3.0.0" + webidl-conversions "^7.0.0" word-wrap@~1.2.3: version "1.2.3" @@ -852,15 +841,15 @@ write-file-atomic@^1.1.4: imurmurhash "^0.1.4" slide "^1.1.5" -ws@^7.4.5: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== +ws@^8.2.3: + version "8.4.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.2.tgz#18e749868d8439f2268368829042894b6907aa0b" + integrity sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA== -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== xmlchars@^2.2.0: version "2.2.0" From 3122361c6c8356d29ab61afa16febdd4ed64846f Mon Sep 17 00:00:00 2001 From: vulet Date: Mon, 25 Apr 2022 06:43:48 +0000 Subject: [PATCH 82/89] chore(deps): upgrade matrix-js-sdk. fix(e2ee): getContent() only summons m.relates_to for reactions. --- main.js | 2 +- package.json | 2 +- utils.js | 8 ++--- yarn.lock | 98 ++++++++++++++++++++++++++++++---------------------- 4 files changed, 62 insertions(+), 48 deletions(-) diff --git a/main.js b/main.js index bb8ced0..46df278 100644 --- a/main.js +++ b/main.js @@ -20,7 +20,7 @@ matrixClient.on('RoomMember.membership', (event, member) => { matrixClient.on('event', async (event) => { if (event.isEncrypted()) await matrixClient.decryptEventIfNeeded(event, { emit: false, isRetry: false }); if (event.getSender() === matrixClient.credentials.userId) return matrix.utils.selfReact(event); - if (!event.getContent()['m.relates_to']) return; + if (!event.event.content['m.relates_to']) return; if (event.event.unsigned.age > 10000) return; return event.getType() === 'm.room.message' ? matrix.utils.handleReply(event) : matrix.utils.handleReact(event); diff --git a/package.json b/package.json index bc5adcd..ffb6796 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "axios": "^0.25.0", "form-data": "^4.0.0", "jsdom": "^19.0.0", - "matrix-js-sdk": "^15.4.0", + "matrix-js-sdk": "^17.0.0", "node-localstorage": "^2.2.1", "olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz", "qs": "^6.10.3" diff --git a/utils.js b/utils.js index 98c3db2..48e5883 100644 --- a/utils.js +++ b/utils.js @@ -129,12 +129,12 @@ module.exports.handleReact = async (event) => { module.exports.handleReply = async (event) => { const roomId = event.event.room_id; - if(!event.getContent()['m.relates_to']['m.in_reply_to']) return; - const reply = event.getContent()['m.relates_to']['m.in_reply_to']; + if(!event.event.content['m.relates_to']['m.in_reply_to']) return; + const reply = event.event.content['m.relates_to']['m.in_reply_to']; const metaEvent = await fetchEncryptedOrNot(roomId, reply); if (!metaEvent.getContent().meta || metaEvent.event.sender !== config.matrix.user) return; - const args = metaEvent.content.meta.split(' '); - args.push(event.event.content.formatted_body.trim().split('')[1]); + const args = metaEvent.getContent().meta.split(' '); + args.push(event.getContent().formatted_body.trim().split('')[1]); isMeta = ['status', 'reblog', 'mention', 'redact', 'unreblog']; if (!isMeta.includes(args[0])) return; args.shift().toLowerCase(); diff --git a/yarn.lock b/yarn.lock index 4f9e917..69eab53 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,9 +3,9 @@ "@babel/runtime@^7.12.5": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" - integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72" + integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg== dependencies: regenerator-runtime "^0.13.4" @@ -19,10 +19,10 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== -abab@^2.0.3, abab@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== +abab@^2.0.5, abab@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== acorn-globals@^6.0.0: version "6.0.0" @@ -189,18 +189,18 @@ dashdash@^1.12.0: assert-plus "^1.0.0" data-urls@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.1.tgz#597fc2ae30f8bc4dbcf731fcd1b1954353afc6f8" - integrity sha512-Ds554NeT5Gennfoo9KN50Vh6tpgtvYEwraYjejXnyTpu1C7oXKxdFk75REooENHE8ndTVOJuv+BEs4/J/xcozw== + version "3.0.2" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== dependencies: - abab "^2.0.3" + abab "^2.0.6" whatwg-mimetype "^3.0.0" - whatwg-url "^10.0.0" + whatwg-url "^11.0.0" debug@4: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" @@ -292,9 +292,9 @@ fast-levenshtein@~2.0.6: integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= follow-redirects@^1.14.7: - version "1.14.7" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685" - integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== + version "1.14.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" + integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== forever-agent@~0.6.1: version "0.6.1" @@ -341,9 +341,9 @@ getpass@^0.1.1: assert-plus "^1.0.0" graceful-fs@^4.1.11: - version "4.2.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" - integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== har-schema@^2.0.0: version "2.0.0" @@ -359,9 +359,9 @@ har-validator@~5.1.3: har-schema "^2.0.0" has-symbols@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has@^1.0.3: version "1.0.3" @@ -396,9 +396,9 @@ http-signature@~1.2.0: sshpk "^1.7.0" https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" debug "4" @@ -506,10 +506,15 @@ loglevel@^1.7.1: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== -matrix-js-sdk@^15.4.0: - version "15.4.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-15.4.0.tgz#3bc7638c8c9313f64cf4410e0e83a376facc3e41" - integrity sha512-4iFYnIYEzRwM8W+D3wwcpcv3EspxlYgBNZN3pxWUoYqsTL8PnPSsq2wYFWsoKfEt27EEWour5jwEoP8vjlwYOw== +matrix-events-sdk@^0.0.1-beta.7: + version "0.0.1-beta.7" + resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1-beta.7.tgz#5ffe45eba1f67cc8d7c2377736c728b322524934" + integrity sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA== + +matrix-js-sdk@^17.0.0: + version "17.0.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-17.0.0.tgz#6edf2f8d05da003e98a6cf5269a4717adfe4e406" + integrity sha512-8nv+a1e6n4x4DYKiBFRS6/CIpsE22+31K+9/4Y5MB8m3iraSVBtdZ5y/9ktQnjQuo9I85TvyqHL2obRWF7UD5Q== dependencies: "@babel/runtime" "^7.12.5" another-json "^0.2.0" @@ -517,22 +522,23 @@ matrix-js-sdk@^15.4.0: bs58 "^4.0.1" content-type "^1.0.4" loglevel "^1.7.1" + matrix-events-sdk "^0.0.1-beta.7" p-retry "^4.5.0" qs "^6.9.6" request "^2.88.2" unhomoglyph "^1.0.6" -mime-db@1.51.0: - version "1.51.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" - integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.34" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" - integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - mime-db "1.51.0" + mime-db "1.52.0" ms@2.1.2: version "2.1.2" @@ -827,6 +833,14 @@ whatwg-url@^10.0.0: tr46 "^3.0.0" webidl-conversions "^7.0.0" +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -842,9 +856,9 @@ write-file-atomic@^1.1.4: slide "^1.1.5" ws@^8.2.3: - version "8.4.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.2.tgz#18e749868d8439f2268368829042894b6907aa0b" - integrity sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA== + version "8.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== xml-name-validator@^4.0.0: version "4.0.0" From 59240091545d444cca2df0ae8fad95d75f901404 Mon Sep 17 00:00:00 2001 From: vulet Date: Tue, 26 Apr 2022 03:09:55 +0000 Subject: [PATCH 83/89] feat(MSC3440): implement threads for feed and notifications. fix(sendHtmlNotice): possibly MSC1767 related. --- commands/archive.js | 2 +- commands/fediverse/unroll.js | 26 ++++++++++++++++++++++++++ commands/fediverse/utils.js | 25 +++++++++++++++++++++---- commands/help.js | 2 +- commands/invidious.js | 2 +- commands/nitter.js | 2 +- registrar.js | 3 ++- utils.js | 4 +++- 8 files changed, 56 insertions(+), 10 deletions(-) create mode 100644 commands/fediverse/unroll.js diff --git a/commands/archive.js b/commands/archive.js index c91e725..7e625ac 100644 --- a/commands/archive.js +++ b/commands/archive.js @@ -44,7 +44,7 @@ const run = async (roomId, userInput, rearchive) => { let reply = null; try { - reply = await matrixClient.sendHtmlNotice(roomId, '', reqStr(userInput)); + reply = await matrixClient.sendHtmlNotice(roomId, ' ', reqStr(userInput)); const { refresh, id, title, date } = await archive(instance, userInput, rearchive); if (id) return await matrix.utils.editNoticeHTML(roomId, reply, arc2Str(`${config.archive.domain}${id}`, title, date)); diff --git a/commands/fediverse/unroll.js b/commands/fediverse/unroll.js new file mode 100644 index 0000000..46bbbc7 --- /dev/null +++ b/commands/fediverse/unroll.js @@ -0,0 +1,26 @@ +exports.runQuery = function (roomId, event, userInput) { + const instance = axios.create({ + baseURL: config.fediverse.domain, + method: 'GET', + headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + }); + instance.get(`/api/v1/statuses/${userInput}/context`) + .then(async (response) => { + let story = []; + const original = await instance.get(`/api/v1/statuses/${userInput}`); + const ancestors = response.data.ancestors; + const descendants = response.data.descendants; + story = [...story, ancestors, original.data, descendants]; + const book = story.flat(); + await fediverse.utils.thread(roomId, event, '

...Beginning thread...



'); + for (const [i, entry] of book.entries()) { + entry.label = 'thread'; + fediverse.utils.formatter(entry, roomId, event) + } + await fediverse.utils.thread(roomId, event, '

...Thread ended...



'); + }) + .catch((e) => { + matrix.utils.addReact(event, '❌'); + matrix.utils.sendError(event, roomId, e); + }); +}; diff --git a/commands/fediverse/utils.js b/commands/fediverse/utils.js index fc87803..8b4be03 100644 --- a/commands/fediverse/utils.js +++ b/commands/fediverse/utils.js @@ -8,6 +8,20 @@ const sendEventWithMeta = async (roomId, content, meta) => { }); }; +const thread = async (roomId, event, content, meta) => { + await matrixClient.sendEvent(roomId, 'm.room.message', { + body: content.replace(/<[^<]+?>/g, ''), + msgtype: 'm.notice', + formatted_body: content, + meta: meta, + format: 'org.matrix.custom.html', + 'm.relates_to': { + rel_type: 'm.thread', + event_id: event['event']['content']['m.relates_to']['event_id'], + }, + }) +}; + const hasAttachment = (res) => { if (res.status) res = res.status; if (!res.media_attachments) return '
'; @@ -69,7 +83,7 @@ const notifyFormatter = (res, roomId) => { } }; -const isOriginal = (res, roomId) => { +const isOriginal = (res, roomId, event) => { if (res.data) res = res.data; userDetails = ` ${res.account.acct}`; @@ -80,7 +94,8 @@ const isOriginal = (res, roomId) => { ${hasAttachment(res)}
(id: ${res.id}) ${registrar.post.visibilityEmoji(res.visibility)}
`; - sendEventWithMeta(roomId, content, meta); + if (res.label == 'thread') thread(roomId, event, content, meta); + else sendEventWithMeta(roomId, content, meta); }; const isReblog = (res, roomId) => { @@ -101,11 +116,13 @@ const isReblog = (res, roomId) => { module.exports.sendEventWithMeta = sendEventWithMeta; -module.exports.formatter = (res, roomId) => { +module.exports.thread = thread; + +module.exports.formatter = (res, roomId, event) => { const filtered = (res.label === 'notifications') ? notifyFormatter(res, roomId) : (res.reblog == null) - ? isOriginal(res, roomId) + ? isOriginal(res, roomId, event) : isReblog(res, roomId); return filtered; }; diff --git a/commands/help.js b/commands/help.js index d08b59b..d131c04 100644 --- a/commands/help.js +++ b/commands/help.js @@ -1,6 +1,6 @@ exports.runQuery = function (roomId) { matrixClient.sendHtmlNotice(roomId, - '', + ' ', '
fediverse commands
' + '+post [your message] : post
' + '+redact [post id] : delete post
' diff --git a/commands/invidious.js b/commands/invidious.js index 90d6dd4..8187df8 100644 --- a/commands/invidious.js +++ b/commands/invidious.js @@ -40,7 +40,7 @@ const getInstance = (domain, config) => const run = async (roomId, userInput) => { const cfg = config.invidious; const video = await matrix.utils.retryPromise(cfg.domains.redirect, domain => invidious(getInstance(domain, cfg), userInput)); - return matrixClient.sendHtmlNotice(roomId, '', card(video, userInput)); + return matrixClient.sendHtmlNotice(roomId, ' ', card(video, userInput)); }; exports.runQuery = async (roomId, event, userInput) => { diff --git a/commands/nitter.js b/commands/nitter.js index 33d1252..8412e6e 100644 --- a/commands/nitter.js +++ b/commands/nitter.js @@ -66,7 +66,7 @@ const getInstance = (domain, config) => const run = async (roomId, userInput) => { const cfg = config.nitter; const tweet = await matrix.utils.retryPromise(cfg.domains.redirect, domain => nitter(getInstance(domain, cfg), userInput)); - return matrixClient.sendHtmlNotice(roomId, '', card(tweet, cfg.check, userInput)); + return matrixClient.sendHtmlNotice(roomId, ' ', card(tweet, cfg.check, userInput)); }; exports.runQuery = async (roomId, event, userInput) => { diff --git a/registrar.js b/registrar.js index 24aff32..0ceae67 100644 --- a/registrar.js +++ b/registrar.js @@ -47,5 +47,6 @@ module.exports = { tip: require('./commands/fediverse/tip.js'), unfollow: require('./commands/fediverse/unfollow.js'), unpin: require('./commands/fediverse/unpin.js'), - unreblog: require('./commands/fediverse/unreblog.js') + unreblog: require('./commands/fediverse/unreblog.js'), + unroll: require('./commands/fediverse/unroll.js') }; diff --git a/utils.js b/utils.js index 48e5883..f9fe174 100644 --- a/utils.js +++ b/utils.js @@ -5,7 +5,7 @@ const sendError = async (event, roomId, e) => { : e.data ? error = `Error(${e.errcode}): ${e.data.error}` : error = `Error: ${e.syscall}, ${e.code}`; return matrixClient.sendHtmlNotice(roomId, - '', error); + ' ', error); }; const addReact = async (event, key) => { @@ -124,6 +124,7 @@ module.exports.handleReact = async (event) => { if (reaction.key === '👏') command = 'clap'; if (reaction.key === '🗑️️') command = 'redact'; if (reaction.key === '🌧️') command = 'makeitrain'; + if (reaction.key === '➕') command = 'unroll'; eventHandler(args, roomId, command, event); }; @@ -150,6 +151,7 @@ module.exports.selfReact = async (event) => { const type = meta.split(' ')[0]; if (type === 'redact' || type === 'unreblog') addReact(event, '🗑️️'); if (type === 'status' || type === 'reblog' || type === 'mention') { + addReact(event, '➕'); addReact(event, '🔁'); addReact(event, '👏'); if (config.fediverse.tipping === true) addReact(event, '🌧️'); From 8e2ce18f26e426b69825b98349fb26c37ca120b0 Mon Sep 17 00:00:00 2001 From: vulet Date: Wed, 23 Aug 2023 15:25:48 +0800 Subject: [PATCH 84/89] feat(fediverse): media posting for e2ee rooms [kakashi] feat(fediverse): direct messaging and follower-only posting [kakashi] feat(config): emoji customization available in config [kakashi] fix(cmd): unroll by text [kakashi] refactor(reacts): timeline minimum +4 events => timeline minimum +1 events [kakashi] chore(deps): upgrade matrix-js-sdk, olm, qs chore(package): bump version --- auth.js | 3 +- commands/fediverse/post.js | 94 ++++-- commands/fediverse/unroll.js | 8 +- commands/fediverse/utils.js | 16 +- commands/help.js | 2 + config.example.js | 8 + main.js | 1 + package.json | 11 +- registrar.js | 4 +- utils.js | 60 +++- yarn.lock | 602 ++++++++++------------------------- 11 files changed, 333 insertions(+), 476 deletions(-) diff --git a/auth.js b/auth.js index 91e17f2..40ae893 100644 --- a/auth.js +++ b/auth.js @@ -6,7 +6,6 @@ const matrixTokenLogin = async () => { accessToken: matrix.auth.access_token, userId: matrix.auth.user_id, deviceId: matrix.auth.device_id, - sessionStore: new sdk.WebStorageSessionStore(localStorage), cryptoStore: new LocalStorageCryptoStore(localStorage), }); matrixClient.initCrypto() @@ -26,7 +25,7 @@ const matrixTokenLogin = async () => { module.exports.matrixTokenLogin = matrixTokenLogin; module.exports.getMatrixToken = async () => { - matrixClient = sdk.createClient(config.matrix.domain); + matrixClient = sdk.createClient({ baseUrl: config.matrix.domain }); matrixClient.loginWithPassword(config.matrix.user, config.matrix.password) .then((response) => { matrix.auth = { diff --git a/commands/fediverse/post.js b/commands/fediverse/post.js index a53a95d..b04ce28 100644 --- a/commands/fediverse/post.js +++ b/commands/fediverse/post.js @@ -1,9 +1,61 @@ const qs = require('qs'); +const crypto = require('crypto'); const FormData = require('form-data'); const emojis = { public: '🌐', unlisted: '📝', private: '🔒️', direct: '✉️' }; exports.visibilityEmoji = (v) => emojis[v] || v; +const mediaPathRegex = /^\/_matrix\/media\/r0\/download\/[^/]+\/[^/]+\/?$/; + +const decryptMedia = (media, file) => { + const { v, key: { alg, ext, k, }, iv } = file; + + if (v !== 'v2' || ext !== true || alg !== 'A256CTR') + throw new Error('Unsupported file encryption'); + + const key = Buffer.from(k, 'base64'); + const _iv = Buffer.from(iv, 'base64'); + const cipher = crypto.createDecipheriv('aes-256-ctr', key, _iv); + const data = Buffer.concat([ cipher.update(media.data), cipher.final() ]); + return Object.assign({}, media, { data }); +}; + +const getMediaInfoFromEvent = async (roomId, event_id) => { + const event = await matrix.utils.fetchEncryptedOrNot(roomId, { event_id }); + if (event.getType() !== 'm.room.message') throw new Error('Invalid type'); + const content = event.getContent(); + if (content.msgtype !== 'm.image') throw new Error('Invalid msgtype'); + if (content.url) return { url: getMediaUrl(content.url) }; + if (content.file) return { + url: getMediaUrl(content.file.url), + filename: content.body, + mimetype: content.info ? content.info.mimetype : null, + file: content.file + }; + throw new Error('Invalid event'); +}; + +const getMediaUrl = string => { + let url = new URL(string); + 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:' || + !config.matrix.domains.includes(url.hostname) || + !mediaPathRegex.test(url.pathname)) + throw new Error('Invalid URL'); + return url.toString(); +}; + +const getMedia = async (roomId, string) => { + let opts = {}; + if (string.startsWith('mxe://')) + opts = await getMediaInfoFromEvent(roomId, string.substring(6)); + else + opts.url = getMediaUrl(string); + const media = await mediaDownload(opts); + return opts.file ? decryptMedia(media, opts.file) : media; +}; + const getFilename = (header) => { if (typeof header !== 'string') return null; try { @@ -14,15 +66,14 @@ const getFilename = (header) => { } }; -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 mediaDownload = async (opts) => { + const { whitelist, blacklist } = config.fediverse.mimetypes; + const media = await axios({ method: 'GET', url: opts.url, responseType: 'arraybuffer' }); + const filename = opts.filename || getFilename(media.headers['content-disposition']); + const mimetype = opts.mimetype || media.headers['content-type']; + if (media.statusText !== 'OK' || blacklist.includes(mimetype)) throw media; + if (whitelist.length && !whitelist.includes(mimetype)) throw media; + return { data: media.data, filename, mimetype }; }; const mediaUpload = async ({ domain }, { data, filename, mimetype }) => { @@ -41,10 +92,10 @@ const mediaUpload = async ({ domain }, { data, filename, mimetype }) => { return upload.data.id; }; -const run = async (roomId, event, content, replyId, mediaURL, subject) => { +const run = async (roomId, event, content, replyId, mediaURL, subject, visibility) => { let mediaId = null; if (mediaURL) { - const media = await mediaDownload(mediaURL, config.fediverse.mimetypes); + const media = await getMedia(roomId, mediaURL); mediaId = await mediaUpload(config.fediverse, media); } if (replyId) content = await fediverse.utils.getStatusMentions(replyId, event).then(m => m.concat(content).join(' ')); @@ -55,6 +106,7 @@ const run = async (roomId, event, content, replyId, mediaURL, subject) => { data: qs.stringify({ status: content, content_type: 'text/markdown', + visibility: visibility || undefined, media_ids: mediaURL && [mediaId] || undefined, in_reply_to_id: replyId || undefined, spoiler_text: subject || undefined, @@ -63,28 +115,16 @@ const run = async (roomId, event, content, replyId, mediaURL, subject) => { return fediverse.utils.sendEventWithMeta(roomId, `${response.data.id}`, `redact ${response.data.id}`); }; -exports.runQuery = async (roomId, event, userInput, { isReply, hasMedia, hasSubject }) => { +exports.runQuery = async (roomId, event, userInput, { isReply, hasMedia, hasSubject, visibility }) => { try { const chunks = userInput.trim().split(' '); if (!chunks.length || chunks.length < !!isReply + !!hasMedia) throw ''; let replyId = null; let mediaURL = null; const subject = hasSubject ? config.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(roomId, event, chunks.join(' '), replyId, mediaURL, subject); + if (isReply) replyId = chunks.shift(); + if (hasMedia) mediaURL = chunks.shift(); + return await run(roomId, event, chunks.join(' '), replyId, mediaURL, subject, visibility); } catch (e) { return matrixClient.sendHtmlNotice(roomId, 'Sad!', 'Sad!').catch(() => {}); } diff --git a/commands/fediverse/unroll.js b/commands/fediverse/unroll.js index 46bbbc7..d018b20 100644 --- a/commands/fediverse/unroll.js +++ b/commands/fediverse/unroll.js @@ -7,17 +7,19 @@ exports.runQuery = function (roomId, event, userInput) { instance.get(`/api/v1/statuses/${userInput}/context`) .then(async (response) => { let story = []; + const rel = event.getContent()['m.relates_to']; + const eventId = rel && rel.event_id ? rel.event_id : event.getId(); const original = await instance.get(`/api/v1/statuses/${userInput}`); const ancestors = response.data.ancestors; const descendants = response.data.descendants; story = [...story, ancestors, original.data, descendants]; const book = story.flat(); - await fediverse.utils.thread(roomId, event, '

...Beginning thread...



'); + await fediverse.utils.thread(roomId, eventId, '

...Beginning thread...



'); for (const [i, entry] of book.entries()) { entry.label = 'thread'; - fediverse.utils.formatter(entry, roomId, event) + fediverse.utils.formatter(entry, roomId, eventId); } - await fediverse.utils.thread(roomId, event, '

...Thread ended...



'); + await fediverse.utils.thread(roomId, eventId, '

...Thread ended...



'); }) .catch((e) => { matrix.utils.addReact(event, '❌'); diff --git a/commands/fediverse/utils.js b/commands/fediverse/utils.js index 8b4be03..394f2de 100644 --- a/commands/fediverse/utils.js +++ b/commands/fediverse/utils.js @@ -8,7 +8,7 @@ const sendEventWithMeta = async (roomId, content, meta) => { }); }; -const thread = async (roomId, event, content, meta) => { +const thread = async (roomId, eventId, content, meta) => { await matrixClient.sendEvent(roomId, 'm.room.message', { body: content.replace(/<[^<]+?>/g, ''), msgtype: 'm.notice', @@ -17,7 +17,7 @@ const thread = async (roomId, event, content, meta) => { format: 'org.matrix.custom.html', 'm.relates_to': { rel_type: 'm.thread', - event_id: event['event']['content']['m.relates_to']['event_id'], + event_id: eventId, }, }) }; @@ -78,6 +78,18 @@ const notifyFormatter = (res, roomId) => {
`; sendEventWithMeta(roomId, content, meta); break; + case 'pleroma:emoji_reaction': + fediverse.auth.me !== res.account.url ? res.meta = 'react' : res.meta = 'redact'; + meta = `${res.meta} ${res.status.id}`; + content = `${userDetails} + has reacted with + ${ res.emoji_url ? `${res.emoji}` : `${res.emoji}` } + to your post:
${res.status.content}
+ ${hasAttachment(res)} +
(id: ${res.status.id}) ${registrar.post.visibilityEmoji(res.status.visibility)} +
`; + sendEventWithMeta(roomId, content, meta); + break; default: return console.log('Unknown notification type.'); } diff --git a/commands/help.js b/commands/help.js index d131c04..010fbac 100644 --- a/commands/help.js +++ b/commands/help.js @@ -3,6 +3,8 @@ exports.runQuery = function (roomId) { ' ', '
fediverse commands
' + '+post [your message] : post
' + + '+direct [@recipient] [message] : direct message
' + + '+private [message] : follower-only message
' + '+redact [post id] : delete post
' + '+follow [user id] : follow
' + '+unfollow [user id] : unfollow
' diff --git a/config.example.js b/config.example.js index 26e6f4d..17f3fe3 100644 --- a/config.example.js +++ b/config.example.js @@ -5,6 +5,14 @@ module.exports = { password: 'your_password', domains: [ 'your_homeserver.com' ], manualVerify: false, + reactions: { + copy: '🔁', + clap: '👏', + redact: '🗑️️', + rain: '🌧️', + unroll: '🔍️', + expand: '➕', + } }, fediverse: { domain: 'https://your_federation.com', diff --git a/main.js b/main.js index 46df278..b3c57ea 100644 --- a/main.js +++ b/main.js @@ -34,6 +34,7 @@ matrixClient.on('Room.timeline', async (event, member, toStartOfTimeline) => { if (event.event.unsigned.age > 10000) return; roomId = event.event.room_id; content = event.getContent().body; + if (!typeof content === 'string') return; if (content.charAt(0) === '+') { const args = content.slice(1).trim().split(/ +/g); const command = args.shift().toLowerCase(); diff --git a/package.json b/package.json index ffb6796..2c35c02 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,10 @@ { "name": "ligh7hau5", - "version": "2.1.1", + "version": "3.0.0", "description": "A Matrix to Fediverse client", + "engines": { + "node": ">=18.0.0" +}, "main": "main.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", @@ -21,10 +24,10 @@ "axios": "^0.25.0", "form-data": "^4.0.0", "jsdom": "^19.0.0", - "matrix-js-sdk": "^17.0.0", + "matrix-js-sdk": "^27.2.0", "node-localstorage": "^2.2.1", - "olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz", - "qs": "^6.10.3" + "olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz", + "qs": "^6.11.2" }, "devDependencies": {} } diff --git a/registrar.js b/registrar.js index 0ceae67..72ee14f 100644 --- a/registrar.js +++ b/registrar.js @@ -48,5 +48,7 @@ module.exports = { unfollow: require('./commands/fediverse/unfollow.js'), unpin: require('./commands/fediverse/unpin.js'), unreblog: require('./commands/fediverse/unreblog.js'), - unroll: require('./commands/fediverse/unroll.js') + unroll: require('./commands/fediverse/unroll.js'), + react: require('./commands/fediverse/react.js'), + expand: require('./commands/expand.js') }; diff --git a/utils.js b/utils.js index f9fe174..c633057 100644 --- a/utils.js +++ b/utils.js @@ -1,5 +1,7 @@ const { MatrixEvent } = require('matrix-js-sdk/lib/models/event'); +const isEmoji = string => true; + const sendError = async (event, roomId, e) => { e.response ? error = `Error(${e.response.status}): ${e.response.data.error}` : e.data ? error = `Error(${e.errcode}): ${e.data.error}` @@ -25,6 +27,7 @@ const eventHandler = (args, roomId, command, event) => { const address = args.slice(0, 1).join(' ').replace(/"/g, ''); args = []; + let visibility = null; switch (command) { case 'config': @@ -36,6 +39,10 @@ const eventHandler = (args, roomId, command, event) => { args.push(roomId, true); command = command.substring(2); break; + case 'unreact': + args.push(roomId, event, userInput, true); + command = 'react'; + break; case 'tip': case 'makeitrain': args.push(roomId, event, address, flaggedInput); break; @@ -45,10 +52,15 @@ const eventHandler = (args, roomId, command, event) => { break; case 'post': case 'reply': case 'media': case 'mediareply': case 'random': case 'randomreply': case 'randommedia': case 'randommediareply': + case 'direct': case 'directreply': case 'directmedia': case 'directmediareply': + case 'private': case 'privatereply': case 'privatemedia': case 'privatemediareply': + case 'unlisted': case 'unlistedreply': case 'unlistedmedia': case 'unlistedmediareply': + visibility = command.match(/^(direct|private|unlisted)/); args.push(roomId, event, userInput, { isReply: !!~command.indexOf('reply'), hasMedia: !!~command.indexOf('media'), hasSubject: !!~command.indexOf('random'), + visibility: visibility ? visibility[1] : null }); command = 'post'; break; @@ -110,21 +122,34 @@ module.exports.editNoticeHTML = (roomId, event, html, plain) => matrixClient.sen }); module.exports.handleReact = async (event) => { + const reactions = config.matrix.reactions; const roomId = event.event.room_id; if (!event.getContent()['m.relates_to']) return; const reaction = event.getContent()['m.relates_to']; const metaEvent = await fetchEncryptedOrNot(roomId, reaction); if (!metaEvent.getContent().meta || metaEvent.event.sender !== config.matrix.user) return; - const args = metaEvent.getContent().meta.split(' '); + let args = metaEvent.getContent().meta.split(' '); isMeta = ['status', 'reblog', 'mention', 'redact', 'unreblog']; if (!isMeta.includes(args[0])) return; let command = []; args.shift().toLowerCase(); - if (reaction.key === '🔁') command = 'copy'; - if (reaction.key === '👏') command = 'clap'; - if (reaction.key === '🗑️️') command = 'redact'; - if (reaction.key === '🌧️') command = 'makeitrain'; - if (reaction.key === '➕') command = 'unroll'; + switch (reaction.key) { + case reactions.copy: command = 'copy'; break; + case reactions.clap: command = 'clap'; break; + case reactions.redact: command = 'redact'; break; + case reactions.rain: command = 'makeitrain'; break; + case reactions.unroll: command = 'unroll'; break; + case reactions.expand: + command = 'expand'; + args = [ reaction.event_id ]; + break; + default: + if (isEmoji(reaction.key)) { + command = 'react'; + args.push(reaction.key); + } + break; + }; eventHandler(args, roomId, command, event); }; @@ -144,17 +169,30 @@ module.exports.handleReply = async (event) => { }; module.exports.selfReact = async (event) => { + const reactions = config.matrix.reactions; if (event.getType() !== 'm.room.message') return; if (event.event.unsigned.age > 10000) return; if (!event.getContent().meta) return; const { meta } = event.getContent(); const type = meta.split(' ')[0]; - if (type === 'redact' || type === 'unreblog') addReact(event, '🗑️️'); + if (type === 'redact' || type === 'unreblog') + addReact(event, reactions.redact); + if (type === 'status' || type === 'reblog' || type === 'mention') + addReact(event, reactions.expand); +}; + +module.exports.expandReact = async (event) => { + const reactions = config.matrix.reactions; + if (event.getSender() !== matrixClient.credentials.userId) return; + if (!event.getContent().meta) return; + const { meta } = event.getContent(); + const type = meta.split(' ')[0]; if (type === 'status' || type === 'reblog' || type === 'mention') { - addReact(event, '➕'); - addReact(event, '🔁'); - addReact(event, '👏'); - if (config.fediverse.tipping === true) addReact(event, '🌧️'); + addReact(event, reactions.unroll); + addReact(event, reactions.copy); + addReact(event, reactions.clap); + if (config.fediverse.tipping) + addReact(event, reactions.rain); } }; diff --git a/yarn.lock b/yarn.lock index 69eab53..0356e71 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,21 +3,31 @@ "@babel/runtime@^7.12.5": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72" - integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.10.tgz#ae3e9631fd947cb7e3610d3e9d8fef5f76696682" + integrity sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ== dependencies: - regenerator-runtime "^0.13.4" + regenerator-runtime "^0.14.0" + +"@matrix-org/matrix-sdk-crypto-wasm@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@matrix-org/matrix-sdk-crypto-wasm/-/matrix-sdk-crypto-wasm-1.2.1.tgz#5b546c8a0e53b614f10b77b3b649818aed9d0db1" + integrity sha512-DCb7Q83PCQK0uav5vB3KNV/hJPlxAhT/ddar+VHz2kC39hMLKGzWYVhprpLYVcavaE/6OX+Q/xFkAoV/3QtUHQ== "@tootallnate/once@2": version "2.0.0" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== -"@types/retry@^0.12.0": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" - integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== +"@types/events@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== abab@^2.0.5, abab@^2.0.6: version "2.0.6" @@ -43,9 +53,9 @@ acorn@^7.1.1: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.5.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" - integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== agent-base@6: version "6.0.2" @@ -54,47 +64,15 @@ agent-base@6: dependencies: debug "4" -ajv@^6.12.3: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - another-json@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/another-json/-/another-json-0.2.0.tgz#b5f4019c973b6dd5c6506a2d93469cb6d32aeedc" - integrity sha1-tfQBnJc7bdXGUGotk0acttMq7tw= - -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + integrity sha512-/Ndrl68UQLhnCdsAzEXLMFuOR546o2qbYRqCglaNHbjXrwG1ayTcdwr3zkSGOGtGXDyR5X9nCFfnyG2AFJIsqg== asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== axios@^0.25.0: version "0.25.0" @@ -103,36 +81,22 @@ axios@^0.25.0: dependencies: follow-redirects "^1.14.7" -base-x@^3.0.2: - version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" - integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== - dependencies: - safe-buffer "^5.0.1" - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" +base-x@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" + integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== browser-process-hrtime@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browser-request@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/browser-request/-/browser-request-0.3.3.tgz#9ece5b5aca89a29932242e18bf933def9876cc17" - integrity sha1-ns5bWsqJopkyJC4Yv5M975h2zBc= - -bs58@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= +bs58@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" + integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== dependencies: - base-x "^3.0.2" + base-x "^4.0.0" call-bind@^1.0.0: version "1.0.2" @@ -142,12 +106,7 @@ call-bind@^1.0.0: function-bind "^1.1.1" get-intrinsic "^1.0.2" -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: +combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -155,14 +114,14 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: delayed-stream "~1.0.0" content-type@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +crypto-js@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" + integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== cssom@^0.5.0: version "0.5.0" @@ -181,13 +140,6 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - data-urls@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" @@ -205,19 +157,14 @@ debug@4: ms "2.1.2" decimal.js@^10.3.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== - -deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== domexception@^4.0.0: version "4.0.0" @@ -226,23 +173,14 @@ domexception@^4.0.0: dependencies: webidl-conversions "^7.0.0" -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" estraverse "^5.2.0" esutils "^2.0.2" - optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" @@ -261,45 +199,15 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== follow-redirects@^1.14.7: - version "1.14.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" - integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== form-data@^4.0.0: version "4.0.0" @@ -310,55 +218,32 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== get-intrinsic@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== dependencies: function-bind "^1.1.1" has "^1.0.3" - has-symbols "^1.0.1" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" graceful-fs@^4.1.11: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - -has-symbols@^1.0.1: +has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== @@ -386,15 +271,6 @@ http-proxy-agent@^5.0.0: agent-base "6" debug "4" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" @@ -413,28 +289,13 @@ iconv-lite@0.6.3: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== is-potential-custom-element-name@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - jsdom@^19.0.0: version "19.0.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-19.0.0.tgz#93e67c149fe26816d38a849ea30ac93677e16b6a" @@ -468,72 +329,55 @@ jsdom@^19.0.0: ws "^8.2.3" xml-name-validator "^4.0.0" -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -jsprim@^1.2.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" - integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" +jwt-decode@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" + integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== loglevel@^1.7.1: - version "1.8.0" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" - integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== + version "1.8.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.1.tgz#5c621f83d5b48c54ae93b6156353f555963377b4" + integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg== -matrix-events-sdk@^0.0.1-beta.7: - version "0.0.1-beta.7" - resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1-beta.7.tgz#5ffe45eba1f67cc8d7c2377736c728b322524934" - integrity sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA== +matrix-events-sdk@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" + integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== -matrix-js-sdk@^17.0.0: - version "17.0.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-17.0.0.tgz#6edf2f8d05da003e98a6cf5269a4717adfe4e406" - integrity sha512-8nv+a1e6n4x4DYKiBFRS6/CIpsE22+31K+9/4Y5MB8m3iraSVBtdZ5y/9ktQnjQuo9I85TvyqHL2obRWF7UD5Q== +matrix-js-sdk@^27.2.0: + version "27.2.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-27.2.0.tgz#c06d5ce9f961b18ed62593e1c01eeaec754725bc" + integrity sha512-jsoA5oPv0eQbELlOzQ6J3v1HTPU0oydqgLQNVpztsajEj6AfJYvCaZueFak8jac9RsopZlqWbP8CXI8r5MvNEA== dependencies: "@babel/runtime" "^7.12.5" + "@matrix-org/matrix-sdk-crypto-wasm" "^1.2.0" another-json "^0.2.0" - browser-request "^0.3.3" - bs58 "^4.0.1" + bs58 "^5.0.0" content-type "^1.0.4" + jwt-decode "^3.1.2" loglevel "^1.7.1" - matrix-events-sdk "^0.0.1-beta.7" - p-retry "^4.5.0" - qs "^6.9.6" - request "^2.88.2" + matrix-events-sdk "0.0.1" + matrix-widget-api "^1.5.0" + oidc-client-ts "^2.2.4" + p-retry "4" + sdp-transform "^2.14.1" unhomoglyph "^1.0.6" + uuid "9" + +matrix-widget-api@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/matrix-widget-api/-/matrix-widget-api-1.5.0.tgz#4ae3e46a7f2854f944ddaf8a5af63d72fba76c45" + integrity sha512-hKGfqQKK5qVMwW0Sp8l2TiuW8UuHafTvUZNSWBPghedB/rSFbVLlr0mufuEV0iq/pQ7ChW96q/WEC6Llie4SnA== + dependencies: + "@types/events" "^3.0.0" + events "^3.2.0" mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@~2.1.19: +mime-types@^2.1.12: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -553,42 +397,33 @@ node-localstorage@^2.2.1: write-file-atomic "^1.1.4" nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== object-inspect@^1.9.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" - integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== -"olm@https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz": - version "3.2.8" - resolved "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz#8d53636d045e1776e2a2ec6613e57330dd9ce856" - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== +oidc-client-ts@^2.2.4: + version "2.2.5" + resolved "https://registry.yarnpkg.com/oidc-client-ts/-/oidc-client-ts-2.2.5.tgz#ca0a9f791d8d9d00a1720226d3e96b50065ce015" + integrity sha512-omAHoLdFcylnwZeHJahOnJBwd0r78JzhmVAmsQjLGrexAnQKiHW9Ilr9FlRD5qjMikmabvaucI4k49AbQLXhmQ== dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" + crypto-js "^4.1.1" + jwt-decode "^3.1.2" -p-retry@^4.5.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" - integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== +"olm@https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz": + version "3.2.14" + resolved "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz#acd96c00a881d0f462e1f97a56c73742c8dbc984" + +p-retry@4: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== dependencies: - "@types/retry" "^0.12.0" + "@types/retry" "0.12.0" retry "^0.13.1" parse5@6.0.1: @@ -596,80 +431,44 @@ parse5@6.0.1: resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= +punycode@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== -psl@^1.1.28, psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qs@^6.10.3, qs@^6.9.6: - version "6.10.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" - integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== +qs@^6.11.2: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== dependencies: side-channel "^1.0.4" -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== -request@^2.88.2: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== retry@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== -safe-buffer@^5.0.1, safe-buffer@^5.1.2: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -681,6 +480,11 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" +sdp-transform@^2.14.1: + version "2.14.1" + resolved "https://registry.yarnpkg.com/sdp-transform/-/sdp-transform-2.14.1.tgz#2bb443583d478dee217df4caa284c46b870d5827" + integrity sha512-RjZyX3nVwJyCuTo5tGPx+PZWkDMCg7oOLpSlhjDdZfwUoNqG1mM8nyj31IGHyaPWXhjbP7cdK3qZ2bmkJ1GzRw== + side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -693,49 +497,27 @@ side-channel@^1.0.4: slide@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= + integrity sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw== source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -sshpk@^1.7.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== dependencies: psl "^1.1.33" punycode "^2.1.1" - universalify "^0.1.2" - -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" tr46@^3.0.0: version "3.0.0" @@ -744,55 +526,28 @@ tr46@^3.0.0: dependencies: punycode "^2.1.1" -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - unhomoglyph@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/unhomoglyph/-/unhomoglyph-1.0.6.tgz#ea41f926d0fcf598e3b8bb2980c2ddac66b081d3" integrity sha512-7uvcWI3hWshSADBu4JpnyYbTVc7YlhF5GDW/oPD5AxIxl34k4wXR3WDkPnzLxkN32LiTCTKMQLtKVZiwki3zGg== -universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== dependencies: - punycode "^2.1.0" + querystringify "^2.1.1" + requires-port "^1.0.0" -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" +uuid@9: + version "9.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== w3c-hr-time@^1.0.2: version "1.0.2" @@ -841,24 +596,19 @@ whatwg-url@^11.0.0: tr46 "^3.0.0" webidl-conversions "^7.0.0" -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - write-file-atomic@^1.1.4: version "1.3.4" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" - integrity sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8= + integrity sha512-SdrHoC/yVBPpV0Xq/mUZQIpW2sWXAShb/V4pomcJXh92RuaO+f3UTWItiR3Px+pLnV2PvC2/bfn5cwr5X6Vfxw== dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" slide "^1.1.5" ws@^8.2.3: - version "8.5.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" - integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== xml-name-validator@^4.0.0: version "4.0.0" From 12c422c3244cf50ea6e52cdda5350ea256dcd567 Mon Sep 17 00:00:00 2001 From: vulet Date: Mon, 4 Sep 2023 17:43:52 +0800 Subject: [PATCH 85/89] fix(timeline): some missing files --- commands/expand.js | 9 +++++++++ commands/fediverse/react.js | 26 ++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 commands/expand.js create mode 100644 commands/fediverse/react.js diff --git a/commands/expand.js b/commands/expand.js new file mode 100644 index 0000000..f327bcb --- /dev/null +++ b/commands/expand.js @@ -0,0 +1,9 @@ +exports.runQuery = async (roomId, event, userInput) => { + return matrix.utils.fetchEncryptedOrNot(roomId, { event_id: userInput }) + .then(event => matrix.utils.expandReact(event)) + .catch(e => { + matrixClient.sendHtmlNotice(roomId, 'Sad!', 'Sad!') + }) + .catch(() => {}); + }; + diff --git a/commands/fediverse/react.js b/commands/fediverse/react.js new file mode 100644 index 0000000..a75fa14 --- /dev/null +++ b/commands/fediverse/react.js @@ -0,0 +1,26 @@ +const run = async (roomId, event, id, emoji, remove) => { + axios({ + method: remove ? 'DELETE' : 'PUT', + url: `${config.fediverse.domain}/api/v1/pleroma/statuses/${id}/reactions/${emoji}`, + headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + }) + .then(() => { + matrix.utils.addReact(event, '✅'); + }) + .catch((e) => { + matrix.utils.addReact(event, '❌'); + matrix.utils.sendError(event, roomId, e); + }); +}; + +exports.runQuery = async (roomId, event, userInput, remove) => { + try { + const chunks = userInput.trim().split(' '); + if (chunks.length !== 2) throw ''; + const id = encodeURIComponent(chunks[0]); + const emoji = encodeURIComponent(chunks[1]); + return run(roomId, event, id, emoji, remove); + } catch (e) { + return matrixClient.sendHtmlNotice(roomId, 'Sad!', 'Sad!').catch(() => {}); + } +}; From 17c7f819acc75807067354b6e6e63dd81340bd7e Mon Sep 17 00:00:00 2001 From: vulet Date: Mon, 4 Sep 2023 17:56:31 +0800 Subject: [PATCH 86/89] feat(fediverse): add twitter crossblog [kakashi] chore(config): update maintained nitter instances --- commands/nitter.js | 14 ++++++++++---- config.example.js | 4 ++-- utils.js | 4 ++++ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/commands/nitter.js b/commands/nitter.js index 8412e6e..bec5c2f 100644 --- a/commands/nitter.js +++ b/commands/nitter.js @@ -63,19 +63,25 @@ const getInstance = (domain, config) => timeout: 10 * 1000, }); -const run = async (roomId, userInput) => { +const run = async (roomId, userInput, fedi) => { const cfg = config.nitter; const tweet = await matrix.utils.retryPromise(cfg.domains.redirect, domain => nitter(getInstance(domain, cfg), userInput)); - return matrixClient.sendHtmlNotice(roomId, ' ', card(tweet, cfg.check, userInput)); + const tweetCard = card(tweet, cfg.check, userInput); + return fedi ? axios({ + method: 'POST', + url: `${config.fediverse.domain}/api/v1/statuses`, + headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + data: { status: tweetCard, content_type: 'text/html' } + }) : matrixClient.sendHtmlNotice(roomId, ' ', tweetCard); }; -exports.runQuery = async (roomId, event, userInput) => { +exports.runQuery = async (roomId, event, userInput, fedi) => { try { const url = new URL(userInput); const { redirect, original } = config.nitter.domains; if (!redirect.includes(url.hostname) && !original.includes(url.hostname)) throw ''; if (!/^\/[^/]+\/status\/\d+\/?$/.test(url.pathname)) throw ''; - return await run(roomId, url.pathname); + return await run(roomId, url.pathname, fedi); } catch (e) { return matrixClient.sendHtmlNotice(roomId, 'Sad!', 'Sad!').catch(() => {}); } diff --git a/config.example.js b/config.example.js index 17f3fe3..53023ec 100644 --- a/config.example.js +++ b/config.example.js @@ -33,8 +33,8 @@ module.exports = { nitter: { userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', domains: { - redirect: [ 'nitter.fdn.fr', 'nitter.snopyta.org', 'nitter.net' ], - original: [ 'nitter.net', 'www.nitter.net', 'twitter.com', 'www.twitter.com', 'mobile.twitter.com', 'm.twitter.com' ] + redirect: [ 'nitter.unixfox.eu', 'nitter.cz', 'nitter.privacydev.net', 'nitter.poast.org', 'nitter.fdn.fr', 'nitter.snopyta.org', 'nitter.net' ], + original: [ 'nitter.unixfox.eu', 'nitter.cz', 'nitter.privacydev.net', 'nitter.poast.org', 'nitter.net', 'www.nitter.net', 'twitter.com', 'www.twitter.com', 'mobile.twitter.com', 'm.twitter.com' ] }, check: '(✅)', }, diff --git a/utils.js b/utils.js index c633057..7ddf32f 100644 --- a/utils.js +++ b/utils.js @@ -64,6 +64,10 @@ const eventHandler = (args, roomId, command, event) => { }); command = 'post'; break; + case 'crossblog': + args.push(roomId, event, userInput, true); + command = 'nitter' + break; case 'proxy': case 'p': try { const url = new URL(userInput); From 4cb8d1da7e3affba558e267a8e42ed79e0152b88 Mon Sep 17 00:00:00 2001 From: vulet Date: Mon, 4 Sep 2023 18:01:07 +0800 Subject: [PATCH 87/89] chore(help): add crossblog --- commands/help.js | 1 + 1 file changed, 1 insertion(+) diff --git a/commands/help.js b/commands/help.js index 010fbac..fb96e52 100644 --- a/commands/help.js +++ b/commands/help.js @@ -10,6 +10,7 @@ exports.runQuery = function (roomId) { + '+unfollow [user id] : unfollow
' + '+media [homeserver image URL or MXC] [optional message] : post media
' + '+copy [post id] : repeat/repost/retweet
' + + '+crossblog [status URL]: cross blog twitter post to fediverse post
' + '+reply [post id] [content] : reply to post
' + '+tip [@user@fedi.url] [amount] : tip 10grans
' + '+makeitrain [post id] : make it rain 10grans
' From 296cdc75a66a65029f4177b2e81d4bb9bc1390e5 Mon Sep 17 00:00:00 2001 From: vulet Date: Mon, 4 Sep 2023 18:09:34 +0800 Subject: [PATCH 88/89] chore(package): bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2c35c02..666116b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ligh7hau5", - "version": "3.0.0", + "version": "3.0.1", "description": "A Matrix to Fediverse client", "engines": { "node": ">=18.0.0" From 73dac81f2d2b971fab53414c0b64675159f8fce3 Mon Sep 17 00:00:00 2001 From: doesnm Date: Sun, 29 Sep 2024 20:53:07 +0300 Subject: [PATCH 89/89] improve authorization --- auth.js | 81 ++- commands/fediverse/auth.js | 12 + commands/fediverse/beg.js | 15 - commands/fediverse/boo.js | 4 +- commands/fediverse/clap.js | 4 +- commands/fediverse/copy.js | 4 +- commands/fediverse/flood.js | 10 +- commands/fediverse/follow.js | 4 +- commands/fediverse/makeitrain.js | 31 - commands/fediverse/mordy.js | 20 - commands/fediverse/notify.js | 10 +- commands/fediverse/pin.js | 4 +- commands/fediverse/post.js | 9 +- commands/fediverse/react.js | 4 +- commands/fediverse/redact.js | 4 +- commands/fediverse/status.js | 4 +- commands/fediverse/tip.js | 16 - commands/fediverse/unfollow.js | 4 +- commands/fediverse/unpin.js | 4 +- commands/fediverse/unreblog.js | 4 +- commands/fediverse/unroll.js | 4 +- commands/fediverse/utils.js | 12 +- commands/help.js | 4 +- commands/proxy.js | 4 - config.example.js | 48 -- main.js | 2 +- package-lock.json | 1027 ++++++++++++++++++++++++++++++ registrar.js | 15 +- utils.js | 26 +- yarn.lock | 191 +++--- 30 files changed, 1265 insertions(+), 316 deletions(-) create mode 100644 commands/fediverse/auth.js delete mode 100644 commands/fediverse/beg.js delete mode 100644 commands/fediverse/makeitrain.js delete mode 100644 commands/fediverse/mordy.js delete mode 100644 commands/fediverse/tip.js delete mode 100644 commands/proxy.js delete mode 100644 config.example.js create mode 100644 package-lock.json diff --git a/auth.js b/auth.js index 40ae893..4c1e216 100644 --- a/auth.js +++ b/auth.js @@ -1,5 +1,4 @@ const { LocalStorageCryptoStore } = require('matrix-js-sdk/lib/crypto/store/localStorage-crypto-store'); - const matrixTokenLogin = async () => { matrixClient = sdk.createClient({ baseUrl: config.matrix.domain, @@ -40,31 +39,75 @@ module.exports.getMatrixToken = async () => { }); }; -module.exports.registerFediverseApp = async () => { - axios.post(`${config.fediverse.domain}/api/v1/apps`, +const getFediverseLink = (domain,roomId) => { + let apps = {} + apps = JSON.parse(localStorage.getItem("apps")); + if(!apps[domain]){ + axios.post(`https://${domain}/api/v1/apps`, { client_name: config.fediverse.client_name, redirect_uris: 'urn:ietf:wg:oauth:2.0:oob', scopes: 'read write follow push', }) .then((response) => { - axios.post(`${config.fediverse.domain}/oauth/token`, - { - username: config.fediverse.username, - password: config.fediverse.password, - client_id: response.data.client_id, - client_secret: response.data.client_secret, - scope: 'read write follow push', - grant_type: 'password', - redirect_uri: 'urn:ietf:wg:oauth:2.0:oob', - }) - .then((tokens) => { - localStorage.setItem('fediverse_auth', JSON.stringify(tokens.data, null, 2)); - }) - .catch((e) => { - console.log(e); - }); + console.log(response.data) + if(!response.data.client_id || !response.data.client_secret) return false; + apps[domain] = { + client_id: response.data.client_id, + client_secret: response.data.client_secret + } + localStorage.setItem("apps",JSON.stringify(apps)) + matrixClient.sendHtmlNotice(roomId,"Приложение зарегистрировано. Введите команду еще раз для создания ссылки") + // return getFediverseLink(domain) }).catch((e) => { console.log(e); }); + }else{ + const app = apps[domain] + const uri = "urn:ietf:wg:oauth:2.0:oob".replace(/:/g,"%3A") + const scope = "read write follow push".replace(/ /g,"%20") + return `https://${domain}/oauth/authorize?client_id=${app.client_id}&response_type=code&redirect_uri=${uri}&scope=${scope}` + } + return "nothing" }; + +const obtainAccessToken = (domain,code,event) => { + const apps = JSON.parse(localStorage.getItem("apps")); + console.log(domain,code) + const app = apps[domain]; + axios.post(`https://${domain}/oauth/token`, { + client_id: app.client_id, + client_secret: app.client_secret, + redirect_uri: "urn:ietf:wg:oauth:2.0:oob", + grant_type: "authorization_code", + code: code, + scopes: "read write follow push" + }).then(response => { + if(!response.data.access_token) return console.log(response.data) + fediverse.auth[event.getSender()] = { + domain: domain, + access_token: response.data.access_token + } + localStorage.setItem("fediverse_auth", JSON.stringify(fediverse.auth)) + getFediverseUserInfo(event) + }).catch(e => console.error(e)) +} + +const getFediverseUserInfo = (event) => { + const user = event.getSender() + axios({ + method: "GET", + url: `https://${fediverse.auth[user].domain}/api/v1/accounts/verify_credentials`, + headers: { + Authorization: `Bearer ${fediverse.auth[user].access_token}` + } + }).then(response => { + if(response.data.username){ + matrixClient.sendHtmlNotice(event.getRoomId(), `Успешный вход в аккаунт ${response.data.display_name || response.data.username} (@${response.data.username}@${fediverse.auth[user].domain})`) + }else{ + console.log(response.data) + } + }).catch(e => console.error(e)) +} +module.exports.getFediverseLink = getFediverseLink; +module.exports.obtainAccessToken = obtainAccessToken; \ No newline at end of file diff --git a/commands/fediverse/auth.js b/commands/fediverse/auth.js new file mode 100644 index 0000000..292d5dc --- /dev/null +++ b/commands/fediverse/auth.js @@ -0,0 +1,12 @@ +exports.runQuery = (roomId,event,userInput) => { + + //matrixClient.sendHtmlNotice(roomId,"Проверка связи","Проверка связи"); + const link = auth.getFediverseLink(userInput) + if(!link){ + matrixClient.sendHtmlNotice(roomId,"Не удалось получить ссылку") + }else if(link == "nothing"){ + }else{ + authEvents.push(event.event_id) + matrixClient.sendHtmlNotice(roomId,`Перейдите по ссылке для входа в аккаунт. Для завершения ответьте на это сообщение кодом (еще не готово, пж не переходе по ссылке): ${link}`) + } +} \ No newline at end of file diff --git a/commands/fediverse/beg.js b/commands/fediverse/beg.js deleted file mode 100644 index 773b1d6..0000000 --- a/commands/fediverse/beg.js +++ /dev/null @@ -1,15 +0,0 @@ -exports.runQuery = function (roomId, event) { - axios({ - method: 'POST', - url: `${config.fediverse.domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, - data: { status: '@10grans@fedi.cc beg' }, - }) - .then(() => { - matrix.utils.addReact(event, '✅'); - }) - .catch((e) => { - matrix.utils.addReact(event, '❌'); - matrix.utils.sendError(event, roomId, e); - }); -}; diff --git a/commands/fediverse/boo.js b/commands/fediverse/boo.js index 5605eef..3296b2d 100644 --- a/commands/fediverse/boo.js +++ b/commands/fediverse/boo.js @@ -1,8 +1,8 @@ exports.runQuery = function (roomId, event, userInput) { axios({ method: 'POST', - url: `${config.fediverse.domain}/api/v1/statuses/${userInput}/unfavourite`, - headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/statuses/${userInput}/unfavourite`, + headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, }) .then(() => { matrix.utils.addReact(event, '✅'); diff --git a/commands/fediverse/clap.js b/commands/fediverse/clap.js index 715c9ad..4142b2d 100644 --- a/commands/fediverse/clap.js +++ b/commands/fediverse/clap.js @@ -1,8 +1,8 @@ exports.runQuery = function (roomId, event, userInput) { axios({ method: 'POST', - url: `${config.fediverse.domain}/api/v1/statuses/${userInput}/favourite`, - headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/statuses/${userInput}/favourite`, + headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, }) .then(() => { matrix.utils.addReact(event, '✅'); diff --git a/commands/fediverse/copy.js b/commands/fediverse/copy.js index 974a11b..0927c76 100644 --- a/commands/fediverse/copy.js +++ b/commands/fediverse/copy.js @@ -1,8 +1,8 @@ exports.runQuery = function (roomId, event, userInput) { axios({ method: 'POST', - url: `${config.fediverse.domain}/api/v1/statuses/${userInput}/reblog`, - headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/statuses/${userInput}/reblog`, + headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, }) .then(() => { matrix.utils.addReact(event, '✅'); diff --git a/commands/fediverse/flood.js b/commands/fediverse/flood.js index c3b28ff..8b671ee 100644 --- a/commands/fediverse/flood.js +++ b/commands/fediverse/flood.js @@ -12,11 +12,12 @@ exports.runQuery = function (roomId, disable) { intervalId = setInterval(() => { axios({ method: 'GET', - url: `${config.fediverse.domain}/api/v1/timelines/home`, - headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/timelines/home`, + headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, }) .then((res) => { - let past = JSON.parse(localStorage.getItem('timeline')); + let timeline = JSON.parse(localStorage.getItem('timeline')); + past = timeline[event.getSender()] || {} if (past.length === 0) past = res.data; const events = res.data; const len = events.length; @@ -28,7 +29,8 @@ exports.runQuery = function (roomId, disable) { fediverse.utils.formatter(events[i], roomId); } } - localStorage.setItem('timeline', JSON.stringify(events, null, 2)); + timeline[event.getSender()] = events + localStorage.setItem('timeline', JSON.stringify(timeline, null, 2)); }) .catch((e) => { matrix.utils.sendError(null, roomId, e); diff --git a/commands/fediverse/follow.js b/commands/fediverse/follow.js index ebebcd0..5458a37 100644 --- a/commands/fediverse/follow.js +++ b/commands/fediverse/follow.js @@ -5,8 +5,8 @@ exports.runQuery = async function (roomId, event, userInput) { const suggest = []; axios({ method: 'GET', - url: `${config.fediverse.domain}/api/v2/search?q=${userInput}&type=accounts`, - headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + url: `https://${fediverse.auth[event.getSender()].domain}/api/v2/search?q=${userInput}&type=accounts`, + headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, }).then((findUserId) => { const results = findUserId.data.accounts; const len = results.length; diff --git a/commands/fediverse/makeitrain.js b/commands/fediverse/makeitrain.js deleted file mode 100644 index 33fdd3f..0000000 --- a/commands/fediverse/makeitrain.js +++ /dev/null @@ -1,31 +0,0 @@ -exports.runQuery = async function (roomId, event, notice) { - if (config.fediverse.tipping === false) return matrixClient.sendHtmlNotice(roomId, `Tipping is not enabled.`, `Tipping is not enabled.`); - const loadingString = `Making it rain for notice: ${notice}...`; - const original = await matrixClient.sendHtmlNotice(roomId, `${loadingString}`, `${loadingString}`); - const findAllUsers = await fediverse.utils.getStatusMentions(notice, event, original); - const exclude = "@10grans@fedi.cc"; - const users = findAllUsers.filter(users => !exclude.includes(findAllUsers)); - if (!users) return matrix.utils.editNoticeHTML(roomId, original, `No eligible users found.`); - const rain = (users) => { - amount = users.length * 0.00000001337 // by per user: - if (users.length === 1) return amount * 100000 // 0.001337 - if (users.length <= 5) return amount * 10000 // 0.0001337 - if (users.length <= 10) return amount * 1000 // 0.00001337 - if (users.length <= 100) return amount * 100 // 0.000001337 - return amount - } - axios({ - method: 'POST', - url: `${config.fediverse.domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, - data: { status: `@10grans@fedi.cc makeitrain ${rain(users)} to ${users.join(' ')}` }, - }) - .then(() => { - matrix.utils.addReact(event, '✅'); - return matrix.utils.editNoticeHTML(roomId, original, `Raining ${rain(users)} 10grans on: 🌧${users.join(', ')}🌧`); - }) - .catch((e) => { - matrix.utils.addReact(event, '❌'); - return matrix.utils.editNoticeHTML(roomId, original, `${e}`) - }); -}; diff --git a/commands/fediverse/mordy.js b/commands/fediverse/mordy.js deleted file mode 100644 index 0b0ce33..0000000 --- a/commands/fediverse/mordy.js +++ /dev/null @@ -1,20 +0,0 @@ -exports.runQuery = function (roomId, event, userInput) { - axios({ - method: 'POST', - url: `${config.fediverse.domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, - data: { - status: `@mordekai ${userInput}`, - content_type: 'text/markdown', - visibility: 'unlisted', - expires_in: '7200', - }, - }) - .then(() => { - matrix.utils.addReact(event, '✅'); - }) - .catch((e) => { - matrix.utils.addReact(event, '❌'); - matrix.utils.sendError(event, roomId, e); - }); -}; diff --git a/commands/fediverse/notify.js b/commands/fediverse/notify.js index 37079a7..074f139 100644 --- a/commands/fediverse/notify.js +++ b/commands/fediverse/notify.js @@ -12,11 +12,12 @@ exports.runQuery = function (roomId, disable) { intervalId = setInterval(() => { axios({ method: 'GET', - url: `${config.fediverse.domain}/api/v1/notifications`, - headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/notifications`, + headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, }) .then((res) => { - let past = JSON.parse(localStorage.getItem('notifications')); + let notifications = JSON.parse(localStorage.getItem('notifications')); + let past = notifications[event.getSender()] || {} if (past.length === 0) past = res.data; const events = res.data; const len = events.length; @@ -28,7 +29,8 @@ exports.runQuery = function (roomId, disable) { fediverse.utils.formatter(events[i], roomId); } } - localStorage.setItem('notifications', JSON.stringify(events, null, 2)); + notifications[event.getSender()] = events + localStorage.setItem('notifications', JSON.stringify(notifications, null, 2)); }) .catch((e) => { matrix.utils.sendError(null, roomId, e); diff --git a/commands/fediverse/pin.js b/commands/fediverse/pin.js index ebca9ca..c5c58e2 100644 --- a/commands/fediverse/pin.js +++ b/commands/fediverse/pin.js @@ -1,8 +1,8 @@ exports.runQuery = function (roomId, event, userInput) { axios({ method: 'POST', - url: `${config.fediverse.domain}/api/v1/statuses/${userInput}/pin`, - headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/statuses/${userInput}/pin`, + headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, }) .then(() => { matrix.utils.addReact(event, '✅'); diff --git a/commands/fediverse/post.js b/commands/fediverse/post.js index b04ce28..3ad97f0 100644 --- a/commands/fediverse/post.js +++ b/commands/fediverse/post.js @@ -84,8 +84,8 @@ const mediaUpload = async ({ domain }, { data, filename, mimetype }) => { }); const upload = await axios({ method: 'POST', - url: `${domain}/api/v1/media`, - headers: form.getHeaders({ Authorization: `Bearer ${fediverse.auth.access_token}` }), + url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/media`, + headers: form.getHeaders({ Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }), data: form, }); if (upload.statusText !== 'OK') throw upload; @@ -101,8 +101,8 @@ const run = async (roomId, event, content, replyId, mediaURL, subject, visibilit if (replyId) content = await fediverse.utils.getStatusMentions(replyId, event).then(m => m.concat(content).join(' ')); const response = await axios({ method: 'POST', - url: `${config.fediverse.domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${fediverse.auth.access_token}`, 'Content-Type': 'application/x-www-form-urlencoded' }, + url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/statuses`, + headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}`, 'Content-Type': 'application/x-www-form-urlencoded' }, data: qs.stringify({ status: content, content_type: 'text/markdown', @@ -126,6 +126,7 @@ exports.runQuery = async (roomId, event, userInput, { isReply, hasMedia, hasSubj if (hasMedia) mediaURL = chunks.shift(); return await run(roomId, event, chunks.join(' '), replyId, mediaURL, subject, visibility); } catch (e) { + console.error(e) return matrixClient.sendHtmlNotice(roomId, 'Sad!', 'Sad!').catch(() => {}); } }; diff --git a/commands/fediverse/react.js b/commands/fediverse/react.js index a75fa14..1ceac6a 100644 --- a/commands/fediverse/react.js +++ b/commands/fediverse/react.js @@ -1,8 +1,8 @@ const run = async (roomId, event, id, emoji, remove) => { axios({ method: remove ? 'DELETE' : 'PUT', - url: `${config.fediverse.domain}/api/v1/pleroma/statuses/${id}/reactions/${emoji}`, - headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/pleroma/statuses/${id}/reactions/${emoji}`, + headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, }) .then(() => { matrix.utils.addReact(event, '✅'); diff --git a/commands/fediverse/redact.js b/commands/fediverse/redact.js index d1ca217..18b0ce1 100644 --- a/commands/fediverse/redact.js +++ b/commands/fediverse/redact.js @@ -1,8 +1,8 @@ exports.runQuery = function (roomId, event, userInput) { axios({ method: 'DELETE', - url: `${config.fediverse.domain}/api/v1/statuses/${userInput}`, - headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/statuses/${userInput}`, + headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, }) .then(() => { matrix.utils.addReact(event, '✅'); diff --git a/commands/fediverse/status.js b/commands/fediverse/status.js index a15845e..d2d0b4a 100644 --- a/commands/fediverse/status.js +++ b/commands/fediverse/status.js @@ -1,8 +1,8 @@ exports.runQuery = function (roomId, event, userInput) { axios({ method: 'GET', - url: `${config.fediverse.domain}/api/v1/statuses/${userInput}`, - headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/statuses/${userInput}`, + headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, }) .then((response) => { response.label = 'status'; diff --git a/commands/fediverse/tip.js b/commands/fediverse/tip.js deleted file mode 100644 index b9ac597..0000000 --- a/commands/fediverse/tip.js +++ /dev/null @@ -1,16 +0,0 @@ -exports.runQuery = function (roomId, event, address, flaggedInput) { - if (config.fediverse.tipping === false) return matrixClient.sendHtmlNotice(roomId, `Tipping is not enabled.`, `Tipping is not enabled.`); - axios({ - method: 'POST', - url: `${config.fediverse.domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, - data: { status: `@10grans@fedi.cc tip ${flaggedInput} to ${address}` }, - }) - .then(() => { - matrix.utils.addReact(event, '✅'); - }) - .catch((e) => { - matrix.utils.addReact(event, '❌'); - matrix.utils.sendError(event, roomId, e); - }); -}; diff --git a/commands/fediverse/unfollow.js b/commands/fediverse/unfollow.js index 9f5cd6b..e34bb8d 100644 --- a/commands/fediverse/unfollow.js +++ b/commands/fediverse/unfollow.js @@ -5,8 +5,8 @@ exports.runQuery = async function (roomId, event, userInput) { const suggest = []; axios({ method: 'GET', - url: `${config.fediverse.domain}/api/v2/search?q=${userInput}&type=accounts`, - headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + url: `https://${fediverse.auth[event.getSender()].domain}/api/v2/search?q=${userInput}&type=accounts`, + headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, }).then((findUserId) => { const results = findUserId.data.accounts; const len = results.length; diff --git a/commands/fediverse/unpin.js b/commands/fediverse/unpin.js index de032a1..7c3d5d2 100644 --- a/commands/fediverse/unpin.js +++ b/commands/fediverse/unpin.js @@ -1,8 +1,8 @@ exports.runQuery = function (roomId, event, userInput) { axios({ method: 'POST', - url: `${config.fediverse.domain}/api/v1/statuses/${userInput}/unpin`, - headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/statuses/${userInput}/unpin`, + headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, }) .then(() => { matrix.utils.addReact(event, '✅'); diff --git a/commands/fediverse/unreblog.js b/commands/fediverse/unreblog.js index 8c7dee8..8e612b7 100644 --- a/commands/fediverse/unreblog.js +++ b/commands/fediverse/unreblog.js @@ -1,8 +1,8 @@ exports.runQuery = function (roomId, event, userInput) { axios({ method: 'POST', - url: `${config.fediverse.domain}/api/v1/statuses/${userInput}/unreblog`, - headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/statuses/${userInput}/unreblog`, + headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, }) .then(() => { matrix.utils.addReact(event, '✅'); diff --git a/commands/fediverse/unroll.js b/commands/fediverse/unroll.js index d018b20..cb47bce 100644 --- a/commands/fediverse/unroll.js +++ b/commands/fediverse/unroll.js @@ -1,8 +1,8 @@ exports.runQuery = function (roomId, event, userInput) { const instance = axios.create({ - baseURL: config.fediverse.domain, + baseURL: 'https://' + fediverse.auth[event.getSender()].domain, method: 'GET', - headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, }); instance.get(`/api/v1/statuses/${userInput}/context`) .then(async (response) => { diff --git a/commands/fediverse/utils.js b/commands/fediverse/utils.js index 394f2de..b1f8d54 100644 --- a/commands/fediverse/utils.js +++ b/commands/fediverse/utils.js @@ -142,8 +142,8 @@ module.exports.formatter = (res, roomId, event) => { module.exports.follow = (roomId, account, event, original) => { axios({ method: 'POST', - url: `${config.fediverse.domain}/api/v1/accounts/${account[0].id}/follow`, - headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + url: `https://${config.fediverse[event.getSender()].domain}/api/v1/accounts/${account[0].id}/follow`, + headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, }) .then(() => { matrix.utils.addReact(event, '✅'); @@ -158,8 +158,8 @@ module.exports.follow = (roomId, account, event, original) => { module.exports.unfollow = (roomId, account, event, original) => { axios({ method: 'POST', - url: `${config.fediverse.domain}/api/v1/accounts/${account[0].id}/unfollow`, - headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/accounts/${account[0].id}/unfollow`, + headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, }) .then(() => { matrix.utils.addReact(event, '✅'); @@ -174,8 +174,8 @@ module.exports.unfollow = (roomId, account, event, original) => { module.exports.getStatusMentions = (notice, event) => { const users = axios({ method: 'GET', - url: `${config.fediverse.domain}/api/v1/statuses/${notice}`, - headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, + url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/statuses/${notice}`, + headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, }).then((notice) => { const users = []; users.push('@' + notice.data.account.acct); diff --git a/commands/help.js b/commands/help.js index fb96e52..e076d5b 100644 --- a/commands/help.js +++ b/commands/help.js @@ -12,9 +12,6 @@ exports.runQuery = function (roomId) { + '+copy [post id] : repeat/repost/retweet
' + '+crossblog [status URL]: cross blog twitter post to fediverse post
' + '+reply [post id] [content] : reply to post
' - + '+tip [@user@fedi.url] [amount] : tip 10grans
' - + '+makeitrain [post id] : make it rain 10grans
' - + '+beg : beg for 10grans
' + '+clap [post id] : favorite
' + '+boo [post id] : unfavorite
' + '
channel commands
' @@ -30,6 +27,7 @@ exports.runQuery = function (roomId) { + `
ligh7hau5 version ${require('../package.json').version}
` + '--- Contributors🐱 ---
' + 'CRYPTOMOONERS
' + + 'doesnm
' + 'docs by LINT
' ); }; diff --git a/commands/proxy.js b/commands/proxy.js deleted file mode 100644 index 0b5b431..0000000 --- a/commands/proxy.js +++ /dev/null @@ -1,4 +0,0 @@ - -const msg = 'Invalid proxy domain!'; -exports.runQuery = (roomId, event, userInput) => - matrixClient.sendHtmlNotice(roomId, msg, `${msg}`).catch(() => {}); diff --git a/config.example.js b/config.example.js deleted file mode 100644 index 53023ec..0000000 --- a/config.example.js +++ /dev/null @@ -1,48 +0,0 @@ -module.exports = { - matrix: { - domain: 'https://your_homeserver.com', - user: '@your_user:your_homeserver.com', - password: 'your_password', - domains: [ 'your_homeserver.com' ], - manualVerify: false, - reactions: { - copy: '🔁', - clap: '👏', - redact: '🗑️️', - rain: '🌧️', - unroll: '🔍️', - expand: '➕', - } - }, - fediverse: { - domain: 'https://your_federation.com', - username: '', - password: '', - client_name: 'ligh7hau5', - subject: '', - tipping: false, - mimetypes: { - whitelist: [], - blacklist: [] - } - }, - archive: { - domain: 'archive.is', - userAgent: 'Mozilla/4.0 (compatible; Beep Boop)' - }, - nitter: { - userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', - domains: { - redirect: [ 'nitter.unixfox.eu', 'nitter.cz', 'nitter.privacydev.net', 'nitter.poast.org', 'nitter.fdn.fr', 'nitter.snopyta.org', 'nitter.net' ], - original: [ 'nitter.unixfox.eu', 'nitter.cz', 'nitter.privacydev.net', 'nitter.poast.org', 'nitter.net', 'www.nitter.net', 'twitter.com', 'www.twitter.com', 'mobile.twitter.com', 'm.twitter.com' ] - }, - check: '(✅)', - }, - invidious: { - userAgent: 'Mozilla/4.0 (compatible; Beep Boop)', - domains: { - redirect: [ 'invidious.fdn.fr', 'invidious.snopyta.org', 'invidious.xyz', 'inv.riverside.rocks', 'vid.puffyan.us', 'y.com.cm' ], - original: [ 'youtube.com', 'www.youtube.com', 'youtu.be', 'm.youtube.com' ] - } - } -}; diff --git a/main.js b/main.js index b3c57ea..64e41d2 100644 --- a/main.js +++ b/main.js @@ -1,7 +1,7 @@ global.registrar = require('./registrar.js'); matrix.auth.access_token ? auth.matrixTokenLogin() : auth.getMatrixToken(); -if (!fediverse.auth.access_token && config.fediverse.username) auth.registerFediverseApp(); +//if (!fediverse.auth.access_token && config.fediverse.username) auth.registerFediverseApp(); matrixClient.on('RoomMember.membership', (event, member) => { if (member.membership === 'invite' && member.userId === matrixClient.credentials.userId) { diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..9370635 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1027 @@ +{ + "name": "ligh7hau5", + "version": "3.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ligh7hau5", + "version": "3.0.1", + "license": "AGPL-3.0-only", + "dependencies": { + "axios": "^0.25.0", + "form-data": "^4.0.0", + "jsdom": "^19.0.0", + "matrix-js-sdk": "^27.2.0", + "node-localstorage": "^2.2.1", + "olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz", + "qs": "^6.11.2" + }, + "devDependencies": {}, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", + "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@matrix-org/matrix-sdk-crypto-wasm": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@matrix-org/matrix-sdk-crypto-wasm/-/matrix-sdk-crypto-wasm-1.2.1.tgz", + "integrity": "sha512-DCb7Q83PCQK0uav5vB3KNV/hJPlxAhT/ddar+VHz2kC39hMLKGzWYVhprpLYVcavaE/6OX+Q/xFkAoV/3QtUHQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "license": "MIT" + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "license": "BSD-3-Clause" + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/another-json": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/another-json/-/another-json-0.2.0.tgz", + "integrity": "sha512-/Ndrl68UQLhnCdsAzEXLMFuOR546o2qbYRqCglaNHbjXrwG1ayTcdwr3zkSGOGtGXDyR5X9nCFfnyG2AFJIsqg==", + "license": "Apache-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", + "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.14.7" + } + }, + "node_modules/base-x": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", + "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==", + "license": "MIT" + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "license": "BSD-2-Clause" + }, + "node_modules/bs58": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "license": "MIT", + "dependencies": { + "base-x": "^4.0.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==", + "license": "MIT" + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", + "license": "MIT", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "license": "MIT" + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "license": "MIT" + }, + "node_modules/jsdom": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz", + "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.5.0", + "acorn-globals": "^6.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.1", + "decimal.js": "^10.3.1", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^10.0.0", + "ws": "^8.2.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jwt-decode": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", + "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==", + "license": "MIT" + }, + "node_modules/loglevel": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", + "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/matrix-events-sdk": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz", + "integrity": "sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==", + "license": "Apache-2.0" + }, + "node_modules/matrix-js-sdk": { + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-27.2.0.tgz", + "integrity": "sha512-jsoA5oPv0eQbELlOzQ6J3v1HTPU0oydqgLQNVpztsajEj6AfJYvCaZueFak8jac9RsopZlqWbP8CXI8r5MvNEA==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@matrix-org/matrix-sdk-crypto-wasm": "^1.2.0", + "another-json": "^0.2.0", + "bs58": "^5.0.0", + "content-type": "^1.0.4", + "jwt-decode": "^3.1.2", + "loglevel": "^1.7.1", + "matrix-events-sdk": "0.0.1", + "matrix-widget-api": "^1.5.0", + "oidc-client-ts": "^2.2.4", + "p-retry": "4", + "sdp-transform": "^2.14.1", + "unhomoglyph": "^1.0.6", + "uuid": "9" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/matrix-widget-api": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/matrix-widget-api/-/matrix-widget-api-1.5.0.tgz", + "integrity": "sha512-hKGfqQKK5qVMwW0Sp8l2TiuW8UuHafTvUZNSWBPghedB/rSFbVLlr0mufuEV0iq/pQ7ChW96q/WEC6Llie4SnA==", + "license": "Apache-2.0", + "dependencies": { + "@types/events": "^3.0.0", + "events": "^3.2.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, + "node_modules/node-localstorage": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-2.2.1.tgz", + "integrity": "sha512-vv8fJuOUCCvSPjDjBLlMqYMHob4aGjkmrkaE42/mZr0VT+ZAU10jRF8oTnX9+pgU9/vYJ8P7YT3Vd6ajkmzSCw==", + "license": "MIT", + "dependencies": { + "write-file-atomic": "^1.1.4" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "license": "MIT" + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/oidc-client-ts": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/oidc-client-ts/-/oidc-client-ts-2.2.5.tgz", + "integrity": "sha512-omAHoLdFcylnwZeHJahOnJBwd0r78JzhmVAmsQjLGrexAnQKiHW9Ilr9FlRD5qjMikmabvaucI4k49AbQLXhmQ==", + "license": "Apache-2.0", + "dependencies": { + "crypto-js": "^4.1.1", + "jwt-decode": "^3.1.2" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/olm": { + "name": "@matrix-org/olm", + "version": "3.2.14", + "resolved": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz", + "integrity": "sha512-Yz8X5+R1PL0RwJNjuH4r9WgWgXHX5v4NB093baUUE3Wh1INHEminESeur6FtIfQhVRQd8UZ9HRBh+Rd2nkNFGQ==", + "license": "Apache-2.0" + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "license": "MIT" + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "license": "MIT" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sdp-transform": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/sdp-transform/-/sdp-transform-2.14.1.tgz", + "integrity": "sha512-RjZyX3nVwJyCuTo5tGPx+PZWkDMCg7oOLpSlhjDdZfwUoNqG1mM8nyj31IGHyaPWXhjbP7cdK3qZ2bmkJ1GzRw==", + "license": "MIT", + "bin": { + "sdp-verify": "checker.js" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==", + "license": "ISC", + "engines": { + "node": "*" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/unhomoglyph": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/unhomoglyph/-/unhomoglyph-1.0.6.tgz", + "integrity": "sha512-7uvcWI3hWshSADBu4JpnyYbTVc7YlhF5GDW/oPD5AxIxl34k4wXR3WDkPnzLxkN32LiTCTKMQLtKVZiwki3zGg==", + "license": "MIT" + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "license": "MIT", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", + "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha512-SdrHoC/yVBPpV0Xq/mUZQIpW2sWXAShb/V4pomcJXh92RuaO+f3UTWItiR3Px+pLnV2PvC2/bfn5cwr5X6Vfxw==", + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + }, + "node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "license": "MIT" + } + } +} diff --git a/registrar.js b/registrar.js index 72ee14f..5d4590c 100644 --- a/registrar.js +++ b/registrar.js @@ -3,16 +3,16 @@ global.sdk = require('matrix-js-sdk'); global.axios = require('axios'); global.config = require('./config.js'); global.auth = require('./auth.js'); - +global.authEvents = []; const { LocalStorage } = require('node-localstorage'); global.localStorage = new LocalStorage('./keys'); if (!localStorage.getItem('matrix_auth')) { localStorage.clear(); localStorage.setItem('matrix_auth', '[]'); } -if (!localStorage.getItem('fediverse_auth')) localStorage.setItem('fediverse_auth', '[]'); -if (!localStorage.getItem('timeline')) localStorage.setItem('timeline', '[]'); -if (!localStorage.getItem('notifications')) localStorage.setItem('notifications', '[]'); +if (!localStorage.getItem('fediverse_auth')) localStorage.setItem('fediverse_auth', '{}'); +if (!localStorage.getItem('timeline')) localStorage.setItem('timeline', '{}'); +if (!localStorage.getItem('notifications')) localStorage.setItem('notifications', '{}'); global.fediverse = { @@ -30,25 +30,22 @@ module.exports = { proxy: require('./commands/proxy.js'), invidious: require('./commands/invidious.js'), nitter: require('./commands/nitter.js'), - beg: require('./commands/fediverse/beg.js'), boo: require('./commands/fediverse/boo.js'), clap: require('./commands/fediverse/clap.js'), copy: require('./commands/fediverse/copy.js'), flood: require('./commands/fediverse/flood.js'), follow: require('./commands/fediverse/follow.js'), help: require('./commands/help.js'), - makeitrain: require('./commands/fediverse/makeitrain.js'), - mordy: require('./commands/fediverse/mordy.js'), notify: require('./commands/fediverse/notify.js'), pin: require('./commands/fediverse/pin.js'), post: require('./commands/fediverse/post.js'), redact: require('./commands/fediverse/redact.js'), status: require('./commands/fediverse/status.js'), - tip: require('./commands/fediverse/tip.js'), unfollow: require('./commands/fediverse/unfollow.js'), unpin: require('./commands/fediverse/unpin.js'), unreblog: require('./commands/fediverse/unreblog.js'), unroll: require('./commands/fediverse/unroll.js'), react: require('./commands/fediverse/react.js'), - expand: require('./commands/expand.js') + expand: require('./commands/expand.js'), + auth: require("./commands/fediverse/auth.js") }; diff --git a/utils.js b/utils.js index 7ddf32f..3b93a24 100644 --- a/utils.js +++ b/utils.js @@ -1,5 +1,5 @@ const { MatrixEvent } = require('matrix-js-sdk/lib/models/event'); - +const url = require("url") const isEmoji = string => true; const sendError = async (event, roomId, e) => { @@ -68,21 +68,11 @@ const eventHandler = (args, roomId, command, event) => { args.push(roomId, event, userInput, true); command = 'nitter' break; - case 'proxy': case 'p': - try { - const url = new URL(userInput); - const invidio = config.invidious.domains; - const nitter = config.nitter.domains; - command = invidio.redirect.includes(url.hostname) || invidio.original.includes(url.hostname) - ? 'invidious' - : nitter.redirect.includes(url.hostname) || nitter.original.includes(url.hostname) - ? 'nitter' - : 'proxy'; - } catch (e) { sendError(event, roomId, e); } // fallthrough default: args.push(roomId, event, userInput); } + if(["boo","clap","copy","flood","follow","notify","pin","unpin","post","react","redact","status","unfollow","unreblog","unroll"].includes(command) && !fediverse.auth[event.getSender()]) return matrixClient.sendHtmlNotice(roomId, ' ',`${event.getSender()}, для использования команды ${command} нужно привязать аккаунт Fediverse. Используйте для этого команду +auth <имя сервера>`) registrar[command] && registrar[command].runQuery.apply(null, args); }; @@ -153,7 +143,7 @@ module.exports.handleReact = async (event) => { args.push(reaction.key); } break; - }; + } eventHandler(args, roomId, command, event); }; @@ -162,6 +152,16 @@ module.exports.handleReply = async (event) => { if(!event.event.content['m.relates_to']['m.in_reply_to']) return; const reply = event.event.content['m.relates_to']['m.in_reply_to']; const metaEvent = await fetchEncryptedOrNot(roomId, reply); + if(authEvents.includes(metaEvent.event_id)){ +const domain = metaEvent.event.content.body.match(/https?:\/\/[^\s]+/); +if(domain && domain[0]){ + domain[0] = url.parse(domain[0]).host + let code = event.getContent().body.split("\n"); + code = code[code.length-1].trim() + auth.obtainAccessToken(domain[0],code,event) + authEvents = authEvents.filter(f => f != event.event_id) +} + } if (!metaEvent.getContent().meta || metaEvent.event.sender !== config.matrix.user) return; const args = metaEvent.getContent().meta.split(' '); args.push(event.getContent().formatted_body.trim().split('')[1]); diff --git a/yarn.lock b/yarn.lock index 0356e71..b2d3ac2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,39 +4,39 @@ "@babel/runtime@^7.12.5": version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.10.tgz#ae3e9631fd947cb7e3610d3e9d8fef5f76696682" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz" integrity sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ== dependencies: regenerator-runtime "^0.14.0" "@matrix-org/matrix-sdk-crypto-wasm@^1.2.0": version "1.2.1" - resolved "https://registry.yarnpkg.com/@matrix-org/matrix-sdk-crypto-wasm/-/matrix-sdk-crypto-wasm-1.2.1.tgz#5b546c8a0e53b614f10b77b3b649818aed9d0db1" + resolved "https://registry.npmjs.org/@matrix-org/matrix-sdk-crypto-wasm/-/matrix-sdk-crypto-wasm-1.2.1.tgz" integrity sha512-DCb7Q83PCQK0uav5vB3KNV/hJPlxAhT/ddar+VHz2kC39hMLKGzWYVhprpLYVcavaE/6OX+Q/xFkAoV/3QtUHQ== "@tootallnate/once@2": version "2.0.0" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== "@types/events@^3.0.0": version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + resolved "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz" integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== "@types/retry@0.12.0": version "0.12.0" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== abab@^2.0.5, abab@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== acorn-globals@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz" integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== dependencies: acorn "^7.1.1" @@ -44,63 +44,63 @@ acorn-globals@^6.0.0: acorn-walk@^7.1.1: version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== acorn@^7.1.1: version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.5.0: version "8.10.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== agent-base@6: version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" another-json@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/another-json/-/another-json-0.2.0.tgz#b5f4019c973b6dd5c6506a2d93469cb6d32aeedc" + resolved "https://registry.npmjs.org/another-json/-/another-json-0.2.0.tgz" integrity sha512-/Ndrl68UQLhnCdsAzEXLMFuOR546o2qbYRqCglaNHbjXrwG1ayTcdwr3zkSGOGtGXDyR5X9nCFfnyG2AFJIsqg== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== axios@^0.25.0: version "0.25.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" + resolved "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz" integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== dependencies: follow-redirects "^1.14.7" base-x@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" + resolved "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz" integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== browser-process-hrtime@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== bs58@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" + resolved "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz" integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== dependencies: base-x "^4.0.0" call-bind@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" @@ -108,41 +108,41 @@ call-bind@^1.0.0: combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" content-type@^1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== crypto-js@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" + resolved "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz" integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== cssom@^0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz" integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== cssom@~0.3.6: version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== cssstyle@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz" integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== dependencies: cssom "~0.3.6" data-urls@^3.0.1: version "3.0.2" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz" integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== dependencies: abab "^2.0.6" @@ -151,31 +151,31 @@ data-urls@^3.0.1: debug@4: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" decimal.js@^10.3.1: version "10.4.3" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== domexception@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + resolved "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz" integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== dependencies: webidl-conversions "^7.0.0" escodegen@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz" integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" @@ -186,32 +186,32 @@ escodegen@^2.0.0: esprima@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== events@^3.2.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== follow-redirects@^1.14.7: version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== form-data@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" @@ -220,12 +220,12 @@ form-data@^4.0.0: function-bind@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== get-intrinsic@^1.0.2: version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz" integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== dependencies: function-bind "^1.1.1" @@ -235,36 +235,36 @@ get-intrinsic@^1.0.2: graceful-fs@^4.1.11: version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== has-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" html-encoding-sniffer@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz" integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== dependencies: whatwg-encoding "^2.0.0" http-proxy-agent@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz" integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== dependencies: "@tootallnate/once" "2" @@ -273,7 +273,7 @@ http-proxy-agent@^5.0.0: https-proxy-agent@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" @@ -281,24 +281,24 @@ https-proxy-agent@^5.0.0: iconv-lite@0.6.3: version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== is-potential-custom-element-name@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== jsdom@^19.0.0: version "19.0.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-19.0.0.tgz#93e67c149fe26816d38a849ea30ac93677e16b6a" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz" integrity sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A== dependencies: abab "^2.0.5" @@ -331,22 +331,22 @@ jsdom@^19.0.0: jwt-decode@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" + resolved "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz" integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== loglevel@^1.7.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.1.tgz#5c621f83d5b48c54ae93b6156353f555963377b4" + resolved "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz" integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg== matrix-events-sdk@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" + resolved "https://registry.npmjs.org/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== matrix-js-sdk@^27.2.0: version "27.2.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-27.2.0.tgz#c06d5ce9f961b18ed62593e1c01eeaec754725bc" + resolved "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-27.2.0.tgz" integrity sha512-jsoA5oPv0eQbELlOzQ6J3v1HTPU0oydqgLQNVpztsajEj6AfJYvCaZueFak8jac9RsopZlqWbP8CXI8r5MvNEA== dependencies: "@babel/runtime" "^7.12.5" @@ -366,7 +366,7 @@ matrix-js-sdk@^27.2.0: matrix-widget-api@^1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/matrix-widget-api/-/matrix-widget-api-1.5.0.tgz#4ae3e46a7f2854f944ddaf8a5af63d72fba76c45" + resolved "https://registry.npmjs.org/matrix-widget-api/-/matrix-widget-api-1.5.0.tgz" integrity sha512-hKGfqQKK5qVMwW0Sp8l2TiuW8UuHafTvUZNSWBPghedB/rSFbVLlr0mufuEV0iq/pQ7ChW96q/WEC6Llie4SnA== dependencies: "@types/events" "^3.0.0" @@ -374,41 +374,41 @@ matrix-widget-api@^1.5.0: mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" ms@2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== node-localstorage@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/node-localstorage/-/node-localstorage-2.2.1.tgz#869723550a4883e426cb391d2df0b563a51c7c1c" + resolved "https://registry.npmjs.org/node-localstorage/-/node-localstorage-2.2.1.tgz" integrity sha512-vv8fJuOUCCvSPjDjBLlMqYMHob4aGjkmrkaE42/mZr0VT+ZAU10jRF8oTnX9+pgU9/vYJ8P7YT3Vd6ajkmzSCw== dependencies: write-file-atomic "^1.1.4" nwsapi@^2.2.0: version "2.2.7" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz" integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== object-inspect@^1.9.0: version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== oidc-client-ts@^2.2.4: version "2.2.5" - resolved "https://registry.yarnpkg.com/oidc-client-ts/-/oidc-client-ts-2.2.5.tgz#ca0a9f791d8d9d00a1720226d3e96b50065ce015" + resolved "https://registry.npmjs.org/oidc-client-ts/-/oidc-client-ts-2.2.5.tgz" integrity sha512-omAHoLdFcylnwZeHJahOnJBwd0r78JzhmVAmsQjLGrexAnQKiHW9Ilr9FlRD5qjMikmabvaucI4k49AbQLXhmQ== dependencies: crypto-js "^4.1.1" @@ -416,11 +416,12 @@ oidc-client-ts@^2.2.4: "olm@https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz": version "3.2.14" - resolved "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz#acd96c00a881d0f462e1f97a56c73742c8dbc984" + resolved "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz" + integrity sha512-Yz8X5+R1PL0RwJNjuH4r9WgWgXHX5v4NB093baUUE3Wh1INHEminESeur6FtIfQhVRQd8UZ9HRBh+Rd2nkNFGQ== p-retry@4: version "4.6.2" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz" integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== dependencies: "@types/retry" "0.12.0" @@ -428,66 +429,66 @@ p-retry@4: parse5@6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== psl@^1.1.33: version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== punycode@^2.1.1: version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== qs@^6.11.2: version "6.11.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz" integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== dependencies: side-channel "^1.0.4" querystringify@^2.1.1: version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== regenerator-runtime@^0.14.0: version "0.14.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz" integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== requires-port@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== retry@^0.13.1: version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== saxes@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + resolved "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz" integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== dependencies: xmlchars "^2.2.0" sdp-transform@^2.14.1: version "2.14.1" - resolved "https://registry.yarnpkg.com/sdp-transform/-/sdp-transform-2.14.1.tgz#2bb443583d478dee217df4caa284c46b870d5827" + resolved "https://registry.npmjs.org/sdp-transform/-/sdp-transform-2.14.1.tgz" integrity sha512-RjZyX3nVwJyCuTo5tGPx+PZWkDMCg7oOLpSlhjDdZfwUoNqG1mM8nyj31IGHyaPWXhjbP7cdK3qZ2bmkJ1GzRw== side-channel@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: call-bind "^1.0.0" @@ -496,22 +497,22 @@ side-channel@^1.0.4: slide@^1.1.5: version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + resolved "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz" integrity sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw== source-map@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== symbol-tree@^3.2.4: version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== tough-cookie@^4.0.0: version "4.1.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz" integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== dependencies: psl "^1.1.33" @@ -521,24 +522,24 @@ tough-cookie@^4.0.0: tr46@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + resolved "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz" integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== dependencies: punycode "^2.1.1" unhomoglyph@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/unhomoglyph/-/unhomoglyph-1.0.6.tgz#ea41f926d0fcf598e3b8bb2980c2ddac66b081d3" + resolved "https://registry.npmjs.org/unhomoglyph/-/unhomoglyph-1.0.6.tgz" integrity sha512-7uvcWI3hWshSADBu4JpnyYbTVc7YlhF5GDW/oPD5AxIxl34k4wXR3WDkPnzLxkN32LiTCTKMQLtKVZiwki3zGg== universalify@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== url-parse@^1.5.3: version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== dependencies: querystringify "^2.1.1" @@ -546,43 +547,43 @@ url-parse@^1.5.3: uuid@9: version "9.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz" integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== w3c-hr-time@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== dependencies: browser-process-hrtime "^1.0.0" w3c-xmlserializer@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz#06cdc3eefb7e4d0b20a560a5a3aeb0d2d9a65923" + resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz" integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg== dependencies: xml-name-validator "^4.0.0" webidl-conversions@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== whatwg-encoding@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz" integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== dependencies: iconv-lite "0.6.3" whatwg-mimetype@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz" integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== whatwg-url@^10.0.0: version "10.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-10.0.0.tgz#37264f720b575b4a311bd4094ed8c760caaa05da" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz" integrity sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w== dependencies: tr46 "^3.0.0" @@ -590,7 +591,7 @@ whatwg-url@^10.0.0: whatwg-url@^11.0.0: version "11.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz" integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== dependencies: tr46 "^3.0.0" @@ -598,7 +599,7 @@ whatwg-url@^11.0.0: write-file-atomic@^1.1.4: version "1.3.4" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz" integrity sha512-SdrHoC/yVBPpV0Xq/mUZQIpW2sWXAShb/V4pomcJXh92RuaO+f3UTWItiR3Px+pLnV2PvC2/bfn5cwr5X6Vfxw== dependencies: graceful-fs "^4.1.11" @@ -607,15 +608,15 @@ write-file-atomic@^1.1.4: ws@^8.2.3: version "8.13.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz" integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== xml-name-validator@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz" integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== xmlchars@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
${notifications.data[0].status.content} -
(id: ${notifications.data[0].status.id})
+
(id: ${notifications.data[0].status.id}) ${registrar.media.visibilityEmoji(notifications.data[0].status.visibility)}