//お気に入り登録やブースト等、フォローやブロック等 //お気に入り登録 function fav(id, acct_id, remote) { if ($('#pub_' + id).hasClass('faved')) { var flag = 'unfavourite' } else { var flag = 'favourite' } var domain = localStorage.getItem('domain_' + acct_id) var at = localStorage.getItem('acct_' + acct_id + '_at') var start = 'https://' + domain + '/api/v1/statuses/' + id + '/' + flag var httpreq = new XMLHttpRequest() httpreq.open('POST', start, true) httpreq.setRequestHeader('Content-Type', 'application/json') httpreq.setRequestHeader('Authorization', 'Bearer ' + at) httpreq.responseType = 'json' httpreq.send() httpreq.onreadystatechange = function() { if (httpreq.readyState === 4) { var json = httpreq.response if (this.status !== 200) { setLog(start, this.status, json) } if (json.reblog) { json = json.reblog } if (remote != 'remote') { //APIのふぁぼカウントがおかしい if ($('[unique-id=' + id + '] .fav_ct').text() == json.favourites_count) { if (flag == 'unfavourite') { var fav = json.favourites_count - 1 if (fav * 1 < 0) { fav = 0 } } else { var fav = json.favourites_count //var fav = json.favourites_count; } } else { var fav = json.favourites_count } $('[unique-id=' + id + '] .fav_ct').text(fav) $('[unique-id=' + id + '] .rt_ct').text(json.reblogs_count) if ($('[unique-id=' + id + ']').hasClass('faved')) { $('[unique-id=' + id + ']').removeClass('faved') $('.fav_' + id).removeClass('yellow-text') } else { $('[unique-id=' + id + ']').addClass('faved') $('.fav_' + id).addClass('yellow-text') } } else { M.toast({ html: lang.lang_status_favWarn, displayLength: 1000 }) } } } } //ブースト function rt(id, acct_id, remote, vis) { if ($('#pub_' + id).hasClass('rted')) { var flag = 'unreblog' } else { var flag = 'reblog' } var domain = localStorage.getItem('domain_' + acct_id) var at = localStorage.getItem('acct_' + acct_id + '_at') var start = 'https://' + domain + '/api/v1/statuses/' + id + '/' + flag var httpreq = new XMLHttpRequest() httpreq.open('POST', start, true) httpreq.setRequestHeader('Content-Type', 'application/json') httpreq.setRequestHeader('Authorization', 'Bearer ' + at) httpreq.responseType = 'json' if (vis) { httpreq.send(JSON.stringify({ visibility: vis })) } else { httpreq.send() } httpreq.onreadystatechange = function() { if (httpreq.readyState === 4) { var json = httpreq.response if (this.status !== 200) { setLog(start, this.status, json) } if (json.reblog) { json = json.reblog } console.log(['Success: boost', json]) $('[unique-id=' + id + '] .fav_ct').text(json.favourites_count) if (!json.reblog) { if (flag == 'unreblog') { var rt = json.reblogs_count - 1 if (rt * 1 < 0) { rt = 0 } } else { var rt = json.reblogs_count } $('[unique-id=' + id + '] .rt_ct').text(rt) } else { $('[unique-id=' + id + '] .rt_ct').text(json.reblogs_count) } if ($('[unique-id=' + id + ']').hasClass('rted')) { $('[unique-id=' + id + ']').removeClass('rted') $('.rt_' + id).removeClass('light-blue-text') } else { $('[unique-id=' + id + ']').addClass('rted') $('.rt_' + id).addClass('light-blue-text') } } } } function boostWith(vis) { var id = $('#tootmodal').attr('data-id') var acct_id = $('#tootmodal').attr('data-acct') rt(id, acct_id, false, vis) } //ブックマーク function bkm(id, acct_id, tlid) { if ($('#pub_' + id).hasClass('bkmed')) { var flag = 'unbookmark' } else { var flag = 'bookmark' } var domain = localStorage.getItem('domain_' + acct_id) var at = localStorage.getItem('acct_' + acct_id + '_at') var start = 'https://' + domain + '/api/v1/statuses/' + id + '/' + flag var httpreq = new XMLHttpRequest() httpreq.open('POST', start, true) httpreq.setRequestHeader('Content-Type', 'application/json') httpreq.setRequestHeader('Authorization', 'Bearer ' + at) httpreq.responseType = 'json' httpreq.send() httpreq.onreadystatechange = function() { if (httpreq.readyState === 4) { var json = httpreq.response if (this.status !== 200) { setLog(start, this.status, json) } if (json.reblog) { json = json.reblog } var fav = json.favourites_count $('[toot-id=' + id + '] .fav_ct').text(fav) $('[toot-id=' + id + '] .rt_ct').text(json.reblogs_count) if (flag == 'unbookmark') { $('.bkmStr_' + id).text(lang.lang_parse_bookmark) $('.bkm_' + id).removeClass('red-text') $('[toot-id=' + id + ']').removeClass('bkmed') } else { $('.bkmStr_' + id).text(lang.lang_parse_unbookmark) $('.bkm_' + id).addClass('red-text') $('[toot-id=' + id + ']').addClass('bkmed') } var tlidTar = $(`.bookmark-timeline[data-acct=${acct_id}]`).attr('tlid') columnReload(tlidTar, 'bookmark') } } } //フォロー async function follow(acct_id, resolve) { if (!acct_id && acct_id != 'selector') { var acct_id = $('#his-data').attr('use-acct') } else if (acct_id == 'selector') { var acct_id = $('#user-acct-sel').val() } if (!resolve && $('#his-data').hasClass('following')) { var flag = 'unfollow' var flagm = 'delete' } else { var flag = 'follow' var flagm = 'create' } var id = $('#his-data').attr('user-id') if (resolve == 'selector') { var fullacct = $('#his-acct').attr('fullname') var id = await acctResolve(acct_id, fullacct) console.log(id) } var domain = localStorage.getItem('domain_' + acct_id) var at = localStorage.getItem('acct_' + acct_id + '_at') var start = 'https://' + domain + '/api/v1/accounts/' + id + '/' + flag if (localStorage.getItem('mode_' + domain) == 'misskey') { var start = 'https://' + domain + '/api/following/' + flagm var ent = { i: at, userId: id } } else if (flag == 'follow') { var ent = {} } var httpreq = new XMLHttpRequest() httpreq.open('POST', start, true) httpreq.setRequestHeader('Content-Type', 'application/json') httpreq.setRequestHeader('Authorization', 'Bearer ' + at) httpreq.responseType = 'json' httpreq.send(JSON.stringify(ent)) httpreq.onreadystatechange = function() { if (httpreq.readyState === 4) { var json = httpreq.response if (this.status !== 200) { setLog(start, this.status, json) } console.log(['Success: folllow', json]) if ($('#his-data').hasClass('following')) { $('#his-data').removeClass('following') $('#his-follow-btn-text').text(lang.lang_status_follow) } else { $('#his-data').addClass('following') $('#his-follow-btn-text').text(lang.lang_status_unfollow) } } } } async function acctResolve(acct_id, user) { console.log('Get user data of ' + user) 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/v2/search?resolve=true&q=' + user let promise = await fetch(start, { method: 'GET', headers: { 'content-type': 'application/json', Authorization: 'Bearer ' + at } }) var idJson = await promise.json() if (idJson.accounts[0]) { var id = idJson.accounts[0].id } else { M.toast({ html: lang.lang_fatalerroroccured, displayLength: 2000 }) } return id } //ブロック function block(acct_id) { if ($('#his-data').hasClass('blocking')) { var flag = 'unblock' var txt = lang.lang_status_unmute } else { var flag = 'block' var txt = lang.lang_status_block } Swal.fire({ title: txt, text: '', type: 'warning', showCancelButton: true, confirmButtonColor: '#3085d6', cancelButtonColor: '#d33', confirmButtonText: lang.lang_yesno, cancelButtonText: lang.lang_no }).then(result => { if (result.value) { if (!acct_id) { var acct_id = $('#his-data').attr('use-acct') } var id = $('#his-data').attr('user-id') var domain = localStorage.getItem('domain_' + acct_id) var at = localStorage.getItem('acct_' + acct_id + '_at') var start = 'https://' + domain + '/api/v1/accounts/' + id + '/' + flag var httpreq = new XMLHttpRequest() httpreq.open('POST', start, true) httpreq.setRequestHeader('Content-Type', 'application/json') httpreq.setRequestHeader('Authorization', 'Bearer ' + at) httpreq.responseType = 'json' httpreq.send() httpreq.onreadystatechange = function() { if (httpreq.readyState === 4) { if (this.status !== 200) { setLog(start, this.status, this.response) } if ($('#his-data').hasClass('blocking')) { $('#his-data').removeClass('blocking') $('#his-block-btn-text').text(lang.lang_status_block) } else { $('#his-data').addClass('blocking') $('#his-block-btn-text').text(lang.lang_status_unblock) } } } } }) } //ミュート function muteDo(acct_id) { if ($('#his-data').hasClass('muting')) { var flag = 'unmute' var flagm = 'delete' var txt = lang.lang_status_unmute } else { var flag = 'mute' var flagm = 'create' var txt = lang.lang_status_mute } Swal.fire({ title: txt, text: '', type: 'warning', showCancelButton: true, confirmButtonColor: '#3085d6', cancelButtonColor: '#d33', confirmButtonText: lang.lang_yesno, cancelButtonText: lang.lang_no }).then(result => { if (result.value) { if (!acct_id) { var acct_id = $('#his-data').attr('use-acct') } var id = $('#his-data').attr('user-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/mute/' + flagm var ent = { i: at, userId: id } var rq = JSON.stringify(ent) } else { var start = 'https://' + domain + '/api/v1/accounts/' + id + '/' + flag var rq = '' } var httpreq = new XMLHttpRequest() httpreq.open('POST', start, true) httpreq.setRequestHeader('Content-Type', 'application/json') httpreq.setRequestHeader('Authorization', 'Bearer ' + at) httpreq.responseType = 'json' httpreq.send(rq) httpreq.onreadystatechange = function() { if (httpreq.readyState === 4) { if (this.status !== 200) { setLog(start, this.status, this.response) } if ($('#his-data').hasClass('muting')) { $('#his-data').removeClass('muting') $('#his-mute-btn-text').text(lang.lang_status_mute) } else { $('#his-data').addClass('muting') $('#his-mute-btn-text').text(lang.lang_status_unmute) } } } } }) } //投稿削除 function del(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/delete' var httpreq = new XMLHttpRequest() httpreq.open('POST', start, true) httpreq.setRequestHeader('Content-Type', 'application/json') httpreq.responseType = 'json' httpreq.send(JSON.stringify({ i: at, noteId: id })) $('[toot-id=' + id + ']').hide() $('[toot-id=' + id + ']').remove() } else { var start = 'https://' + domain + '/api/v1/statuses/' + id var httpreq = new XMLHttpRequest() httpreq.open('DELETE', start, true) httpreq.setRequestHeader('Content-Type', 'application/json') httpreq.setRequestHeader('Authorization', 'Bearer ' + at) httpreq.responseType = 'json' httpreq.send() } httpreq.onreadystatechange = function() { if (httpreq.readyState === 4) { if (this.status !== 200) { setLog(start, this.status, this.response) } } } } //redraft function redraft(id, acct_id) { Swal.fire({ title: lang.lang_status_redraftTitle, text: lang.lang_status_redraft, type: 'warning', showCancelButton: true, confirmButtonColor: '#3085d6', cancelButtonColor: '#d33', confirmButtonText: lang.lang_yesno, cancelButtonText: lang.lang_no }).then(result => { if (result.value) { show() 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/delete' var httpreq = new XMLHttpRequest() httpreq.open('POST', start, true) httpreq.setRequestHeader('Content-Type', 'application/json') httpreq.responseType = 'json' httpreq.send(JSON.stringify({ i: at, noteId: id })) $('[toot-id=' + id + ']').hide() $('[toot-id=' + id + ']').remove() } else { var start = 'https://' + domain + '/api/v1/statuses/' + id var httpreq = new XMLHttpRequest() httpreq.open('DELETE', start, true) httpreq.setRequestHeader('Content-Type', 'application/json') httpreq.setRequestHeader('Authorization', 'Bearer ' + at) httpreq.responseType = 'json' httpreq.send() } httpreq.onreadystatechange = function() { if (httpreq.readyState === 4) { if (this.status !== 200) { setLog(start, this.status, this.response) } var json = httpreq.response $('#post-acct-sel').prop('disabled', true) $('#post-acct-sel').val(acct_id) $('select').formSelect() mdCheck() var medias = $('[toot-id=' + id + ']').attr('data-medias') var vismode = $('[toot-id=' + id + '] .vis-data').attr('data-vis') vis(vismode) $('#media').val(medias) var ct = medias.split(',').length $('[toot-id=' + id + '] img.toot-img').each(function(i, elem) { if (i < ct) { var url = $(elem).attr('src') console.log('Play back image data:' + url) $('#preview').append('') } }) localStorage.setItem('nohide', true) show() if(json.text){ var html = json.text } else { var html = $('[toot-id=' + id + '] .toot').html() html = html.replace(/^
(.+)<\/p>$/, '$1')
html = html.replace(/
/, '\n')
html = html.replace(/
/, '\n') html = html.replace(/<\/p>/, '\n') html = html.replace(//g, '$1') html = $.strip_tags(html) } $('#textarea').val(html) if (json.spoiler_text) { cw() $('#cw-text').val(json.spoiler_text) } if (json.sensitive){ $('#nsfw').addClass('yellow-text') $('#nsfw').html('visibility') $('#nsfw').addClass('nsfw-avail') } if(json.in_reply_to_id){ $('#reply').val(json.in_reply_to_id) } } } } }) } //ピン留め function pin(id, acct_id) { if ($('#pub_' + id).hasClass('pined')) { var flag = 'unpin' } else { var flag = 'pin' } var domain = localStorage.getItem('domain_' + acct_id) var at = localStorage.getItem('acct_' + acct_id + '_at') var start = 'https://' + domain + '/api/v1/statuses/' + id + '/' + flag var httpreq = new XMLHttpRequest() httpreq.open('POST', start, true) httpreq.setRequestHeader('Content-Type', 'application/json') httpreq.setRequestHeader('Authorization', 'Bearer ' + at) httpreq.responseType = 'json' httpreq.send() httpreq.onreadystatechange = function() { if (httpreq.readyState === 4) { var json = httpreq.response if (this.status !== 200) { setLog(start, this.status, this.response) } console.log(['Success: pinned', json]) if (flag == 'unpin') { $('[toot-id=' + id + ']').removeClass('pined') $('.pin_' + id).removeClass('blue-text') $('.pinStr_' + id).text(lang.lang_parse_pin) } else { $('[toot-id=' + id + ']').addClass('pined') $('.pin_' + id).addClass('blue-text') $('.pinStr_' + id).text(lang.lang_parse_unpin) } } } } //フォロリク function request(id, flag, acct_id) { var domain = localStorage.getItem('domain_' + acct_id) var at = localStorage.getItem('acct_' + acct_id + '_at') var start = 'https://' + domain + '/api/v1/follow_requests/' + id + '/' + flag var httpreq = new XMLHttpRequest() httpreq.open('POST', start, true) httpreq.setRequestHeader('Content-Type', 'application/json') httpreq.setRequestHeader('Authorization', 'Bearer ' + at) httpreq.responseType = 'json' httpreq.send() httpreq.onreadystatechange = function() { if (httpreq.readyState === 4) { var json = httpreq.response if (this.status !== 200) { setLog(start, this.status, this.response) } console.log(['Success: request', 'type:' + flag, json]) showReq() } } } //ドメインブロック(未実装) function domainblock(add, flag, acct_id) { if (!acct_id) { var acct_id = $('#his-data').attr('use-acct') } var domain = localStorage.getItem('domain_' + acct_id) var at = localStorage.getItem('acct_' + acct_id + '_at') var start = 'https://' + domain + '/api/v1/domain_blocks' var httpreq = new XMLHttpRequest() httpreq.open('POST', start, true) httpreq.setRequestHeader('Content-Type', 'application/json') httpreq.setRequestHeader('Authorization', 'Bearer ' + at) httpreq.responseType = 'json' httpreq.send() httpreq.onreadystatechange = function() { if (httpreq.readyState === 4) { var json = httpreq.response if (this.status !== 200) { setLog(start, this.status, this.response) } console.log(['Success: domain block', json]) showDom() } } } function addDomainblock() { var domain = $('#domainblock').val() domainblock(domain, 'POST') } //ユーザー強調 function empUser() { var usr = localStorage.getItem('user_emp') var obj = JSON.parse(usr) var id = $('#his-acct').attr('fullname') if (!obj) { var obj = [] obj.push(id) M.toast({ html: id + lang.lang_status_emphas, displayLength: 4000 }) } else { var can Object.keys(obj).forEach(function(key) { var usT = obj[key] if (usT != id && !can) { can = false } else { can = true obj.splice(key, 1) M.toast({ html: id + lang.lang_status_unemphas, displayLength: 4000 }) } }) } var json = JSON.stringify(obj) localStorage.setItem('user_emp', json) } //Endorse function pinUser() { var id = $('#his-data').attr('user-id') var acct_id = $('#his-data').attr('use-acct') if ($('#his-end-btn').hasClass('endorsed')) { var flag = 'unpin' } else { var flag = 'pin' } var domain = localStorage.getItem('domain_' + acct_id) var at = localStorage.getItem('acct_' + acct_id + '_at') var start = 'https://' + domain + '/api/v1/accounts/' + id + '/' + flag var httpreq = new XMLHttpRequest() httpreq.open('POST', start, true) httpreq.setRequestHeader('Content-Type', 'application/json') httpreq.setRequestHeader('Authorization', 'Bearer ' + at) httpreq.responseType = 'json' httpreq.send() httpreq.onreadystatechange = function() { if (httpreq.readyState === 4) { var json = httpreq.response if (this.status !== 200) { setLog(start, this.status, this.response) } if ($('#his-end-btn').hasClass('endorsed')) { $('#his-end-btn').removeClass('endorsed') $('#his-end-btn').text(lang.lang_status_endorse) } else { $('#his-end-btn').addClass('endorsed') $('#his-end-btn').text(lang.lang_status_unendorse) } } } } //URLコピー function tootUriCopy(url) { execCopy(url) M.toast({ html: lang.lang_details_url, displayLength: 1500 }) } //他のアカウントで… function staEx(mode) { var url = $('#tootmodal').attr('data-url') var acct_id = $('#status-acct-sel').val() var domain = localStorage.getItem('domain_' + acct_id) var at = localStorage.getItem('acct_' + acct_id + '_at') var start = 'https://' + domain + '/api/v2/search?resolve=true&q=' + url 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 id = json.statuses[0].id if (mode == 'rt') { rt(id, acct_id, 'remote') } else if (mode == 'fav') { fav(id, acct_id, 'remote') } else if (mode == 'reply') { reEx(id) } }) return } function toggleAction(elem, height) { var cont = elem.parents('.cvo').find('.contextMenu') if (cont.hasClass('hide')) { $('#contextWrap').removeClass('hide') var left = elem.offset().left + 60 var top = elem.offset().top - height if (top < 75) { top = elem.offset().top + 45 cont.removeClass('bottom') cont.addClass('top') } else { cont.removeClass('top') cont.addClass('bottom') } if (elem.parents('.cvo').attr('id') == 'toot-this') { console.log($('#toot-this').offset().top, elem.offset().top) left = $('#toot-this').offset().left + elem.offset().left + 10 top = $('#toot-this').offset().top - $('#toot-this').height() - height + 25 } cont.css('top', top + 'px') cont.css('right', `calc(100vw - ${left}px)`) cont.removeClass('hide') elem .parents('.cvo') .find('.act-icon') .text('expand_less') } else { $('#contextWrap').addClass('hide') $('.contextMenu').addClass('hide') $('.act-icon').text('expand_more') } }