Greasy Fork is available in English.

ProtectCover

Protect your secret on the screen so that won't be seen by leader or other idler.

// ==UserScript==
// @name          ProtectCover
// @namespace    https://greasyfork.org/
// @version       1.0.4
// @description  Protect your secret on the screen so that won't be seen by leader or other idler.
// @author        JMRY
// @match         http*://*/*
// @grant          none
// ==/UserScript==

var debugUpdate=[
    {
		mainVersion:`1.0.4`,
		dateVersion:`20210705`,
		versionDesc:[
			`优化资源占用。`,
			`调整FPS刷新频率。`,
			`调整透明度按钮为下拉选项。`,
			`调整按钮选定时的边线更加明显。`,
			`隐藏Debug按钮,以避免遮挡画面。`,
		]
	},
    {
		mainVersion:`1.0.3`,
		dateVersion:`20210409`,
		versionDesc:[
			`适配更多网站。`,
            `加入随机生成LOG功能。`,
			`加入自定义透明度按钮。`,
		]
	},
	{
		mainVersion:`1.0.2`,
		dateVersion:`20200605`,
		versionDesc:[
			`加入LOG输出开关。`,
            `加入开关记忆功能。`,
			`优化按钮和快捷键排列。`,
		]
	},
	{
		mainVersion:`1.0.1`,
		dateVersion:`20200518`,
		versionDesc:[
			`适配石墨文档。`,
			`优化输出内容。`,
		]
	},
	{
		mainVersion:`1.0`,
		dateVersion:`20200511`,
		versionDesc:[
			`完成DebugMode基本功能。`,
		]
	},
]
var debugVersion=`${debugUpdate[0].mainVersion} Build ${debugUpdate[0].dateVersion}`;

function attachDebugButton(data){
	data={
		...{
			type:`button`,
			id:``,
			name:``,
			class:``,
			style:``,
			feature:function(){},
			event:{},
		},
		...data,
	}
	console.debug(`Attach Debug Button: ${JSON.stringify(data)}`);
	//{name:`CLEAR`,style:``,feature:function(){}},
	var debugButtonEl=document.createElement(data.type);
	debugButtonEl.setAttribute(`id`,`debugButton_${data.id}`);
	debugButtonEl.setAttribute(`class`,`debugButton debugButton_${data.name} ${data.class}`);
	debugButtonEl.setAttribute(`style`,data.style);
	debugButtonEl.innerHTML=data.name;

	//按钮绑定事件
	debugButtonEl.addEventListener(`click`,function(){
		data.feature();
	});

	for(let key in data.event){
		let curEv=data.event[key];
		debugButtonEl.addEventListener(key,function(){
			curEv();
		});
	}

	// debugButtonDIV.appendChild(debugButtonEl);
	document.getElementById(`debugButtonDIV`).appendChild(debugButtonEl);
}

