Riddle Master Assistant Reborn

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

Od 08.04.2021.. Pogledajte najnovija verzija.

// ==UserScript==
// @name         Riddle Master Assistant Reborn
// @version      0.1.0
// @description  ML based riddle master answering bot. Help novice to answer pony problem when encounter riddle master challenge.
// @homepage     https://rdma.mooo.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.mooo.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 = '';


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.mooo.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: 5000,
                url: 'https://rdma.mooo.com/help',
                onload: async function(response){
                    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=='good'){
                        console.log(return_dict);
                        document.getElementById('riddleanswer').value=return_dict.answer;
                        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 about to expire','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(){
                    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
                }
            });
        });
    });
}