Vielen Dank für die Erklärung, nun funktioniert es, abe die Haken vergessen ![]()
Beiträge von CottonEyeJoe190
-
-
perfekt, dies wars.
Vielen Dank. -
Bei meinen Feuerwachen gehts leider auch nicht, kann sich das jemand anschauen?
-
Bei mir war nicht deine AAO auf der ersten Seite die Aktuellste, sondern dein Post #87 + #88.
Hatte mich auch gewundert, aber bin dann die Seiten durch gegangen und da war es dann drin.
-
-
Hallo Jan (jxn_30)
hast du eine Idee, wie ich herausfinden könnte, wo alles Pferde in der AAO hinterlegt sind?
Hintergrund ist, dass ich eine AAO importiert habe von jemandem, ich aber nur Zugfahrzeuge für Pferde nutze, ich muss diese also immer manuell nachschicken.Möchte nun irgendwie prüfen, wo alles Pferde hinterlegt sind und dort in der AAO Zugfahrzeuge ergänzen.
Hast du eine Idee? -
@BOS-Ernie ich versuche das "Personal (Soll) über dein Script auf 400 zu setzen.
Es steht in deinem Script auch dran, aber nicht in den einzelnen Gebäuden dann.
Spielt das eine Rolle? Also ist das ein Bug oder funktioniert es trotzdem, auch wenn es nur in deinem Script steht?
Verstehst du was ich meine? -
Fast gut, wenn es dies noch für eine Leitstelle gäbe, dass ich nicht über 100 BePol durchklicken müsste, wäre das perfekt

Edit: nachdem ich es nun getestet habe, ist es doch perfekt, man muss nur die Buttons drücken und dann nächstes Gebäude.
Ich nehme hiermit noch mir auf, dass das Script sehr gut ist und man damit sehr erleichternd Erweitern kann
Der Vorschlag mit der Leitstelle wäre somit doch etwas überzogen, diesen nehme ich zurück.
-
Ein Traum wie das funktioniert, vielen herzlichen Dank

-
Auch von mir ein Danke, habe es soeben gesehen.
Eine Reaktion hier würde ich mir für die Zukunft wünschen, dass es gesehen wurde. -
Kennt niemand einen Trick, wie ich dies ändern könnte in meinen AAOs?
Der Support reagiert ja leider nicht. -
perfekt