function attachDebugFrame(){
	//Head classes
	var debugStyles=document.createElement(`style`);
	debugStyles.innerHTML=`
		.debugP{
			margin-top:4px;
			margin-bottom:4px;
		}
		.debugHr{
			border:none;
			height:1px;
			background:#000;
		}
        .debugTable{
            width:100%;
        }
		.debugDIV{
			position:fixed;
			top:0px;
			left:0px;
			right:0px;
			bottom:0px;
			z-index:1000;
			pointer-events:none;
		}

		.debugButtonDIV{
			height:16px;
			z-index:1001;
			text-align:right;
			opacity:0;
			overflow:hidden;
		}
		.debugButtonDIV:hover{
			opacity:1;
		}

		.debugProtectDIV{
			font-family: 'IBFU Font';
            font-size:20px;
			padding:32px;
            padding-left:256px;
            padding-right:256px;
			word-wrap:break-word;
            letter-spacing:0px;
			background-color:rgba(240,240,240,0.9);
		}

		.debugButton{
			height:100%;
			width:96px;
			font-size:8px;
			outline:none;
			pointer-events:auto;
			font-family: GameFont;
			padding:0px;
			padding-top:0px;
		}

		.debugSelect{
			height:100%;
			width:96px;
			font-size:8px;
			outline:none;
			pointer-events:auto;
			font-family: GameFont;
			padding-top:0px;
		}

		.debug_error{
			color:#FF0000;
		}
		.debug_info{
			color:#0099FF;
		}
		.debug_debug{
			color:#666666;
		}
		.debug_warn{
			color:#FF9900;
		}
	`;
	document.head.appendChild(debugStyles);

	//Debug div
	var debugDIV=document.createElement(`div`);
	debugDIV.setAttribute(`id`,`debugDIV`);
	debugDIV.setAttribute(`class`,`debugDIV`);
	document.body.appendChild(debugDIV);

	//Debug control button zone
	var debugButtonDIV=document.createElement(`div`);
	debugButtonDIV.setAttribute(`id`,`debugButtonDIV`);
	debugButtonDIV.setAttribute(`class`,`debugDIV debugButtonDIV`);
	debugDIV.appendChild(debugButtonDIV);

	//Debug protect frame
	var debugProtectDIV=document.createElement(`div`);
	debugProtectDIV.setAttribute(`id`,`debugProtectDIV`);
	debugProtectDIV.setAttribute(`class`,`debugDIV debugProtectDIV`);
	debugDIV.appendChild(debugProtectDIV);
	clearDebugLogs();

	console.debug(`Attach Debug frame`);
	console.debug(`Attach Debug DIV`);
	console.debug(`Attach Debug control button zone`);
	console.debug(`Attach Debug protect frame`);

	var debugButtonList=[
		{type:`select`,id:`opacityBu`,class:`debugSelect`,name:(
			()=>{
				let optionText=``;
				let opacityList=[
					{name:`0.0`,val:0},
					{name:`0.1`,val:9},
					{name:`0.2`,val:8},
					{name:`0.3`,val:7},
					{name:`0.4`,val:6},
					{name:`0.5`,val:5},
					{name:`0.6`,val:4},
					{name:`0.7`,val:3},
					{name:`0.8`,val:2},
					{name:`0.9`,val:1},
					{name:`1.0`,val:`\``},
				];
				for(let i=0; i<opacityList.length; i++){
					optionText+=`<option value="${opacityList[i].val}">OPACITY ${opacityList[i].name}</option>`;
				}
				return optionText;
			})(),
			style:`width:96px`,
			event:{
				change(){
					let selected=document.getElementById(`debugButton_opacityBu`);
					setDebugProtectionOpacity(selected.options[selected.selectedIndex].value);
				}
			}
		},
        // {name:`OP0.0`,id:`opacityBu0.0`,style:`width:36px;`,feature:function(){
		// 	setDebugProtectionOpacity(0);
		// }},
        // {name:`OP0.1`,id:`opacityBu0.1`,style:`width:36px;`,feature:function(){
		// 	setDebugProtectionOpacity(9);
		// }},
        // {name:`OP0.2`,id:`opacityBu0.2`,style:`width:36px;`,feature:function(){
		// 	setDebugProtectionOpacity(8);
		// }},
        // {name:`OP0.3`,id:`opacityBu0.3`,style:`width:36px;`,feature:function(){
		// 	setDebugProtectionOpacity(7);
		// }},
        // {name:`OP0.4`,id:`opacityBu0.4`,style:`width:36px;`,feature:function(){
		// 	setDebugProtectionOpacity(6);
		// }},
        // {name:`OP0.5`,id:`opacityBu0.5`,style:`width:36px;`,feature:function(){
		// 	setDebugProtectionOpacity(5);
		// }},
        // {name:`OP0.6`,id:`opacityBu0.6`,style:`width:36px;`,feature:function(){
		// 	setDebugProtectionOpacity(4);
		// }},
        // {name:`OP0.7`,id:`opacityBu0.7`,style:`width:36px;`,feature:function(){
		// 	setDebugProtectionOpacity(3);
		// }},
        // {name:`OP0.8`,id:`opacityBu0.8`,style:`width:36px;`,feature:function(){
		// 	setDebugProtectionOpacity(2);
		// }},
        // {name:`OP0.9`,id:`opacityBu0.9`,style:`width:36px;`,feature:function(){
		// 	setDebugProtectionOpacity(1);
		// }},
        // {name:`OP1.0`,id:`opacityBu1`,style:`width:36px;`,feature:function(){
		// 	setDebugProtectionOpacity(`\``);
		// }},
        {name:`FLOWLOGS[F9]`,id:`flowLogsBu`,style:``,feature:function(){
			toggleFlowLogs();
		}},
        {name:`RELOAD[F5]`,id:`resetBu`,style:``,feature:function(){
			resetGame();
		}},
        {name:`RECLOG[F6]`,id:`recordLogBu`,style:``,feature:function(){
			toggleRecordDebugLogs();
		}},
		{name:`CLEAR[F7]`,id:`clearLogBu`,style:``,feature:function(){
			clearDebugLogs();
		}},
		{name:`TOGGLE[F8]`,id:`toggleDebugBu`,style:``,feature:function(){
			toggleDebugProtect();
		}},
	];

	for(var i=0; i<debugButtonList.length; i++){
		attachDebugButton(debugButtonList[i]);
	}

	document.onkeydown=function(event){
		var e = event || window.event || arguments.callee.caller.arguments[0];
		console.debug(`KEY PRESS: KEYID: ${e.keyIdentifier} CODE: ${e.keyCode} EVENT: ${e}`);
		console.debug(e,false);
		if(e && e.keyCode==117){ // 按F6
			toggleRecordDebugLogs();
		}
        if(e && e.keyCode==118){ // 按F7
			clearDebugLogs();
		}
        if(e && e.keyCode==119){ // 按F8
			toggleDebugProtect();
		}
        if(e && e.keyCode==120){ // 按F9
			toggleFlowLogs();
		}
        if(e && e.altKey){
            setDebugProtectionOpacity(e.key);
        }
	};

    document.onmousedown=function(event){
        var e = event || window.event || arguments.callee.caller.arguments[0];
        console.debug(`MOUSE PRESS: MOUSEID: ${e.which} POSITION: ${e.screenX} ${e.screenY} EVENT: ${e}`);
        console.debug(e,false);
    }

    document.onmousewheel=function(event){
        var e = event || window.event || arguments.callee.caller.arguments[0];
        console.debug(`MOUSE SCROLL: POSITION: ${e.screenX} ${e.screenY} DIRECTION: ${e.wheelDelta>0?`UP`:`DOWN`} EVENT: ${e}`);
        console.debug(e,false);
    }
}

