Riddle Master Assistant Reborn

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

  1. // ==UserScript==
  2. // @name Riddle Master Assistant Reborn
  3. // @version 0.3.2
  4. // @description ML based riddle master answering bot. Help novice to answer pony problem when encounter riddle master challenge.
  5. // @homepage https://rdma.ooguy.com
  6. // @include http://hentaiverse.org/*
  7. // @include http://alt.hentaiverse.org/*
  8. // @include https://hentaiverse.org/*
  9. // @include https://alt.hentaiverse.org/*
  10. // @compatible Chrome/Chromium + Tampermonkey
  11. // @connect rdma.ooguy.com
  12. // @grant GM.xmlHttpRequest
  13. // @grant GM_notification
  14. // @grant GM.notification
  15. // @grant GM.getValue
  16. // @grant GM.setValue
  17. // @run-at document-end
  18. // @namespace https://greasyfork.org/users/756324
  19. // ==/UserScript==
  20.  
  21. var GM_notification = GM_notification || GM.notification;
  22. //You can specify these two parameter in local storage.
  23. var extend_submit_interval = 3;//delay time for extand waiting when dom has focused at "expecting submit time"
  24. var api_key = '';
  25.  
  26. // From https://jsperf.com/parse-response-headers-from-xhr/3
  27. function parseResponseHeaders(headerStr) {
  28. var l = headerStr.length,
  29. p = -2,
  30. j = 0,
  31. headers = {},
  32. l, i, q, k, v;
  33.  
  34. while ( (p = headerStr.indexOf( "\r\n", (i = p + 2) + 5 )) > i )
  35. (q = headerStr.indexOf( ":", i + 3 )) > i && q < p
  36. && (headers[k = headerStr.slice( i, q ).toLowerCase()] = headerStr.slice( q + 2, p ))[0] === '"'
  37. && (headers[k] = JSON.parse( headers[k] ));
  38. (q = headerStr.indexOf( ":", i + 3 )) > i && q < l
  39. && (headers[k = headerStr.slice( i, q ).toLowerCase()] = headerStr.slice( q + 2 ))[0] === '"'
  40. && (headers[k] = JSON.parse( headers[k] ))
  41. return headers;
  42. }
  43.  
  44. function send_head(){
  45. //GM_notification('INFO: Send awake request to server.','Riddle Master Assistant');
  46. console.log('[RMA]INFO: Send awake request to server');
  47. GM.xmlHttpRequest({
  48. method: 'HEAD',
  49. timeout: 30000,
  50. url: 'https://rdma.ooguy.com/status',
  51. onerror: async function(){
  52. var is_down = await GM.getValue('is_down',false);
  53. if(!is_down){
  54. GM_notification('ERROR: Server not respond','Riddle Master Assistant');
  55. GM.setValue('is_down',true);
  56. }
  57. console.error('[RMA]ERROR: Server not respond');
  58. GM.setValue('check_interval',60);
  59. },
  60. ontimeout: async function(){
  61. var is_down = await GM.getValue('is_down',false);
  62. if(!is_down){
  63. GM_notification('TIMEOUT: Server not respond','Riddle Master Assistant');
  64. GM.setValue('is_down',true);
  65. }
  66. console.error('[RMA]TIMEOUT: Server not respond');
  67. GM.setValue('check_interval',60);
  68. },
  69. onload: async function(response){
  70. if(response.status!=200){
  71. var is_maintenance = await GM.getValue('is_maintenance',false);
  72. if(!is_maintenance){
  73. GM.setValue('is_maintenance',true);
  74. }else{
  75. alert('[RMA]WARNING: Server is in maintenance');
  76. }
  77. console.warn('[RMA]WARNING: Server is in maintenance');
  78. GM.setValue('check_interval',60);
  79. }
  80. else{
  81. if(is_maintenance){
  82. GM_notification('INFO: Server is up','Riddle Master Assistant');
  83. console.log('[RMA]INFO: Server is up');
  84. }
  85. GM.setValue('is_maintenance',false);
  86. GM.setValue('check_interval',3600);
  87. GM.setValue('is_down',false);
  88. }
  89. },
  90. });
  91. }
  92.  
  93. async function stay_awake(){
  94. var d = new Date();
  95. var last_day = await GM.getValue('last_date','0/0/0');
  96. var today = d.getUTCFullYear()+'/'+(d.getUTCMonth()+1)+'/'+d.getUTCDate();
  97. if(today!=last_day){
  98. console.log('[RMA]INFO: Initialize variable')
  99. GM.setValue('last_date',today);
  100. GM.setValue('is_maintenance',false);
  101. GM.setValue('check_interval',3600);
  102. GM.setValue('is_down',false);
  103. }
  104. var now = Date.now();
  105. var ts = Math.floor(now / 1000);
  106. var last_ts = await GM.getValue('last_awake_ts',0);
  107. var check_interval = await GM.getValue('check_interval',3600);
  108. if((ts-last_ts) >= check_interval){
  109. send_head();
  110. GM.setValue('last_awake_ts',ts);
  111. }
  112. }
  113.  
  114. stay_awake();
  115. setInterval(stay_awake,30000);
  116.  
  117. if (document.getElementById('riddlecounter')){
  118. var image_url=document.getElementById('riddleimage').childNodes[0].src;
  119. //GM_notification('INFO: Encounter Riddle Master Challenge','Riddle Master Assistant','https://webrdm.herokuapp.com/favicon.ico');
  120. window.addEventListener('load', function(event) {//need to wait for riddlebot to complete download
  121. var xhr = new Request(image_url,{method:'GET',credentials:'same-origin',cache:'only-if-cached',mode:'same-origin'});
  122. fetch(xhr).then(response => {
  123. if(response.status===200){
  124. return response.blob();
  125. } else {
  126. //throw new Error('Cache not usable');
  127. console.warn('[RMA]WARNING: Can not use cache');
  128. GM_notification('INFO: Can not use cache','Riddle Master Assistant');
  129. var xhr_nocache = new Request(image_url,{method:'GET',credentials:'same-origin',cache:'force-cache',mode:'same-origin'});
  130. fetch(xhr_nocache).then(response_nocache => {
  131. if(response_nocache.status===200){
  132. return response_nocache.blob();
  133. } else {
  134. console.error('[RMA]ERROR: Cannot get riddlebot');
  135. //alert('[RMA]ERROR: Cannot get riddlebot');
  136. throw new Error('Cannot get riddlebot');
  137. }
  138. });
  139. }
  140. }).then(imgData =>{
  141. GM.xmlHttpRequest({
  142. method: 'POST',
  143. timeout: 8666,
  144. url: 'https://rdma.ooguy.com/help2',
  145. onload: async function(response){
  146. console.log('status',response.status, response.status == 429)
  147. var extend_submit_interval = await GM.getValue('extend_submit_interval',3);
  148. var return_dict = JSON.parse(response.responseText);
  149. if(return_dict.return=='error'){
  150. GM_notification('ERROR: Server respond with error','Riddle Master Assistant');
  151. console.error('[RMA]ERROR: Server respond with error');
  152. } else if (return_dict.return=='finish'){
  153. GM_notification('ERROR: No more solves for the day','Riddle Master Assistant Reborn');
  154. }else if(return_dict.return=='good'){
  155. console.log(return_dict);
  156. var responseheaders = parseResponseHeaders(response.responseHeaders);
  157.  
  158. // tick the correct boxes
  159. if (return_dict.answer.includes('aj')){
  160. document.getElementById('riddler1').children[5].children[0].children[0].checked = true
  161. }
  162. if (return_dict.answer.includes('fs')){
  163. document.getElementById('riddler1').children[2].children[0].children[0].checked = true
  164. }
  165. if (return_dict.answer.includes('pp')){
  166. document.getElementById('riddler1').children[4].children[0].children[0].checked = true
  167. }
  168. if (return_dict.answer.includes('ra')){
  169. document.getElementById('riddler1').children[1].children[0].children[0].checked = true
  170. }
  171. if (return_dict.answer.includes('rd')){
  172. document.getElementById('riddler1').children[3].children[0].children[0].checked = true
  173. }
  174. if (return_dict.answer.includes('ts')){
  175. document.getElementById('riddler1').children[0].children[0].children[0].checked = true
  176. }
  177. // document.getElementById('riddleanswer').value=return_dict.answer;
  178. if (responseheaders['x-ratelimit-remaining'] < 3){
  179. GM_notification('WARNING: Remaining solves = ' + responseheaders['x-ratelimit-remaining'] + ' for the day','Riddle Master Assistant Reborn');
  180. }
  181. document.getElementById('riddlesubmit').disabled = false;
  182. //GM_notification('Remaining solve: ' + responseheaders['x-ratelimit-remaining'] ,'Riddle Master Assistant');
  183. // document.getElementById('riddleform').childNodes[3].click();
  184.  
  185. if(document.hasFocus()){
  186. setTimeout(
  187. function(){
  188. console.log('[RMA]INFO: Auto submit with delay of '+extend_submit_interval+' secs');
  189. document.getElementById('riddlesubmit').click()
  190. },
  191. extend_submit_interval*1000
  192. );
  193. }else{
  194. console.log('[RMA]INFO: Auto submit');
  195. setTimeout(() => document.getElementById('riddlesubmit').click(), Math.random() * (8000 - 3000) + 3000);
  196. }
  197.  
  198. if(return_dict.expire==true){
  199. GM_notification('WARNING: License is expired/invalid','Riddle Master Assistant Reborn');
  200. }
  201. }else{
  202. GM_notification('ERROR: Server respond with unknown result','Riddle Master Assistant');
  203. console.error('[RMA]ERROR: Server respond with unknown result');
  204. }
  205. },
  206. onerror: function(response){
  207. //console.log('WTF RESPONSE PLS',response)
  208. if(response.status == 429){
  209. GM_notification('ERROR: All solves used up for this IP today','Riddle Master Assistant');
  210. } else {
  211. GM_notification('ERROR: Send request error','Riddle Master Assistant');
  212. console.error('[RMA]ERROR: Send request error');
  213. }
  214. },
  215. ontimeout: function(){
  216. GM_notification('TIMEOUT: Server not respond','Riddle Master Assistant');
  217. console.error('[RMA]TIMEOUT: Server does not respond');
  218. },
  219. binary: true,
  220. data: imgData,
  221. headers: {
  222. 'Content-Type':'image/jpeg',
  223. 'apikey': api_key
  224. }
  225. });
  226. });
  227. });
  228. }