maintenance.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. const JmeMaintenance = {};
  2. JmeMaintenance.Icons = {
  3. cog: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAABuklEQVRYhe3Wu2sUURQG8J/GTlPETtKIiEnto0gna5Mqq4UKakBBhPTRf0awsTVgYWFjYqdg7JPSEBCbxEcjuNm1mDtkd/bOnc3NWrkfnGLO6/tm7pwzwwQT5KGFDnrBOrie0+hkpoBrmOq7nsKVfyXgCTZwqc83F8mbr8Q38DBHVD+eOnzMP3Abd7Hb5y9tJ8Qe4GfwdbGSS/4oNKgSHdW6QdiR8W4M5KWt5Qi4gL0xkH/DbI4AuDUGAYspgqYpOF3j30Ib08FuYrsm92yK4ETEt4irirFq4VyEfAHfK/4ZfDA8ol/wJtR9DjlJHEg/0qVEbbuh9k8TuYYGPZxJ1E6PUD+A3FVch9iRJhET0GmouZGItRpqu1VHTPECLit2/xLOV+LbIWe/4p/BR4PfDPiKdcVLuIm3DSIHcE/8HKtj2A7CYrn3UwSnGgTs1fjn8HqUO8DvEfOGMKtYo8fdhPu4mCNgbQzkpa3XkaTG8JXI3Gagh5e5xSsON+MvLCu+7TuG73I3xO4ofl5K/2q+9gLLeG/wl+t5RMCLvvh8qHl8XPI6rEYEPMtplLuKNxVHU+IAnzJ7TfCf4y+1kepxyfi12AAAAABJRU5ErkJggg==",
  4. alert: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAABV0lEQVRYhe2VP0oDQRjFfwQi0UqNpRDwAoI3MJhb6AkEGz2FnsLcQk8ggkHF0qiNYGEsLNTCMBaZgXHy7fzZ7E61D16xM+/73rc7w1toUB594FGzn9t8DZgASnOi17LhzDI3PM1lvgl8CQN8A70cAwwFc8Pzus23galngCmwU+cAlx5zw4u6zHcjzA0HVZu3gJFlcAe0rf22XjP7I11TGQ74/4ZXguba0exXZb4EjJ3m94LuwdG8AJ1Q85jPdARsOWvLgm7Fee4BhxH9vVgF3pm/ZK+C9k3QfQDriwwgRa5p7OKzQFs6oosiVwE/gv63QFs6on2Rq5gdj8FGQDtMNQ9FbiqTIzomclMZHdGDyIZdq6YbWROM6BZwE9nMRUzNLYHscSO36gEUnojuMIvP2EZljkDhieiThCaL8lga4DnjAE/G1L4Q0rlmxR7zv906ONZeDRoA8AcUklEqQcSO3AAAAABJRU5ErkJggg==",
  5. check: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAABuklEQVRYhe3Wu2sUURQG8J/GTlPETtKIiEnto0gna5Mqq4UKakBBhPTRf0awsTVgYWFjYqdg7JPSEBCbxEcjuNm1mDtkd/bOnc3NWrkfnGLO6/tm7pwzwwQT5KGFDnrBOrie0+hkpoBrmOq7nsKVfyXgCTZwqc83F8mbr8Q38DBHVD+eOnzMP3Abd7Hb5y9tJ8Qe4GfwdbGSS/4oNKgSHdW6QdiR8W4M5KWt5Qi4gL0xkH/DbI4AuDUGAYspgqYpOF3j30Ib08FuYrsm92yK4ETEt4irirFq4VyEfAHfK/4ZfDA8ol/wJtR9DjlJHEg/0qVEbbuh9k8TuYYGPZxJ1E6PUD+A3FVch9iRJhET0GmouZGItRpqu1VHTPECLit2/xLOV+LbIWe/4p/BR4PfDPiKdcVLuIm3DSIHcE/8HKtj2A7CYrn3UwSnGgTs1fjn8HqUO8DvEfOGMKtYo8fdhPu4mCNgbQzkpa3XkaTG8JXI3Gagh5e5xSsON+MvLCu+7TuG73I3xO4ofl5K/2q+9gLLeG/wl+t5RMCLvvh8qHl8XPI6rEYEPMtplLuKNxVHU+IAnzJ7TfCf4y+1kepxyfi12AAAAABJRU5ErkJggg=="
  6. }
  7. JmeMaintenance.Settings = {
  8. scheduledMaintenance: "00 0 1 * *",
  9. maintenanceDurationInHours: 1,
  10. maintenanceNoticeDurationInHours: 2,
  11. debugTimeSpeed: 1
  12. }
  13. JmeMaintenance.cronToDate = function (cron) {
  14. later.date.UTC();
  15. const s = later.parse.cron(cron, false);
  16. const scheduler = later.schedule(s);
  17. const prev= scheduler.prev(0);
  18. const currentDate = JmeMaintenance.getTime();
  19. let delta = (currentDate - prev) / 1000;
  20. delta = Math.abs(delta);
  21. let deltaH = Math.floor(delta / 3600);
  22. if(deltaH<24){
  23. return prev;
  24. }
  25. const next= scheduler.next(0);
  26. return next;
  27. }
  28. JmeMaintenance.showMaintenanceMessage = function (icon, type, message) {
  29. const body = document.querySelector("body");
  30. let maintenanceEl = body.querySelector("#jme-a-maintenance");
  31. if (maintenanceEl) {
  32. console.log("Clear maintenance message");
  33. maintenanceEl.innerHTML = "";
  34. } else {
  35. console.log("Create new maintenance message");
  36. maintenanceEl = document.createElement("div");
  37. maintenanceEl.setAttribute("id", "jme-a-maintenance");
  38. maintenanceEl.addEventListener("click", function (ev) {
  39. maintenanceEl.style.display = "none";
  40. });
  41. body.appendChild(maintenanceEl);
  42. }
  43. if (type && !maintenanceEl.className != type) {
  44. maintenanceEl.className = type;
  45. maintenanceEl.style.display = "flex";
  46. }
  47. console.info(message);
  48. const iconEl = document.createElement("img");
  49. iconEl.setAttribute("src", icon);
  50. maintenanceEl.appendChild(iconEl);
  51. const messageEl = document.createElement("span");
  52. messageEl.innerHTML = message;
  53. maintenanceEl.appendChild(messageEl);
  54. }
  55. JmeMaintenance.getTime = function () {
  56. let date = Date.now();
  57. if (JmeMaintenance.Settings.debugTimeSpeed > 1) {
  58. if (!JmeMaintenance.prevDate) JmeMaintenance.prevDate = date;
  59. let virtualDate = JmeMaintenance.prevDate + (date - JmeMaintenance.prevDate) * JmeMaintenance.Settings.debugTimeSpeed;
  60. date = virtualDate;
  61. }
  62. return date;
  63. }
  64. JmeMaintenance.showScheduledMaintenanceMessage = function () {
  65. const nextMaintenance = JmeMaintenance.cronToDate(JmeMaintenance.Settings.scheduledMaintenance);
  66. const currentDate = JmeMaintenance.getTime();
  67. let delta = (nextMaintenance - currentDate) / 1000;
  68. const sign = Math.sign(delta);
  69. delta = Math.abs(delta);
  70. let deltaH = Math.floor(delta / 3600);
  71. let deltaM = Math.floor((delta - (deltaH * 3600)) / 60);
  72. console.log("Maintenance in",deltaH,"hours and ",deltaM,"minutes",sign,JmeMaintenance.Settings.maintenanceNoticeDurationInHours);
  73. if (sign <= 0) {
  74. if (deltaH < JmeMaintenance.Settings.maintenanceDurationInHours) {
  75. JmeMaintenance.showMaintenanceMessage(JmeMaintenance.Icons.cog, "jme-a-maintenance-inprogress", "Maintenance in progress...");
  76. if (localStorage) localStorage.setItem('jme-a-maintenance', '1');
  77. setTimeout(JmeMaintenance.showScheduledMaintenanceMessage, Math.max(1, 1000 / JmeMaintenance.Settings.debugTimeSpeed));
  78. return;
  79. } else {
  80. const mFlag = localStorage.getItem('jme-a-maintenance');
  81. if (localStorage && mFlag && mFlag == "1") {
  82. JmeMaintenance.showMaintenanceMessage(JmeMaintenance.Icons.check, "jme-a-maintenance-completed", "Maintenance completed! All services should be back to normal.");
  83. localStorage.removeItem('jme-a-maintenance');
  84. }
  85. }
  86. } else {
  87. if (deltaH <= JmeMaintenance.Settings.maintenanceNoticeDurationInHours) {
  88. JmeMaintenance.showMaintenanceMessage(JmeMaintenance.Icons.alert, "", "Scheduled unattended maintenance will start in " + deltaH + " hours and " + deltaM + " minutes. <br />Slowdowns and hiccups are expected during this process.");
  89. if (localStorage) localStorage.setItem('jme-a-maintenance', '1');
  90. setTimeout(JmeMaintenance.showScheduledMaintenanceMessage, Math.max(1, (1000 * 60) / JmeMaintenance.Settings.debugTimeSpeed));
  91. return;
  92. }
  93. }
  94. setTimeout(JmeMaintenance.showScheduledMaintenanceMessage, Math.max(1, (20 * 60 * 1000) / JmeMaintenance.Settings.debugTimeSpeed));
  95. }
  96. if (document.readyState === 'complete') {
  97. JmeMaintenance.showScheduledMaintenanceMessage();
  98. } else {
  99. document.addEventListener("DOMContentLoaded", function () {
  100. JmeMaintenance.showScheduledMaintenanceMessage();
  101. });
  102. }