Sleazy Fork is available in English.

Riddle Master Assistant Reborn

ML based riddle master answering bot. Help novice to answer pony problem when encounter riddle master challenge.

Від 17.09.2021. Дивіться остання версія.

// ==UserScript==
// @name         Riddle Master Assistant Reborn
// @version      0.2.2
// @description  ML based riddle master answering bot. Help novice to answer pony problem when encounter riddle master challenge.
// @homepage     https://rdma.ooguy.com
// @include      http://hentaiverse.org/*
// @include      http://alt.hentaiverse.org/*
// @include      https://hentaiverse.org/*
// @include      https://alt.hentaiverse.org/*
// @compatible   Chrome/Chromium + Tampermonkey
// @connect      rdma.ooguy.com
// @grant        GM.xmlHttpRequest
// @grant        GM_notification
// @grant        GM.notification
// @grant        GM.getValue
// @grant        GM.setValue
// @run-at       document-end
// @namespace https://greasyfork.org/users/756324
// ==/UserScript==

var GM_notification = GM_notification || GM.notification;
//You can specify these two parameter in local storage.
var extend_submit_interval = 3;//delay time for extand waiting when dom has focused at "expecting submit time"
var api_key = '';

// From https://jsperf.com/parse-response-headers-from-xhr/3
function parseResponseHeaders(headerStr) {
	var l = headerStr.length,
	p = -2,
	j = 0,
	headers = {},
	l, i, q, k, v;

	while ( (p = headerStr.indexOf( "\r\n", (i = p + 2) + 5 )) > i )
		(q = headerStr.indexOf( ":", i + 3 )) > i && q < p
		&& (headers[k = headerStr.slice( i, q ).toLowerCase()] = headerStr.slice( q + 2, p ))[0] === '"'
		&& (headers[k] = JSON.parse( headers[k] ));
		(q = headerStr.indexOf( ":", i + 3 )) > i && q < l
		&& (headers[k = headerStr.slice( i, q ).toLowerCase()] = headerStr.slice( q + 2 ))[0] === '"'
		&& (headers[k] = JSON.parse( headers[k] ))
	return headers;
}

function send_head(){
    //GM_notification('INFO: Send awake request to server.','Riddle Master Assistant');
    console.log('[RMA]INFO: Send awake request to server');
    GM.xmlHttpRequest({
        method: 'HEAD',
        timeout: 30000,
        url: 'https://rdma.ooguy.com/status',
        onerror: async function(){
            var is_down = await GM.getValue('is_down',false);
            if(!is_down){
                GM_notification('ERROR: Server not respond','Riddle Master Assistant');
                GM.setValue('is_down',true);
            }
            console.error('[RMA]ERROR: Server not respond');
            GM.setValue('check_interval',60);
        },
        ontimeout: async function(){
            var is_down = await GM.getValue('is_down',false);
            if(!is_down){
                GM_notification('TIMEOUT: Server not respond','Riddle Master Assistant');
                GM.setValue('is_down',true);
            }
            console.error('[RMA]TIMEOUT: Server not respond');
            GM.setValue('check_interval',60);
        },
        onload: async function(response){
            if(response.status!=200){
                var is_maintenance = await GM.getValue('is_maintenance',false);
                if(!is_maintenance){
                    GM.setValue('is_maintenance',true);
                }else{
                    alert('[RMA]WARNING: Server is in maintenance');
                }
                console.warn('[RMA]WARNING: Server is in maintenance');
                GM.setValue('check_interval',60);
            }
            else{
                if(is_maintenance){
                    GM_notification('INFO: Server is up','Riddle Master Assistant');
                    console.log('[RMA]INFO: Server is up');
                }
                GM.setValue('is_maintenance',false);
                GM.setValue('check_interval',3600);
                GM.setValue('is_down',false);
            }
        },
    });
}

async function stay_awake(){
    var d = new Date();
    var last_day = await GM.getValue('last_date','0/0/0');
    var today = d.getUTCFullYear()+'/'+(d.getUTCMonth()+1)+'/'+d.getUTCDate();
    if(today!=last_day){
        console.log('[RMA]INFO: Initialize variable')
        GM.setValue('last_date',today);
        GM.setValue('is_maintenance',false);
        GM.setValue('check_interval',3600);
        GM.setValue('is_down',false);
    }
    var now = Date.now();
    var ts = Math.floor(now / 1000);
    var last_ts = await GM.getValue('last_awake_ts',0);
    var check_interval = await GM.getValue('check_interval',3600);
    if((ts-last_ts) >= check_interval){
        send_head();
        GM.setValue('last_awake_ts',ts);
    }
}

