NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @id TabunStats // @name TabunStats // @version 1.3 // @namespace // @author Zayka (geostyle mod) // @description Набор элементов статистики для Табуна // @include http://tabun.everypony.ru/blog/* // @include http://tabun.everypony.ru/ // @include https://tabun.everypony.ru/blog/* // @include https://tabun.everypony.ru/ // @include http://tabun.everypony.ru/index/newall/* // @include https://tabun.everypony.ru/index/newall/* // @require http://code.jquery.com/jquery-2.1.1.min.js // @require http://code.highcharts.com/highcharts.js // @run-at document-end // @grant GM_addStyle // @grant GM_getResourceText // ==/UserScript== // оперокостыль function addJQuery(callback) { var script = document.createElement("script"); script.setAttribute("src", "http://code.jquery.com/jquery-2.1.1.min.js"); script.addEventListener('load', function() { var script = document.createElement("script"); script.textContent = "(" + callback.toString() + ")();"; document.body.appendChild(script); }, false); document.body.appendChild(script); } var css = ".zTable{border:1px solid;box-shadow:2px 2px 3px #AAA;border-top-right-radius:8px;border-bottom-right-radius:5px;border-top-left-radius:5px;background:#76afe8;background:-moz-linear-gradient(left,#76afe8 0,#3591e8 100%);background:-webkit-linear-gradient(left,#76afe8 0,#3591e8 100%);background:-o-linear-gradient(left,#76afe8 0,#3591e8 100%);background:linear-gradient(to right,#76afe8 0,#3591e8 100%)}.crop{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.zСontainer{position:fixed;right:10px;bottom:34px;width:160px;zIndex:10000px;background:#fff;border:1px solid Silver;borderRadius:6px;padding:10px}.zСontainer>.switch{display:block;margin:10px auto;left:45px}.switch{position:relative;display:inline-block;vertical-align:top;width:56px;height:20px;padding:3px;background-color:#fff;border-radius:18px;box-shadow:inset 0 -1px white,inset 0 1px 1px rgba(0,0,0,.05);cursor:pointer;background-image:-webkit-linear-gradient(top,#eee,#fff 25px);background-image:-moz-linear-gradient(top,#eee,#fff 25px);background-image:-o-linear-gradient(top,#eee,#fff 25px);background-image:linear-gradient(to bottom,#eee,#fff 25px)}.switch-input{position:absolute;top:0;left:0;opacity:0}.switch-label{position:relative;display:block;height:inherit;font-size:10px;text-transform:uppercase;background:#eceeef;border-radius:inherit;box-shadow:inset 0 1px 2px rgba(0,0,0,.12),inset 0 0 2px rgba(0,0,0,.15);-webkit-transition:.15s ease-out;-moz-transition:.15s ease-out;-o-transition:.15s ease-out;transition:.15s ease-out;-webkit-transition-property:opacity background;-moz-transition-property:opacity background;-o-transition-property:opacity background;transition-property:opacity background}.switch-label:after,.switch-label:before{position:absolute;top:50%;margin-top:-.5em;line-height:1;-webkit-transition:inherit;-moz-transition:inherit;-o-transition:inherit;transition:inherit}.switch-label:before{content:attr(data-off);right:11px;color:#aaa;text-shadow:0 1px rgba(255,255,255,.5)}.switch-label:after{content:attr(data-on);left:11px;color:#fff;text-shadow:0 1px rgba(0,0,0,.2);opacity:0}.switch-input:checked~.switch-label{background:#47a8d8;box-shadow:inset 0 1px 2px rgba(0,0,0,.15),inset 0 0 3px rgba(0,0,0,.2)}.switch-input:checked~.switch-label:before{opacity:0}.switch-input:checked~.switch-label:after{opacity:1}.switch-handle{position:absolute;top:4px;left:4px;width:18px;height:18px;background:#fff;border-radius:10px;box-shadow:1px 1px 5px rgba(0,0,0,.2);background:-webkit-linear-gradient(top,#fff 40%,#f0f0f0) #fff;background:-moz-linear-gradient(top,#fff 40%,#f0f0f0) #fff;background:-o-linear-gradient(top,#fff 40%,#f0f0f0) #fff;background:linear-gradient(to bottom,#fff 40%,#f0f0f0) #fff;-webkit-transition:left .15s ease-out;-moz-transition:left .15s ease-out;-o-transition:left .15s ease-out;transition:left .15s ease-out}.switch-handle:before{content:'';position:absolute;top:50%;left:50%;margin:-6px 0 0 -6px;width:12px;height:12px;background:#f9f9f9;border-radius:6px;box-shadow:inset 0 1px rgba(0,0,0,.02);background-image:-webkit-linear-gradient(top,#eee,#fff);background-image:-moz-linear-gradient(top,#eee,#fff);background-image:-o-linear-gradient(top,#eee,#fff);background-image:linear-gradient(to bottom,#eee,#fff)}.switch-input:checked~.switch-handle{left:40px;box-shadow:-1px 1px 5px rgba(0,0,0,.2)}.switch-green>.switch-input:checked~.switch-label{background:#4fb845}" GM_addStyle(css); var configKey = 'Tabun stats config key'; var commentsTableId = "zCommentsTable"; var topicsTableId = "zTopicsTable"; var graphsTableId = "zGraphsTable"; var defaultCfg = { useComments : true, useTopics : false, useGraphs : false, }, cfg = defaultCfg; cfg = $.extend({}, defaultCfg, JSON.parse(window.localStorage.getItem(configKey) || "{}")); var configItems = []; configItems.push( { text : "Комментарии", idName : "statsCommentsOption", cfgName : "useComments", getValue : function(){ return $('#zStats').find("#"+this.idName).prop('checked');}, saveValue : function(){ cfg[this.cfgName]=this.getValue(); }, cfgValue : function () { return cfg[this.cfgName]; }, }, { text : "Топики", idName : "statsTopicsOption", cfgName : "useTopics", getValue : function(){ return $('#zStats').find("#"+this.idName).prop('checked');}, saveValue : function(){ cfg[this.cfgName]=this.getValue(); }, cfgValue : function () { return cfg[this.cfgName]; }, }, { text : "График", idName : "statsGraphsOption", cfgName : "useGraphs", getValue : function(){ return $('#zStats').find("#"+this.idName).prop('checked');}, saveValue : function(){ cfg[this.cfgName]=this.getValue(); }, cfgValue : function () { return cfg[this.cfgName]; }, } ); var cont = $('<div>', {"class":'zСontainer',"id":"zStats"}); configItems.forEach(function(o, idx) { var label = $('<label>', {"class":'switch'}); var input = $("<input>", {type:'checkbox', "class":'switch-input',"id":o.idName}).prop('checked',o.cfgValue()).on('click', SaveConfig ); var span = $("<span>", {"class":'switch-label', "data-on":"Вкл","data-off":"Откл" }); var textDiv = $('<div>',{"class":'zcomment',text:o.text}).css({position:'relative',right:90,bottom:19}); label.append(input); label.append(span); label.append(textDiv); label.appendTo(cont); }); var button = $('<button>', { "class":"button button-small", click: ShowConfig, text:"Stats" }).css({ "margin-right":0 }); button.append(cont); $('#widemode').append(button); $('#widemode').append(cont); cont.toggle(); function ShowConfig(e) { $(e.currentTarget).toggleClass("active"); cont.toggle(); console.log(cfg); } function SaveConfig(e) { var currentItem = configItems.filter(function(item) { return item.idName == e.currentTarget.id})[0]; currentItem.saveValue(); window.localStorage.setItem(configKey, JSON.stringify(cfg)); } if (cfg.useComments) { LoadComments(); } if (cfg.useTopics) { LoadTopics(); } if (cfg.useGraphs) { LoadGraphs(); } function LoadComments() { var xmlhttp= new XMLHttpRequest(); xmlhttp.open('GET',"https://tabunstats.com/speed?"+Math.random()*1000000); xmlhttp.onreadystatechange = function (){ if (xmlhttp.readyState<4) return; var json = JSON.parse(xmlhttp.responseText); CreateCommentsTable(json); }; xmlhttp.send(); } function LoadTopics() { var xmlhttp2= new XMLHttpRequest(); xmlhttp2.open('GET',"https://tabunstats.com/hot"); xmlhttp2.onreadystatechange = function (){ if (xmlhttp2.readyState<4) return; var json = JSON.parse(xmlhttp2.responseText); var sort_json = []; for (var key in json) { sort_json.push({key:key,score:json[key][2],name:json[key][3]}); } sort_json.sort(function(a,b){return b.score-a.score;}); CreateTopicsTable(sort_json); }; xmlhttp2.send(); } function LoadGraphs() { if ($(".topic-header").length>2) return null; //милый костыль работы графиков только внутри топиков. $(".topic-header").append( $("<div>",{"class":'zGraph',id:graphsTableId})); pattern = /http[\w\W\s\S]+?([\d]+)[\.]/g; var topicN=pattern.exec(document.URL); $.ajax({ type:"GET", dataType: "json", data:"id="+topicN[1], url:"https://tabunstats.com/graph/", success: function (msg){MyLittleCallback(msg)}, error: function (jqXHR, textStatus, errorThrown ) { console.log("jqXHR:"+jqXHR); console.log("textStatus:"+textStatus); console.log("errorThrown:"+errorThrown); } }); } function CreateCommentsTable(json) { var sidebar = document.getElementById("sidebar") var blockafter = sidebar.getElementsByClassName("block block-type-pseudomenu")[0]; var node = document.createElement("div"); node.className="block"; var linkWidth = (sidebar.clientWidth-40)*0.40; table = document.createElement("table"); table.setAttribute("border","2"); var tr = document.createElement("tr"); tr.innerHTML=" <TH>Имя топика</TH> <TH>Комментариев в час</TH>"; table.appendChild(tr); table.align="center"; table.width="100%"; table.id = commentsTableId; //table.style.background="#DFDFDF"; var invmax = 99/json[0].event.commentsTotal; for(var i=0;i<json.length&&i<5;i++) { if (json[i].event.name=="") json[i].event.name="Unidentified"; var link = document.createElement("a"); link.href = "http://tabun.everypony.ru/blog/"+json[i].event.topicNum+".html"; link.innerHTML = json[i].event.name; link.title = link.innerHTML; var div = document.createElement("div"); div.className = "crop"; div.style.width = linkWidth+"px"; div.appendChild(link); var td1 = document.createElement("td"); td1.style.width="40%"; td1.appendChild(div); td1.style.fontSize = "11px"; var td2 = document.createElement("td"); //td2.style.width="60%"; var bar = document.createElement("div"); bar.style.width=(invmax*json[i].event.commentsTotal).toString()+"%"; bar.textContent=json[i].event.commentsTotal; bar.align="center"; bar.className = "zTable"; td2.appendChild(bar); var tr = document.createElement("tr"); tr.appendChild(td1); tr.appendChild(td2); table.appendChild(tr); } node.appendChild(table); sidebar.insertBefore(node,blockafter); } function CreateTopicsTable(json) { var sidebar = document.getElementById("sidebar") var blockafter = sidebar.getElementsByClassName("block block-type-pseudomenu")[0]; var node = document.createElement("div"); node.className="block"; var linkWidth = (sidebar.clientWidth-40)*0.40; table = document.createElement("table"); table.setAttribute("border","2"); var tr = document.createElement("tr"); tr.innerHTML=" <TH>Имя топика</TH> <TH>Рейтинг</TH>"; table.appendChild(tr); table.align="center"; table.width="100%"; table.id = topicsTableId; json=json.map(function(j){j.score=Math.round((6.666*j.score-5.6666)*1000); return j;}); var invmax = 99/json[0].score; for(var i=0;i<json.length&&i<5;i++) { if (json[i].name=="") json[i].event.name="Unidentified"; var link = document.createElement("a"); link.href = "http://tabun.everypony.ru/blog/"+json[i].key+".html"; link.innerHTML = json[i].name; link.title = link.innerHTML; var div = document.createElement("div"); div.className = "crop"; div.style.width = linkWidth+"px"; div.appendChild(link); var td1 = document.createElement("td"); td1.style.width="40%"; td1.appendChild(div); td1.style.fontSize = "11px"; var td2 = document.createElement("td"); //td2.style.width="60%"; var bar = document.createElement("div"); var score = json[i].score; if (score<0) score = 0; bar.style.width=(invmax*score).toString()+"%"; bar.textContent=json[i].score; bar.align="center"; bar.className = "zTable"; td2.appendChild(bar); var tr = document.createElement("tr"); tr.appendChild(td1); tr.appendChild(td2); table.appendChild(tr); } node.appendChild(table); sidebar.insertBefore(node,blockafter); } function MyLittleCallback(msg) { $('#'+graphsTableId).highcharts({ chart: { type: 'spline', backgroundColor:'rgba(255, 255, 255, 0.0)', zoomType: 'x' }, plotOptions: { spline: { lineWidth: 2, marker: { enabled: false }, color: '#5FA459', negativeColor:'#DA4242', }, }, xAxis: { type: 'datetime', // title: {text:"222333"} }, yAxis: { title: {enabled:false} }, series: [{data:msg, name:'Рейтинг топика'}], title: {text:""}, legend: {enabled:false} }); $('.zGraph').hide(); button = document.createElement('button'); button.className ="button button-primary graphbutton" button.textContent = "График"; $(button).click(function(){$('.zGraph').toggle()}); $(".topic-info-vote").after(button); }