summaryrefslogtreecommitdiffstats
path: root/uftow-stats-simple.user.js
diff options
context:
space:
mode:
Diffstat (limited to 'uftow-stats-simple.user.js')
-rw-r--r--uftow-stats-simple.user.js225
1 files changed, 225 insertions, 0 deletions
diff --git a/uftow-stats-simple.user.js b/uftow-stats-simple.user.js
new file mode 100644
index 0000000..f04c987
--- /dev/null
+++ b/uftow-stats-simple.user.js
@@ -0,0 +1,225 @@
+// ==UserScript==
+// @name uftow-stats-simple
+// @namespace uftow-stats-simple
+// @include https://ubuntuforums.org/showthread.php?t=1579442*
+// @version 1.3.0
+// @Description Generates stats for Tug of War - simple variant.
+// @grant GM_log
+// @grant GM_getValue
+// @grant GM_setValue
+// @grant GM_listValues
+// @grant GM_deleteValue
+// @grant GM_registerMenuCommand
+// ==/UserScript==
+
+var towStats = {
+ alreadyHasStartCounting:false,
+ scores:new Array(),
+ lastPostNumber:null,
+ lastPoster:null,
+ startPostNumber:null,
+ endPostNumber:null,
+ init: function(){
+ this.postContainers=document.getElementsByClassName('postcontainer');
+ this.firstPostNumber=parseInt(this.postContainers[0].getElementsByClassName('postcounter')[0].textContent.substr(1));
+ this.lastPostNumber=parseInt(this.postContainers[this.postContainers.length-1].getElementsByClassName('postcounter')[0].textContent.substr(1));
+ 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(startPost){
+ var postNumber;
+ var startDiff=startPost-this.firstPostNumber;
+ var postInfo;
+ if(startDiff<0 || startPost>this.firstPostNumber+this.postContainers.length-1){
+ alert("Post #"+startPost+" is not on this page.");
+ return false;
+ }
+ for (var i=startDiff;i<this.postContainers.length;i++){
+ postInfo=this.getPostInfo(this.postContainers[i]);
+ this.lastPostNumber=postInfo[1];
+ if(this.lastPoster==postInfo[0]){
+ //GM_log("Post #"+this.lastPostNumber+" is a duplicate and has been skipped.");
+ continue;
+ }
+ if(this.endPostNumber!=null && this.lastPostNumber>this.endPostNumber){
+ break;
+ }
+ this.scorePost(postInfo);
+ }
+ return true;
+ },
+ getPostInfo: function(postElement){
+ var userSpanTag=postElement.getElementsByClassName('username')[0].getElementsByTagName('span')[0];
+ var userName=userSpanTag.textContent;
+ var postNumber=parseInt(postElement.getElementsByClassName('postcounter')[0].textContent.substr(1));
+ return new Array(userName,postNumber);
+ },
+ scorePost: function(postInfo){
+ this.lastPoster=postInfo[0];
+ 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%2==0){
+ this.scores[userIndex+1]++;
+ }else{
+ this.scores.push(postInfo[0]);
+ this.scores.push(1);
+ }
+ },
+ getSummary: function(){
+ var alertText="[B]TUG OF WAR LAST ROUND STATS[/B]\n";
+ var totalParticipants=0;
+ var totalPosts=0;
+ for(var i=1;i<this.scores.length;i+=2){
+ //GM_log("STATS: User: "+this.scores[i-1]+", Posts: "+this.scores[i]);
+ totalParticipants++;
+ totalPosts+=this.scores[i];
+ }
+ alertText+="[B]Post range:[/B] "+this.startPostNumber+" - "+
+ ((this.endPostNumber!=null)?this.endPostNumber:this.lastPostNumber)+"\n";
+ alertText+="[B]Post count:[/B] "+totalPosts+"\n";
+ alertText+="[B]Participants:[/B] "+totalParticipants+"\n\n";
+ alertText+="[B]PARTICIPANTS[/B]";
+ alertText+=this.getListText(this.scores);
+ window.alert(alertText);
+ },
+ getListText: function(participants){
+ var statsText="";
+ var thisScore;
+ var currScore=0;
+ var reCheck=true;
+ var tempSpot;
+ while(reCheck){
+ reCheck=false;
+ for(var i=0;i<participants.length;i+=2){
+ if(i+2>=participants.length){
+ break;
+ }
+ if(participants[i+1]<participants[i+3]){
+ tempSpot=new Array(participants[i],participants[i+1]);
+ participants[i]=participants[i+2];
+ participants[i+1]=participants[i+3];
+ participants[i+2]=tempSpot[0];
+ participants[i+3]=tempSpot[1];
+ reCheck=true;
+ }
+ }
+ }
+ //List individually
+ //for(var i=0;i<participants.length;i+=2){
+ // thisScore=participants[i+1];
+ // statsText+="[B]"+participants[i]+":[/B] "+participants[i+1]+" ";
+ // statsText+="post"+((thisScore!=1)?"s":"");
+ // statsText+="\n";
+ //}
+ //Group by post count
+ for(var i=0;i<participants.length;i+=2){
+ thisScore=participants[i+1];
+ if(thisScore!=currScore){
+ currScore=thisScore;
+ statsText+="\n[B]"+thisScore+" post"+((thisScore!=1)?"s":"")+":[/B] "+participants[i];
+ }else{
+ statsText+=", "+participants[i];
+ }
+ }
+ if(participants.length==0){
+ statsText+="None\n";
+ }
+ return new Array(statsText);
+ },
+ restoreStats: function(){
+ if(!GM_getValue("statsActive",false)){
+ GM_setValue("statsActive",true);
+ return false;
+ }
+ var scoresCount=GM_getValue("scores.count",0);
+ this.lastPoster=GM_getValue("lastPoster",null);
+ this.lastPostNumber=parseInt(GM_getValue("lastPostNumber"));
+ this.startPostNumber=parseInt(GM_getValue("startPostNumber"));
+ this.endPostNumber=GM_getValue("endPostNumber");
+ if(this.endPostNumber!=null){
+ this.endPostNumber=parseInt(this.endPostNumber);
+ }
+ for(i=0;i<scoresCount;i++){
+ this.scores.push(GM_getValue("scores."+i));
+ }
+ return true;
+ },
+ startCounting: function(){
+ if(this.restoreStats()){
+ startPost=this.lastPostNumber+1;
+ }else{
+ answerStart=window.prompt("Specifiy a post number to begin counting.\n"+
+ "If you do not know the post number, click Cancel.");
+ if(answerStart!=null){
+ startPost=parseInt(answerStart);
+ this.startPostNumber=startPost;
+ answerEnd=window.prompt("Specifiy a post number to end counting.\n"+
+ "If you want to count until the end, click Cancel.");
+ if(answerEnd!=null){
+ this.endPostNumber=parseInt(answerEnd);
+ }
+ GM_setValue("statsActive",true);
+ }else{
+ this.clearStats();
+ return false;
+ }
+ }
+ if(!this.recordPosts(startPost)){
+ return false;
+ }
+ this.saveStats();
+ if((this.endPostNumber!=null && this.lastPostNumber>=this.endPostNumber) || !this.goToNextPage()){
+ if(this.scores.length>=2 && !(this.endPostNumber!=null && this.lastPostNumber<this.endPostNumber)){
+ window.alert("Counting complete.\n"+
+ "Stats will be displayed in the next dialog box.");
+ this.getSummary();
+ }else{
+ window.alert("Tug of War is yet to be completed.");
+ }
+ this.clearStats();
+ }
+ },
+ saveStats: function(){
+ //GM_log("Last post on this page: "+this.lastPostNumber);
+ GM_setValue("lastPostNumber",this.lastPostNumber);
+ for(i=0;i<this.scores.length;i++){
+ GM_setValue("scores."+i,this.scores[i]);
+ GM_setValue("scores.count",this.scores.length);
+ }
+ GM_setValue("lastPoster",this.lastPoster);
+ GM_setValue("startPostNumber",this.startPostNumber);
+ GM_setValue("endPostNumber",this.endPostNumber);
+ },
+ goToNextPage: function(){
+ var pageLinks=document.getElementsByClassName('pagination_top')[0];
+ var nextLinkContainer=pageLinks.getElementsByClassName('prev_next')[1];
+ if(nextLinkContainer!=undefined){
+ nextLinkContainer.getElementsByTagName('a')[0].click();
+ return true;
+ }else{
+ return false;
+ }
+ },
+ clearStats: function(){
+ this.scores=new Array();
+ this.lastPostNumber=null;
+ this.lastPoster=null;
+ this.startPostNumber=null;
+ this.endPostNumber=null;
+ keys=GM_listValues();
+ for (var i=0,key=null; key=keys[i];i++) {
+ GM_deleteValue(key);
+ }
+ if(!this.alreadyHasStartCounting){
+ GM_registerMenuCommand("Start counting posts",function(){towStats.startCounting()},'S');
+ this.alreadyHasStartCounting=true;
+ }
+ }
+};
+
+towStats.init();