liChess.org Current Match Score

lichessCurrentMatch

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name          liChess.org Current Match Score
// @namespace     http://userstyles.org
// @description	  lichessCurrentMatch
// @author        ceberous
// @homepage      https://creatitees.info
// @include       https://lichess.org/*
// @require		  http://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js
// @run-at        document-start
// @version       0.3
// ==/UserScript==

( function() {

	var lastRecordedMatch;
	var wPlayers;
	var wCurrentScores;

	if (!String.prototype.format) {
	  String.prototype.format = function() {
	    var args = arguments;
	    return this.replace(/{(\d+)}/g, function(match, number) { 
	      return typeof args[number] != 'undefined'
	        ? args[number]
	        : match
	      ;
	    });
	  };
	}

	function normalizeString( wString ) {

	    wString = wString.split("");
	    var wL = wString.length;
	    var wF = "";
	    for ( var i = 0; i < wL; ++i ) {
	        var c = wString[i].charCodeAt(0);
	        if ( c === 10 ) { continue; }
	        if ( c === 32 ) {
	            if ( wF.length < 1 ) { continue; }
	            var x = i + 1;
	            if ( x < wL ) {
	                var d = wString[x].charCodeAt(0);
	                if ( d != 32 && d != 10 ) {
	                    wF = wF + " ";
	                }
	            }
	        }
	        else { wF = wF + wString[i]; }
	    }
	    return wF;

	}

	function scoreStringToINT( wScoreString ) {
		
		var wNumRegEx = new RegExp( "[0-9]" );
		var wTMP = wScoreString.split("");
		var wFinal = "";
		var wAddon = 0;
		for ( var i = 0; i < wTMP.length; ++i ) {
			if ( !wNumRegEx.test( wTMP[i] ) ) {
				wAddon = 0.5;
			}
			else {
				wFinal = wFinal + wTMP[i];
			}
		}
		wFinal = parseInt( wFinal );
		wFinal = wFinal + wAddon;
		return wFinal;

	}

	function getCurrentPlayers() {

		var wPlayers = $(".players").children();
		var wPLen = $(".players").children().length; 
		if ( wPLen < 1 ) { return undefined; }
	    var wWhitePlayer = $(wPlayers[0]).children();
	    wWhitePlayer = $(wWhitePlayer[0]).attr("href");
	    wWhitePlayer = wWhitePlayer.split("/@/")[1];
	    var wBlackPlayer = $(wPlayers[1]).children();
	    wBlackPlayer = $(wBlackPlayer[0]).attr("href");
	    wBlackPlayer = wBlackPlayer.split("/@/")[1];
	    //alert( wWhitePlayer + " vs " + wBlackPlayer );
	    return [ wWhitePlayer , wBlackPlayer ];

	}

	function getCurrentScore() {

		var wScores = {};

		$(".score").each( function( indx , elem ) {
			var wPN = $(elem).next("th.user").text().split(" ");
			wPN = wPN.length > 1 ? wPN[1] : wPN[0];
			var wScore = normalizeString( $(elem).text() );
			wScores[wPN] = scoreStringToINT( wScore );
		});

		return wScores;

	}

	function insertIntoScoreTable( wScore1 , wScore2 ) {

		//var wP1 = "<td><th class='score win'>{0}</th></td>".format( wScore1 );
		//var wP2 = "<td><th class='score lose'>{0}</th></td>".format( wScore2 );

		var wP1 = "<td><a>{0}</a></td>".format( wScore1 );
		var wP2 = "<td><a>{0}</a></td>".format( wScore2 );

		console.log( wP1 );
		console.log( wP2 );

		var wS = $('.crosstable > table > tbody').children();
		var wPOS = $(wS[0]).children().length - 1;
		var wP1CH = $( wS[0] ).children();
		var wP2CH = $( wS[1] ).children();
		$( wP1CH ).eq( wPOS ).after(wP1);
		$( wP2CH ).eq( wPOS ).after(wP2);

	}

	$(document).ready(function() {

		lastRecordedMatch = localStorage.getItem( "lastRecordedMatch" );
	    wPlayers = getCurrentPlayers();
	    if ( !wPlayers ) { return; }
	    console.log( wPlayers );
	    wCurrentScores = getCurrentScore();

	    var key1 = wPlayers[0] + "@/vs/@" + wPlayers[1];
	    var key2 = wPlayers[1] + "@/vs/@" + wPlayers[0];

	    var wFresh = true;
	    var wKey;
	    var wLSK1 = localStorage.getItem( key1 );
	    var wLSK2;
	    if ( wLSK1 === null ) {
	    	wLSK2 = localStorage.getItem( key2 );
	    	if ( wLSK2 === null ) {
	    		wKey = key1;
	    	}
	    	else {
	    		wFresh = false;
	    		wKey = key2;
	    	}
	    }
	    else {
	    	wFresh = false;
	    	wKey = key1;
	    }

	    //console.log( "Fresh ? = " + wFresh );
	    //console.log( "using key --> " + wKey );

	    var wTMPN = wKey.split("@/vs/@");
	    if ( wFresh ) {
	    	var wOBJ = {
	    		p1: {
	    			name: wTMPN[0],
	    			totalScore: wCurrentScores[ wTMPN[0] ],
	    			currentMatch: 0,
	    		},
	    		p2: {
	    			name: wTMPN[1],
	    			totalScore: wCurrentScores[ wTMPN[1] ],
	    			currentMatch: 0,
	    		},
	    	};
	    	wOBJ = JSON.stringify( wOBJ );
	    	localStorage.setItem( wKey , wOBJ );
	    	localStorage.setItem( "lastRecordedMatch" , wKey );
	    }
	    else {

	    	var wOldScores = JSON.parse( localStorage.getItem( wKey ) );
	    	var wP1OldScore = wOldScores.p1.totalScore;
	    	var wP2OldScore = wOldScores.p2.totalScore;
			
			//console.log( "\nOld Scores =" );
	    	//console.log( wP1OldScore );
	    	//console.log( wP2OldScore );

	    	//console.log( "\n\nNew Scores = ");
	    	//console.log( wCurrentScores );

	    	var wP1ScoreDiff , wP2ScoreDiff;

	    	// Were in the same match
	    	if ( lastRecordedMatch === wKey ) {

	    		//console.log("same match");

	    		wP1ScoreDiff = wCurrentScores[ wTMPN[0] ] - wP1OldScore;
	    		wP2ScoreDiff = wCurrentScores[ wTMPN[1] ] - wP2OldScore;

	    		wP1ScoreDiff = isNaN( wP1ScoreDiff ) ? 0.5 : wP1ScoreDiff;
	    		wP2ScoreDiff = isNaN( wP2ScoreDiff ) ? 0.5 : wP2ScoreDiff;	    		

	    		console.log( "Current Match Differences = " );
	    		console.log( wTMPN[0] + " -P1-Diff = " + wP1ScoreDiff );
	    		console.log( wTMPN[1] + " -P2-Diff = " + wP2ScoreDiff );

	    		wOldScores.p1.currentMatch = wP1ScoreDiff;
	    		wOldScores.p2.currentMatch = wP2ScoreDiff;

	    		wOldScores = JSON.stringify( wOldScores );
	    		localStorage.setItem( wKey , wOldScores );
	    		localStorage.setItem( "lastRecordedMatch" , wKey );

	    	}
	    	else { // this is a new matchup

	    		//console.log("not the same match");
	    		localStorage.removeItem( lastRecordedMatch );

				wP1ScoreDiff = wCurrentScores[ wTMPN[0] ] - wP1OldScore;
	    		wP2ScoreDiff = wCurrentScores[ wTMPN[1] ] - wP2OldScore;

	    		wP1ScoreDiff = isNaN( wP1ScoreDiff ) ? 0.5 : wP1ScoreDiff;
	    		wP2ScoreDiff = isNaN( wP2ScoreDiff ) ? 0.5 : wP2ScoreDiff;

	    		console.log( "Current Match Differences = " );
	    		console.log( wTMPN[0] + " -P1-Diff = " + wP1ScoreDiff );
	    		console.log( wTMPN[1] + " -P2-Diff = " + wP2ScoreDiff );

	    	}

	    	insertIntoScoreTable( wP1ScoreDiff , wP2ScoreDiff );

	    }

	});

})();