From 3da131191439b1f1e28dae96a755ff7c11631020 Mon Sep 17 00:00:00 2001 From: Krytarik Raido Date: Sat, 1 Jun 2013 05:21:25 +0200 Subject: uftow-stats 1.2.1 --- uftow-stats.user.js | 349 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 349 insertions(+) create mode 100644 uftow-stats.user.js diff --git a/uftow-stats.user.js b/uftow-stats.user.js new file mode 100644 index 0000000..fdfb838 --- /dev/null +++ b/uftow-stats.user.js @@ -0,0 +1,349 @@ +// ==UserScript== +// @name uftow-stats +// @namespace uftow-stats +// @include http://ubuntuforums.org/showthread.php?t=1579442* +// @version 1.2.1 +// @Description Generates stats for Tug of War. +// @grant GM_getValue +// @grant GM_setValue +// @grant GM_log +// @grant GM_listValues +// @grant GM_setValue +// @grant GM_addStyle +// @grant GM_deleteValue +// @grant GM_registerMenuCommand +// ==/UserScript== + +var towConfig = { + multipliers:new Array( + //Forum Staff + 'images/rank_uf_moderator_2013-07.png',-2, + //Forum Admin + 'images/rank_uf_admin_2013-07.png',-4, + //LoCo mods + 'font-weight: bold; color: #339900;',2, + //Ubuntu Member + 'images/rank_ubuntumember_2013-02.png',2, + //Kubuntu Member - unchanged (2013.02.17) + 'images/rebrand/ranks/rankkubuntumember.png',2, + //Staff Emeritus + 'images/rank_oldstaff_2013-02.png',3, + //Forum Donators - unchanged (2013.02.13) + 'images/rank_forum_donators.png',4, + //Ubuntu Developers - unchanged (2013.02.13) + 'images/rank_ubuntudeveloper.png',4, + //Ubuntu One Developers - Unable to verify whether or not this has changed (2013.02.13) + 'http://kryogenix.org/random/u1-forums-rank-logo.png',4 + ) +}; +var towStats = { + alreadyHasStartCounting:false, + scores:new Array(), + currentScore:0, + lastPostNumber:null, + winner:null, + marker:null, + markerPost:null, + lastPoster:null, + init:function(){ + this.postContainers=document.getElementsByClassName('postcontainer'); + this.firstPostNumber=this.parsePostNumber(this.postContainers[0].getElementsByClassName('postcounter')[0].textContent); + this.lastPostNumber=this.parsePostNumber(this.postContainers[this.postContainers.length-1].getElementsByClassName('postcounter')[0].textContent); + this.currentScore=0; + if(!GM_getValue("statsActive",false)){ + GM_registerMenuCommand("Start counting posts",function(){towStats.startCounting();},'S'); + this.alreadyHasStartCounting=true; + }else{ + this.startCounting(); + } + GM_registerMenuCommand("Clear counter",function(){towStats.clearStats();},'A'); + }, + recordPosts: function(start){ + var postNumber; + var startDiff=start-this.firstPostNumber; + var postInfo; + GM_log("Seek ahead by "+startDiff+" posts"); + //alt4Number=1+(startDiff*2); + if(startDiff<0){ + alert("No such post exists on this page"); + return false; + } + for (var i=startDiff;i=200){ + this.winner='community'; + }if(this.winner!=undefined){ + this.marker=postInfo[0]; + this.markerPost=postInfo[3]; + break; + } + GM_log("Post: "+postInfo[3]+", Round score: "+this.currentScore); + } + }, + getPostInfo: function(postElement){ + var userSpanTag=postElement.getElementsByClassName('username')[0].getElementsByTagName('span')[0]; + var userName=userSpanTag.textContent; + var css=userSpanTag.getAttribute('style'); + var rankURL=postElement.getElementsByClassName('rank')[0].getElementsByTagName('img')[0].getAttribute('src'); + var postNumber=this.parsePostNumber(postElement.getElementsByClassName('postcounter')[0].textContent); + if(userName==""){ + userName='[UNKNOWN USERNAME]'; + } + return new Array(userName,css,rankURL,postNumber); + }, + scorePost: function(postInfo){ + this.lastPoster=postInfo[0]; + var groupImgIndex=towConfig.multipliers.indexOf(postInfo[2]); + if(groupImgIndex==-1){ + groupImgIndex=towConfig.multipliers.indexOf(postInfo[1]); + } + multiplier=(groupImgIndex==-1)?1:towConfig.multipliers[groupImgIndex+1]; + this.currentScore+=multiplier; + userIndex=this.scores.indexOf(postInfo[0]); + //The second check in the if statement makes sure users with usernames being actual numbers don't break this script + if(userIndex!=-1&&userIndex%3==0){ + this.scores[userIndex+2]++; + }else{ + this.scores.push(postInfo[0]); + this.scores.push(multiplier); + this.scores.push(1); + } + }, + getSummary: function(){ + if(this.winner!=undefined){ + var alertText="[B]TUG OF WAR LAST ROUND STATS[/B]\n"; + var totalPoints=0; + var totalPosts=0; + var totalModPoints=0; + var totalModPosts=0; + var totalCommunityPoints=0; + var totalCommunityPosts=0; + var minimumRequiredMVP; + var mvpList=new Array(); + var communityParticipants=new Array(); + var winners; + var allowMVP; + var modParticipants=new Array(); + GM_log(this.scores); + for(var i=1;i0){ + totalCommunityPoints+=this.scores[i+1]*this.scores[i]; + totalCommunityPosts+=this.scores[i+1]; + } + totalPosts+=this.scores[i+1]; + } + minimumRequiredMVP=Math.round(((this.winner=='community')?totalCommunityPoints:totalModPoints)*0.15); + alertText+="[B]Total points:[/B] "+totalPoints+" from "+totalPosts+" posts\n"; + alertText+="[B]Total community points:[/B] "; + if(totalCommunityPosts>0){ + alertText+=totalCommunityPoints+" from "+totalCommunityPosts+" posts\n"; + }else{ + alertText+="None\n"; + } + alertText+="[B]Total mod points:[/B] "; + if(totalModPosts>0){ + alertText+=totalModPoints+" from "+totalModPosts+" posts\n"; + }else{ + alertText+="None\n"; + } + alertText+="[B]Minimum required for MVP* ("+((this.winner=='community')?totalCommunityPoints:totalModPoints)+" x 0.15):[/B] "+minimumRequiredMVP+"\n\n"; + for(var i=0;i=participants.length){ + break; + } + if(participants[i+2]*participants[i+1]=minimumRequiredMVP){ + GM_log("Adding "+participants[i]+" to the MVP list."); + mvpList.push(participants[i]); + } + } + if(participants.length==0){ + statsText+="None\n"; + } + return new Array(statsText,mvpList); + }, + restoreStats: function(){ + var statsActive=GM_getValue("statsActive",false); + var scoresCount=GM_getValue("scores.count",0); + if(statsActive==false){ + GM_log("Attempting to save setting statsActive"); + GM_setValue("statsActive",true); + return false; + }else{ + this.lastUser=GM_getValue("lastPoster",null); + this.currentScore = parseInt(GM_getValue("CurrentScore")); + this.lastPostNumber = parseInt(GM_getValue("lastPostNumber")); + for(i=0;i