Telegram Bot auf Kotlin: Dratuti / Sudo Null IT News

Dies ist der zweite Teil der Telegram-Bot-Tutorials für Kotlin. Den ersten Artikel finden Sie hier. In diesem Teil werden wir versuchen, ein unzureichend einfaches Willkommens-Plugin zu erstellen, in dem wir mit Datenbanken arbeiten, neue Methoden beim Senden von Nachrichten und Möglichkeiten zur Interaktion mit Bot-Benutzern verwenden müssen.

Viele Dinge in diesem Teil werden übersprungen. Das Starten eines Bots, das Zuweisen grundlegender Schnittstellen usw. wird hier beispielsweise nicht behandelt. Auch das Einrichten der Admin-Caching-API wird nicht im Detail behandelt. Sie können die meisten Informationen finden, indem Sie den ersten und anderthalb Teil dieses Tutorials besuchen.

Warnung für schwache Nerven

Tatsächlich würde die Funktionalität dieses Plugins für einen separaten Bot ausreichen, da es über eine eigene Logik und Funktionen verfügt, die unbegrenzt weiterentwickelt werden können. Ich werde jedoch versuchen, so klar wie möglich zu erklären, was hier passiert und warum.

Kommen Sie zur Sache

Die Aufgabe ist also relativ einfach: Fügen Sie ein Plugin hinzu, mit dem Chat-Administratoren die Willkommensnachricht für eingehende Benutzer anpassen können. Die Hauptlogik ist die folgende:

  1. Der Administrator sendet den /welcome-Befehl an den Chat

  2. Der Admin erhält vom Bot eine persönliche Nachricht mit dem Vorschlag, eine Willkommensnachricht einzurichten

  3. Dann passiert eine von drei Optionen:

    1. Begrüßungsnachricht vom Administrator deaktiviert

    2. Der Administrator hat die Willkommenseinstellung abgebrochen

    3. Der Administrator hat eine Nachricht gesendet, die als Begrüßung dient

Wie immer ist die Realität komplizierter.

Tatsächlich können bei jedem Schritt viele Dinge passieren: Der Benutzer ist kein Administrator, der Benutzer hat keinen Dialog mit dem Bot gestartet, während der Einrichtung hat der Benutzer aufgehört, ein Administrator zu sein usw. Wir werden einige dieser Situationen behandeln und einige in diesem Tutorial weglassen.

Erwähnenswert ist auch, dass die Willkommensnachricht über die Kopiermethode gesendet wird, um die Kosten sowohl für den Bot als auch für das Telegramm selbst zu reduzieren

Nachrichteneinstellungen und WelcomeTable

Die Einstellungen selbst bestehen für jeden Chat aus nur drei Feldern: dem Besitzer des Begrüßungschats, dem Chat mit der Begrüßungsnachricht und der Nachrichten-ID.

WelcomeTable ist eine ziemlich einfache SQL-Tabelle mit drei Feldern für Einstellungen und drei Operationen:

  • Nachricht einstellen (einstellen)

  • Nachricht löschen (nicht gesetzt)

  • Nachricht für Chat erhalten (get)

Plugin selbst

Im Kern ist der Sub in zwei Teile geteilt:

  • Senden einer Willkommensnachricht (wahrscheinlich der einfachste Teil)

  • Anpassen der Begrüßungsnachricht

Einstellung

Das Setup besteht aus mehreren Teilen:

  • Teamregistrierung vom Admin

  • Nachrichtensteuerung starten

  • Verarbeitung aller Variantenzweige:

    • Nachricht stummschalten

    • Einstellung abbrechen

    • Einstellen einer neuen Nachricht

    • Umgang mit der Tatsache, dass ein Benutzer in einem Chat aufhören kann, Administrator zu sein

Jeder der Schritte ist an sich relativ einfach, also lasst uns teilen und erobern und wieder zusammenbauen.