Danke für deine Mühe und cool, dass dir der Replacer helfen konnte
-
Community-Team Leitstellenspiel wurde dies gesehen und weitergeleitet?
-
Danke Jan (jxn_30)
dann werde ich meinen "Fork" mal einstellen, nachdem ich deine Freigabe habe.Ihr müsst bei "zu ersetzende Fahrzeuge" das Fahrzeug auswählen und dann bei "Ersetzen mit" ganz unten "Setze auf 0" wählen.
Dann wird alles, also wirklich alles, auch einzelne Fahrzeuge auf 0 gesetzt.
aber einzelne Fahrzeuge sind ja in Sekunden wieder eingestellt
Code
Alles anzeigen// ==UserScript== // @name [LSS] AAO Replacer // @name:de [LSS] AAO Replacer // @namespace https://jxn.lss-manager.de // @version 2023.12.25+0046 // @description Allows to replace a requirement in all AbRRs with another one or set it to 0. // @description:de Ersetze alle Anforderungen in allen AAOs mit einer anderen oder setze sie auf 0. // @match https://www.leitstellenspiel.de/aaos // @match https://www.leitstellenspiel.de/aaos/ // @grant GM_addStyle // ==/UserScript== const AAO_LINK_SELECTOR = '.aao_btn_group > a[href^="/aaos/"][href$="/edit"]'; const getDoc = url => fetch(url) .then(res => res.text()) .then(html => new DOMParser().parseFromString(html, 'text/html')); const getPossibleAAORequirements = () => new Promise((resolve, reject) => { const aaoEditLink = document.querySelector(AAO_LINK_SELECTOR)?.href; if (!aaoEditLink) reject(); getDoc(aaoEditLink) .then(doc => [ doc, Array.from(doc.querySelectorAll('#tabs > li > a')), ]) .then(([doc, tabs]) => tabs.map(tab => [ tab.textContent.trim(), Object.fromEntries( Array.from( doc.querySelectorAll( `${tab.getAttribute('href')} .form-group` ) ).map(req => [ req.querySelector('input')?.name, req.querySelector('label')?.textContent.trim(), ]) ), ]) ) .then(tabs => Object.fromEntries(tabs)) .then(resolve); }); const getAAORequirements = () => fetch('/api/v1/aaos') .then(res => res.json()) .then(aaos => aaos.map( ({ id, vehicle_classes, vehicle_types, vehicle_type_captions, }) => [ id.toString(), [ ...Object.keys(vehicle_classes ?? {}).map( key => `aao[${key}]` ), ...Object.keys(vehicle_types ?? {}).map( id => `vehicle_type_ids[${id}]` ), ...Object.keys(vehicle_type_captions ?? {}).map( caption => `vehicle_type_caption[${caption}]` ), ], ] ) ) .then(Object.fromEntries); GM_addStyle(` .progress-bar[data-current][data-total]::before { content: attr(data-current) " / " attr(data-total); } `); (() => { const replaceBtn = document.createElement('a'); replaceBtn.classList.add('btn', 'btn-default'); replaceBtn.textContent = 'Anforderungen ersetzen'; document .querySelector('.page-header > .btn-group.pull-right') ?.append(replaceBtn); replaceBtn.addEventListener('click', () => { const modal = document.createElement('div'); modal.style.setProperty('position', 'fixed'); modal.style.setProperty('width', '90%'); modal.style.setProperty('height', '90%'); modal.style.setProperty('z-index', '10005'); modal.style.setProperty('top', '0'); modal.style.setProperty('left', '0'); modal.style.setProperty('margin', '5vh 5%'); modal.style.setProperty('background-color', 'inherit'); modal.style.setProperty('border', '1px solid black'); modal.style.setProperty('border-radius', '5px'); modal.style.setProperty('padding', '1em'); modal.style.setProperty('box-shadow', '0px 0px 100vh black'); modal.style.setProperty('pointer-events', 'all'); const closeBtn = document.createElement('button'); closeBtn.id = 'lightbox_close'; closeBtn.classList.add('close'); closeBtn.style.setProperty('cursor', 'pointer'); closeBtn.textContent = 'x'; closeBtn.addEventListener('click', () => { modal.remove(); document.body.style.removeProperty('pointer-events'); }); const infoBox = document.createElement('div'); infoBox.classList.add('alert', 'alert-info'); infoBox.textContent = `Du hast aktuell ${ document.querySelectorAll('.aao_btn_group').length } AAOs. Bitte wähle, welche Anforderung du durch welche alternative Anforderung ersetzen möchtest oder setze sie auf 0.`; const statusBox = document.createElement('div'); statusBox.classList.add('alert', 'alert-info'); statusBox.textContent = 'Status: Lese mögliche Anforderungen aus, bitte habe einen Moment Geduld...'; getPossibleAAORequirements().then(tabs => { statusBox.textContent = 'Status: Bitte wähle nun, welche Anforderung du mit welcher ersetzen möchtest oder setze sie auf 0.'; Object.entries(tabs).forEach(([tab, reqs]) => { const group = document.createElement('optgroup'); group.label = tab; Object.entries(reqs).forEach(([req, label]) => { const option = document.createElement('option'); option.value = req; option.textContent = label; group.append(option); }); fromReqSelect.add(group); toReqSelect.add(group.cloneNode(true)); }); // Add an option to set the requirement to 0 const zeroOption = document.createElement('option'); zeroOption.value = '0'; zeroOption.textContent = 'Setze auf 0'; toReqSelect.add(zeroOption); fromReqSelect.disabled = false; toReqSelect.disabled = false; }); const fromReqSelect = document.createElement('select'); fromReqSelect.disabled = true; const toReqSelect = document.createElement('select'); toReqSelect.disabled = true; modal.addEventListener( 'change', () => (changeBtn.disabled = fromReqSelect.value === toReqSelect.value && toReqSelect.value !== '0') ); const changeBtn = document.createElement('button'); changeBtn.classList.add('btn', 'btn-success'); changeBtn.textContent = 'Anforderungen ersetzen'; changeBtn.disabled = true; changeBtn.addEventListener('click', async () => { if (changeBtn.disabled) return; changeBtn.disabled = true; fromReqSelect.disabled = true; toReqSelect.disabled = true; closeBtn.classList.add('hidden'); const progressWrapper = document.createElement('div'); progressWrapper.classList.add('progress'); const progressBar = document.createElement('div'); progressBar.classList.add( 'progress-bar', 'progress-bar-striped', 'active' ); progressBar.dataset.current = '0'; progressBar.dataset.total = '0'; progressWrapper.append(progressBar); const from = fromReqSelect.value; const to = toReqSelect.value; statusBox.textContent = 'Status: Erfassen, welche AAOs ersetzt werden müssen'; const aaoRequirements = await getAAORequirements(); const aaos = Array.from( document.querySelectorAll(AAO_LINK_SELECTOR) ).filter(aao => aaoRequirements[ aao.href.match(/(?<=\/aaos\/)\d+(?=\/edit)/)?.[0] ]?.includes(from) ); progressBar.dataset.total = aaos.length.toLocaleString(); statusBox.textContent = `Status: Die AAO-Einträge werden nun ersetzt. Bitte habe einen Moment Geduld. Bitte plane ca. 0,3 Sekunden pro AAO ein, das heißt der Prozess braucht vermutlich mindestens ${ (aaos.length * 0.3).toLocaleString() } Sekunden. Abbrechen kannst du den Prozess, indem du das Fenster neu lädst.`; statusBox.append(progressWrapper); let counter = 0; const inc = () => { counter++; progressBar.dataset.current = counter.toLocaleString(); progressBar.style.setProperty( 'width', `${((counter / aaos.length) * 100).toString()}%` ); }; const timeoutReq = promise => Promise.all([ promise, new Promise(resolve => setTimeout(() => resolve(), 100)), ]).then(([result]) => result); for (const aao of aaos) { const doc = await timeoutReq(getDoc(aao.href)); const form = doc.querySelector('form'); const formData = new FormData(form); const reqs = Object.fromEntries(formData.entries()); if (to === '0') { formData.set(from, '0'); } else { formData.set(to, reqs[from]); formData.set(from, '0'); } await timeoutReq( fetch(form.action, { method: 'POST', body: formData, }) ); inc(); } statusBox.textContent = 'Status: Die AAO-Einträge wurden ersetzt. Herzlichen Glückwunsch! Du kannst bei Bedarf jetzt noch eine Ersetzung durchführen.'; progressBar.remove(); changeBtn.disabled = false; fromReqSelect.disabled = false; toReqSelect.disabled = false; closeBtn.classList.remove('hidden'); }); modal.append( closeBtn, infoBox, statusBox, 'Zu ersetzende Anforderung:\xa0', fromReqSelect, document.createElement('br'), 'Ersetzen mit:\xa0', toReqSelect, document.createElement('br'), document.createElement('br'), changeBtn ); document.body.append(modal); document.body.style.setProperty('pointer-events', 'none'); }); })(); -
-
Guten Morgen.
kann es sein, dass bei der AAO der "MTW-Verpflegung" fehlt?
Habe es ein paar mal komplett gesucht und auch eine Browser suche, aber kann diesen nicht finden, aber wenn ich meine AAO anklicke, ist er irgendwo eingestellt
-
Alles anzeigen
Moin Jan (jxn_30)
Ich wollte höflichst nachfragen, wie dazu der sachstand aussieht?
Ich denke mal die todo Liste ist und bleibt lang.
Aber evtl ist dieser Punkt schon etwas nach oben gerutscht
Insbesondere unter dem Aspekt, dass hier...
...schon eine Zuarbeit erfolgt ist.
Danke
Servus,
ich kann dir meine Version schon als PN geben, da ich kein Programmierer bin und dies lediglich versuche waren, kann ich keine Fehlerfreiheit garantieren.
Da es auch nicht mein Script ist, möchte ich es auch nicht öffentlich posten, hab ihn sogar schriftlich gefragt, ob ich es verändern darf.Ich denke ihn stört es nicht, wenn ich dir dies ebenfalls als Pn gebe, ansonsten könnte er sich hier melden.
Grüße und Rückantwort, falls du es möchtest.
-
ich frage mich sowieso, wen sie damit strafen möchte, wenn sie alle Scripte löscht.
Dann straft sie ja eher die User und nicht den Support, dem ist das doch eher Wurst wieviel Scripte hier verzeichnet sind oder denke ich da falsch?
-
Hallo PASS
bevor du dein neues Release veröffentlichst, habe ich mir meine Auffälligkeiten notiert.folgendes ist mir aufgefallen, was du einarbeiten kannst oder auch nicht

