mGET

Fancy GET script, !kittensORw's fork c: Requires 4chan-X.

  1. // ==UserScript==
  2. // @name mGET
  3. // @description Fancy GET script, !kittensORw's fork c: Requires 4chan-X.
  4. // @author mizzl
  5. // @require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
  6. // @include http://boards.4chan.org/*
  7. // @include https://boards.4chan.org/*
  8. // @grant GM_xmlhttpRequest
  9. // @version 0.0.1.20140723004400
  10. // @namespace https://greatest.deepsurf.us/users/3797
  11. // ==/UserScript==
  12.  
  13. this.$ = this.jQuery = jQuery.noConflict(true); // bug fix
  14.  
  15. var board = location.pathname.match(/\/[^\/]+\//)[0];
  16.  
  17. if (board != '/b/') {
  18. $(document).on('QRDialogCreation', bindMGET);
  19. }
  20. $(document).ready(findLatestPostNumber);
  21.  
  22. var latestPostNumber = -1;
  23. var targetPostNumber = -1;
  24.  
  25. var mGetSelect = $('<select title="mGET"></select>');
  26.  
  27. var targets = {
  28. dubs: function (postNumber) {
  29. var digits = postNumber % 100;
  30. if (digits == 99) {
  31. return postNumber + 1; // next dubs are 00
  32. } else {
  33. return postNumber + (11 - digits % 11);
  34. }
  35. },
  36. trips: function (postNumber) {
  37. var digits = postNumber % 1000;
  38. if (digits == 999) {
  39. return postNumber + 1; // next trips are 000
  40. } else {
  41. return postNumber + (111 - digits % 111);
  42. }
  43. },
  44. quads: function (postNumber) {
  45. var digits = postNumber % 10000;
  46. if (digits == 9999) {
  47. return postNumber + 1; // next quads are 0000
  48. } else {
  49. return postNumber + (1111 - digits % 1111);
  50. }
  51. },
  52. quints: function (postNumber) {
  53. var digits = postNumber % 100000;
  54. if (digits == 99999) {
  55. return postNumber + 1; // next quints are 00000
  56. } else {
  57. return postNumber + (11111 - digits % 11111);
  58. }
  59. },
  60. sixtynine: function (postNumber) {
  61. return postNumber + (69 - (postNumber % 100));
  62. },
  63. seven: function (postNumber) {
  64. return postNumber + (7 - (postNumber % 10));
  65. }
  66. };
  67. populateMGETSelect(targets);
  68.  
  69. function bindMGET() {
  70. var qr = $('#qr');
  71. var submitButton = qr.find('form #file-n-submit-container #file-n-submit input:submit');
  72. var postNumberDisplay = $('<strong style="padding-left: 25px">#</strong><i id="mGETPostNumberDisplay">~</i>');
  73.  
  74. $(document).on('MTargetPostNumberReached', function () {
  75. submitButton.trigger('click');
  76. });
  77.  
  78. $(document).on('MTargetPostNumberMissed', function () {
  79. document.dispatchEvent(new CustomEvent('CreateNotification', {
  80. type: 'warning',
  81. content: 'Missed target post number '+targetPostNumber
  82. }));
  83. targetPostNumber = -1;
  84. });
  85.  
  86. qr.find('div select')
  87. .after(postNumberDisplay)
  88. .after(mGetSelect)
  89. .after('<strong style="padding-left: 10px">mGET</strong>');
  90.  
  91. document.dispatchEvent(new CustomEvent('QRAddPreSubmitHook', {detail: mGETSubmit}));
  92.  
  93. console.log('mGET bound');
  94. }
  95.  
  96. function mGETSubmit() {
  97. if (latestPostNumber + 1 == targetPostNumber) {
  98. targetPostNumber = -1;
  99. return null;
  100. }
  101.  
  102. var selectedTarget = mGetSelect.find('option:selected').val();
  103. if (selectedTarget == 'none') {
  104. return null;
  105. }
  106.  
  107. console.log('Target is ' + selectedTarget);
  108. targetPostNumber = targets[selectedTarget](latestPostNumber);
  109.  
  110. return "Waiting for post number " + targetPostNumber;
  111. }
  112.  
  113. function urlForPostNumber(postNumber) {
  114. return "http://sys.4chan.org" + board + "imgboard.php?res=" + postNumber;
  115. }
  116.  
  117. function checkLatestPostNumber() {
  118. var url = urlForPostNumber(latestPostNumber + 1);
  119. GM_xmlhttpRequest({
  120. url: url,
  121. method: "HEAD",
  122. onload: function (res) {
  123. if (res.status == 200) {
  124. latestPostNumber++;
  125. checkLatestPostNumber();
  126. } else {
  127. var displayText = (targetPostNumber == -1) ?
  128. latestPostNumber + '' :
  129. latestPostNumber + ' +' + (targetPostNumber - latestPostNumber);
  130. $('#mGETPostNumberDisplay').text(displayText);
  131. if (latestPostNumber + 1 == targetPostNumber) {
  132. $(document).trigger('MTargetPostNumberReached');
  133. } else if (targetPostNumber <= latestPostNumber) {
  134. $(document).trigger('MTargetPostNumberMissed');
  135. }
  136. checkLatestPostNumber();
  137. }
  138. }
  139. });
  140. }
  141.  
  142. function findLatestPostNumber() {
  143. function guessLatestPostNumber() {
  144. console.log('Guessing latest post number');
  145. var postNumLinks = $('span.postNum a:nth-child(2)');
  146. postNumLinks.each(function (index, postNumLink) {
  147. var postNumber = parseInt(postNumLink.text.match(/(\d+)/)[0]);
  148. latestPostNumber = postNumber > latestPostNumber ? postNumber : latestPostNumber;
  149. });
  150. console.log('Guessed post number: ' + latestPostNumber);
  151. }
  152.  
  153. if (latestPostNumber == -1) { // we haven't taken a guess yet
  154. guessLatestPostNumber();
  155. }
  156.  
  157. checkLatestPostNumber();
  158. }
  159.  
  160. function populateMGETSelect(targets) {
  161. if (board == '/b/') {
  162. mGetSelect.prop('disabled', true);
  163. mGetSelect.append('<option value="none">disabled</option>');
  164. } else {
  165. mGetSelect.append('<option value="none">none</option>');
  166. for (var targetKey in targets) {
  167. mGetSelect.append('<option value="' + targetKey + '">' + targetKey + '</option>');
  168. }
  169. }
  170. }
  171.  
  172. console.log('mGET loaded');