Countdown Timer for the Random Encounter Event on E-Hentai

Adds a countdown timer for the Random Encounter event on E-Hentai.org and its subdomains.

  1. // ==UserScript==
  2. // @name Countdown Timer for the Random Encounter Event on E-Hentai
  3. // @description Adds a countdown timer for the Random Encounter event on E-Hentai.org and its subdomains.
  4. // @grant none
  5. // @include https://e-hentai.org/*
  6. // @include https://*.e-hentai.org/*
  7. // @version 0.0.1.20170121223709
  8. // @namespace https://greasyfork.org/users/2233
  9. // ==/UserScript==
  10.  
  11. var wnd = window
  12. var doc = wnd.document
  13. var loc = location
  14. var href = loc.href
  15.  
  16. if(!doc.querySelector('*[name="ipb_login_submit"]') && /(\.e-hentai\.org\/)|(^e-hentai.org\/)/.test(loc.hostname+'/') && !/\/palette\.html?\b/.test(href) && !doc.getElementById('countdown_timer')) {
  17. var set_cookie = function(k, v, t) {
  18. var expires = '; expires=Fri, 31 Dec 9999 23:59:59 GMT'
  19. if(t) {
  20. var d = new Date()
  21. d.setTime(d.getTime() + (t * 24 * 60 * 60 * 1000))
  22. expires = '; expires=' + d.toGMTString()
  23. }
  24. doc.cookie = k + '=' + escape(v) + expires + '; domain=.' + /[^\.]+\.[^\.]+$/.exec(loc.hostname)[0] + '; path=/';
  25. //doc.cookie = k + '=' + escape(v) + expires + '; path=/';
  26. }
  27. var get_cookie = function(k) {
  28. var n = k + '='
  29. var ca = doc.cookie.split(';')
  30. for(var i=0; i<ca.length; i++) {
  31. var c = ca[i]
  32. while (c.charAt(0) == ' ') { c = c.substring(1) }
  33. if (c.indexOf(n) == 0) { return unescape(c.substring(n.length, c.length)) }
  34. }
  35. return undefined
  36. }
  37.  
  38. if(!get_cookie('event')) { console.log('The "event" cookie does not exist or is invalid.'); throw 'exit' }
  39. if(!get_cookie('re_cnt')) { set_cookie('re_cnt', 0) }
  40. if(!get_cookie('re_lst')) { set_cookie('re_lst', '[]') }
  41.  
  42. var timer_box = doc.createElement('DIV')
  43. timer_box.id = 'countdown_timer'
  44. timer_box.onclick = function() { if(/\bReady\b/i.test(this.textContent)) { wnd.open('https://e-hentai.org/news.php', href=='https://e-hentai.org/news.php'?'_self':'_blank') } }
  45.  
  46. var toggle_re_lst = function() {
  47. //alert(get_cookie('re_lst'))
  48. var re_lst_box = doc.getElementById('re_lst_box')
  49. if(re_lst_box) { re_lst_box.parentNode.removeChild(re_lst_box); return }
  50. re_lst_box = doc.createElement('DIV')
  51. re_lst_box.id = 're_lst_box'
  52. re_lst_box.style.cssText = 'top:15px; right:0px; position:fixed; z-index:2147483647; background:rgba(0,255,0,1); color:#ff0000;'
  53. setTimeout(function() { re_lst_box.style.cssText = 'top:15px; right:0px; position:fixed; z-index:2147483647; background:rgba(0,255,0,0.2); color:#ff0000;' }, 3000)
  54. re_lst_box.innerHTML = '[List of RE Events Occurred Today]<BR>'
  55. re_lst_box.onmouseover = function () { this.style.cssText = 'top:15px; right:0px; position:fixed; z-index:2147483647; background:rgba(0,255,0,1); color:#ff0000;' }
  56. re_lst_box.onmouseout = function () { this.style.cssText = 'top:15px; right:0px; position:fixed; z-index:2147483647; background:rgba(0,255,0,0.2); color:#ff0000;' }
  57. var decode_hv_b64 = function(e) {
  58. var a = doc.createElement('A')
  59. a.href = 'http://hentaiverse.org/?s=Battle&ss=ba&encounter=' + e
  60. a.target = '_blank'
  61. a.text = (i+1) + '. '
  62. a.style.cssText = 'color:#ff0000'
  63. var d = atob(e)
  64. var m = /([^-]+?)-([^-]+?)-([^-]+)/.exec(d)
  65. if(m == null) { return a }
  66. var uid = m[1]
  67. var epoch = m[2]
  68. var hash = m[3]
  69. var da = new Date()
  70. da.setTime(parseInt(epoch)*1000)
  71. da = da.toLocaleTimeString()
  72. a.text = a.text + da
  73. return a
  74. }
  75. var re_lst = JSON.parse(get_cookie('re_lst'))
  76. if(re_lst) {
  77. for(var i=0, len=re_lst.length; i<len; i++) {
  78. var a = decode_hv_b64(re_lst[i])
  79. if(i != 0) { re_lst_box.appendChild(doc.createElement('BR')) }
  80. re_lst_box.appendChild(a)
  81. }
  82. doc.body.appendChild(re_lst_box)
  83. }
  84. }
  85. addEventListener('keydown', function(evt) { if((evt.target.tagName!='INPUT') && (evt.target.tagName!='TEXTAREA') && (evt.keyCode == 76)) { toggle_re_lst() } }, false)
  86. if(href == 'https://e-hentai.org/news.php') { toggle_re_lst() }
  87.  
  88. var newshead = doc.getElementById('newshead')
  89. if(newshead && /\/e-hentai\./.test(href)) {
  90. timer_box.style.color = '#ff0000'
  91. newshead.appendChild(timer_box)
  92. } else {
  93. timer_box.style.cssText = 'line-height:15px; top:0px; right:0px; position:fixed; z-index:2147483647; background:rgba(0,255,0,0.2); color:#ff0000;'
  94. doc.body.appendChild(timer_box)
  95. }
  96.  
  97. var update_timer = function() {
  98. if(href == 'https://e-hentai.org/news.php') {
  99. var da = new Date()
  100. if((da.getUTCHours()==0) && (da.getUTCMinutes()==0) && (da.getUTCSeconds()<=10)) {
  101. if(!/^Your IP.*banned/i.test(doc.body.textContent)) {
  102. setTimeout(function() {loc.reload()}, 10000)
  103. }
  104. }
  105. }
  106. var now = Math.floor(new Date().getTime()/1000)
  107. var diff = parseInt(get_cookie('event')) + 1800 - now
  108. if(isNaN(diff)) { setTimeout(function() {loc.reload()}, 60000); return }
  109. if(diff <= 0) {
  110. timer_box.textContent = 'Ready! re_cnt=' + get_cookie('re_cnt')
  111. if(href == 'https://e-hentai.org/news.php') {
  112. if(/^Your IP.*banned/i.test(doc.body.textContent)) {}
  113. else if(/The site is currently in Read Only\/Failover Mode/i.test(doc.documentElement.innerHTML)) { setTimeout(function() {loc.reload()}, 60000) }
  114. else { loc.reload() }
  115. return
  116. }
  117. } else {
  118. var mm = Math.floor(diff / 60) + ''
  119. mm = (mm.length >= 2 ? mm : '0' + mm)
  120. var ss = Math.floor(diff % 60) + ''
  121. ss = (ss.length >= 2 ? ss : '0' + ss)
  122. timer_box.textContent = mm + ':' + ss + ', re_cnt=' + get_cookie('re_cnt')
  123. if( (mm == '00') || ((mm == '01') && (ss == '00')) ) {
  124. try {
  125. if(doc.getElementById('eventpane').getElementsByTagName('div')[1].getElementsByTagName('a')[0].textContent != 'HentaiVerse') {
  126. if(!doc.getElementById('re_snd')) {
  127. var audio = new Audio('http://www.freesound.org/data/previews/234/234524_4019029-lq.mp3')
  128. audio.id = 're_snd'
  129. audio.volume = 1
  130. audio.loop = true
  131. audio.play()
  132. doc.body.appendChild(audio)
  133. }
  134. if(/50|40|30|20|10|05|00/.test(ss)) { alert('Random Encounter') }
  135. }
  136. else {
  137. if(doc.getElementById('re_snd')) {
  138. doc.getElementById('re_snd').parentNode.removeChild(doc.getElementById('re_snd'))
  139. }
  140. }
  141. } catch(e) {}
  142. }
  143. }
  144. setTimeout(update_timer, 1000)
  145. }
  146. update_timer()
  147.  
  148. var eventpane = doc.getElementById('eventpane')
  149. if(eventpane != null) {
  150. var re_evt = eventpane.querySelector('a[onclick*="http://hentaiverse.org/"]')
  151. //var re_evt = eventpane.getElementsByTagName('div')[1].getElementsByTagName('a')[0]
  152. if(re_evt) {
  153. var hv_lnk = ''
  154. if((/^http:\/\//.test(re_evt.href)) && (!/#/.test(re_evt.href))) { hv_lnk = re_evt.href }
  155. else {
  156. hv_lnk = /.*window\.open\(['"]?([^'"]+)['"]?/.exec(re_evt.onclick.toString().split('\n').join(''))
  157. if(hv_lnk) { hv_lnk = hv_lnk[1] }
  158. }
  159. if(hv_lnk) {
  160. hv_b64 = hv_lnk.replace(/.+?&encounter=([^&]*).*/, '$1') // the base64 encoded part
  161. var re_lst = JSON.parse(get_cookie('re_lst'))
  162. if((!re_lst) || (re_lst.length == 0)) { re_lst = [] }
  163. if(re_lst.indexOf(hv_b64) == -1) { re_lst.push(hv_b64) }
  164. re_lst = JSON.stringify(re_lst, null, ' ')
  165. set_cookie('re_lst', re_lst)
  166. }
  167. else {
  168. console.log('Error: There is a random encounter event but the HentaiVerse link cannot be found.')
  169. throw 'exit'
  170. }
  171. re_evt.addEventListener('click', function() {
  172. if(re_evt.text != 'HentaiVerse') {
  173. set_cookie('re_cnt', parseInt(get_cookie('re_cnt'))+1)
  174. re_evt.text = 'HentaiVerse'
  175. if(doc.getElementById('re_lst_box')) { toggle_re_lst(); toggle_re_lst() }
  176. }
  177. eventpane.style.display = 'block'
  178. }, false)
  179. }
  180. else if(/\bdawn\b/i.test(eventpane.textContent)) {
  181. set_cookie('re_cnt', 0)
  182. set_cookie('re_lst', '[]')
  183. if(doc.getElementById('re_lst_box')) { toggle_re_lst(); toggle_re_lst() }
  184. }
  185. }
  186. }