var debugInterval;
function clearDebugLogs(){
	document.getElementById(`debugProtectDIV`).innerHTML=`<p id="debugTitle" class="debugP"></p><hr class="debugHr"><p id="debugContent" class="debugP"></p>`;
	clearInterval(debugInterval);
	debugInterval=setInterval(function(){
		if(debutProtectShow){
			refreshDebugHeader();
		}
	},500);
}

function refreshDebugHeader(){
	var debugTitle=document.getElementById(`debugTitle`);
	debugTitle.innerHTML=`
<table class="debugTable">
  <tr>
    <td><b>DEBUG for Websites by JMRY</b></td>
    <td><b>Version ${debugVersion}</b></td>
    <td><b>FPS: ${GameFPS}</b></td>
  </tr>
  <tr>
    <td><b>[F6]</b> Toggle record debug logs</td>
    <td><b>[F7]</b> Clear the debug logs</td>
    <td><b>[F8]</b> Toggle the protect cover</td>
  </tr>
  <tr>
    <td><b>[ALT+1~0]</b> Switch protect gear</td>
    <td><b>[F9]</b> Toggle Flow Logs</td>
    <td><b>[F12]</b> Show Develoer tools</td>
  </tr>
</table>
`;
    try{
        let recordLogBu=document.getElementById(`debugButton_recordLogBu`);
        if(isRecordingDebugLog==true){
            recordLogBu.setAttribute(`style`,`border:1px solid #F00;`);
        }else{
            recordLogBu.setAttribute(`style`,``);
        }
        let flowLogBu=document.getElementById(`debugButton_flowLogsBu`);
        if(isFlowDebugLog==true){
            flowLogBu.setAttribute(`style`,`border:1px solid #F00;`);
        }else{
            flowLogBu.setAttribute(`style`,``);
        }
    }catch(e){}
}

function setDebugProtectionOpacity(level){
    var opacityLevel={
        '`':1,
        '1':0.9,
        '2':0.8,
        '3':0.7,
        '4':0.6,
        '5':0.5,
        '6':0.4,
        '7':0.3,
        '8':0.2,
        '9':0.1,
        '0':0,
    }

    var opacityVal=opacityLevel[level];
    if(opacityVal!=undefined){
        var debugProtectDIV=document.getElementById(`debugProtectDIV`);
        debugProtectDIV.setAttribute(`style`,`opacity:${opacityVal}`);
        console.debug(`DEBUG PROTECT SCREEN SET OPACITY: ${opacityVal}`);
        localStorage.setItem(`debugProtectionOpacity`,level);
    }
}

