Lichess Auto Rematch

Automatically Presses Rematch Button When Available

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name          Lichess Auto Rematch
// @namespace     http://userstyles.org
// @description   Automatically Presses Rematch Button When Available
// @author        636597
// @include       https://lichess.org/*
// @run-at        document-start
// @version       0.2
// ==/UserScript==

var spinner_count = 0;
function request_rematch() {
	console.log( "requesing rematch" );
	try {
		//lichess.socket.send( "rematch-yes" );
		var rematch_button = document.querySelector("button.rematch");
		rematch_button.click();
	}
	catch( e ) {}
}

var spam_interval = false;
function spam_request_rematch() {
	if ( spam_interval !== false ) { return; }
	console.log( "spaming request rematch" );
	spam_interval = setInterval( request_rematch , 1000 );
	setTimeout( function() {
		clearInterval( spam_interval );
		spam_interval = false;
	} , 60000 );
}

var rematch_button_element = false;
var rematch_button_observer = false;

var document_observer = false;
var parent_element = false;
var observerConfig = {
	childList: true,
	attributes: true,
	characterData: true,
	subtree: true,
	attributeOldValue: true,
	characterDataOldValue: true
};

function observe_rematch_button() {
	rematch_button_element = document.querySelector( "button.rematch" );
	if ( !rematch_button_element ) {
		console( "Could Not Find Rematch Button To Observe" );
		return;
	}
	rematch_button_observer = new MutationObserver( function( mutations ) {
		mutations.forEach( function( mutation , index ) {
			if ( mutation.type === "childList" ) {
				if ( mutation.removedNodes ) {
					if ( mutation.removedNodes[ 0 ] ) {
						if ( mutation.removedNodes[ 0 ].className ) {
							if ( mutation.removedNodes[ 0 ].className === "spinner" ) {
								spinner_count += 1;
								console.log( "Spinner Count == " + spinner_count.toString() );
								if ( spinner_count > 2 ) {
									console.log( "Someone Cancelled The Rematch" );
									console.log( "Re-Requesting Rematch" );
									request_rematch();
									spinner_count = 0;
								}
							}
						}
					}
				}
			}
			//console.log( mutation );
		});
	});
	rematch_button_observer.observe( rematch_button_element , observerConfig );
	console.log( "Observing Rematch Button" );
}

function observe_document() {
	parent_element = document.querySelector( "main.round" );
	console.log( parent_element );
	if ( !parent_element ) {
		console.log( "Could Not Find Parent Element to Observe" );
		return;
	}
	document_observer = new MutationObserver( function( mutations ) {
		mutations.forEach( function( mutation , index ) {
			if ( mutation.target.firstChild ) {
				if ( mutation.target.firstChild.className ) {
					if ( mutation.target.firstChild.className === "follow-up" ) {
						console.log( "Rematch Button Available" );
						request_rematch();
						observe_rematch_button();
					}
				}
			}
		});
	});
	document_observer.observe( parent_element , observerConfig );
	console.log( "Lichess Auto-Rematch Loaded" );
}

( function() {
	window.addEventListener ( "load" , observe_document );
})();