A simple bot that tags people in digdig.io
// ==UserScript==
// @name         DigDig.IO Tag Bot
// @namespace    https://tampermonkey.net/
// @version      0.0.1
// @description  A simple bot that tags people in digdig.io
// @author       Zertalious (Zert)
// @match        *://digdig.io/*
// @icon         https://www.google.com/s2/favicons?domain=digdig.io
// @grant        none
// @run-at       document-end
// ==/UserScript==
let inDeathScreen = false;
let health = 0;
const healthX = [];
let border = null;
let waitingText;
let isWaiting = false;
	
let seekerText, hiderText;
let isSeeker = false;
const hiders = [];
let angle = 0;
let lastTime = 0;
let canBoost = true;
let isRunning = true;
Object.defineProperty( window, 'localStorage', {
	value: new Proxy( window.localStorage, {
		get( target, prop, receiver ) {
			if ( prop === 'digdig_gamemode' ) {
				return '2';
			}
			return Reflect.get( ...arguments );
		}
	} )
} );
window.requestAnimationFrame = new Proxy( window.requestAnimationFrame, {
	apply( target, thisArgs, args ) {
		if ( isRunning === true ) {
			args[ 0 ] = new Proxy( args[ 0 ], {
				apply( target, thisArgs, args ) {
					inDeathScreen = false;
					health = 0;
					isWaiting = false;
					hiders.length = 0;
					healthX.length = 0;
					health = 0;
					border = null;
					Reflect.apply( ...arguments );
					if ( inDeathScreen === true || health <= 0 ) {
						pressEnter();
						console.log( 'spam enter' );
						return;
					}
					if ( isWaiting === true ) {
						return;
					}
					if ( isSeeker === false ) {
						cp6.disconnect();
						return;
					}
					if ( health <= 0.05 ) {
						canBoost = false;
						setAttack( false );
					} else if ( health > 0.15 ) {
						canBoost = true;
					}
					if ( hiders.length > 0 ) {
						const [ x, y ] = hiders[ 0 ];
						setAttack( canBoost );
						angle = Math.atan2( y - window.innerHeight / 2, x - window.innerWidth / 2 );
						mouseMove( x, y );
						lastTime = Date.now() + 5000;
						return;
					}
					setAttack( false );
					const now = Date.now();
					if ( now - lastTime > 1000 ) {
						angle += ( Math.random() * 2 - 1 ) * Math.PI / 4;
						lastTime = now;
					}
					if ( border !== null ) {
						const x = border[ 0 ] - window.innerWidth / 2;
						const y = border[ 1 ] - window.innerHeight / 2;
						if ( Math.hypot( x, y ) > border[ 2 ] - 500 ) {
							angle = Math.atan2( y, x );
						}
					}
					mouseMove( 
						( Math.cos( angle ) * 0.5 + 0.5 ) * window.innerWidth, 
						( Math.sin( angle ) * 0.5 + 0.5 ) * window.innerHeight 
					);
				}
			} );
		}
		return Reflect.apply( ...arguments );
	}
} );
const Context = CanvasRenderingContext2D.prototype;
Context.arc = new Proxy( Context.arc, {
	apply( target, thisArgs, [ x, y, r ] ) {
		if ( r === 25 ) {
			if ( thisArgs.fillStyle === '#6096b5' ) {
				const { e, f } = thisArgs.getTransform();
				if ( Math.hypot( e - window.innerWidth, f - window.innerHeight ) > 10 ) {
					hiders.push( [ e, f ] );
				}
			}
		} else if ( thisArgs.fillStyle === '#222222' && x !== 0 && y !== 0 ) {
			border = [ x, y, r ];
		}
		return Reflect.apply( ...arguments );
	}
} );
const params = {
	apply( target, thisArgs, [ x ] ) {
		healthX[ target.name === 'moveTo' ? 0 : 1 ] = x;
		return Reflect.apply( ...arguments );
	}
};
Context.moveTo = new Proxy( Context.moveTo, params );
Context.lineTo = new Proxy( Context.lineTo, params );
Context.stroke = new Proxy( Context.stroke, {
	apply( target, thisArgs, args ) {
		if ( thisArgs.strokeStyle === '#75dd34' ) {
			health = ( healthX[ 0 ] - healthX[ 1 ] ) / ( 2 * healthX[ 0 ] );
		}
		return Reflect.apply( ...arguments );
	}
} );
const OffscreenContext = typeof OffscreenCanvasRenderingContext2D !== 'undefined' ? 
	OffscreenCanvasRenderingContext2D.prototype : Context;
OffscreenContext.fillRect = new Proxy( OffscreenContext.fillRect, {
	apply( target, thisArgs, args ) {
		if ( thisArgs.fillStyle === '#000000' ) {
			inDeathScreen = true;
		}
		return Reflect.apply( ...arguments );
	}
} );
OffscreenContext.fillText = new Proxy( OffscreenContext.fillText, {
	apply( target, { canvas }, [ text ] ) {
		if ( text.indexOf( 'Starting in' ) > - 1 && text.indexOf( 'Waiting for' ) > - 1 ) {
			waitingText = canvas;
		} else if ( text.indexOf( 'You are a seeker' ) > - 1 ) {
			seekerText = canvas;
		} else if ( text.indexOf( 'You are a hider' ) > - 1 ) {
			hiderText = canvas;
		}
		return Reflect.apply( ...arguments );
	}
} );
OffscreenContext.drawImage = new Proxy( OffscreenContext.drawImage, {
	apply( target, thisArgs, [ image ] ) {
		switch ( image ) {
			case waitingText : isWaiting = true; break;
			case seekerText : isSeeker = true; break;
			case hiderText : isSeeker = false; break;
		}
		return Reflect.apply( ...arguments );
	}
} );
function pressEnter() {
	keyEvent( 'keydown', 13 );
	keyEvent( 'keyup', 13 );
}
function setAttack( bool ) {
	keyEvent( bool !== false ? 'keydown' : 'keyup', 32 );
}
function setHeal( bool ) {
	keyEvent( bool !== false ? 'keydown' : 'keyup', 16 );
}
function keyEvent( type, keyCode ) {
	window.dispatchEvent( new KeyboardEvent( type, { keyCode } ) );
}
function mouseMove( clientX, clientY ) {
	window.Module.canvas.dispatchEvent(
		new MouseEvent( 'mousemove', { 
			clientX, 
			clientY 
		} )
	);
}