//通知 //取得+Streaming接続 function notf(acct_id, tlid, sys) { todo("Notifications Loading..."); var domain = localStorage.getItem("domain_" + acct_id); var at = localStorage.getItem(domain + "_at"); var start = "https://" + domain + "/api/v1/notifications"; fetch(start, { method: 'GET', headers: { 'content-type': 'application/json', 'Authorization': 'Bearer ' + at }, //body: JSON.stringify({}) }).then(function(response) { return response.json(); }).catch(function(error) { todo(error); console.error(error); }).then(function(json) { var templete = parseNotf(json, -1, tlid, acct_id); if (sys == "direct") { $("#timeline_" + tlid).html(templete[0]); } else { $("#notifications_" + tlid).html(templete[0]); } jQuery("time.timeago").timeago(); $("#notf-box").addClass("fetched"); todc(); }); var start = "wss://" + domain + "/api/v1/streaming/?stream=user&access_token=" + at; console.log(start); var wsid = websocketNotf.length; websocketNotf[wsid] = new WebSocket(start); console.log(websocketNotf); websocketNotf[wsid].onopen = function(mess) { console.log("Connect Streaming API:"); console.log(mess); } websocketNotf[wsid].onmessage = function(mess) { console.log("Receive Streaming API:"); var obj = JSON.parse(JSON.parse(mess.data).payload); console.log(obj); var type = JSON.parse(mess.data).event; if (type == "notification") { var popup = localStorage.getItem("popup"); if (!popup) { popup = 0; } var templete = parseNotf([obj], popup, tlid, acct_id); var notices = templete[1]; console.log(templete); if (sys == "direct") { $("#timeline_" + tlid).prepend(templete[0]); } else { $("#notifications_" + tlid).prepend(templete[0]); } jQuery("time.timeago").timeago(); } } websocketNotf[wsid].onerror = function(error) { console.error('WebSocket Error ' + error); }; } //通知トグルボタン function notfToggle(acct, tlid) { $("#notf-box_" + tlid).toggleClass("hide"); if (!$("#notf-box_" + tlid).hasClass("fetched")) { notf(acct, tlid); } $(".notf-icon_" + tlid).removeClass("red-text"); } //通知オブジェクトパーサー function parseNotf(obj, popup, tlid, acct_id) { var templete = ''; var datetype = localStorage.getItem("datetype"); var nsfwtype = localStorage.getItem("nsfw"); var gif = localStorage.getItem("gif"); if (!gif) { var gif = "yes"; } if (!nsfwtype || nsfwtype == "yes") { var nsfw = "ok"; } else { var nsfw; } var cwtype = localStorage.getItem("cw"); if (!cwtype || cwtype == "yes") { var cw = "ok"; } else { var cw; } if (!datetype) { datetype = "absolute"; } Object.keys(obj).forEach(function(key) { var eachobj = obj[key]; var toot = eachobj.status; //トゥートである var type = eachobj.type; if (toot) { if (!toot.application) { var via = 'Unknown'; } else { var via = toot.application.name; } var sent = localStorage.getItem("sentence"); if (!sent) { var sent = 500; } if (toot.spoiler_text && cw) { var content = toot.content; var spoil = toot.spoiler_text; var spoiler = "cw cw_hide_" + toot.id; var api_spoil = "gray"; var spoiler_show = '見る'; } else { var ct = toot.content.split('

