thedesk/app/js/tl/datails.js
2022-12-05 23:26:08 +09:00

694 lines
18 KiB
JavaScript

//トゥートの詳細
async function details(id, acct_id, tlid, mode) {
if (mode == 'dm') {
$('.dm-hide').hide()
} else {
$('.dm-hide').show()
}
const context = localStorage.getItem('moreContext')
if (context != 'yes') {
$('.contextTool').hide()
} else {
$('.contextTool').show()
}
$('.toot-reset').html('<span class="no-data">' + lang.lang_details_nodata + '</span>')
var html = $('#timeline_' + tlid + ' [toot-id=' + id + ']').html()
$('#toot-this').html(html)
$('#tootmodal').modal('open')
var domain = localStorage.getItem('domain_' + acct_id)
var at = localStorage.getItem('acct_' + acct_id + '_at')
if (localStorage.getItem('mode_' + domain) == 'misskey') {
var start = 'https://' + domain + '/api/notes/show'
var i = {
method: 'POST',
headers: {
'content-type': 'application/json'
},
body: JSON.stringify({
i: at,
noteId: id
})
}
} else {
var start = 'https://' + domain + '/api/v1/statuses/' + id
var i = {
method: 'GET',
headers: {
'content-type': 'application/json',
Authorization: 'Bearer ' + at
}
}
}
try {
const response = await fetch(start, i)
if (!response.ok) {
response.text().then(function (text) {
setLog(response.url, response.status, text)
})
}
const json = await response.json()
console.log(['Toot data:', json])
if (!$('#timeline_' + tlid + ' #pub_' + id).length) {
var mute = getFilterTypeByAcct(acct_id, 'thread')
var html = parse([json], '', acct_id, '', '', mute)
$('#toot-this').html(html)
jQuery('time.timeago').timeago()
}
if (localStorage.getItem('mode_' + domain) == 'misskey') {
var url = 'https://' + domain + '/notes/' + json.id
var scn = json.user.username
if (!json.user.host) {
var local = true
} else {
var local = false
scn = scn + '@' + host
}
var rep = ''
var uid = json.user.id
if (json._replyIds) {
replyTL(json._replyIds[0], acct_id)
}
} else {
var url = json.url
if (json.account.acct == json.account.username) {
var local = true
} else {
var local = false
}
var scn = json.account.acct
var uid = json.account.id
if (json['in_reply_to_id']) {
replyTL(json['in_reply_to_id'], acct_id)
}
}
$('#toot-this .fav_ct').text(json.favourites_count)
$('#toot-this .rt_ct').text(json.reblogs_count)
$('#tootmodal').attr('data-url', url)
$('#tootmodal').attr('data-id', json.id)
$('#tootmodal').attr('data-acct', acct_id)
if (local) {
$('#tootmodal').attr('data-user', scn + '@' + domain)
} else {
$('#tootmodal').attr('data-user', scn)
}
getContext(id, acct_id)
var dom = null
if (!local) {
dom = scn.replace(/.+@/g, '')
} else {
dom = domain
}
beforeToot(id, acct_id, dom)
userToot(id, acct_id, uid)
afterToot(id, acct_id, dom)
afterUserToot(id, acct_id, uid)
afterFTLToot(id, acct_id, dom)
faved(id, acct_id)
rted(id, acct_id)
if (json.edited_at) {
$('.edited-hide').show()
try {
const history = await (await fetch(`https://${domain}/api/v1/statuses/${id}/history`, i)).json()
const temp = parse(history, 'noauth', acct_id)
console.log(temp)
$('#toot-edit').html(temp)
} catch(e) { console.error(e) }
} else {
$('#toot-edit').html('')
$('.edited-hide').hide()
}
if ($('#toot-this div').hasClass('cvo')) {
$('#toot-this').removeClass('cvo')
} else {
if (!$('#toot-this .cvo').hasClass('cvo')) {
$('#toot-this').addClass('cvo')
}
}
if (!$('#activator').hasClass('active')) {
$('#det-col').collapsible('open', 4)
}
} catch (error) {
todo(error)
setLog(start, 'JSON', error)
console.error(error)
}
}
//返信タイムライン
function replyTL(id, acct_id) {
var domain = localStorage.getItem('domain_' + acct_id)
var at = localStorage.getItem('acct_' + acct_id + '_at')
if (localStorage.getItem('mode_' + domain) == 'misskey') {
var start = 'https://' + domain + '/api/notes/show'
var i = {
method: 'POST',
headers: {
'content-type': 'application/json'
},
body: JSON.stringify({
i: at,
noteId: id
})
}
} else {
return false
}
fetch(start, i)
.then(function (response) {
if (!response.ok) {
response.text().then(function (text) {
setLog(response.url, response.status, text)
})
}
return response.json()
})
.catch(function (error) {
todo(error)
setLog(start, 'JSON', error)
console.error(error)
})
.then(function (json) {
var mute = getFilterTypeByAcct(acct_id, 'thread')
if (localStorage.getItem('mode_' + domain) == 'misskey') {
var templete = misskeyParse([json], '', acct_id, '', '', mute)
$('#toot-after').prepend(templete)
$('#toot-after .hide').html(lang.lang_details_filtered)
$('#toot-after .by_filter').css('display', 'block')
$('#toot-after .by_filter').removeClass('hide')
var rep = '_replyIds'
if (json[rep]) {
replyTL(json[rep][0], acct_id)
}
}
})
}
//コンテクストってなんですか
function getContext(id, acct_id) {
var domain = localStorage.getItem('domain_' + acct_id)
var at = localStorage.getItem('acct_' + acct_id + '_at')
if (localStorage.getItem('mode_' + domain) == 'misskey') {
var start = 'https://' + domain + '/api/notes/conversation'
var i = {
method: 'POST',
headers: {
'content-type': 'application/json'
},
body: JSON.stringify({
i: at,
noteId: id
})
}
} else {
var start = 'https://' + domain + '/api/v1/statuses/' + id + '/context'
var i = {
method: 'GET',
headers: {
'content-type': 'application/json',
Authorization: 'Bearer ' + at
}
}
}
fetch(start, i)
.then(function (response) {
if (!response.ok) {
response.text().then(function (text) {
setLog(response.url, response.status, text)
})
}
return response.json()
})
.catch(function (error) {
todo(error)
setLog(start, 'JSON', error)
console.error(error)
})
.then(function (json) {
if (localStorage.getItem('mode_' + domain) == 'misskey') {
json.reverse()
var templete = misskeyParse(json, '', acct_id, '', '', [])
$('#toot-reply').html(templete)
$('#toot-reply .hide').html(lang.lang_details_filtered)
$('#toot-reply .by_filter').css('display', 'block')
$('#toot-reply .by_filter').removeClass('hide')
jQuery('time.timeago').timeago()
} else {
var mute = getFilterTypeByAcct(acct_id, 'thread')
var templete = parse(json.descendants, '', acct_id, '', '', mute)
if (templete != '') {
$('#toot-after .no-data').hide()
$('#toot-after-new').removeClass('hide')
} else {
$('#toot-after-new').addClass('hide')
$('#toot-after').html('<span class="no-data">' + lang.lang_details_nodata + '</span>')
}
$('#toot-after').html(templete)
$('#toot-after .hide').html(lang.lang_details_filtered)
$('#toot-after .by_filter').css('display', 'block')
$('#toot-after .by_filter').removeClass('hide')
var templete = parse(json.ancestors, '', acct_id, '', '', mute)
if (templete != '') {
$('#toot-reply .no-data').hide()
$('#toot-reply-new').removeClass('hide')
} else {
$('#toot-reply-new').addClass('hide')
}
$('#toot-reply').prepend(templete)
$('#toot-reply .hide').html(lang.lang_details_filtered)
$('#toot-reply .by_filter').css('display', 'block')
$('#toot-reply .by_filter').removeClass('hide')
jQuery('time.timeago').timeago()
}
})
}
//前のトゥート(Back TL)
function beforeToot(id, acct_id, domain) {
//var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem('acct_' + acct_id + '_at')
if (localStorage.getItem('mode_' + domain) == 'misskey') {
var start = 'https://' + domain + '/api/notes/local-timeline'
fetch(start, {
method: 'POST',
headers: {
'content-type': 'application/json'
},
body: JSON.stringify({
i: at,
untilID: id
})
})
.then(function (response) {
if (!response.ok) {
response.text().then(function (text) {
setLog(response.url, response.status, text)
})
}
return response.json()
})
.catch(function (error) {
todo(error)
setLog(start, 'JSON', error)
console.error(error)
})
.then(function (json) {
var templete = misskeyParse(json, 'noauth', acct_id)
$('#toot-before').html(templete)
jQuery('time.timeago').timeago()
})
} else {
var start = 'https://' + domain + '/api/v1/timelines/public?local=true&max_id=' + id
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json'
}
})
.then(function (response) {
if (!response.ok) {
response.text().then(function (text) {
setLog(response.url, response.status, text)
})
}
return response.json()
})
.catch(function (error) {
todo(error)
setLog(start, 'JSON', error)
console.error(error)
})
.then(function (json) {
var templete = parse(json, 'noauth', acct_id)
if (templete != '') {
$('#toot-before .no-data').hide()
}
$('#toot-before').html(templete)
jQuery('time.timeago').timeago()
})
}
}
//前のユーザーのトゥート
function userToot(id, acct_id, user) {
var domain = localStorage.getItem('domain_' + acct_id)
var at = localStorage.getItem('acct_' + acct_id + '_at')
if (localStorage.getItem('mode_' + domain) == 'misskey') {
var start = 'https://' + domain + '/api/users/notes'
fetch(start, {
method: 'POST',
headers: {
'content-type': 'application/json'
},
body: JSON.stringify({
i: at,
untilID: id,
userId: user
})
})
.then(function (response) {
if (!response.ok) {
response.text().then(function (text) {
setLog(response.url, response.status, text)
})
}
return response.json()
})
.catch(function (error) {
todo(error)
setLog(start, 'JSON', error)
console.error(error)
})
.then(function (json) {
var templete = misskeyParse(json, 'noauth', acct_id)
$('#user-before').html(templete)
jQuery('time.timeago').timeago()
})
} else {
var start = 'https://' + domain + '/api/v1/accounts/' + user + '/statuses?max_id=' + id
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
Authorization: 'Bearer ' + at
}
})
.then(function (response) {
if (!response.ok) {
response.text().then(function (text) {
setLog(response.url, response.status, text)
})
}
return response.json()
})
.catch(function (error) {
todo(error)
setLog(start, 'JSON', error)
console.error(error)
})
.then(function (json) {
var templete = parse(json, '', acct_id)
if (templete != '') {
$('#user-before .no-data').hide()
}
$('#user-before').html(templete)
jQuery('time.timeago').timeago()
})
}
}
//後のLTL
function afterToot(id, acct_id, domain) {
//var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem('acct_' + acct_id + '_at')
var start = 'https://' + domain + '/api/v1/timelines/public?local=true&min_id=' + id
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json'
}
})
.then(function (response) {
if (!response.ok) {
response.text().then(function (text) {
setLog(response.url, response.status, text)
})
}
return response.json()
})
.catch(function (error) {
todo(error)
setLog(start, 'JSON', error)
console.error(error)
})
.then(function (json) {
var templete = parse(json, 'noauth', acct_id)
if (templete != '') {
$('#ltl-after .no-data').hide()
}
$('#ltl-after').html(templete)
jQuery('time.timeago').timeago()
})
}
//後のUTL
function afterUserToot(id, acct_id, user) {
var domain = localStorage.getItem('domain_' + acct_id)
var at = localStorage.getItem('acct_' + acct_id + '_at')
var start = 'https://' + domain + '/api/v1/accounts/' + user + '/statuses?min_id=' + id
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
Authorization: 'Bearer ' + at
}
})
.then(function (response) {
if (!response.ok) {
response.text().then(function (text) {
setLog(response.url, response.status, text)
})
}
return response.json()
})
.catch(function (error) {
todo(error)
setLog(start, 'JSON', error)
console.error(error)
})
.then(function (json) {
var templete = parse(json, '', acct_id)
if (templete != '') {
$('#user-after .no-data').hide()
}
$('#user-after').html(templete)
jQuery('time.timeago').timeago()
})
}
//後のFTL
function afterFTLToot(id, acct_id, domain) {
//var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem('acct_' + acct_id + '_at')
var start = 'https://' + domain + '/api/v1/timelines/public?min_id=' + id
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json'
}
})
.then(function (response) {
if (!response.ok) {
response.text().then(function (text) {
setLog(response.url, response.status, text)
})
}
return response.json()
})
.catch(function (error) {
todo(error)
setLog(start, 'JSON', error)
console.error(error)
})
.then(function (json) {
var templete = parse(json, 'noauth', acct_id)
if (templete != '') {
$('#ftl-after .no-data').hide()
}
$('#ftl-after').html(templete)
jQuery('time.timeago').timeago()
})
}
//ふぁぼ一覧
function faved(id, acct_id) {
var domain = localStorage.getItem('domain_' + acct_id)
if (localStorage.getItem('mode_' + domain) == 'misskey') {
return false
}
var at = localStorage.getItem('acct_' + acct_id + '_at')
var start = 'https://' + domain + '/api/v1/statuses/' + id + '/favourited_by'
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
Authorization: 'Bearer ' + at
}
})
.then(function (response) {
if (!response.ok) {
response.text().then(function (text) {
setLog(response.url, response.status, text)
})
}
return response.json()
})
.catch(function (error) {
todo(error)
setLog(start, 'JSON', error)
console.error(error)
})
.then(function (json) {
var templete = userparse(json, '', acct_id)
if (templete != '') {
$('#toot-fav .no-data').hide()
}
$('#toot-fav').html(templete)
jQuery('time.timeago').timeago()
})
}
//ブースト一覧
function rted(id, acct_id) {
var domain = localStorage.getItem('domain_' + acct_id)
if (localStorage.getItem('mode_' + domain) == 'misskey') {
return false
}
var at = localStorage.getItem('acct_' + acct_id + '_at')
var start = 'https://' + domain + '/api/v1/statuses/' + id + '/reblogged_by'
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
Authorization: 'Bearer ' + at
}
})
.then(function (response) {
if (!response.ok) {
response.text().then(function (text) {
setLog(response.url, response.status, text)
})
}
return response.json()
})
.catch(function (error) {
todo(error)
setLog(start, 'JSON', error)
console.error(error)
})
.then(function (json) {
var templete = userparse(json, '', acct_id)
$('#toot-rt').html(templete)
jQuery('time.timeago').timeago()
})
}
//URL等のコピー
function cbCopy(mode) {
var url = $('#tootmodal').attr('data-url')
var urls = url.match(/https?:\/\/([-.a-zA-Z0-9]+)/)
var domain = urls[1]
if (mode == 'emb') {
var emb =
`<iframe src="${url}/embed" class="mastodon-embed" style="max-width: 100%; border: 0" width="400"></iframe>
<script src="https://${domain}/embed.js" async="async"></script>`
execCopy(emb)
M.toast({ html: lang.lang_details_embed, displayLength: 1500 })
} else {
if (execCopy(url)) {
M.toast({ html: lang.lang_details_url, displayLength: 1500 })
}
}
}
//本文のコピー
function staCopy(id) {
var html = $('[toot-id=' + id + '] .toot').html()
html = html.replace(/^<p>(.+)<\/p>$/, '$1')
html = html.replace(/<br\s?\/?>/, '\n')
html = html.replace(/<p>/, '\n')
html = html.replace(/<\/p>/, '\n')
console.log('Copy it:\n' + html)
html = html.replace(/<img[\s\S]*alt="(.+?)"[\s\S]*?>/g, '$1')
html = $.strip_tags(html)
if (execCopy(html)) {
M.toast({ html: lang.lang_details_txt, displayLength: 1500 })
}
}
//翻訳
function trans(tar, to, elem) {
var html = elem.parents('.cvo').find('.toot').html()
if (html.match(/^<p>(.+)<\/p>$/)) {
html = html.match(/^<p>(.+)<\/p>$/)[1]
}
html = html.replace(/<br\s?\/?>/g, '\n')
html = html.replace(/<p>/g, '\n')
html = html.replace(/<\/p>/g, '\n')
html = $.strip_tags(html)
if (~tar.indexOf('zh')) {
tar = 'zh'
}
$('#toot-this .additional').text('Loading...(Powered by Google Translate)')
var exec =
'https://script.google.com/macros/s/AKfycbxhwW5tjjop9Irg-y1zr_WsXlCKEzwWG6KuoOt_vVRDfEbRv0c/exec?format=json&text=' +
encodeURIComponent(html) +
'&source=' +
tar +
'&target=' +
to
console.log('Try to translate from ' + tar + ' to ' + to + ' at ' + exec)
fetch(exec, {
method: 'GET'
})
.then(function (response) {
if (!response.ok) {
response.text().then(function (text) {
setLog(response.url, response.status, text)
})
}
return response.json()
})
.catch(function (error) {
todo(error)
setLog(start, 'JSON', error)
console.error(error)
})
.then(function (text) {
elem.parents('.cvo').find('.toot').append('<span class="gray translate">' + text.text + '</span>')
})
}
//ブラウザで開く
function brws() {
var url = $('#tootmodal').attr('data-url')
postMessage(['openUrl', url], '*')
}
//外部からトゥート開く
async function detEx(url, acct_id) {
if (acct_id == 'main') {
acct_id = localStorage.getItem('main')
}
Swal.fire({
title: 'Loading...',
html: lang.lang_details_fetch,
showConfirmButton: false,
showCloseButton: true,
onBeforeOpen: () => {
Swal.showLoading()
},
onClose: () => { },
}).then((result) => { })
const json = await detExCore(url, acct_id)
Swal.close()
if (!json.statuses) {
postMessage(['openUrl', url], '*')
} else {
var id = json.statuses[0].id
$('.loadp').text($('.loadp').attr('href'))
$('.loadp').removeClass('loadp')
details(id, acct_id, 0)
}
return
}
async function detExCore(url, acct_id) {
const domain = localStorage.getItem('domain_' + acct_id)
const start = 'https://' + domain + '/api/v2/search?resolve=true&q=' + encodeURIComponent(url)
const at = localStorage.getItem('acct_' + acct_id + '_at')
let promise = await fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
Authorization: 'Bearer ' + at
}
})
const json = await promise.json()
if (json) {
return json
} else {
return false
}
}