Es geht um Telegrammer, das Telegram Bot-Framework für Linux / macOS , das vollständig in Swift 4.1 geschrieben wurde

Exposition: Wie ist ein solcher Gedanke in den Sinn gekommen?
Eines meiner Lieblingsprojekte (eine iOS-Anwendung, die sich auf Telegram bezieht, aber jetzt geht es nicht mehr um ihn) benötigte eine Weboberfläche für den Content Manager, um eine Beschreibung, ein Tag und mehr zu erstellen. Da die Anwendung bereits ideologisch mit Telegram verbunden war, fiel mir sofort ein, Inhalte direkt an den Messenger zu senden und dort bereits die oben genannten Aktionen auszuführen.
Es stellte sich heraus, dass Sie solche Daten über Bots senden können (wie Bots im Telegramm angeordnet sind).
Anfang: Ich suchte nach einer vorgefertigten Lösung, ich konnte keine passende finden.
Und dann reihen sich alle Sterne aneinander, jetzt wirst du verstehen, was ich meine ...
Es gibt viele zuverlässige, bewährte serverseitige Frameworks in Java, Go, Python, PHP und anderen, mit denen Sie bereits problemlos einen Bot erstellen können. Aber hier geht es nicht um uns (Zeugen) Jehovas Apple) suchen wir nicht nach einfachen Wegen.
Was ist, wenn Sie einen Bot in Swift schreiben?
In jüngerer Zeit (nach den Standards der Programmiersprachen) begann sich die Server Side Swift-Community aktiv zu entwickeln, und es erschienen mehrere Frameworks wie Vapor, Perfect und Kitura, die genügend Ruhm erlangten.
Außerdem hat Apple Brennholz in den Ofen geworfen , was Entwicklern mit einem SwiftNIO- Framework auf niedriger Ebene und hoher Leistung das Leben erleichtert
Warum ist SwiftNIO cool?SwiftNIO ist ein plattformübergreifendes asynchrones ereignisgesteuertes Netzwerkanwendungsframework für die schnelle Entwicklung wartbarer Hochleistungsprotokollserver und -clients.
Es ist wie bei Netty , aber für Swift geschrieben.
SwiftNIO ist im Grunde ein Low-Level-Tool zum Erstellen von Hochleistungs-Netzwerkanwendungen in Swift. Es richtet sich insbesondere an Anwendungsfälle, in denen die Verwendung eines "Thread-per-Connection" -Modells der Parallelität ineffizient oder unhaltbar ist. Dies ist eine häufige Einschränkung beim Erstellen von Servern, die eine große Anzahl von Verbindungen mit relativ geringer Auslastung verwenden, z. B. HTTP-Server.
Um seine Ziele zu erreichen, verwendet SwiftNIO in großem Umfang "nicht blockierende E / A": daher der Name! Nicht blockierende E / A unterscheiden sich vom häufigeren blockierenden E / A-Modell dadurch, dass die Anwendung nicht darauf wartet, dass Daten an das Netzwerk gesendet oder von diesem empfangen werden. Stattdessen fordert SwiftNIO den Kernel auf, sie zu benachrichtigen, wenn E / A-Vorgänge dies können durchgeführt werden, ohne zu warten.
SwiftNIO zielt nicht darauf ab, Lösungen auf hoher Ebene bereitzustellen, wie dies beispielsweise bei Webframeworks der Fall ist. Stattdessen konzentriert sich SwiftNIO auf die Bereitstellung der Low-Level-Bausteine für diese übergeordneten Anwendungen. Wenn es um das Erstellen einer Webanwendung geht, möchten die meisten Benutzer SwiftNIO nicht direkt verwenden. Stattdessen möchten sie eines der vielen großartigen Webframeworks verwenden, die im Swift-Ökosystem verfügbar sind. Diese Web-Frameworks können sich jedoch dafür entscheiden, SwiftNIO unter dem Deckmantel zu verwenden, um ihre Netzwerkunterstützung bereitzustellen.
Was ich aus den fertigen Telegram Bot Swift-Bibliotheken herausgefunden habe:
zmeyc / telegram-bot-swift - Eine ziemlich fortgeschrittene Bibliothek, die gesamte Telegramm-Bot-API wird von der Site aus analysiert. Sowohl Methoden als auch Modelle, erweitertes Routing, funktionieren sowohl unter MacOS als auch unter Linux.
Die Nachteile, die mit der Tatsache verbunden sind, dass es vor langer Zeit geschrieben wurde und zu dieser Zeit alle Apple-Frameworks (insbesondere Foundation) unter Linux sehr instabil arbeiteten:
- Sendet Anfragen per Curl
- Zum Zeitpunkt der Studie waren sowohl die Bibliothek selbst als auch die abhängigen Bibliotheken nicht auf Swift 4 portiert
- Wird von Webhooks nicht unterstützt
- Ein Repository, das lange Zeit nicht aktualisiert wurde. Daher werden einige Funktionen der aktualisierten Telegramm-Bot-API nicht unterstützt.
FabrizioBrancati / SwiftyBot - Verzeih mir, ich verstehe nicht, warum dieser Bot die meisten Sterne hat, der veraltete Vapor 2.4.0 ist unter der Haube und der einsame main.swift, der einfach die einfachste Arbeit mit dem Bot demonstriert. Keine Modelle, Helfer, Versandwarteschlangen, nichts. Oh nein! Im Gegensatz zu Wettbewerbern unterstützt es WebHooks.
ShaneQi / ZEGBot - Eine sehr einfache Implementierung, die grundlegenden Methoden, Modelle und wieder nur LongPolling sind implementiert.
Es wird also beschlossen, dass wir unser eigenes Framework schreiben. Ehrlich gesagt hat mich Andrey Fidrya mit seinem Bot inspiriert, aber ich habe beschlossen, dass ich versuchen könnte, es besser zu machen.
Höhepunkt: Willkommen in der Backend-Welt. SwiftNIO, danke für das explodierte Gehirn.
Ich gebe zu, dass es nach iOS-Anwendungen ziemlich schwierig ist, eine Anwendung für die Serverseite zu schreiben. Ich muss anders denken.
Zum Zeitpunkt der Erstellung des Frameworks hatten die Jungs von Vapor eine Beta angekündigt und basierten bereits auf SwiftNIO. Vapor hat eine modulare Architektur. Jede Schicht befindet sich in einem eigenen Repository. Dies ist sehr praktisch. Sie können nur einen Teil der Implementierungen verwenden.
Ich entschied mich für:
Dabei wurden einige Fehler in Vapor HTTPClient gefunden, erfolgreich behoben, der HTTPServer wurde verbessert, um mit https sofort zu arbeiten, ohne dass Nginx und dergleichen verwendet werden müssen.
Was ist passiert:
- Die Bot-API wurde mit einem starken Blick auf einen vertrauenswürdigen Spieler in diesem Bereich Python-Telegramm-Bot entwickelt
- Wie bei zmeyc / telegram-bot-swift können alle Telegramm-Bot-API- Bot-Modelle und -Methoden durch Ausführen eines Skripts generiert werden.
- Implementierte Longpolling- und WebHooks-Modi
- Implementierte Handler: CommandHandler, CallbackQueryHandler, RegexpHandler, MessageHandler
- Viele Filter für Updates
- Zwei einfache Bots, zum Beispiel Standard EchoBot und HelloBot
Austausch: Wir schreiben einen Bot, der im Allgemeinen nützlich ist. Lassen Sie ihn die Rechtschreibung überprüfen.
Bot: @yandex_spell_checker_bot
Quellcode: https://github.com/givip/YandexSpellCheckerBot
main.swift sieht folgendermaßen aus:
import Foundation import Telegrammer /// enviroment variable ( , ) guard let token = Enviroment.get("SPELL_CHECKER_BOT_TOKEN") else { exit(1) } do { /// let bot = try Bot(token: token) /// let dispatcher = Dispatcher(bot: bot) /// let controller = SpellCheckerController(bot: bot) /// /start, let commandHandler = CommandHandler(commands: ["/start"], callback: controller.start) dispatcher.add(handler: commandHandler) /// , let textHandler = MessageHandler(filters: .private, callback: controller.spellCheck) dispatcher.add(handler: textHandler) /// , . let inlineHandler = CallbackQueryHandler(pattern: "\\w+", callback: controller.inline) dispatcher.add(handler: inlineHandler) /// Longpolling _ = try Updater(bot: bot, dispatcher: dispatcher).startLongpolling().wait() } catch { print(error.localizedDescription) }
Epilog: iOS-Entwickler und mehr, nutzen Sie es!
Das Framework befindet sich in der Beta-Phase und kann von jedem für seine Anforderungen verwendet werden.
Nach einem Monat voller Tests und Verbesserungen gab es einige Mängel, Wunschliste und viele Verbesserungsprobleme, aber dennoch hat sich "Rechtschreibprüfung" unter Ubuntu schon lange gedreht.
Ich wäre dankbar für jedes Feedback und würde auf den Ventilator werfen.