//検索 //検索ボックストグル function searchMenu() { $('#src-contents').html('') trend() $('#left-menu div').removeClass('active') $('#searchMenu').addClass('active') $('.menu-content').addClass('hide') $('#src-box').removeClass('hide') //$('ul.tabs').tabs('select_tab', 'src-sta'); } //検索取得 function src(mode, offset) { if (!offset) { $('#src-contents').html('') var add = '' } else { var add = '&type=accounts&offset=' + $('#src-accts .cvo').length } var q = $('#src').val() var acct_id = $('#src-acct-sel').val() if (acct_id == 'tootsearch') { tsAdd(q) return false } localStorage.setItem('last-use', acct_id) var domain = localStorage.getItem('domain_' + acct_id) var at = localStorage.getItem('acct_' + acct_id + '_at') var m = q.match(/^#(.+)$/) if (m) { q = m[1] } if (user == '--now') { var user = $('#his-data').attr('user-id') } if (!mode) { var start = 'https://' + domain + '/api/v2/search?q=' + q + add } else { var start = 'https://' + domain + '/api/v1/search?q=' + q } console.log('Try to search at ' + start) 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) { src('v1') return false }) .then(function(json) { console.log(['Search', json]) //ハッシュタグ if (json.hashtags[0]) { var tags = '' Object.keys(json.hashtags).forEach(function(key4) { var tag = json.hashtags[key4] if (mode) { tags = tags + `<a onclick="tl('tag','${tag}','${acct_id}','add')" class="pointer"> #${escapeHTML(tag)} </a> <br> ` } else { tags = tags + graphDraw(tag, acct_id) } }) $('#src-contents').append('Tags<br>' + tags) } //トゥート if (json.statuses[0]) { var templete = parse(json.statuses, '', acct_id) $('#src-contents').append('<br>Mentions<br>' + templete) } //アカウント if (json.accounts[0]) { var templete = userparse(json.accounts, '', acct_id) if (!offset) { $('#src-contents').append( `<br>Accounts<div id="src-accts"> ${templete} </div><a onclick="src(false,'more')" class="pointer">more...</a>` ) } else { $('#src-accts').append(templete) } } jQuery('time.timeago').timeago() }) } function tsAdd(q) { var add = { domain: acct_id, type: 'tootsearch', data: q } var multi = localStorage.getItem('column') var obj = JSON.parse(multi) localStorage.setItem('card_' + obj.length, 'true') obj.push(add) var json = JSON.stringify(obj) localStorage.setItem('column', json) parseColumn('add') } function tootsearch(tlid, q) { var start = 'https://tootsearch.chotto.moe/api/v1/search?from=0&sort=created_at%3Adesc&q=' + q console.log('Toot srrach at ' + start) $('#notice_' + tlid).text('tootsearch(' + q + ')') $('#notice_icon_' + tlid).text('search') fetch(start, { method: 'GET', headers: { 'content-type': 'application/json' } }) .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(raw) { var templete = '' var json = raw.hits.hits var max_id = raw['hits'].length for (var i = 0; i < json.length; i++) { var toot = json[i]['_source'] if (lastid != toot.uri) { if (toot && toot.account) { templete = templete + parse([toot], 'noauth', null, tlid, 0, [], 'tootsearch') } } var lastid = toot.uri } if (!templete) { templete = lang.lang_details_nodata } else { templete = templete + `<div class="hide ts-marker" data-maxid="${max_id}"></div>` } $('#timeline_' + tlid).html(templete) jQuery('time.timeago').timeago() }) } function moreTs(tlid, q) { var sid = $('#timeline_' + tlid + ' .ts-marker') .last() .attr('data-maxid') moreloading = true var start = 'https://tootsearch.chotto.moe/api/v1/search?from=' + sid + '&sort=created_at%3Adesc&q=' + q $('#notice_' + tlid).text('tootsearch(' + q + ')') $('#notice_icon_' + tlid).text('search') fetch(start, { method: 'GET', headers: { 'content-type': 'application/json' } }) .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(raw) { var templete = '' var json = raw.hits.hits var max_id = raw['hits'].length for (var i = 0; i < json.length; i++) { var toot = json[i]['_source'] if (lastid != toot.uri) { if (toot && toot.account) { templete = templete + parse([toot], 'noauth', null, tlid, 0, [], 'tootsearch') } } var lastid = toot.uri } if (!templete) { templete = lang.lang_details_nodata } else { templete = templete + `<div class="hide ts-marker" data-maxid="${max_id}"></div>` } $('#timeline_' + tlid).append(templete) jQuery('time.timeago').timeago() }) } function graphDraw(tag, acct_id) { var tags = '' var his = tag.history var max = Math.max.apply(null, [ his[0].uses, his[1].uses, his[2].uses, his[3].uses, his[4].uses, his[5].uses, his[6].uses ]) var six = 50 - (his[6].uses / max) * 50 var five = 50 - (his[5].uses / max) * 50 var four = 50 - (his[4].uses / max) * 50 var three = 50 - (his[3].uses / max) * 50 var two = 50 - (his[2].uses / max) * 50 var one = 50 - (his[1].uses / max) * 50 var zero = 50 - (his[0].uses / max) * 50 if (max === 0) { tags = `<br><br><svg version="1.1" viewbox="0 0 60 50" width="60" height="50"></svg> <span style="font-size:200%">${his[0].uses}</span> toot(s) <a onclick=\"tl('tag','${escapeHTML(tag.name)}','${acct_id}','add')" class="pointer"> #${escapeHTML(tag.name)} </a> ` + his[0].accounts + lang.lang_src_people } else { tags = `<br><br> <svg version="1.1" viewbox="0 0 60 50" width="60" height="50"> <g> <path d="M0,${six} L10,${five} 20,${four} 30,${three} 40,${two} 50,${one} 60,${zero}" style="stroke: #0f8c0c;fill: rgba(13,113,19,.25); stroke-width: 1;"> </path> </g> </svg> <span style="font-size:200%">${his[0].uses}</span> toot <a onclick="tl('tag','${escapeHTML(tag.name)}','${acct_id}','add')" class="pointer"> #${escapeHTML(tag.name)} </a> ` + his[0].accounts + lang.lang_src_people } return tags } /* <svg version="1.1" viewbox="0 0 50 300" width="100%" height="50"> <path d="M0,0 L10,0 20,10 20,50" fill="#3F51B5"></path> </svg> */ function trend() { console.log('get trend') $('#src-contents').html('') var acct_id = $('#src-acct-sel').val() if (acct_id == 'tootsearch') { return false } var domain = localStorage.getItem('domain_' + acct_id) var at = localStorage.getItem('acct_' + acct_id + '_at') var start = 'https://' + domain + '/api/v1/trends' console.log(start) 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) { setLog(start, 'JSON', error) console.error(error) }) .then(function(json) { var tags = '' Object.keys(json).forEach(function(keye) { var tag = json[keye] var his = tag.history var max = Math.max.apply(null, [ his[0].uses, his[1].uses, his[2].uses, his[3].uses, his[4].uses, his[5].uses, his[6].uses ]) var six = 50 - (his[6].uses / max) * 50 var five = 50 - (his[5].uses / max) * 50 var four = 50 - (his[4].uses / max) * 50 var three = 50 - (his[3].uses / max) * 50 var two = 50 - (his[2].uses / max) * 50 var one = 50 - (his[1].uses / max) * 50 var zero = 50 - (his[0].uses / max) * 50 tags = `<svg version="1.1" viewbox="0 0 60 50" width="60" height="50"> <g> <path d="M0,${six} L10,${five} 20,${four} 30,${three} 40,${two} 50,${one} 60,${zero}" style="stroke: #0f8c0c;fill: rgba(13,113,19,.25); stroke-width: 1;"> </path> </g> </svg> <span style="font-size:200%">${his[0].uses}</span> toot <a onclick="tl('tag','${escapeHTML(tag.name)}','${acct_id}','add')" class="pointer"> #${escapeHTML(tag.name)} </a> ` + his[0].accounts + lang.lang_src_people + '<br><br>' $('#src-contents').append(tags) }) }) }