Mad_Kiwi

Toastmaster 8chan javascript

Mar 26th, 2019
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2. * Toastmaster 1.0
  3. * Finds the bread so you don't have to.
  4. *
  5. * Always read the code before pasting it in like an idiot.
  6. */
  7.  
  8. var toast ="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADcAAAA3CAMAAACfBSJ0AAAAS1BMVEXMzMzMmWbMmTP/zJmZZjPMzJmZZgDMZjPMzGb/zGaZZmZmMwCZmWb/mWZmMzP//8yZmTP/zMzMmZmZMwBmZjPMZgCZMzPMZmb///+gGFQUAAAAAXRSTlMAQObYZgAABIBJREFUSMe1Vtly4zgMNEECJCXZTjKZmv//0+luUIqzW3u8jHxIlNA4Ggd1u/2Bo7X22B74/5/iW9Ox749933nxeODqP3E7TOC7b+1BxCfXn/+O+9y2X61FKc0Kj9Z6K/rQ538A8SFkD/da8MG/F/cyvOLf8XT//DuUKgvFIURBfJ9PnHKN/0rkX202+lJooA6cefgTsgLlmrrg+OO7MQpDbBSbuKRfXNYyDYG6VHlC92/mYtAW4+IxcJ60BfQ8QVi/Q8P2DQbhKBPqzGERNuYApFKBVMkLRV/ai5uVsPSIR53kswz8TxifQtaBNX066S/tQBQBm26FwZeBtVEId3GFT80ArI5aV93Ryhvt4fAq7XQPBuegPYonGNfGjC6c+YE80B5drQ5/FFdVTggImsa5y/TCMboWHfcdd0eGb4zPZeVnetjwNUhNcLD8hD6UYU9OZp7oa2XyBnSEu5zBMmwsZmAOaxSwIiSNEBniAZJhmaKs9ElevS5GK2vTqBwwgxX8Vvap0lY1TBYCquPKH2zAeZkbQthgkHNxLz6ZAxY4KuirgaryHZVeVFLDRAE6hjFsS2/M35/1pVyUQTxpinykW4Oqce4ZX4fvUP98HuUL9cW5wnKdGI6qAHd7phGa3r1uL7hDjpKGZET/Jyv0k6fBgvLaLhyKJyM3O5PHxlAeqPCuKyYdP/erPssxTCBfGbeTRTtNcpWFOK76XGybHCllTSRqOixZAcJyyHWrL3V2lAtsg+xO6ZjqYOvyMFQ7wRAunGdmq1Ke1eGDDUtER6eY2EH1m0rislcVzapJcPKmolUDpcpOg8E2rgwi+8/khTzV3CPB1VjIsUhZ7NzhKfpIqUDvcT5oFI7JEkgafRHZQ2G3YJxt0UZcXJSsgilnLiGJeRyWrdnZpMEWc9nrdgaRKYq8IAepMyDODICWYA3XKVyJ6WcYDAD8iXS0Mgus2L1rityj7R1ejyw1KHJFsYK3xodYRu+NvuFHDnDfmAq2WOJKbnd0VSRQB6zJGEzi1CEDBBPYzDz9RFrfSo4RW2PbyC9E8Kh3kxLqhOVOSmdfOBYTouK+GUpbyCTEAhZgH4RQIRaNYzM4PrvaoCv4kgkLWsCNn+CP4ebGA1uImY1fsv3YOCT7ZLXTaKN2yZaeGYAifAO9L3uKn/rpPgH0hkJBRulYi5CjdyriHpN1ppST+oaHTDhr/85EMBd8AJVksym8mbhbb6u7Ccya6zlSVDAIyBgWQDSfA/mWxKiewta+e/aGLS3cG5teZVgErOy+cHVJUd6zuFc31GsS0A1yznEiP6HrYEUG6u3gNnvKaraXrGhRF9lSmCLE/Wi2Rk/uuL4GZ+7PmBVlNb62OK0WL+3ICZcgbR5jTXG+fawdUa83WYdr9Br3d8xFH3rBOjx3nlFz3zpSnd6FnLto6wtnPvKdLF+mSg7NlgMybPGkTVe1+mON+pDvXmJnZo+N++i2AfZRPrbSzoPvs3iPLR+3L5yGaMHL6rbxOVHbR2IB3VRuB57sLJNrB2Rbte3lxp86fgOuVyGN3reBwAAAAABJRU5ErkJggg==";
  9.  
  10. function navigate(url) {
  11. if(typeof url != 'undefined') {
  12. window.location.href=url;
  13. }
  14. }
  15. function get_bread_number(text) {
  16. if ( (text.toLowerCase().indexOf('ebake') != -1)
  17. || (text.toLowerCase().indexOf('research') != -1)) {
  18. var rx = /[^0-9]*([0-9]+)[^0-9]*/g;
  19. var arr = rx.exec(text);
  20. return arr.length > 1 ? arr[1] : false;
  21. }
  22.  
  23. return false;
  24. }
  25.  
  26. function make_toast(url, time) {
  27.  
  28. var response;
  29.  
  30. var age = 100 - ((~~((new Date).getTime() / 1000)) - time)/72;
  31.  
  32. var x = new XMLHttpRequest();
  33. x.open('GET', url, true);
  34.  
  35. x.onreadystatechange = function() {
  36. if(x.readyState === 4 && x.status == 200) {
  37. response = JSON.parse(x.responseText);
  38.  
  39. var target = document.getElementById('dythreads');
  40.  
  41. var bread = response.posts[0];
  42. var posts = response.posts.length;
  43. var opts = document.getElementsByName('toast');
  44.  
  45. for(var i = 0; i < opts.length; i++) {
  46. if (opts[i].getAttribute('no') == bread.no) {
  47. opts[i].setAttribute('old',false)
  48. return;
  49. }
  50. }
  51. var txt = bread.sub;
  52.  
  53. if (typeof txt == 'undefined') {
  54. txt = bread.com;
  55. if (txt.length > 40) {
  56. txt = txt.substring(0,39) + '...';
  57. }
  58. }
  59. var num = get_bread_number(txt);
  60. if (false == num) return;
  61. var img = document.createElement('IMG');
  62.  
  63. var opt = document.createElement('SPAN');
  64.  
  65. opt.setAttribute('title', txt + ' (' + posts + ')' );
  66. opt.setAttribute('no',bread.no);
  67. opt.style.borderRadius='5px';
  68. opt.style.border='1px solid transparent';
  69. opt.addEventListener('mouseover',function() {
  70. opt.style.backgroundColor='rgb(255,255,255,0.4)';
  71. opt.style.cursor='pointer';
  72. });
  73. opt.addEventListener('mouseout',function() {
  74. opt.style.backgroundColor='transparent';
  75. opt.style.cursor='auto';
  76. });
  77. opt.style.height = '76px';
  78. opt.style.width = '70px';
  79. opt.style.verticalAlign='top';
  80. opt.style.textAlign='center';
  81. opt.style.display = 'inline-block';
  82.  
  83.  
  84. img.src = toast;
  85. img.id = "" + bread.no;
  86.  
  87. opt.appendChild(img);
  88. target.appendChild(opt);
  89.  
  90. opt.setAttribute('name','toast');
  91.  
  92.  
  93. var label = document.createElement('SPAN');
  94. label.style.display = 'block';
  95. label.style.fontWeight = 'bold';
  96. var node = document.createTextNode('#' + num);
  97. label.appendChild(node);
  98. opt.appendChild(label);
  99.  
  100. img.style = "filter: saturate(" + age + "%);";
  101. img.style = "filter: brightness(" + age + "%);";
  102.  
  103. opt.onclick = function () {
  104. var no = bread.no;
  105. return navigate("/qresearch/res/" + no + ".html");
  106. };
  107.  
  108.  
  109. opt.setAttribute('old',false);
  110. }
  111. };
  112. x.send();
  113.  
  114. }
  115.  
  116. // every 60 seconds we reload from threads.json
  117. function refresh() {
  118. var opts = document.getElementsByName('toast');
  119.  
  120. // prune expired breads and append new ones.
  121. if (typeof opts != 'undefined' && opts.length) {
  122. for(var i = 0; i < opts.length; i++) {
  123. if(opts[i].getAttribute('old') == true) {
  124. target.removeChild(opts[i]);
  125. console.log('removed option ' + i)
  126. }
  127. else {
  128. opts[i].setAttribute('old',true);
  129. }
  130. }
  131. }
  132.  
  133. var x = new XMLHttpRequest();
  134. x.open('GET', "/qresearch/threads.json", true);
  135. x.onreadystatechange = function() {
  136. if(x.readyState === 4 && x.status == 200) {
  137. var response = JSON.parse(x.responseText);
  138. find_recent_bread(response);
  139. }
  140. };
  141. x.send();
  142.  
  143.  
  144. }
  145. function find_recent_bread(board) {
  146.  
  147. var now = ~~((new Date).getTime() / 1000);
  148. var thread;
  149. for(var i = 0; i < board.length; i++) {
  150. for(var j = 0; j < board[i].threads.length; j++) {
  151. thread = board[i].threads[j];
  152. // only show threads modified within the last 2 hours
  153.  
  154. if (now - thread.last_modified < 7200) {
  155. make_toast('/qresearch/res/'+thread.no + '.json',
  156. thread.last_modified);
  157. }
  158.  
  159. }
  160. }
  161. }
  162.  
  163. var target = document.getElementsByName('postcontrols')[0];
  164.  
  165. // Post controls is loaded and we're already in a thread
  166. // append the controls at the top.
  167. if (target) {
  168.  
  169. var div = document.createElement('DIV');
  170. div.id = 'dythreads';
  171. target.appendChild(div);
  172.  
  173. div.style
  174. = 'z-index:2;'
  175. + 'top:20px;'
  176. + 'padding:1px 3px 0 3px;'
  177. + 'position:fixed;height:1px;width:100%;'
  178. + 'display:block;' ;
  179.  
  180.  
  181. setInterval("refresh();", 60000);
  182. refresh();
  183. }
Add Comment
Please, Sign In to add comment