').length + toot.content.split('
') .length - 2; if (sent < ct && $.mb_strlen(toot.content) > 5) { var content = '以下全文
' + toot.content var spoil = '' + $.strip_tags($.mb_substr( toot.content, 0, 100)) + '自動折りたたみ'; var spoiler = "cw cw_hide_" + toot.id; var spoiler_show = '続き…'; } else { var content = toot.content; var spoil = toot.spoiler_text; var spoiler = ""; var spoiler_show = ""; } } if (toot.account.locked) { var locked = ' '; } else { var locked = ""; } var id = toot.id; if (eachobj.type == "mention") { var what = "返信しました"; } else if (eachobj.type == "reblog") { var what = "ブーストしました"; } else if (eachobj.type == "favourite") { var what = "お気に入り登録しました"; } var noticetext = '' + eachobj.account.display_name + "(" + eachobj.account.acct + ")が" + what; var memory = localStorage.getItem("notice-mem"); if (popup >= 0 && obj.length < 5 && noticetext != memory) { Materialize.toast(noticetext, popup * 1000); $(".notf-icon_" + tlid).addClass("red-text"); localStorage.setItem("notice-mem", noticetext); notftext = ""; } if (toot.spoiler_text && cw) { var spoiler = "cw cw_hide_" + toot.id; var spoiler_show = '見る'; } else { var spoiler = ""; var spoiler_show = ""; } var urls = content.match( /https?:\/\/([-a-zA-Z0-9@.]+)\/?([-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)?/ ); if (urls) { var analyze = 'URL解析'; } else { var analyze = ''; } var viewer = ""; var youtube = ""; var emojick = toot.emojis[0]; //絵文字があれば var content = toot.content if (emojick) { Object.keys(toot.emojis).forEach(function(key5) { var emoji = toot.emojis[key5]; var shortcode = emoji.shortcode; var emoji_url = ''; var regExp = new RegExp(":" + shortcode + ":", "g"); content = content.replace(regExp, emoji_url); }); } var mediack = toot.media_attachments[0]; //メディアがあれば if (mediack) { var cwdt = 100 / toot.media_attachments.length Object.keys(toot.media_attachments).forEach(function(key2) { var media = toot.media_attachments[key2]; var purl = media.preview_url; var url = media.url; if (toot.sensitive && nsfw) { var sense = "sensitive" } else { var sense = "" } viewer = viewer + ''; }); } else { viewer = ""; } //公開範囲を取得 var vis = ""; var visen = toot.visibility; if (visen == "public") { var vis = 'public'; } else if (visen == "unlisted") { var vis = 'lock_open'; } else if (visen == "plivate") { var vis = 'lock'; } else if (visen == "direct") { var vis = 'mail'; } var menck = toot.mentions[0]; var mentions = ""; if (menck) { mentions = "Links: "; Object.keys(toot.mentions).forEach(function(key3) { var mention = toot.mentions[key3]; mentions = mentions + '@' + mention.acct + ' '; }); } var tagck = toot.tags[0]; var tags = ""; if (tagck) { if (!menck) { tags = "Links: "; } Object.keys(toot.tags).forEach(function(key4) { var tag = toot.tags[key4]; tags = tags + '#' + tag.name + ' '; }); } if (toot.favourited) { var if_fav = " yellow-text"; var fav_app = "faved"; } else { var if_fav = ""; var fav_app = ""; } if (toot.reblogged) { var if_rt = "teal-text"; var rt_app = "rted"; } else { var if_rt = ""; var rt_app = ""; } if (toot.account.acct == localStorage.getItem("user_" + acct_id)) { var if_mine = ""; } else { var if_mine = "hide"; } if (toot.favourited) { var if_fav = " yellow-text"; var fav_app = "faved"; } else { var if_fav = ""; var fav_app = ""; } if (toot.reblogged) { var if_rt = "teal-text"; var rt_app = "rted"; } else { var if_rt = ""; var rt_app = ""; } var boostback = ""; var hasmedia = ""; var home = ""; //アニメ再生 if (gif == "yes") { var avatar = toot.account.avatar; } else { var avatar = toot.account.avatar_static; } var divider = '
'; var notice = noticetext; templete = templete + '
' + '
' + date(eachobj.created_at, datetype) + '' + notice + home + '
' + '
' + '
' + '
' + toot.account.display_name + ' @' + toot.account.acct + locked + '
' + '
' + date(toot.created_at, datetype) + '
' + '
' + content + '' + spoil + spoiler_show + '' + '' + viewer + '' + '
' + analyze + '' + '' + mentions + tags + '
' + '
' + '
' + vis + '
' + '' + '' + '
' + '' + '
' + '
via ' + via + '
' + '' + divider; } else { templete = templete + userparse([eachobj.account],"","true"); var noticetext = eachobj.account.display_name + "(" + eachobj.account.acct + ")がフォローしました"; var memory = localStorage.getItem("notice-mem"); if (popup >= 0 && obj.length < 5 && noticetext != memory) { Materialize.toast(noticetext, popup * 1000); $(".notf-icon_" + tlid).addClass("red-text"); localStorage.setItem("notice-mem", noticetext); notftext = ""; } } }); if (!noticetext) { var noticetext = null; } return [templete, noticetext]; }