function resetGame(){
	window.top.location.reload(true);
}

var debutProtectShow=true;
function toggleDebugProtect(bool){
	var debugProtectDIV=document.getElementById(`debugProtectDIV`);
    if(bool!=undefined){
        debutProtectShow=!bool;
    }
	if(debutProtectShow){
		// debugProtectDIV.setAttribute(`style`,`opacity:0`);
		debugProtectDIV.setAttribute(`style`,`display:none`);
		debutProtectShow=false;
	}else{
		debugProtectDIV.setAttribute(`style`,``);
        setDebugProtectionOpacity(`\``);
		debutProtectShow=true;
	}
    localStorage.setItem(`isShowDebugCover`,debutProtectShow);
}

var debugCount=1;
function pushDebugLog(text,level,bool){
    if(isRecordingDebugLog==true){
        if(bool==undefined || bool==true){
            if(typeof text==`object`){
                try{
                    text=JSON.stringify(text);
                }catch(e){}
            }

            var debugContent=document.getElementById(`debugContent`);
            var debugText=document.createElement(`p`);
            debugText.setAttribute(`id`,`debug_${debugContent}`);
		debugText.setAttribute(`class`,`debug_p debug_${level}`);
            debugText.innerHTML=`[${level.toUpperCase()} ${debugCount}] ${text}`;
            debugContent.insertBefore(debugText, debugContent.children[0]);

            //Debug输出条目限制
            let countLimit=30; //Count 30 in 1080P
            if(countLimit>0){
                let debugPList=document.getElementsByClassName(`debug_p`);
                if(debugPList.length>countLimit){
                    for(let i=countLimit; i<debugPList.length; i++){
                        let curP=debugPList[i];
                        let parent=document.getElementById(`debugContent`);
                        parent.removeChild(curP);
                    }
                }
            }

            debugCount++;
        }
    }
}

var isRecordingDebugLog=true;
function toggleRecordDebugLogs(){
    if(isRecordingDebugLog==true){
        isRecordingDebugLog=false;

    }else{
        isRecordingDebugLog=true;
    }
    localStorage.setItem(`isRecordingDebugLog`,isRecordingDebugLog);
}

async function wait(n){
    return new Promise(resolve=>{
        setTimeout(()=>{
            resolve();
        },n);
    });
}

function random(minNum,maxNum){
    switch(arguments.length){
        case 1:
            return parseInt(Math.random()*minNum+1,10);
            break;
        case 2:
            return parseInt(Math.random()*(maxNum-minNum+1)+minNum,10);
            break;
        default:
            return 0;
            break;
    }
}

var isFlowDebugLog=true;
function toggleFlowLogs(){
    if(isFlowDebugLog==true){
        isFlowDebugLog=false;
    }else{
        isFlowDebugLog=true;
    }
    localStorage.setItem(`isFlowDebugLog`,isFlowDebugLog);
}

async function flowLogs(){
    let typeList=[`log`,`trace`,`info`,`debug`,`warn`];
	let gameDataList=Object.keys(window);
	let curIndex=0;
	while(true){
		if(debutProtectShow && isRecordingDebugLog && isFlowDebugLog){
			let curKey=gameDataList[Math.floor(Math.random()*gameDataList.length)];
			let curType=typeList[Math.floor(Math.random()*typeList.length)];
			console.flow(window[curKey],true,curType);
			console.flow(curKey,true,`info`);
			await wait(random(0,1000));
		}else{
			await wait(1000);
		}
	}
}

function replaceConsoleDebugLog(){
	var org_console=console;
	console={
		log:function(text,bool){
			pushDebugLog(text,`log`,bool);
			org_console.log(text);
		},
		error:function(text,bool){
			pushDebugLog(text,`error`,bool);
			org_console.error(text);
		},
		warn:function(text,bool){
			pushDebugLog(text,`warn`,bool);
			org_console.warn(text);
		},
		info:function(text,bool){
			pushDebugLog(text,`info`,bool);
			org_console.info(text);
		},
		debug:function(text,bool){
			pushDebugLog(text,`debug`,bool);
			org_console.debug(text);
		},
        flow:function(text,bool,type){
			if(type==undefined){
				type=`log`;
			}
			pushDebugLog(text,type,bool);
		},
	}
}

