Telegram Client - Variablen Übergabe lua<>bash

  • Hallo,

    ich denke für diesen Fall eröffne ich mal einen eigenen Thread, da ich fürchte (oder auch wünsche), dass das Thema auch diskussionswürdig ist.

    Folgende Frage ...

    Auf meinem RasPi läuft der Telegram-Client und funktiioniert auch in jeder Hinsicht einwandfrei. Nun kann ich ja in der test.lua Bedingungen und Aktionen festlegen für den Fall einer eintreffenden Nachricht.

    Da ich hier einen ziemlichen Aufwand plane, mit einer Menge verschiedenster Bedingungen, wo unter anderem nach Absender und erhaltenem Text unterschieden werden muss, erscheint mir der Einbau in die test.lua eher nicht angebracht.


    Ich starte den Client/Listener per

    Code
    screen -dmS telegramID ./telegram -s test.lua


    durch den screen wird verhindert, dass das an anderer Stelle aufgetretene Problem mit der hohen CPU-Last, wenn der Client im Hintergrund läuft auftritt

    Nun kann ich ja in der test.lua meine Bedingungen für den Fall einer eingehenden Nachricht festlegen und ggf. Aktionen auslösen.

    Beispielweise eine schlichte Textantwort

    Code
    function on_msg_receive (msg)
    
    
    vardump( msg ) --Ausgabe von msg
    
    
      if (msg.text == 'Hallo') then
        send_msg (msg.from.print_name, 'Welt!')
        return
      end

    oder aber ich rufe ein bash-script auf

    Code
    function on_msg_receive (msg)
    
    
    vardump( msg ) --Ausgabe von msg
    
    
      if (msg.text == 'Hallo') then
      os.execute("/home/pi/telegram/meinbash.sh")
        return
      end

    Nun denn, ich habe mir in den letzten Monaten mühsam die Grundbegriffe der bash Programmierung draufgetan und bin einigermassen in der Lage bash-scripts zu schreiben.
    Lua ist für mich absolutes Neuland und ich muss gestehen, dass ich mir gestern ordentlich einen abgebrochen habe, bei dem Versuch einen verschachtelteten if then elseif else Block hinzukriegen. Das wiederum wäre in bash für mich kein Problem.

    Daher halte ich den folgenden Lösungsansatz für mich am geeignetsten:

    Ansatz 1
    Ich übergebe bei Eintreffen einer Nachricht den Absender und den Text an ein bash-script, dass dann auf meine unzähligen Bedingungen prüft, ggf. Aktionen auslöst und am Ende dann den Absender und den Antwort-Text wieder an die lua zurückgibt, die diese dann versendet.

    Ansatz 2
    Folgender Code soll ja von bash aus, direkt eine Nachricht senden können

    Code
    echo 'msg user#<ID> <Nachricht>\nquit' |./telegram

    Demnach würde ich dann wie oben die zwei Variablen übergeben und ALLES andere im bash-script ausführen, ohne die Variablen an die lua zurückgeben zu müssen.

    Nun zu meinen Fragen:

    Stimmt ihr mir zu, dass diese Variante eleganter ist, als die test.lua mit unzähligen Bedingungen zu füllen? (wozu ich mich auch noch intensiv mit lua beschäftigen müsste)

    Welcher der beiden Ansätze macht mehr Sinn und mit welchen Schwierigkeiten muss ich rechnen?

    und jetzt kommts ... (war doch klar, oder?)

    Ich kann ja mit

    Code
    os.execute("/home/pi/telegram/tgexe \""..msg.from.print_name.."\" \""..msg.text.."\"")

    die Variablen an die bash übergeben

    Wie gebe ich sie anschliessend zurück?

    Ich fände es schön, das mal auszudiskutieren, da ich mir wirklich die halbe Nacht das Hirn zermartert habe und ziemlich unsicher bin, wie ich es am Besten mache.

    Und wenn dann noch jemand die letzte Frage beantworten würde, wäre Ostern gerettet.

    Danke im Voraus

    Gruss Haggi

  • Wenn du die Ausgabe des Bash Skripts in Lua haben willst, solltest du nicht os.execute nehmen, sondern:

    Code
    local handle = io.popen("echo 'Hallo'") --oder z.B. io.popen("./tgexe.sh arg1 arg2'")
        local result = handle:read("*a")
        handle:close()
        print result

    LG
    mlt

  • Hallo und Guten Abend,

    leider habe ich dummerweise meinen Eintrag grad überschrieben, also poste ich es nochmal von vorne... Vielleicht hat jemand von euch eine Idee:

    Ich habe auf meinem pi2 (wheezy) den Telegram-CLI zum Laufen bekommen. In meiner action.lua habe ich bereits diverse Aktionen angelegt, sodass der telegram-cli bereits auf die folgenden Commands reagiert:
    /help --> schickt mit eine Übersicht mit div. von mit definierten Commands per Telegram
    /ip ---> sendet mir die per ext. Skript ermittelte externe IP Adresse per Telegram
    /ping --> sendet einen ping an meinen Router und sendet mir die Antwort per Telegram
    ....

    Nun habe ich ein einfaches Bash-Skript "wecker.sh" erstellt, welches mir eine einfache Erinnerungsfunktion/Weckfunktion zu einem definierten Zeitpunkt liefert. Starte ich das Skript ohne ein Argument also z.b. /home/pi/skripte/wecker.sh setzt er die Erinnerung auf 12:00... Nun möchte ich die Uhrzeit flexibiler definieren können und nutze $1 für die Angabe der Uhrzeit. Starte ich also das Skript mit /home/pi/skripte/wecker.sh 13:15 wird die Erinnerung brav zu der gewünschten Uhrzeit versendet. Das Bash-Skript ansich funktioniert also. Nun möchte ich per Telegram den Command /wecker 13:15 senden. Die Herausforderung dabei besteht darin, die Uhrzeit 13:15 in eine Variable im Lua-Skript zu bekommen, damit ich diese dem Bash-Skript mitgeben kann:

    Mein aktueller Versuch schaut so aus:

    Code
    -- Wecker:
      if (msg.text=='/wecker' or msg.text=='/Wecker') then
          os.execute ("/home/pi/skripte/wecker.sh '"..msg.text.."')
          local res = handle:read("*a")
      handle:close()
      end

    Leider funktioniert dies nicht....

    Wenn ich den Command /wecker 13:15 per Telegram sende, erhalte ich bei den Test-Variablen

    Code
    print("Test1: %{msg}")
    print("Test2: "..msg.text)

    die folgende Ausgabe:

    Code
    Test1: %{msg}
    Test2: /wecker 13:15

    Wie bekomme ich nun die 13:15 in mein LUA-Script, damit ich dies weiter an das Bash Skript durchreichen kann?? Kann mir jemand helfen?

    Einmal editiert, zuletzt von Micky (19. Dezember 2015 um 19:08)

  • Getreu dem Motto "Mühsam ernährt sich das Eichhörnchen" habe ich nun eine Möglichkeit gefunden den String zu zerlegen:

    Code
    befehl, uhrzeit=msg.text:match("([^,]+) ([^,]+)")
    print (uhrzeit)

    Ausgabe: Uhrzeit des mitgeschickten Commands.... soweit so gut. Nun hänge ich an der folgenden Kleinigkeit im Lua-Skript:

    Code
    local handle = io.popen("/home/pi/skripte/wecker.sh 13:34")


    --> funktioniert --> startet das Bash-Skript mit der gewünschten Zeit

    Code
    local handle = io.popen("/home/pi/skripte/wecker.sh ..uhrzeit..")


    --> funktioniert nicht....

    Jemand nen Tipp?

    Einmal editiert, zuletzt von Micky (19. Dezember 2015 um 21:59)

  • Und wieder ein kleiner Schritt geschafft. Der u.g. Code funktioniert (incl. Übergabe der Variable Uhrzeit). Das Skript reagiert aber nur wenn der Command /wecker lautet.

    Code
    --Wecker 
    if (msg.text=='/wecker' or msg.text=='/Wecker') then
         os.execute(string.format("/home/pi/skripte/wecker.sh \"%s\" &",uhrzeit))
    end

    Sobald ich aber als Command /wecker 10:15 schicke startet des Skript nicht mehr, da es nicht der if-Bedingung entspricht. Wie bekomme ich hier einen Platzhalter ála * oder ??:?? rein, damit die if Anweisung auch erfüllt wird, wenn die Uhrzeit mitgeschickt wird?

    Vielen Dank für eure Hilfe.

    Einmal editiert, zuletzt von Micky (20. Dezember 2015 um 18:29)

  • Guten Morgen,

    Manchmal sieht man den Wald vor lauter Bäumen nicht... Folgende Code für die if-Prüfung funktioniert:

    Code
    befehl, uhrzeit=msg.text:match("([^,]+) ([^,]+)")
    if (befehl=='/wecker' or befehl='/Wecker') then


    Der komplette Auszug aus der action.lua würde dann folgendermaßen aussehen:

    Code
    --Wecker 
    befehl, uhrzeit=msg.text:match("([^,]+) ([^,]+)")
    if (befehl=='/wecker' or befehl='/Wecker') then
         os.execute(string.format("/home/pi/skripte/wecker.sh \"%s\" &",uhrzeit))
    end

    Vielleicht hilft es ja den ein oder anderen von euch.... Über den gleichen Weg ist es auch möglich eine dritte Variable z.B. mit dem Erinnerungsgrund einzubauen.

    LG M.

    EDIT: Nachdem ich fälschlicherweise einiges doppelt gepostet habe, verweiese ich hier noch auf den anderen Post: Lua -> variable -> Python

    Einmal editiert, zuletzt von Micky (20. Dezember 2015 um 18:30)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!