function announParse(obj, acct_id, tlid) { var template = '' var datetype = localStorage.getItem('datetype') var gif = localStorage.getItem('gif') //Ticker var tickerck = localStorage.getItem('ticker_ok') if (tickerck == 'yes') { var ticker = true } else if (!ticker || ticker == 'no') { var ticker = false } if (!datetype) { datetype = 'absolute' } if (!gif) { var gif = 'yes' } Object.keys(obj).forEach(function(key) { var toot = obj[key] var content = toot.content if (toot.emojis) { Object.keys(toot.emojis).forEach(function(key1) { var emoji = toot.emojis[key1] var shortcode = emoji.shortcode if (gif == 'yes') { var emoSource = emoji.url } else { var emoSource = emoji.static_url } var emoji_url = ` <img draggable="false" src="${emoSource}" class="emoji-img" data-emoji="${shortcode}" alt=" :${shortcode}: " title="${shortcode}" onclick="this.classList.toggle('bigemoji');"> ` var regExp = new RegExp(':' + shortcode + ':', 'g') content = content.replace(regExp, emoji_url) }) } content = twemoji.parse(content) var reactions = '' //既存のリアクション if (toot.reactions) { Object.keys(toot.reactions).forEach(function(key2) { var reaction = toot.reactions[key2] //普通の絵文字 or カスタム絵文字 は文字数判断。ただしスコットランド国旗みたいなやべぇやつに注意 var splitter = new GraphemeSplitter() if (splitter.splitGraphemes(reaction.name).length > 1) { //カスタム絵文字 var shortcode = reaction.shortcode if (gif == 'yes') { var emoSource = reaction.url } else { var emoSource = reaction.static_url } var emoji_url = ` <img draggable="false" src="${emoSource}" class="emoji-img" data-emoji="${shortcode}" alt=" :${shortcode}: " title="${shortcode}">` } else { emoji_url = twemoji.parse(reaction.name) } var addClass = '' if (reaction.me) { addClass = 'reactioned' } reactions = reactions + `<div class="announReaction ${addClass}" onclick="announReaction('${toot.id}', '${acct_id}', '${tlid}', ${reaction.me},'${reaction.name}')"> ${emoji_url} ${reaction.count} </div>` }) } if (toot.ends_at) { var ended = `<div class="announReaction" title="${date(toot.ends_at, 'absolute')}" style="width: auto; cursor: default;"> <i class="fas fa-arrow-right"></i> ${date(toot.ends_at, datetype)} </div>` } else { var ended = '' } template = template + `<div class="announcement" data-id="${toot.id}"> ${content} <div class="reactionsPack"> ${reactions} <div class="announReaction add" onclick="announReactionNew('${toot.id}', '${acct_id}', '${tlid}')"><i class="fas fa-plus"></i></div> ${ended} </div> </div>` }) return template } function announReaction(id, acct_id, tlid, del, name) { var at = localStorage.getItem('acct_' + acct_id + '_at') var domain = localStorage.getItem('domain_' + acct_id) var start = 'https://' + domain + '/api/v1/announcements/' + id + '/reactions/' + encodeURIComponent(name) var httpreq = new XMLHttpRequest() if(del) { var method = 'DELETE' } else { var method = 'PUT' } httpreq.open(method, 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) } announ(acct_id, tlid) } } } function announReactionNew(id, acct_id, tlid) { $('#reply').val(id) $('#media').val('announcement') $('#unreact').hide() $('#addreact').removeClass('hide') $('#post-acct-sel').val(acct_id) $('select').formSelect() localStorage.setItem('nohide', true) show() emojiToggle(true) $('#left-side').hide() } function emojiReactionDef(target) { var emojiraw = newpack.filter(function(item, index) { if (item.short_name == target) return true }) var hex = emojiraw[0].unified.split('-') if (hex.length === 2) { emoji = twemoji.convert.fromCodePoint(hex[0]) + twemoji.convert.fromCodePoint(hex[1]) } else { emoji = twemoji.convert.fromCodePoint(hex[0]) } var acct_id = $('#post-acct-sel').val() var id = $('#reply').val() announReaction(id, acct_id, 0, false, emoji) clear() hide() }