stay_awake();
setInterval(stay_awake,30000);

if (document.getElementById('riddlecounter')){
    var image_url=document.getElementById('riddlebot').childNodes[0].src;
    //GM_notification('INFO: Encounter Riddle Master Challenge','Riddle Master Assistant','https://webrdm.herokuapp.com/favicon.ico');
    window.addEventListener('load', function(event) {//need to wait for riddlebot to complete download
        var xhr = new Request(image_url,{method:'GET',credentials:'same-origin',cache:'only-if-cached',mode:'same-origin'});
        fetch(xhr).then(response => {
            if(response.status===200){
                return response.blob();
            } else {
                //throw new Error('Cache not usable');
                console.warn('[RMA]WARNING: Can not use cache');
                GM_notification('INFO: Can not use cache','Riddle Master Assistant');
                var xhr_nocache = new Request(image_url,{method:'GET',credentials:'same-origin',cache:'force-cache',mode:'same-origin'});
                fetch(xhr_nocache).then(response_nocache => {
                    if(response_nocache.status===200){
                        return response_nocache.blob();
                    } else {
                        console.error('[RMA]ERROR: Cannot get riddlebot');
                        //alert('[RMA]ERROR: Cannot get riddlebot');
                        throw new Error('Cannot get riddlebot');
                    }
                });
            }
        }).then(imgData =>{
            GM.xmlHttpRequest({
                method: 'POST',
                timeout: 8666,
                url: 'https://rdma.ooguy.com/help',
                onload: async function(response){
					
					console.log('status',response.status, response.status == 429)
					
					var extend_submit_interval = await GM.getValue('extend_submit_interval',3);
					var return_dict = JSON.parse(response.responseText);
					if(return_dict.return=='error'){
						GM_notification('ERROR: Server respond with error','Riddle Master Assistant');
						console.error('[RMA]ERROR: Server respond with error');
					} else if (return_dict.return=='finish'){
						GM_notification('ERROR: No more solves for the day','Riddle Master Assistant Reborn');
					}else if(return_dict.return=='good'){
						console.log(return_dict);
						var responseheaders = parseResponseHeaders(response.responseHeaders);

						document.getElementById('riddleanswer').value=return_dict.answer;
						
						if (responseheaders['x-ratelimit-remaining'] < 3){
							GM_notification('WARNING: Remaining solves = ' +  responseheaders['x-ratelimit-remaining'] + ' for the day','Riddle Master Assistant Reborn');
						}
						
						//GM_notification('Remaining solve: ' + responseheaders['x-ratelimit-remaining'] ,'Riddle Master Assistant');
						
						if(document.hasFocus()){
							setTimeout(
								function(){
									console.log('[RMA]INFO: Auto submit with delay of '+extend_submit_interval+' secs');
									document.getElementById('riddleform').childNodes[3].click();
								},
								extend_submit_interval*1000
							);
						}else{
							console.log('[RMA]INFO: Auto submit');
							document.getElementById('riddleform').childNodes[3].click();
						}

						if(return_dict.expire==true){
							GM_notification('WARNING: License is expired/invalid','Riddle Master Assistant Reborn');
						}
						
					}else{
						GM_notification('ERROR: Server respond with unknown result','Riddle Master Assistant');
						console.error('[RMA]ERROR: Server respond with unknown result');
					}
					
                },
                onerror: function(response){
					
					//console.log('WTF RESPONSE PLS',response)
					if(response.status == 429){
						GM_notification('ERROR: All solves used up for this IP today','Riddle Master Assistant');
					} else {
						GM_notification('ERROR: Send request error','Riddle Master Assistant');
						console.error('[RMA]ERROR: Send request error');
					}
                },
                ontimeout: function(){
                    GM_notification('TIMEOUT: Server not respond','Riddle Master Assistant');
                    console.error('[RMA]TIMEOUT: Server does not respond');
                },
                binary: true,
                data: imgData,
                headers: {
                    'Content-Type':'image/jpeg',
					'apikey': api_key
                }
            });
        });
    });
}