// ==UserScript== // @name osu!pp // @namespace http://nat.moe/ // @version 0.1 // @description show FC PP on osu info page. // @author NAT // @match https://osu.ppy.sh/* // @grant none // ==/UserScript== (function() { 'use strict'; var bmid = 0, si = document.getElementById('songinfo'); if(!si) return 0; else si = si.children[0]; try { bmid = parseInt( si.children[6].children[2].children[3].href .split('/')[4] ); } catch (e) { // whatever. } if (bmid == 0) return 0; Array.prototype.chunk = function(chunkSize) { var R = []; for (var i=0; i { return new Promise(function (resolve, reject) { var xhr = new XMLHttpRequest(); xhr.open('GET', api_url); xhr.onload = function () { if (this.status == 200) { var res = JSON.parse(xhr.response); if(res.ok) resolve(res.info); else reject({err: res.err}); } else reject({err: xhr.statusText}); }; xhr.onerror = function () { reject({err: xhr.statusText}); }; xhr.send(); }); }; var target_infos = [ {name: 'FC PP:', prop: 'pp'}, {name: 'Speed *:', prop: 'speed_stars'}, {name: 'Aim *:', prop: 'aim_stars'}, {name: 'Circles:', prop: 'num_circles'}, {name: 'Sliders:', prop: 'num_sliders'}, {name: 'Spinners:', prop: 'num_spinners'} ]; var DescTr = function(items, vals) { var tr = document.createElement('tr'); items.forEach((item) => { var td_title = document.createElement('td'); var td_val = document.createElement('td'); td_title.width = '0%'; td_val.className = "colour"; td_title.innerHTML = item.name; td_val.innerHTML = vals[item.prop]; tr.appendChild(td_title); tr.appendChild(td_val); }); return tr; }; var handler = (oppai) => { target_infos.chunk(3).forEach((infoset) => { si.insertBefore(new DescTr(infoset, oppai), si.children[3]); }); }; apiGet().then(handler).catch(console.log); })();