Registrieren eines Administrators commandonCommand( // Registrieren eines „Welcome“-Handlers, // Festlegen eines Befehls für den Handler initialFilter = { it.chat is GroupChat // pre-filtering // to work only with group chats } ) { it.ifCommonGroupContentMessage { groupMessage -> // Wenn die Nachricht normal ist, // also nicht anonym und nicht von einem Kanal, // dann Verarbeitung starten launch { // Parallele Verarbeitung starten – um die Verarbeitung neuer Nachrichten nicht zu blockieren handleWelcomeCommand( / / Rufen Sie die Verarbeitungsmethode auf, deren Arbeit unten beschrieben wird adminsCacheAPI, welcomeTable , config, groupMessage ) } } } Bezüglich des Starts

Eigentlich ist dieser Schritt optional. Es würde ausreichen, so etwas wie markerFactory = { it.chat.id to it.messageId } anzugeben, was dazu führen würde, dass jede Nachricht separat und inkonsistent relativ zu anderen verarbeitet wird. Die Startoption scheint jedoch prägnanter zu sein.

Kontrollen und „dratuti vor dratuti“

Das erste, was in handleWelcomeCommand passiert, ist, den Benutzer abzurufen, der den Befehl gesendet hat, und ihn zu überprüfen:

val user = groupMessage.user // Befehlssender user if (adminsCacheAPI.isAdmin(groupMessage.chat.id, user.id)) { // Prüfe, ob der Benutzer ein Administrator ist val previousMessage = welcomeTable.get(groupMessage.chat.id ) // Holen Sie sich die vorherige Begrüßungsnachricht val sentMessage = send( // Senden Sie eine Nachricht mit Steuerschaltflächen für die Begrüßungsnachricht user, // Geben Sie den Benutzer und damit seinen Chat als Ziel an answerMarkup = flatInlineKeyboard { // Erstellen Sie eine einstufige keyboard if ( previousMessage ! = null) { // Wenn die Willkommensnachricht bereits gesetzt ist, können Sie sie entfernen dataButton(“Unset”, unsetData) // Fügen Sie dazu den entsprechenden Button hinzu } dataButton(“Cancel”, cancelData) // Fügen Sie auch eine Schaltfläche hinzu, um die Steuerung der Willkommensnachricht abzubrechen } ) { // Dieses Lambda erstellt den Text der Nachricht regular(“Ok, sende mir die Nachricht, die als Willkommensnachricht für den Chat verwendet werden soll”) underline(groupMessage. chat.title) } // Hauptlogik } Das Schlimmste

Bevor ich die Hauptkonfigurationslogik beschreibe, möchte ich gleich einen Vorbehalt zu zwei Unter-DSLs machen, die weiter verwendet werden:

  • Der parallele Aufruf innerhalb des BehaviourContext erstellt eine parallel laufende Operation, die etwas zurückgeben kann (was im Allgemeinen nicht erforderlich ist).

  • oneOf empfängt eine Reihe paralleler Aufrufergebnisse als Eingabe und wartet darauf, dass mindestens eine der empfangenen Operationen abgeschlossen ist (der Rest wird abgebrochen).

Der Code lautet also:

oneOf( // Beginnen Sie mit dem Warten auf den Abschluss von mindestens einem der Skripte parallel { // Starten Sie das Skript, um die Willkommensnachricht zu deaktivieren val query = waitMessageDataCallbackQuery().filter { // Warten Sie, bis die Schaltfläche mit unsetData gedrückt wird, und prüfen Sie dass auf die Schaltfläche geklickt wird // Auf die gleiche Schaltfläche , die sentMessage ist it.data == unsetData && it.message.sameMessage(sentMessage) }.first() // Auf die erste solche warten press edit(sentMessage) { // Bearbeiten Sie die gesendete Nachricht, um das Ergebnis der Operation anzuzeigen if (welcomeTable.unset( groupMessage.chat.id)) { // Entfernen Sie die Nachricht aus der Datenbank // Wenn erfolgreich, informieren Sie den Benutzer darüber regular(“Welcome message has been für Chat entfernt “) underline(groupMessage.chat.title) } else { // Auch wenn die Nachricht nicht gelöscht werden konnte, sagen Sie dies regular(“Beim Deaktivieren der Willkommensnachricht für den Chat ist etwas schief gelaufen”) underline(groupMessage.chat.title) } } answer(query) // Telegram Bot API mitteilen, dass die Anfrage verarbeitet wurde }, parallel { // Beginn des Override-Skripts neue Nachricht autsch val query = waitMessageDataCallbackQuery().filter { // Auf das Drücken einer Schaltfläche mit cancelData warten und prüfen, ob die Schaltfläche gedrückt wird // Auf derselben Schaltfläche wie sentMessage it.data == cancelData && it.message.sameMessage (sentMessage) }.first() // Auf den ersten solchen Klick warten edit(sentMessage) { // Den Benutzer über das Abbrechen des Zurückspulens benachrichtigen regular(“Sie haben die Änderung der Begrüßungsnachricht für den Chat abgebrochen”) underline(groupMessage.chat. title) } answer(query) // Teilen Sie der Telegram Bot API mit, dass die Anfrage verarbeitet wurde }, parallel { // Starten Sie die Registrierungsoperation für neue Nachrichten val message = waitContentMessage().filter { // Prüfen Sie, ob die empfangene Nachricht von ist derselbe Chat it.sameChat(sentMessage) }.first () // Erhalte die erste Nachricht im Chat mit dem Benutzer val success = welcomeTable.set( // Speichere die neuen Einstellungen mit einem Link zur neuen Nachricht ChatSettings( groupMessage. chat.id, message.chat.id, message.messageId ) ) respond(message ) { // Antworten auf eine benutzerdefinierte Nachricht Chat-Erfolgs-/Fehlermeldung if (success) { regular(“Willkommensnachricht wurde für den Chat geändert”) underline(groupMessage.chat.title) regular(“.\n\n”) bold(“Bitte diese Nachricht nicht löschen wenn Sie möchten, dass es funktioniert und stoppen Sie diesen Bot nicht, damit die Willkommensnachricht richtig funktioniert”) } else { regular(“Beim Ändern der Willkommensnachricht für den Chat ist etwas schief gelaufen”) underline(groupMessage.chat.title) } } delete ( sentMessage) // Löschen Sie die Nachricht mit den Schaltflächen }, parallel { // Starten Sie die Operation, um zu überprüfen, ob der Administrator des Benutzers auf dem neuesten Stand ist while (isActive) { // Bis die Operation unterbrochen wird delay(config.recheckOfAdmin) // Just sleep 🙂 if (adminsCacheAPI.isAdmin( groupMessage.chat.id, user.id)) { // Überprüfung des Admins // Wenn der Benutzer aufgehört hat, Admin zu sein, melden wir dies und // vervollständigen dies und (als eine Ergebnis) andere Operationen edit(sentMessage, “Entschuldigung, aber Sie sind nicht mehr Admin im Chat ${groupMessage.chat.title}”) break } } } )

Na jetzt etwas drutti?

Und schließlich eine Nachricht für neue Benutzer senden:

onNewChatMembers { it: ChatEventMessage -> // Registrierung eines Benutzer-Login-Triggers val chatSettings = welcomeTable.get(it.chat.id) // Holen Sie sich die Chat-Einstellungen if (chatSettings == null) { // Wenn es keine gibt Einstellungen für den Chat – nichts zu senden return@onNewChatMembers } answer( // Sende eine Antwort auf die Benutzer-Login-Nachricht it, // Nutze die Nachricht – der Bot wird verstehen, wohin die Nachricht // gesendet werden soll und welche MessageId für die zu verwenden ist replay chatSettings.sourceChatId, // Chat-Quelle der Willkommensnachricht chatSettings.sourceMessageId // Nachrichten-ID der Willkommensnachricht ) }

Da wir die Chat- und Nachrichten-IDs für die Wiedergabe verwendet haben, verwendet der Bot die copyMessage-Methode, um eine Nachricht an den angegebenen Chat und die zu kopierende Nachrichten-ID zu senden.

Was ist das Ergebnis

Aus diesem Grund haben wir ein Plugin für unseren Bot erstellt, mit dem Sie Willkommensnachrichten für eine potenziell fast unbegrenzte Anzahl von Chats anpassen können. Es gibt jedoch viele Dinge, die hinzugefügt werden könnten, und ich habe sie bewusst weggelassen, um den Code zu vereinfachen:

  • Verarbeitung von Befehlen, die von Nicht-Administratoren gesendet wurden

  • Möglichkeit, eine Willkommensnachricht zu empfangen

  • Benachrichtigungen für Administratoren beim Ändern von Willkommensnachrichten

Zu Übungs- und Testzwecken können Sie diese Funktionalität selbst hinzufügen 🙂

Similar Posts

Leave a Reply

Your email address will not be published.