//通知 //取得+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"); 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; //トゥートである if (toot) { if (!toot.application) { var via = "Unknown"; } else { var via = toot.application.name; } 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; if (popup >= 0 && obj.length < 5) { Materialize.toast(noticetext, popup * 1000); $(".notf-icon_" + tlid).addClass("red-text"); notftext=""; } if (toot.spoiler_text && cw) { var spoiler = "cw cw_hide_" + toot.id; var spoiler_show = '見る'; } else { var spoiler = ""; var spoiler_show = ""; } 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 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 = ""; } templete = templete + '
' + '' + noticetext + '
' + date(eachobj.created_at, datetype) + '
' + '
' + '
' + '
' + '
' + toot.account.display_name + '
' + '
@' + toot.account.acct + locked + '
' + '
' + '' + content + '' + toot.spoiler_text + spoiler_show + '' + '' + viewer + '' + '
' + date(toot.created_at, datetype) + '' + 'via ' + via + '' + mentions + tags + '
' + '
返信
' + '
' + toot.reblogs_count + 'ブースト
' + '
' + toot.favourites_count + 'お気に入り
' + '' + '
more_vert詳細表示
' + '
' + '
' + '
' + ''; } else if (eachobj.type == "follow") { //フォロー等のユーザーデータである var tooter = eachobj.account; if (tooter.locked) { var locked = ' '; } else { var locked = ""; } templete = templete + '
' + '
' + '
' + '
' + '
' + tooter.display_name + '
にフォローされました
' + '
@' + tooter.acct + locked + '
' + '
' + '
Follows:' + tooter.following_count + '
Followers:' + tooter.followers_count + '
' + '
' + '
' + '
'; var noticetext = eachobj.account.display_name + "(" + eachobj.account.acct + ")がフォローしました"; if (popup >= 0 && obj.length < 5) { Materialize.toast(noticetext, popup * 1000); $(".notf-icon").addClass("red-text"); } } }); if (!noticetext) { var noticetext = null; } return [templete, noticetext]; }