Greasy Fork is available in English.

Lichess Puzzle Auto-Zen Mode

Automatically Enters Zen Mode in Puzzle Training

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name          Lichess Puzzle Auto-Zen Mode
// @namespace     http://userstyles.org
// @description   Automatically Enters Zen Mode in Puzzle Training
// @author        636597
// @include       *://*lichess.org/training*

// @run-at        document-start
// @version       0.1
// ==/UserScript==

function sleep( ms ) { return new Promise( resolve => setTimeout( resolve , ms ) ); }

function hide_puzzle_info() {
	try{
		var styles = `
			a[href^="/training/"]  { visibility: hidden !important; }
			a[href^="/@/"]  { visibility: hidden !important; }
			div.infos.puzzle { visibility: hidden !important; }
		`;
		var styleSheet = document.createElement("style");
		styleSheet.type = "text/css";
		styleSheet.innerText = styles;
		document.head.appendChild(styleSheet);
	}
	catch(e) {
		console.log( e );
	}
}

function click_fucking_menu_button() {
	return new Promise( function( resolve , reject ) {
		try {
			// select the button
			console.log( "click_fucking_menu_button()" );
			let button = document.querySelector( 'button.board-menu-toggle' );
			console.log( button );
			let events = [ 'mouseover' , 'mousedown' , 'mouseup' , 'click' ];
			events.forEach( ( eventName ) => {
				let event = new MouseEvent( eventName, {
					bubbles: true ,
					cancelable: false ,
				});
				try { button.dispatchEvent( event ); }
				catch( e ) { console.log( e ); }
			});
			resolve();
			return;
		}
		catch( error ) { console.log( error ); reject( error ); return; }
	});
}

function click_fucking_zen_button() {
	return new Promise( function( resolve , reject ) {
		try {
			// select the button
			console.log( "click_fucking_zen_button()" );
			let button = document.querySelector( 'div.abset-zen' );
			console.log( button );
			button = button.querySelectorAll( "input" )[ 0 ];
			console.log( button );
			let events = [ 'mouseover' , 'mousedown' , 'mouseup' , 'click' ];
			events.forEach( ( eventName ) => {
				let event = new MouseEvent( eventName, {
					bubbles: true ,
					cancelable: false ,
				});
				try { button.dispatchEvent( event ); }
				catch( e ) { console.log( e ); }
			});
			resolve();
			return;
		}
		catch( error ) { console.log( error ); reject( error ); return; }
	});
}

function on_element_to_exist( query_selector , timeout=10000 , check_interval=500 ) {
	return new Promise( function( resolve , reject ) {
		try {
			let READY_CHECK_INTERVAL = setInterval( function() {
				let item = document.querySelectorAll( query_selector );
				if ( item ) {
					if ( item[ 0 ] ) {
						clearInterval( READY_CHECK_INTERVAL );
						resolve( item[ 0 ] );
						return;
					}
				}
			} , check_interval );
			setTimeout( function() {
				clearInterval( READY_CHECK_INTERVAL );
				resolve( false );
				return;
			} , timeout );
		}
		catch( error ) { console.log( error ); resolve( false ); return; }
	});
}

( async ()=> {
	window.addEventListener ( "load" , hide_puzzle_info );
	hide_puzzle_info();
	await on_element_to_exist( "button.board-menu-toggle" );
	let menu_button = document.querySelector( "button.board-menu-toggle" );
	// await sleep( 1000 );
	await click_fucking_menu_button();
	// await sleep( 1000 );
	await on_element_to_exist( "div.abset-zen" )
	await click_fucking_zen_button();
})();