+ Absicherung Flugshow
-> fehlt bei geplante Einsätze
+ Absicherung Castor-Transport
-> falsche Spalte, muss Spalte 3 sein
+ Straßenblockade
-> 1 Wasserwerfer zu wenig
+ Brandsicherheitswache bei Feuerwerk
+ Brandsicherheitswache bei Volksfest
+ Brandsicherheitswache in Theater
+ Feuerprobealarm an Schule
-> MTW raus, wird nicht benötigt
+ Fußball Bundesliga-Risikospiel
+ Explosion in Biogasanlage
+ Gasexplosion
-> MTW-Verpflegung raus, wird nicht benötigt
+ Schwerlastkontrolle
-> NEA50 fehlt
+ Absicherung Rockkonzert
-> NEA50 fehlt
+ Brennender Bahnhof
-> Anh FüLa fehlt
-
Habe es gerade mit Copilot versucht und etwas genauer beschrieben.
Also funktionieren tut es mal, er hat im Dropdownmenü bei "Ersetzen mit" einfach eine Option mit "Setze auf 0" hinzugefügt.
Hat sogar funktioniert
Da es aber dein Script ist und es nicht verändert posten möchte, kann ich es dir als PN senden zum anschauen und evtl. dann selbst ein Update zu machen.
Ich hoffe es ist nicht schlimm, wenn ich es für mich selbst jetzt verändert habe, aber der Code wird nirgendwo veröffentlicht, versprochen.