Hacktimer

HackTimer by Turuslan, uploaded by Azti for 7Placer.

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.cn-greasyfork.org/scripts/498080/1395134/Hacktimer.js

  1. // ==UserScript==
  2. // @license MIT
  3. // ==/UserScript==
  4. (function (workerScript) {
  5. if (!/MSIE 10/i.test (navigator.userAgent)) {
  6. try {
  7. var blob = new Blob (["\
  8. var fakeIdToId = {};\
  9. onmessage = function (event) {\
  10. var data = event.data,\
  11. name = data.name,\
  12. fakeId = data.fakeId,\
  13. time;\
  14. if(data.hasOwnProperty('time')) {\
  15. time = data.time;\
  16. }\
  17. switch (name) {\
  18. case 'setInterval':\
  19. fakeIdToId[fakeId] = setInterval(function () {\
  20. postMessage({fakeId: fakeId});\
  21. }, time);\
  22. break;\
  23. case 'clearInterval':\
  24. if (fakeIdToId.hasOwnProperty (fakeId)) {\
  25. clearInterval(fakeIdToId[fakeId]);\
  26. delete fakeIdToId[fakeId];\
  27. }\
  28. break;\
  29. case 'setTimeout':\
  30. fakeIdToId[fakeId] = setTimeout(function () {\
  31. postMessage({fakeId: fakeId});\
  32. if (fakeIdToId.hasOwnProperty (fakeId)) {\
  33. delete fakeIdToId[fakeId];\
  34. }\
  35. }, time);\
  36. break;\
  37. case 'clearTimeout':\
  38. if (fakeIdToId.hasOwnProperty (fakeId)) {\
  39. clearTimeout(fakeIdToId[fakeId]);\
  40. delete fakeIdToId[fakeId];\
  41. }\
  42. break;\
  43. }\
  44. }\
  45. "]);
  46. // Obtain a blob URL reference to our worker 'file'.
  47. workerScript = window.URL.createObjectURL(blob);
  48. } catch (error) {
  49. /* Blob is not supported, use external script instead */
  50. }
  51. }
  52. var worker,
  53. fakeIdToCallback = {},
  54. lastFakeId = 0,
  55. maxFakeId = 0x7FFFFFFF, // 2 ^ 31 - 1, 31 bit, positive values of signed 32 bit integer
  56. logPrefix = 'HackTimer.js by turuslan: ';
  57. if (typeof (Worker) !== 'undefined') {
  58. function getFakeId () {
  59. do {
  60. if (lastFakeId == maxFakeId) {
  61. lastFakeId = 0;
  62. } else {
  63. lastFakeId ++;
  64. }
  65. } while (fakeIdToCallback.hasOwnProperty (lastFakeId));
  66. return lastFakeId;
  67. }
  68. try {
  69. worker = new Worker (workerScript);
  70. window.setInterval = function (callback, time /* , parameters */) {
  71. var fakeId = getFakeId ();
  72. fakeIdToCallback[fakeId] = {
  73. callback: callback,
  74. parameters: Array.prototype.slice.call(arguments, 2)
  75. };
  76. worker.postMessage ({
  77. name: 'setInterval',
  78. fakeId: fakeId,
  79. time: time
  80. });
  81. return fakeId;
  82. };
  83. window.clearInterval = function (fakeId) {
  84. if (fakeIdToCallback.hasOwnProperty(fakeId)) {
  85. delete fakeIdToCallback[fakeId];
  86. worker.postMessage ({
  87. name: 'clearInterval',
  88. fakeId: fakeId
  89. });
  90. }
  91. };
  92. window.setTimeout = function (callback, time /* , parameters */) {
  93. var fakeId = getFakeId ();
  94. fakeIdToCallback[fakeId] = {
  95. callback: callback,
  96. parameters: Array.prototype.slice.call(arguments, 2),
  97. isTimeout: true
  98. };
  99. worker.postMessage ({
  100. name: 'setTimeout',
  101. fakeId: fakeId,
  102. time: time
  103. });
  104. return fakeId;
  105. };
  106. window.clearTimeout = function (fakeId) {
  107. if (fakeIdToCallback.hasOwnProperty(fakeId)) {
  108. delete fakeIdToCallback[fakeId];
  109. worker.postMessage ({
  110. name: 'clearTimeout',
  111. fakeId: fakeId
  112. });
  113. }
  114. };
  115. worker.onmessage = function (event) {
  116. var data = event.data,
  117. fakeId = data.fakeId,
  118. request,
  119. parameters,
  120. callback;
  121. if (fakeIdToCallback.hasOwnProperty(fakeId)) {
  122. request = fakeIdToCallback[fakeId];
  123. callback = request.callback;
  124. parameters = request.parameters;
  125. if (request.hasOwnProperty ('isTimeout') && request.isTimeout) {
  126. delete fakeIdToCallback[fakeId];
  127. }
  128. }
  129. if (typeof (callback) === 'string') {
  130. try {
  131. callback = new Function (callback);
  132. } catch (error) {
  133. console.log (logPrefix + 'Error parsing callback code string: ', error);
  134. }
  135. }
  136. if (typeof (callback) === 'function') {
  137. callback.apply (window, parameters);
  138. }
  139. };
  140. worker.onerror = function (event) {
  141. console.log (event);
  142. };
  143. } catch (error) {
  144. console.log (logPrefix + 'Initialisation failed');
  145. console.error (error);
  146. }
  147. } else {
  148. console.log (logPrefix + 'Initialisation failed - HTML5 Web Worker is not supported');
  149. }
  150. }) ('HackTimerWorker.js');