//トゥートの詳細 function details(id, acct_id, tlid, mode) { if (mode == "dm") { $(".dm-hide").hide(); } else { $(".dm-hide").show(); } $(".toot-reset").html('' + lang.lang_details_nodata + ''); 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 }, } } fetch(start, i).then(function (response) { return response.json(); }).catch(function (error) { todo(error); console.error(error); }).then(function (json) { console.log(["Toot data:", json]); if (!$("#timeline_" + tlid + " #pub_" + id).length) { var html = parse([json], '', acct_id); $("#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); if (local) { $("#tootmodal").attr("data-user", scn + "@" + domain); } else { $("#tootmodal").attr("data-user", scn); } context(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 ($("#toot-this div").hasClass("cvo")) { $("#toot-this").removeClass("cvo"); } else { $("#toot-this").addClass("cvo"); } if (!$("#activator").hasClass("active")) { $('#det-col').collapsible('open', 4); } }); } //返信タイムライン 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 { var start = "https://" + domain + "/api/v1/statuses/" + id; var i = { method: 'GET', headers: { 'content-type': 'application/json', 'Authorization': 'Bearer ' + at }, } } fetch(start, i).then(function (response) { return response.json(); }).catch(function (error) { todo(error); console.error(error); }).then(function (json) { if (localStorage.getItem("filter_" + acct_id) != "undefined") { var mute = getFilterType(JSON.parse(localStorage.getItem("filter_" + acct_id)), "thread"); } else { var mute = []; } 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); } } else { var templete = parse([json], '', acct_id, "", "", mute); if (templete != "") { $("#toot-reply .no-data").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(); var rep = "in_reply_to_id"; if (json[rep]) { replyTL(json[rep], acct_id); } } }); } //コンテクストってなんですか function context(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) { return response.json(); }).catch(function (error) { todo(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 { if (localStorage.getItem("filter_" + acct_id) != "undefined") { var mute = getFilterType(JSON.parse(localStorage.getItem("filter_" + acct_id)), "thread"); } else { var mute = []; } var templete = parse(json.descendants, '', acct_id, "", "", mute); if (templete != "") { $("#toot-after .no-data").hide(); } $("#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"); 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) { return response.json(); }).catch(function (error) { todo(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) { return response.json(); }).catch(function (error) { todo(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) { return response.json(); }).catch(function (error) { todo(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) { return response.json(); }).catch(function (error) { todo(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) { return response.json(); }).catch(function (error) { todo(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) { return response.json(); }).catch(function (error) { todo(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) { return response.json(); }).catch(function (error) { todo(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) { return response.json(); }).catch(function (error) { todo(error); console.error(error); }).then(function (json) { var templete = userparse(json, '', acct_id); if (templete != "") { $("#toot-fav .no-data").hide(); } $("#toot-fav").html(templete); }); } //ブースト一覧 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) { return response.json(); }).catch(function (error) { todo(error); console.error(error); }).then(function (json) { var templete = userparse(json, '', acct_id); $("#toot-rt").html(templete); }); } //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 = ''; 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>$/, "$1"); html = html.replace(//, "\n"); html = html.replace(/

/, "\n"); html = html.replace(/<\/p>/, "\n"); console.log("Copy it:\n" + html); html = html.replace(//g, "$1"); html = $.strip_tags(html); if (execCopy(html)) { M.toast({ html: lang.lang_details_txt, displayLength: 1500 }) } } //翻訳 function trans(tar, to) { var html = $("#toot-this .toot").html(); if (html.match(/^

(.+)<\/p>$/)) { html = html.match(/^

(.+)<\/p>$/)[1]; } html = html.replace(//g, "\n"); html = html.replace(/

/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) { return response.json(); }).catch(function (error) { todo(error); console.error(error); }).then(function (text) { $("#toot-this .additional").html('' + text.text + ''); }); } //ブラウザで開く function brws() { var url = $("#tootmodal").attr("data-url"); postMessage(["openUrl", url], "*") } //外部からトゥート開く function detEx(url, acct_id) { if (acct_id == "main") { acct_id = localStorage.getItem("main"); } var domain = localStorage.getItem("domain_" + acct_id); var at = localStorage.getItem("acct_" + acct_id + "_at"); var start = "https://" + domain + "/api/v1/search?resolve=true&q=" + url fetch(start, { method: 'GET', headers: { 'content-type': 'application/json', 'Authorization': 'Bearer ' + at } }).then(function (response) { return response.json(); }).catch(function (error) { todo(error); console.error(error); }).then(function (json) { 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; }