var GameFPS=0;
function showFPS(){
	var requestAnimationFrame =
		window.requestAnimationFrame || //Chromium
		window.webkitRequestAnimationFrame || //Webkit
		window.mozRequestAnimationFrame || //Mozilla Geko
		window.oRequestAnimationFrame || //Opera Presto
		window.msRequestAnimationFrame || //IE Trident?
		function(callback) { //Fallback function
			window.setTimeout(callback, 1000/60);
		};
	var e,pe,pid,fps,last,offset,step,appendFps;

	fps = 0;
	last = Date.now();
	step = function(){
		offset = Date.now() - last;
		fps += 1;
		if( offset >= 1000 ){
			last += offset;
			appendFps(fps);
			fps = 0;
		}
		requestAnimationFrame( step );
	};
	//显示fps; 如果未指定元素id,默认<body>标签
	appendFps = function(fps){
		GameFPS=fps;
		// if(!e) e=document.createElement('span');
		// pe=pid?document.getElementById(pid):document.getElementsByTagName('body')[0];
		// e.innerHTML = "fps: " + fps;
		// pe.appendChild(e);
	}
	return {
		setParentElementId :  function(id){pid=id;},
		go                 :  function(){step();}
	}
}

function initDebugLogs(){
    /*
	setTimeout(function(){
		//console.info(`DATA ACTORS: ${formatJSON($dataActors,false)}`);
		// console.info(`DATA ARMORS: ${formatJSON($dataArmors,false)}`);
		// console.info(`DATA CLASSES: ${formatJSON($dataClasses,false)}`);
		// console.info(`DATA ITEMS: ${formatJSON($dataItems,false)}`);
		// console.info(`DATA MAPS: ${formatJSON($dataMap,false)}`);
		// console.info(`DATA SYSTEM: ${formatJSON($dataSystem,false)}`);
	},1000);
    */
}

function formatJSON(json,bool){
	var JSON_str=JSON.stringify(json,null,4);
	if(bool!=undefined && bool==false){
		return JSON_str;
	}
	var replaceList=[
		{org:` `,tgt:`&nbsp;`},
		{org:`\n`,tgt:`<br>`},
	];
	for(var i=0; i<replaceList.length; i++){
		JSON_str=JSON_str.split(replaceList[i].org).join(replaceList[i].tgt);
	}
	return JSON_str;
}

function getStorage(name){
	if(name==undefined){
		return localStorage;
	}else{
		return localStorage.getItem(name);
	}
}

function setStorage(name, value){
	if(typeof value==='object'){
		value=JSON.stringify(value);
	}
	localStorage.setItem(name, value);
}

var debugEnabled=1;
(function() {
    'use strict';
    /*
    debugEnabled=parseInt(getStorage(debugEnabled));
    if(isNaN(debugEnabled)){
        debugEnabled=1;
    }
    isRecordingDebugLog=getStorage(isRecordingDebugLog);
    if(isRecordingDebugLog==`true`){
        isRecordingDebugLog=true;
    }else{
        isRecordingDebugLog=false;
    }

    console.log(debugEnabled);
    */

    if(debugEnabled==0){
        return false;
    }else if(debugEnabled==1){
        showFPS().go();
        replaceConsoleDebugLog();
        attachDebugFrame();
        initDebugLogs();

        var debugProtectionOpacity=parseInt(localStorage.getItem(`debugProtectionOpacity`));

        var isShowDebugCover=localStorage.getItem(`isShowDebugCover`);
        if(isShowDebugCover==`false`){
            isShowDebugCover=false;
             toggleDebugProtect(isShowDebugCover);
        }else{
            isShowDebugCover=true;
            toggleDebugProtect(isShowDebugCover);
             if(!isNaN(debugProtectionOpacity)){
                 setDebugProtectionOpacity(debugProtectionOpacity);
             }
        }

        isRecordingDebugLog=localStorage.getItem(`isRecordingDebugLog`);
        if(isRecordingDebugLog==`false`){
            isRecordingDebugLog=false;
        }else{
            isRecordingDebugLog=true;
        }

        isFlowDebugLog=localStorage.getItem(`isFlowDebugLog`);
        if(isFlowDebugLog==`false`){
            isFlowDebugLog=false;
        }else{
            isFlowDebugLog=true;
        }

        flowLogs();
    }
})();