Greasy Fork 支持简体中文。

DC_auto_refresh_test_only

Custom auto-refresh, display ping/delay network info overlay.

  1. // ==UserScript==
  2. // @name DC_auto_refresh_test_only
  3. // @author Ladoria
  4. // @version 0.2
  5. // @grant none
  6. // @description Custom auto-refresh, display ping/delay network info overlay.
  7. // @match http://www.dreadcast.net/Main
  8. // @match http://www.dreadcast.net/Index
  9. // @copyright 2015+, Ladoria
  10. // @namespace InGame
  11. // ==/UserScript==
  12.  
  13. /*
  14. Reload or ask to reload window if no successful network activityfor a while
  15. Display tiny overlay on left top of window. (Delay between 2 refreshs)
  16. Display alert message before reload (Can be deactivated)
  17. Always can abort a reload
  18. */
  19.  
  20. // Global
  21. var reload_asked = 0;
  22. var last_request_completed = Date.now();
  23. var check_delay = 3000; // In ms, x >= 3000. DC's refresh is each ~2950ms.
  24. var lag_buster = 10000; // In ms, setted to casual or hard mode.
  25. var casual_lag_buster = 10000; // In ms, x >= 2000. Time to activate reconnection routine. Because lag is life, m'k.
  26. var hard_lag_buster = 600000; // In ms, x >= 600000 (10min). Time to activate reconnection routine during hard lagging.
  27. casual_lag_buster += check_delay; // Basic anti-lag security
  28. hard_lag_buster += check_delay;
  29. var refresh_time_limit = 120000; // In ms. Time to auto-refresh. (+ lag_buster in script)
  30. var script_paused = false;
  31. var disconnected = false;
  32. var global_clock_interval = undefined;
  33.  
  34. // Cookies
  35. var cookie_prefix = "DC_auto_refresh_";
  36. var animation_enabled = true; // Enable delay animation
  37. var show_overlay = true; // Show ping overlay
  38. var show_overlay_options = true; // Show options overlay
  39. var full_auto = false; // Do not ask to reload
  40. var script_enabled = true;
  41.  
  42. // Overlay
  43. var refresh_interval;
  44. var server_date = new Date(); // Hard lagging from 5:00 to 6:00 GTM + 2
  45. var last_request_send = Date.now(); // Last attempt time
  46. var first_request_send = Date.now(); // First of failed attempts time
  47.  
  48. var alert_messages = new Array();
  49. alert_messages.ask_to_reload = 'Attention, vous semblez avoir été déconnecté. Rechargement de la page dans <span class="seconds">&nbsp;</span> seconde(s) <br><div class="btnTxt abort"><div>Annuler</div></div><div class="btnTxt reload"><div>Recharger</div></div>';
  50. alert_messages.unconnected = 'Attention, vous semblez toujours déconnecté.&nbsp;<div class="btnTxt hide"><div>OK</div></div>';
  51. alert_messages.connected = '<span class="ok_message">Vous semblez avoir été reconnecté.</span>&nbsp;&nbsp;<div class="btnTxt hide"><div>OK</div></div>';
  52.  
  53. $(document).ready( function() {
  54. $('body').append('<style>#auto_refresh {display: block;z-index: 1000000;position: absolute;top: 31px;width: 100%;text-align: center;}#auto_refresh .overlay_container {z-index: 1000001;position: absolute;top: 0px;max-width: 131px;color: white;line-height: 14px;font-size: 10px;}#auto_refresh .overlay, #auto_refresh .overlay_options {float: left;margin-right: 2px;margin-bottom: 1px;max-height: 125px;color: white;background-color: rgba(0, 0, 0, 0.75);line-height: 14px;font-size: 10px;}#auto_refresh .overlay .toggle, #auto_refresh .overlay_options .toggle, #auto_refresh .overlay_options .abort_reload_auto {float: right;padding-left: 5px;padding-right: 5px;width: 6px;border: 1px solid gray;cursor: pointer;}#auto_refresh .overlay_options .abort_reload_auto {display: none;color: red;font-weight: bold;border: 1px solid red;}#auto_refresh .overlay_options .check_box {float: right;width: 14px;height: 100%;background-color: rgba(255,0,0,0.5);box-shadow: inset 0px 0px 0px 1px red;}#auto_refresh .overlay .refresh_delay, #auto_refresh .overlay_options .full_auto , #auto_refresh .overlay_options .reload_auto {float: left;margin-right: 1px;width: 105px;color: back;background-color: transparent;border: 1px solid green;cursor: pointer;}#auto_refresh .overlay_options .full_auto, #auto_refresh .overlay_options .reload_auto {border: 1px solid gray;}#auto_refresh .overlay_options .reload_auto {cursor: default;display: none;}#auto_refresh .overlay .refresh_delay .actual_time {position: absolute;top: 0px;left: 0px;background-color: rgba(0, 255, 0, 0.1);height: 100%;overflow: hidden;}#auto_refresh .alert_container {display: none;}#auto_refresh .alert {position: relative;display: inline-block;padding: 5px;color: red;background-color: white;text-align: center;font-size: 15px;}#auto_refresh .alert .abort, #auto_refresh .alert .reload, #auto_refresh .alert .hide {display: inline-block;margin: 4px;width: 100px;}#auto_refresh .ok_message{color: green;}</style>');
  55. $("body").append('<div id="auto_refresh"><div class="overlay_container"><div class="overlay"><div class="ping refresh_delay" title="Activer/Désactiver animation"><div class="actual_time barre_etat"></div><span class="data">Ping</span> : <span class="seconds">&nbsp;</span> <span class="unit">ms</span></div><div class="toggle" title="Ping">&lt;</div></div><div class="overlay_options"><div class="full_auto" title="Activer/Désactiver notifications"><span class="data">Full auto</span><span class="check_box" value="0">&nbsp;</span></div><div class="toggle" title="Mode full auto">&lt;</div></div><div class="overlay_options"><div class="reload_auto" title="Refresh prévu dans..."><span class="data">Refresh</span> : <span class="seconds">&nbsp;</span> <span class="unit">s</span></div><div class="abort_reload_auto" title="Stopper le refresh prévu">x</div></div></div><div class="alert_container"><div class="alert fakeToolTip"></div></div></div>');
  56. function initialize() {
  57. if(undefined !== getCookie('global')) {
  58. show_overlay = (/overlay_on/gi.test(getCookie('global'))) ? true : false;
  59. show_overlay_options = (/overlay_options_on/gi.test(getCookie('global'))) ? true : false;
  60. animation_enabled = (/delay_anim_on/gi.test(getCookie('global'))) ? true : false;
  61. full_auto = (/full_auto_on/gi.test(getCookie('global'))) ? true : false;
  62. }
  63. else
  64. saveCookie('global','');
  65. if(false === show_overlay) {
  66. $('#auto_refresh .overlay .toggle').html('>');
  67. $('#auto_refresh .overlay .ping').hide();
  68. }
  69. if(false === animation_enabled) {
  70. $('#auto_refresh .animation_enabled .toggle').html('>');
  71. $('#auto_refresh .animation_enabled .full_auto').hide();
  72. }
  73. if(false === show_overlay_options) {
  74. $('#auto_refresh .overlay_options .toggle').html('>');
  75. $('#auto_refresh .overlay_options .full_auto').hide();
  76. if(false === full_auto)
  77. $('#auto_refresh .overlay_options .toggle').css({'borderColor' : 'red'});
  78. else
  79. $('#auto_refresh .overlay_options .toggle').css({'borderColor' : 'green'});
  80. }
  81. if(true === full_auto) {
  82. $('#auto_refresh .overlay_options .full_auto .check_box').css({ 'boxShadow' : 'inset 0px 0px 0px 1px rgba(0, 210, 0,1)',
  83. 'backgroundColor' : 'rgba(0,255,0,0.5)'});
  84. }
  85. }
  86. // Handle alert messages
  87. function show_alert(message) {
  88. // Automatic mode, no alert
  89. if (true === full_auto) {
  90. hide_alert();
  91. return;
  92. }
  93. $('#auto_refresh .alert').html(alert_messages[message]);
  94. // Yes/No alert
  95. if('ask_to_reload' == message) {
  96. // User want to abort, then notify user and pause script
  97. $('#auto_refresh .alert .abort').on('click', function() {
  98. abort_reload();
  99. show_alert('unconnected');
  100. });
  101. // Do reload
  102. $('#auto_refresh .alert .reload').on('click', function() {
  103. do_reload();
  104. });
  105. // Refresh reload countdown
  106. refresh_reload_alert(true);
  107. }
  108. else if ('connected' == message || 'unconnected' == message) {
  109. // hide alert
  110. $('#auto_refresh .alert .hide').on('click', function() {
  111. hide_alert();
  112. });
  113. }
  114. $('#auto_refresh .alert_container').show();
  115. }
  116. function hide_alert() {
  117. $('#auto_refresh .alert_container').hide();
  118. }
  119. // Stop refresh countdown
  120. function abort_reload() {
  121. clearInterval(refresh_interval);
  122. reload_asked = 0;
  123. script_paused = true;
  124. // last_request_completed = Date.now();
  125. }
  126. // Reload window
  127. function do_reload() {
  128. // Useless, but lovely
  129. script_paused = true;
  130. // Click method to avoid form issues
  131. window.location.href = 'http://www.dreadcast.net/Main';
  132. }
  133. // Handle reload events
  134. function handle_reload() {
  135. if(true === script_paused) return;
  136. // If no network activity for a while, reload.
  137. if (Date.now() - last_request_completed >= lag_buster) {
  138. // Delay to refresh
  139. if(0 === reload_asked) {
  140. reload_asked = Date.now();
  141. refresh_reload_auto();
  142. }
  143. // If yes/no alert hidden, show it (fired every seconds in full auto mode)
  144. if (true === full_auto) {
  145. hide_alert();
  146. }
  147. else if (false === $('#auto_refresh .alert .abort').is(':Visible'))
  148. show_alert('ask_to_reload'); // If full auto mode, disabled function
  149. // If waiting asked and done, reload
  150. if (0 !== reload_asked)
  151. if (Date.now() - reload_asked >= refresh_time_limit) {
  152. do_reload();
  153. }
  154. }
  155. }
  156. // Refresh reload countdown
  157. function refresh_reload_alert(forced) {
  158. if (true === forced || true === $('#auto_refresh .alert .seconds').is(':Visible')) {
  159. $('#auto_refresh .alert .seconds').html(Math.round((refresh_time_limit - (Date.now() - reload_asked)) / 1000));
  160. }
  161. }
  162. // Overlay
  163. // Display refreshed ping
  164. function refresh_ping(request_send, request) {
  165. // If connected, refresh values
  166. if (false === disconnected)
  167. first_request_send = request_send;
  168. else {
  169. request = Date.now(); // If disconnected, keep stored data.
  170. request_send = first_request_send;
  171. }
  172. var ping = ((request - request_send) < 0) // During requesting new Check
  173. ? ping
  174. : request - request_send;
  175. if (false === show_overlay) {
  176. if (ping > (check_delay * 2))
  177. $('#auto_refresh .overlay .toggle').css({'borderColor' : 'red'});
  178. return;
  179. }
  180. // Time background-color cheat.
  181. if (ping > (check_delay * 2)) {
  182. $('#auto_refresh .overlay .refresh_delay').css( {'borderColor' : 'red'});
  183. $('#auto_refresh .overlay .actual_time').css( {'width' : '0px'},
  184. {'backgroundColor' : 'rgba(255, 0, 0, 0.2)'});
  185. $('#auto_refresh .overlay .refresh_delay .data').html('Délai');
  186. }
  187. if (true === disconnected) {
  188. ping = Math.round(ping / 100) / 10;
  189. $('#auto_refresh .overlay .refresh_delay .unit').html('s');
  190. }
  191. else
  192. $('#auto_refresh .overlay .refresh_delay .unit').html('ms');
  193. $('#auto_refresh .overlay .ping .seconds').html(ping);
  194. }
  195. // Display refreshed delay animation
  196. function refresh_delay(request, animation_start) {
  197. var animation_progression = 0;
  198. if (undefined === animation_start)
  199. animation_start = 0;
  200. else {
  201. // Percent of animation completion
  202. animation_progression = (request + check_delay - animation_start);
  203. animation_progression = 1 - (animation_progression / check_delay);
  204. }
  205. // Stop animation, then set to new width
  206. $('#auto_refresh .overlay .actual_time').stop();
  207. // Overlay hide, do not animate
  208. if(false === show_overlay) {
  209. $('#auto_refresh .overlay .toggle').css({'borderColor' : 'green'});
  210. return;
  211. }
  212. $('#auto_refresh .overlay .toggle').css({'borderColor' : 'gray'});
  213. $('#auto_refresh .overlay .refresh_delay').css( {'borderColor' : 'green'});
  214. $('#auto_refresh .overlay .actual_time').css( {'width' : (animation_progression * $('#auto_refresh .overlay .refresh_delay').width()) + 'px'},
  215. {'backgroundColor' : 'rgba(0, 255, 0, 0.2)'});
  216. $('#auto_refresh .overlay .refresh_delay .data').html('Ping');
  217. if (false === animation_enabled) return;
  218. // Moving width to 100% at correct speed
  219. $('#auto_refresh .overlay .actual_time').animate(
  220. {width : $('#auto_refresh .overlay .refresh_delay').width()}
  221. , check_delay - (check_delay * animation_progression));
  222. }
  223. function refresh_reload_auto() {
  224. console.log('\n');
  225. console.log('refresh_reload_auto :');
  226. console.log('disconnected : ' + disconnected);
  227. console.log('full_auto : ' + full_auto);
  228. console.log('reload_asked : ' + (0 === reload_asked) ? reload_asked : ((Date.now() - reload_asked) / 1000).toFixed(2) + ' s');
  229. console.log('last_request_send : ' + ((Date.now() - last_request_send) / 1000).toFixed(2) + ' s');
  230. console.log('last_request_completed : ' + ((Date.now() - last_request_completed) / 1000).toFixed(2) + ' s');
  231. if (0 === reload_asked || true !== full_auto) {
  232. $('#auto_refresh .overlay_options .reload_auto').hide();
  233. $('#auto_refresh .overlay_options .abort_reload_auto').hide();
  234. return;
  235. }
  236. console.log('refresh_time_limit(' + refresh_time_limit + ') - (Date.now(' + Date.now() + ') - reload_asked(' + reload_asked + ')) = ' + (refresh_time_limit - (Date.now() - reload_asked)));
  237. $('#auto_refresh .overlay_options .reload_auto').show();
  238. $('#auto_refresh .overlay_options .abort_reload_auto').show();
  239. $('#auto_refresh .overlay_options .reload_auto .seconds').html(Math.round((refresh_time_limit - (Date.now() - reload_asked)) / 1000));
  240. }
  241. // Toggle delay animation
  242. $('#auto_refresh .overlay .ping').on('click', function() {
  243. animation_enabled = !animation_enabled;
  244. refresh_delay(last_request_completed, Date.now());
  245. // Remove old value and put new value
  246. saveCookie( 'global',
  247. getCookie('global').replace(/(delay_anim_on|delay_anim_off)/gi, '') + ((true === animation_enabled) ? 'delay_anim_on' : 'delay_anim_off'));
  248. });
  249. // Toggle full auto mode
  250. $('#auto_refresh .overlay_options .full_auto').on('click', function() {
  251. full_auto = !full_auto;
  252. if(true === full_auto) {
  253. $('#auto_refresh .overlay_options .full_auto .check_box').css({ 'boxShadow' : 'inset 0px 0px 0px 1px rgba(0, 210, 0,1)',
  254. 'backgroundColor' : 'rgba(0,255,0,0.5)'});
  255. }
  256. else {
  257. $('#auto_refresh .overlay_options .full_auto .check_box').css({ 'boxShadow' : 'inset 0px 0px 0px 1px red',
  258. 'backgroundColor' : 'rgba(255,0,0,0.5)'});
  259. }
  260. script_paused = false;
  261. // Remove old value and put new value
  262. saveCookie( 'global',
  263. getCookie('global').replace(/(full_auto_on|full_auto_off)/gi, '') + ((true === full_auto) ? 'full_auto_on' : 'full_auto_off'));
  264. });
  265. // Toggle overlay
  266. $('#auto_refresh .overlay .toggle').on('click', function() {
  267. $('#auto_refresh .overlay .ping').toggle();
  268. show_overlay = !show_overlay;
  269. if (true === show_overlay) {
  270. $('#auto_refresh .overlay .toggle').html('<');
  271. $('#auto_refresh .overlay .toggle').css({'borderColor' : 'gray'});
  272. }
  273. else {
  274. $('#auto_refresh .overlay .toggle').html('>');
  275. $('#auto_refresh .overlay .toggle').css({'borderColor' : $('#auto_refresh .overlay .refresh_delay').css('borderColor')});
  276. }
  277. if(true === animation_enabled)
  278. refresh_delay(last_request_completed, Date.now());
  279. refresh_ping(last_request_send, last_request_completed);
  280. // Remove old value and put new value
  281. saveCookie( 'global',
  282. getCookie('global').replace(/(overlay_on|overlay_off)/gi, '') + ((true === show_overlay) ? 'overlay_on' : 'overlay_off'));
  283. });
  284. // Toggle overlay options
  285. $('#auto_refresh .overlay_options .toggle').on('click', function() {
  286. $('#auto_refresh .overlay_options .full_auto').toggle(); // full auto option
  287. show_overlay_options = !show_overlay_options;
  288. if (true === show_overlay_options) {
  289. $('#auto_refresh .overlay_options .toggle').css({'borderColor' : 'gray'});
  290. $('#auto_refresh .overlay_options .toggle').html('<');
  291. }
  292. else {
  293. if (true === full_auto)
  294. $('#auto_refresh .overlay_options .toggle').css({'borderColor' : 'green'});
  295. else
  296. $('#auto_refresh .overlay_options .toggle').css({'borderColor' : 'red'});
  297. $('#auto_refresh .overlay_options .toggle').html('>');
  298. }
  299. // Remove old value and put new value
  300. saveCookie( 'global',
  301. getCookie('global').replace(/(overlay_options_on|overlay_options_off)/gi, '') + ((true === show_overlay_options) ? 'overlay_options_on' : 'overlay_options_off'));
  302. });
  303. $('#auto_refresh .overlay_options .abort_reload_auto').on('click', function() {
  304. abort_reload();
  305. refresh_reload_auto();
  306. });
  307. // Global clock
  308. function start_global_clock() {
  309. if(undefined !== global_clock_interval)
  310. clearInterval(global_clock_interval);
  311. global_clock_interval = setInterval(function() {
  312. // In case of hard lagging (5:00 -> 5:59)
  313. lag_buster = (5 == server_date.getHours()) ? hard_lag_buster : casual_lag_buster;
  314. // Alert reload time refresh
  315. refresh_reload_alert();
  316. // Ping refresh
  317. refresh_ping(last_request_send, last_request_completed);
  318. // Reload auto refresh
  319. refresh_reload_auto();
  320. // Countdown to window reload
  321. handle_reload();
  322. }, 1000);
  323. }
  324. // Script start
  325. initialize();
  326. start_global_clock();
  327. // Update last request send time
  328. $(document).ajaxSend( function(a,b,c) {
  329. if(/Check/.test(c.url)) {
  330. last_request_send = Date.now();
  331. }
  332. });
  333. // Update last request time
  334. $(document).ajaxComplete( function(a,b,c) {
  335. if(/Check/.test(c.url)) {
  336. // Refresh server date
  337. server_date = new Date(b.getResponseHeader('Date'));
  338. // If request succeeded
  339. if(b.readyState === 4) {
  340. // If reconnected again connexion, resume script and notify
  341. if($('#auto_refresh .alert').is(':Visible') || true === disconnected) {
  342. show_alert('connected');
  343. // Stop reload
  344. abort_reload();
  345. }
  346. // Resume script
  347. script_paused = false;
  348. disconnected = false;
  349. last_request_completed = Date.now();
  350. // Display new data (better sync)
  351. refresh_delay(last_request_completed);
  352. refresh_reload_auto();
  353. }
  354. else
  355. disconnected = true;
  356. // Display new data (better sync)
  357. refresh_ping(last_request_send, last_request_completed);
  358. }
  359. });
  360. });
  361. // handle cookies
  362. function saveCookie(name,val) {
  363. name = cookie_prefix + name;
  364. if(!navigator.cookieEnabled) return;
  365. document.cookie = name + '=' + val + ';expires=Wed, 01 Jan 2020 00:00:00 GMT; path=/';
  366. }
  367. function getCookie(var_name) {
  368. name = cookie_prefix + var_name;
  369. if(!navigator.cookieEnabled) return undefined;
  370. var start = document.cookie.indexOf(name + '=')
  371. if(start == -1) return undefined;
  372. start += name.length + 1;
  373. var end = document.cookie.indexOf(';',start);
  374. if (end == -1) end = document.cookie.lenght;
  375. return document.cookie.substring(start,end);
  376. };
  377. console.log('DC - Auto Refresh started');