From f20163767723cf87f2c58127d138bee63062bb20 Mon Sep 17 00:00:00 2001 From: vulet Date: Fri, 6 Nov 2020 19:21:01 +0800 Subject: [PATCH 01/64] 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 02/64] 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 03/64] 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 04/64] 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:
${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)}
`); } 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 05/64] 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 06/64] 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 07/64] 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 08/64] 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 09/64] 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 10/64] 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 11/64] 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 12/64] 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 13/64] 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 14/64] 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 15/64] 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 16/64] 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 17/64] 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 18/64] 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 19/64] 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 20/64] 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 21/64] 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 22/64] 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 23/64] 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 24/64] 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 25/64] 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 26/64] 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 27/64] 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 28/64] 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 29/64] 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 30/64] 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 31/64] 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 32/64] 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 33/64] 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 34/64] 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 35/64] 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 36/64] 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 37/64] 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 38/64] 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 39/64] 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 40/64] 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 41/64] 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 42/64] 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 43/64] 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 44/64] 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 45/64] 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 46/64] 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 47/64] 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 48/64] 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 49/64] 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 50/64] 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 51/64] 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 52/64] 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 53/64] 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 54/64] 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 55/64] 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 56/64] 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 57/64] 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 58/64] 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 59/64] 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 60/64] 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 61/64] 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 62/64] 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 63/64] 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 64/64] 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==