* Leitstellen Status Umschalter

Fügt der Gebäudeliste einen Button hinzu, mit dem der Status jeder Leitstelle umgeschaltet werden kann.

  1. // ==UserScript==
  2. // @name * Leitstellen Status Umschalter
  3. // @namespace bos-ernie.leitstellenspiel.de
  4. // @version 1.1.0
  5. // @license BSD-3-Clause
  6. // @author BOS-Ernie
  7. // @description Fügt der Gebäudeliste einen Button hinzu, mit dem der Status jeder Leitstelle umgeschaltet werden kann.
  8. // @match https://www.leitstellenspiel.de/
  9. // @match https://polizei.leitstellenspiel.de/
  10. // @icon https://www.google.com/s2/favicons?sz=64&domain=leitstellenspiel.de
  11. // @run-at document-idle
  12. // @grant none
  13. // @resource https://forum.leitstellenspiel.de/index.php?thread/23376-script-leitstellen-status-umschalter-by-bos-ernie/
  14. // ==/UserScript==
  15.  
  16. /* global buildingLoadContent */
  17.  
  18. (function () {
  19. const callback = mutations => {
  20. mutations.forEach(mutation => {
  21. if (mutation.addedNodes.length > 0) {
  22. addToggleButtons();
  23. }
  24. });
  25. };
  26.  
  27. const observer = new MutationObserver(callback);
  28. observer.observe(document.getElementById("buildings"), {
  29. childList: true,
  30. });
  31.  
  32. function addToggleButtons() {
  33. const listItems = document.querySelectorAll('#building_list li[leitstelle_building_id][building_type_id="7"]');
  34. if (listItems.length === 0) {
  35. return;
  36. }
  37.  
  38. listItems.forEach(li => {
  39. if (li.getAttribute("building_type_id") !== "7") {
  40. return;
  41. }
  42.  
  43. const buildingId = li.querySelector("img").getAttribute("building_id");
  44. const captionDiv = document.getElementById("building_list_caption_" + buildingId);
  45.  
  46. const img = li.querySelector("img");
  47. const imgSource = img.getAttribute("src");
  48. img.remove();
  49.  
  50. if (imgSource === "/images/building_leitstelle_deactivated.png") {
  51. captionDiv.prepend(createStatusButtonGroup(buildingId, "disabled"));
  52. } else {
  53. captionDiv.prepend(createStatusButtonGroup(buildingId, "enabled"));
  54. }
  55. });
  56. }
  57.  
  58. const buildingList = document.getElementById("building_list");
  59. if (!buildingList) {
  60. console.error("Leitstellen Status Umschalter: Building list not found.");
  61. return;
  62. }
  63.  
  64. const observerBuildingList = new MutationObserver(mutations => {
  65. mutations.forEach(mutation => {
  66. if (mutation.addedNodes.length > 0) {
  67. addToggleButtons();
  68. }
  69. });
  70. });
  71. observerBuildingList.observe(buildingList, {
  72. childList: true,
  73. });
  74.  
  75. function createStatusButtonGroup(buildingId, status) {
  76. const href = "https://www.leitstellenspiel.de/buildings/" + buildingId + "/active";
  77.  
  78. const listener = e => {
  79. e.preventDefault();
  80. $.ajax({
  81. url: href,
  82. type: "GET",
  83. success: function () {
  84. const statusButtonGroup = document.getElementById("status-button-group-" + buildingId);
  85. statusButtonGroup.replaceWith(
  86. createStatusButtonGroup(buildingId, status === "disabled" ? "enabled" : "disabled"),
  87. );
  88. },
  89. });
  90. };
  91.  
  92. if (status === "disabled") {
  93. const enableButtonInactive = document.createElement("a");
  94. enableButtonInactive.href = href;
  95. enableButtonInactive.type = "button";
  96. enableButtonInactive.className = "btn btn-default";
  97. enableButtonInactive.innerHTML = "An";
  98. enableButtonInactive.addEventListener("click", listener);
  99.  
  100. const disableButtonActive = document.createElement("a");
  101. disableButtonActive.href = href;
  102. disableButtonActive.type = "button";
  103. disableButtonActive.className = "btn btn-danger active";
  104. disableButtonActive.innerHTML = "Aus";
  105. disableButtonActive.addEventListener("click", listener);
  106.  
  107. const statusButtonGroupDisabled = document.createElement("div");
  108. statusButtonGroupDisabled.id = "status-button-group-" + buildingId;
  109. statusButtonGroupDisabled.className = "btn-group btn-group-xs";
  110. statusButtonGroupDisabled.role = "group";
  111. statusButtonGroupDisabled.appendChild(enableButtonInactive);
  112. statusButtonGroupDisabled.appendChild(disableButtonActive);
  113.  
  114. return statusButtonGroupDisabled;
  115. }
  116.  
  117. const enableButtonActive = document.createElement("a");
  118. enableButtonActive.href = href;
  119. enableButtonActive.type = "button";
  120. enableButtonActive.className = "btn btn-success active";
  121. enableButtonActive.innerHTML = "An";
  122. enableButtonActive.addEventListener("click", listener);
  123.  
  124. const disableButtonInactive = document.createElement("a");
  125. disableButtonInactive.href = href;
  126. disableButtonInactive.type = "button";
  127. disableButtonInactive.className = "btn btn-default";
  128. disableButtonInactive.innerHTML = "Aus";
  129. disableButtonInactive.addEventListener("click", listener);
  130.  
  131. const statusButtonGroupEnabled = document.createElement("div");
  132. statusButtonGroupEnabled.id = "status-button-group-" + buildingId;
  133. statusButtonGroupEnabled.className = "btn-group btn-group-xs";
  134. statusButtonGroupEnabled.role = "group";
  135. statusButtonGroupEnabled.appendChild(enableButtonActive);
  136. statusButtonGroupEnabled.appendChild(disableButtonInactive);
  137.  
  138. return statusButtonGroupEnabled;
  139. }
  140. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址