From b3e9c3d6cedb9338a1005a3f49f99a2cb649bcb4 Mon Sep 17 00:00:00 2001 From: cutls Date: Wed, 2 Sep 2020 13:24:59 +0900 Subject: [PATCH] wip: channel subscription type streaming --- app/js/tl/parse.js | 218 ++++++++++++++++++++++++++++++++++++++++++--- app/js/tl/tl.js | 26 +++++- 2 files changed, 231 insertions(+), 13 deletions(-) diff --git a/app/js/tl/parse.js b/app/js/tl/parse.js index 419c456d..ead8058d 100644 --- a/app/js/tl/parse.js +++ b/app/js/tl/parse.js @@ -934,20 +934,20 @@ function parse(obj, mix, acct_id, tlid, popup, mutefilter, type) { var fontColor = value.fontColor if (!value.bgColor || !value.fontColor) { if (value.type == 'mastodon') { - if(!value.bgColor) bgColor = tickerdataRaw.default.mastodon.bgColor - if(!value.fontColor) fontColor = tickerdataRaw.default.mastodon.fontColor + if (!value.bgColor) bgColor = tickerdataRaw.default.mastodon.bgColor + if (!value.fontColor) fontColor = tickerdataRaw.default.mastodon.fontColor } else if (value.type == 'pleroma') { - if(!value.bgColor) bgColor = tickerdataRaw.default.pleroma.bgColor - if(!value.fontColor) fontColor = tickerdataRaw.default.pleroma.fontColor + if (!value.bgColor) bgColor = tickerdataRaw.default.pleroma.bgColor + if (!value.fontColor) fontColor = tickerdataRaw.default.pleroma.fontColor } else if (value.type == 'misskey') { - if(!value.bgColor) bgColor = tickerdataRaw.default.misskey.bgColor - if(!value.fontColor) fontColor = tickerdataRaw.default.misskey.fontColor + if (!value.bgColor) bgColor = tickerdataRaw.default.misskey.bgColor + if (!value.fontColor) fontColor = tickerdataRaw.default.misskey.fontColor } else if (value.type == 'misskeylegacy') { - if(!value.bgColor) bgColor = tickerdataRaw.default.misskeylegacy.bgColor - if(!value.fontColor) fontColor = tickerdataRaw.default.misskeylegacy.fontColor + if (!value.bgColor) bgColor = tickerdataRaw.default.misskeylegacy.bgColor + if (!value.fontColor) fontColor = tickerdataRaw.default.misskeylegacy.fontColor } else if (value.type == 'pixelfed') { - if(!value.bgColor) bgColor = tickerdataRaw.default.pixelfed.bgColor - if(!value.fontColor) fontColor = tickerdataRaw.default.pixelfed.fontColor + if (!value.bgColor) bgColor = tickerdataRaw.default.pixelfed.bgColor + if (!value.fontColor) fontColor = tickerdataRaw.default.pixelfed.fontColor } } else { var bgColor = value.bgColor @@ -1560,3 +1560,201 @@ function pollParse(poll, acct_id, emojis) { ` return pollHtml } + +//MastodonBaseStreaming +var mastodonBaseWs = {} +var mastodonBaseWsStatus = {} +function mastodonBaseStreaming(acct_id) { + const mute = getFilterTypeByAcct(acct_id, type) + mastodonBaseWsStatus[domain] = 'undetected' + const domain = localStorage.getItem(`domain_${acct_id}`) + const at = localStorage.getItem(`acct_${acct_id}_at`) + const start = `wss://cutls.com/api/v1/streaming/?at=${at}` + mastodonBaseWs[domain] = new WebSocket(start) + mastodonBaseWs[domain].onopen = function () { + mastodonBaseWsStatus[domain] = 'available' + } + mastodonBaseWs[domain].onmessage = function () { + const typeA = JSON.parse(mess.data).event + if (typeA == 'delete') { + $(`[unique-id=${JSON.parse(mess.data).payload}]`).hide() + $(`[unique-id=${JSON.parse(mess.data).payload}]`).remove() + } else if (typeA == 'update' || typeA == 'conversation') { + if ( + !$('#unread_' + tlid + ' .material-icons').hasClass('teal-text') + ) { + //markers show中はダメ + const tl = JSON.parse(mess.data).stream + const obj = JSON.parse(JSON.parse(mess.data).payload) + const tls = getTlMeta(tl[0], tl, acct_id) + insertTl(obj, tls) + } else if (typeA == 'filters_changed') { + filterUpdate(acct_id) + } else if (~typeA.indexOf('announcement')) { + announ(acct_id, tlid) + } + } + } + mastodonBaseWs[domain].onerror = function (error) { + console.error("Error closing " + tlid) + console.error(error) + mastodonBaseWsStatus[domain] = 'cannotuse' + mastodonBaseWs[domain] = false + return false + } + mastodonBaseWs[domain].onclose = function () { + console.warn("Closing " + tlid) + mastodonBaseWs[domain] = false + mastodonBaseWsStatus[domain] = 'cannotuse' + connectMisskey(acct_id, true) + return false + } +} +function insertTl(obj, tls) { + for (const timeline of tls) { + const { id, voice } = timeline + if ($(`#timeline_${id} [toot-id=${obj.id}]`).length) { + if (voice) { + say(obj.content) + } + const template = parse([obj], type, acct_id, tlid, '', mute, type) + if ( + $(`timeline_box_${tlid}_box .tl-box`).scrollTop() === 0 + ) { + $(`#timeline_${tlid}`).prepend(template) + } else { + const pool = localStorage.getItem('pool_' + tlid) + if (pool) { + pool = template + pool + } else { + pool = template + } + localStorage.setItem('pool_' + tlid, pool) + } + scrollck() + additional(acct_id, tlid) + jQuery('time.timeago').timeago() + } + } +} +function getTlMeta(type, data, num) { + const acct_id = num.toString() + const columns = localStorage.getItem('column') + const obj = JSON.parse(columns) + let ret = [] + let i = 0 + switch (type) { + case 'user': + for (const tl of obj) { + if (tl.domain != acct_id) continue + if (tl.type == 'mix' || tl.type == 'home') { + let voice = false + if (localStorage.getItem('voice_' + i)) voice = true + ret.push({ + id: i, + voice: voice + }) + } + i++ + } + break + case 'public:local': + for (const tl of obj) { + if (tl.domain != acct_id) continue + if (tl.type == 'mix' || tl.type == 'local') { + let voice = false + if (localStorage.getItem('voice_' + i)) voice = true + ret.push({ + id: i, + voice: voice + }) + } + i++ + } + break + case 'public:local:media': + for (const tl of obj) { + if (tl.domain != acct_id) continue + if (tl.type == 'local-media') { + let voice = false + if (localStorage.getItem('voice_' + i)) voice = true + ret.push({ + id: i, + voice: voice + }) + } + i++ + } + break; + case 'public': + for (const tl of obj) { + if (tl.domain != acct_id) continue + if (tl.type == 'pub') { + let voice = false + if (localStorage.getItem('voice_' + i)) voice = true + ret.push({ + id: i, + voice: voice + }) + } + i++ + } + break; + case 'public:media': + for (const tl of obj) { + if (tl.domain != acct_id) continue + if (tl.type == 'pub-media') { + let voice = false + if (localStorage.getItem('voice_' + i)) voice = true + ret.push({ + id: i, + voice: voice + }) + } + i++ + } + break; + case 'list': + for (const tl of obj) { + if (tl.domain != acct_id) continue + if (tl.type == 'list' && tl.data == data[1]) { + let voice = false + if (localStorage.getItem('voice_' + i)) voice = true + ret.push({ + id: i, + voice: voice + }) + } + i++ + } + break; + case 'hashtag': + for (const tl of obj) { + if (tl.domain != acct_id) continue + const columnDataRaw = tl.data + let columnData + if (!columnDataRaw.name) { + columnData = { name: columnDataRaw } + } else { + columnData = columnDataRaw + } + if (tl.type == 'tag') { + let voice = false + let can = false + if (columnData.name == data[1]) can = true + if (columnData.any.split(',').includes(data[1])) can = true + + if (localStorage.getItem('voice_' + i)) voice = true + ret.push({ + id: i, + voice: voice + }) + } + i++ + } + break; + default: + console.log(`Sorry, we are out of ${expr}.`); + } + return ret +} \ No newline at end of file diff --git a/app/js/tl/tl.js b/app/js/tl/tl.js index 9d2d861e..a198f6b2 100644 --- a/app/js/tl/tl.js +++ b/app/js/tl/tl.js @@ -247,7 +247,29 @@ function reload(type, cc, acct_id, tlid, data, mute, delc, voice, mode) { } }, 100) } else { - var misskey = false + var domain = localStorage.getItem('domain_' + acct_id) + if(mastodonBaseWs[domain] == 'cannnotopen') { + oldStreaming(type, cc, acct_id, tlid, data, mute, delc, voice, mode) + } else if(mastodonBaseWs[domain] == 'undetected') { + var mbws = setInterval(function () { + if(mastodonBaseWs[domain] == 'cannnotopen') { + oldStreaming(type, cc, acct_id, tlid, data, mute, delc, voice, mode) + clearInterval(mbws) + } else if(mastodonBaseWs[domain] == 'available') { + stremaingSubscribe(type, cc, acct_id, tlid, data, mute, delc, voice, mode) + clearInterval(mbws) + } + }, 1000) + } else if(mastodonBaseWs[domain] == 'available') { + stremaingSubscribe(type, cc, acct_id, tlid, data, mute, delc, voice, mode) + } + } +} +function stremaingSubscribe(type, cc, acct_id, tlid, data, mute, delc, voice, mode) { + +} +function oldStreaming(type, cc, acct_id, tlid, data, mute, delc, voice, mode) { + var misskey = false if (localStorage.getItem('streaming_' + acct_id)) { var wss = localStorage.getItem('streaming_' + acct_id) } else { @@ -433,9 +455,7 @@ function reload(type, cc, acct_id, tlid, data, mute, delc, voice, mode) { } return false } - } } - //一定のスクロールで発火 function moreload(type, tlid) { var multi = localStorage.getItem('column')