FMS Status 5 abfragen

  • Hey,

    ich brauche mal euer Hilfe, ich habe es erstmal alleine versucht, aber leider ohne Erfolg. Ich hatte vor mithilfe von einem Scriptteil von @Lennard[TFD] "FMS 5 LED Plugin" ein Webhook auszulösen, wenn ein Status 5 eingeht, was dann im Hintergrund den Webhook ausführt, womit ich dann an meinem Handy eine Textansage bekomme mit "Fahrzeug in Status 5" was auch geht nur habe ich noch nicht heraus wie ich es auslösen kann, wenn ein Fahrzeug im FMS 5 ist. Das ist der Code denn ich habe


    wo WEBHOOK steht, kommt die URL von meinem Webhook hin. Vielleicht hat ja jemand mehr Ahnung als ich

  • Huhu,

    ich würde das nicht per MutationObserver machen sondern ich würde mich in die bereits existierende Methode radioMessage reinhaken. Unter https://raw.githubusercontent.…SSD/master/application.js findest du immer die jeweils aktuelle JS-Datei des Spiels, schön formatiert, dort findest du also auch die radioMessage Funktion:

    Was kannst du jetzt damit machen?

    1. musst du den übergebenen Parameter analysieren und schauen, wie der aussieht. Das haben wir schon öfters gemacht, deshalb kannst du da einfach bei uns spicken: https://github.com/LSS-Manager…pings/Ingame.d.ts#L39-L62

    das Übergebene kann also entweder ein Funkspruch sein oder ein Hinweis für eine Sicherheitswache.

    => Du musst checken, ob e.type "vehicle_fms" entspricht und ob e.fms den Wert 5 hat. Warum gibt es fms_real und fms? Ganz einfach. fms_real bestimmt die Farbe, fms (manchmal auch fms_show genannt) bestimmt die angezeigte Zahl). Im Niederländischen sind die Farben anders als bei uns, deshalb dieses System seitens des Spiels.



    2. Jetzt musst du dich aber noch irgendwie in diese Funktion reinhaken. Ich mach das ganz gerne so:

    Code
    const radioMessageOrigin = window.radioMessage;
    window.radioMessage = e => {
    // put own code here
    radioMessageOrigin(e);
    // put own code here
    };

    Ob du den Code zum Versenden des Webhooks jetzt vor oder nach dem Aufruf von radioMessageOrigin packst ist prinzipiell egal natürlich :)



    Erklärt das halbwegs verständlich, wie du vorgehen könntest?


    Bei weiteren Fragen, natürlich gerne jederzeit nachfragen.

  • Ich bin ehrlich, ich verstehe nur Bahnhof. Mit dem ersten Code wird geprüft, ob ein FMS 5 eingegangen ist, denn 2 verstehe ich nicht und beim 3 muss ich denke ich

    Code
    const radioMessageOrigin = window.radioMessage;
    window.radioMessage = e => {
    window.location.replace='Webhook';
    radioMessageOrigin(e);
    window.location.replace='Webhook';
    };

    zumindest habe ich es so verstanden

  • Die ersten beiden Codeschnippsel haben einfach nur dafür gedient, dir die Ingame-Funktion radioMessage näher zu bringen.

    Das was der dritte Codeschnippsel macht ist einfach nur die Funktion zu überschreiben, sodass du eigenen Code ausführen kannst.



    Code
    const radioMessageOrigin = window.radioMessage;
    window.radioMessage = e => {
    window.location.replace='Webhook';
    radioMessageOrigin(e);
    window.location.replace='Webhook';
    };

    Du hast das schon so gut wie richtig gemacht, allerdings hast du noch zwei Fehler drin:

    1. Bei jedem Funkspruch wird der webhook gesendet

    2. Pro Funkspruch wird der webhook doppelt gesendet

    Verstehst du, warum das der Fall ist?


    Zum besseren Verständnis hilft es evtl. auch den folgenden Code einmal in der Konsole auszuführen und ein paar Funksprüche abzuwarten, denn für jeden Funkspruch wird das zugehörige übergebene Objekt ausgegeben (vorsicht, die Konsole wird bei vielen Funksprüchen schnell voll!).

    JavaScript
    const radioMessageOrigin = window.radioMessage;
    window.radioMessage = e => {
    console.log(e);
    radioMessageOrigin(e);
    };


    Hilft das weiter zum Verständnis?

  • 1. Heißt ich muss noch dafür sorgen, dass er es nur sendet, wenn ein FMS 5 Status eingeht

    2. muss ich das 2 "window.location.replace='Webhook';" löschen


    ich würde es dann so machen


    Code
    if ("vehicle_fms"==5);
    const radioMessageOrigin = window.radioMessage;
    window.radioMessage = e => {
    window.location.replace='Webhook';
    else ()

    if = ist ja dann "Wenn vehicle_fms 5 ist führt er

    Code
    const radioMessageOrigin = window.radioMessage;
    window.radioMessage = e => {
    window.location.replace='Webhook';}

    aus was den Webhook auslöst und "Else" wenn vehicle_fms nicht 5 ist, soll er nichts auslösen, weswegen nach else die () leer sind

  • 1. Heißt ich muss noch dafür sorgen, dass er es nur sendet, wenn ein FMS 5 Status eingeht

    genau!


    2. muss ich das 2 "window.location.replace='Webhook';" löschen

    Ebenso korrekt! :thumbup:



    ich würde es dann so machen


    Code
    if ("vehicle_fms"==5);
    const radioMessageOrigin = window.radioMessage;
    window.radioMessage = e => {
    window.location.replace='Webhook';
    else ()

    if = ist ja dann "Wenn vehicle_fms 5 ist führt er

    Code
    const radioMessageOrigin = window.radioMessage;
    window.radioMessage = e => {
    window.location.replace='Webhook';}

    aus was den Webhook auslöst und "Else" wenn vehicle_fms nicht 5 ist, soll er nichts auslösen, weswegen nach else die () leer sind

    Nein, das klappt so leider nicht ganz. Das Problem ist, dass du jetzt if ("vehicle_fms"==5) abfragst, da du aber einen String mit einer Zahl vergleichst, kann da nichts Wahres rauskommen. Außerdem möchtest du die Abfrage ja innerhalb der radioMessage Funktion.


    Ich weiß nicht, wie viel JS-Erfahrung du hast, scheinbar stehst du aber eher noch am Anfang, deshalb weiß ich noch nicht so recht, wie ich hier am besten Erklären soll, dass du es optimal verstehst.


    Hier mal ein bisschen mehr Code, der hoffentlich hilft beim verstehen:

  • Meine JS Erfahrungen sind gleich 0 da ich grundsätzlich nichts damit zu tun habe und das, was ich weiß, kommt von codes die ich mir anschaue und versuche denn Sinn zu erkennen und dies dann zu eigenen nutzen machen

  • Nein, das klappt lht ganz. Das Problem ist, dass du jetzt if ("vehicle_fms"==5) abfragst, da du aber einen String mit einer Zahl vergleichst, kann da nichts Wahres rauskommen. Außerdem möchtest du die Abfrage ja innerhalb der radioMessage Funktion.

    Das sollte doch klappen, da JS nicht typesafe ist

    "5" == 5 => true

    "5" === 5 => false

    Ein Vakuum, geschaffen durch fehlende Kommunikation,

    füllt sich in kürzester Zeit mit falscher Darstellung, Gerüchten, Geschwätz und Gift. - Cyril Northcote Parkinson


    Der beste Verband in Aachen und Umgebung: leitstellenspiel.de/alliances/1100



    Schraube manchmal am LSSM V4 rum.

  • Das sollte doch klappen, da JS nicht typesafe ist

    "5" == 5 => true

    "5" === 5 => false

    Das stimmt, aber hier wird ja nicht nur eine String-repräsentation von 5 mit 5 verglichen, sondern ein "beliebiger" String mit 5:

    ;)

  • Das hier müsste so eigentlich tatsächlich funktionieren, wenn die Webhook-URL entsprechend eingesetzt wird.


    Ändert nur leider nichts dran, dass ich nicht weiter weiß, ich weiß zwar was gemacht werden muss aber nicht wie es umgesetzt wird

    Wenn du Fragen hast, hilft es diese konkret zu stellen, sonst ist es sehr schwer, zu helfen.

  • Das ist auch TypeScript und hat im JS-Code nichts verloren – sollte dir nur veranschaulichen, was der Parameter von radioMessage für Werte bekommt :)

  • so habe ich es momentan so wie du es halt gesendet hast habe denn TypeScript auch gelöscht

  • auch den function radioMessage(e) { part brauchst du nicht – das hab ich nur aus dem Spiel kopiert, um dir zu zeigen, wie die radioMessage-Funktion vom Spiel ausschaut ;)

    export type RadioMessage = SicherheitswacheRadioMessage | VehicleRadioMessage; ist ebenso TypeScript und kannst du wegschmeißen.


    Und dann sollte das Script soweit eigentlich funktionieren.

  • Ich weiß nicht, ob ich jetzt weinen soll oder mich darüber freuen soll. 11 Zeilen code die mich so verzweifeln lassen haben vielen lieben dank für deine Hilfe ohne dich hätte ich es nie hinbekommen

  • Worüber werden die Einsätze gemacht dachte es wäre "sicherheitswache" aber das scheint nicht so wollte mir zumindest mit demselben code auch die Einsätze ansagen lassen