// ==UserScript==
// @name Riddle Master Assistant Reborn
// @version 0.3.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('riddleimage').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/help2',
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);
// tick the correct boxes
if (return_dict.answer.includes('aj')){
document.getElementById('riddler1').children[5].children[0].children[0].checked = true
}
if (return_dict.answer.includes('fs')){
document.getElementById('riddler1').children[2].children[0].children[0].checked = true
}
if (return_dict.answer.includes('pp')){
document.getElementById('riddler1').children[4].children[0].children[0].checked = true
}
if (return_dict.answer.includes('ra')){
document.getElementById('riddler1').children[1].children[0].children[0].checked = true
}
if (return_dict.answer.includes('rd')){
document.getElementById('riddler1').children[3].children[0].children[0].checked = true
}
if (return_dict.answer.includes('ts')){
document.getElementById('riddler1').children[0].children[0].children[0].checked = true
}
// 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');
}
document.getElementById('riddlesubmit').disabled = false;
//GM_notification('Remaining solve: ' + responseheaders['x-ratelimit-remaining'] ,'Riddle Master Assistant');
// document.getElementById('riddleform').childNodes[3].click();
if(document.hasFocus()){
setTimeout(
function(){
console.log('[RMA]INFO: Auto submit with delay of '+extend_submit_interval+' secs');
document.getElementById('riddlesubmit').click()
},
extend_submit_interval*1000
);
}else{
console.log('[RMA]INFO: Auto submit');
setTimeout(() => document.getElementById('riddlesubmit').click(), Math.random() * (8000 - 3000) + 3000);
}
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
}
});
});
});
}