Il s'agira de Telegrammer, framework Telegram Bot pour Linux / macOS , entièrement écrit en Swift 4.1

Exposition: Comment une telle pensée vous est-elle venue à l'esprit?
Un de mes projets pour animaux de compagnie (une application iOS liée à Telegram, mais maintenant il ne s'agit pas de lui) avait besoin d'une interface Web pour que le gestionnaire de contenu crée une description, une balise et plus encore. Étant donné que l'application était déjà liée idéologiquement à Telegram, il m'est immédiatement venu à l'esprit d'envoyer du contenu directement au messager et d'effectuer déjà les actions ci-dessus.
Il s'est avéré que vous pouvez envoyer ces données via des bots (comment les bots sont organisés dans Telegram ).
Au départ: je cherchais une solution toute faite, je n'ai pas trouvé de solution adaptée.
Et puis toutes les étoiles alignées, maintenant vous comprendrez ce que je veux dire ...
Il existe de nombreux frameworks côté serveur fiables et éprouvés en Java, Go, Python, PHP et autres qui vous permettent déjà de créer un bot sans aucun problème. Mais cela ne nous concerne pas (témoins De Jéhovah Apple), nous ne recherchons pas de moyens simples.
Et si vous écrivez un bot dans Swift?
Plus récemment (selon les standards des langages de programmation), la communauté Server Side Swift a commencé à se développer activement, et plusieurs frameworks sont apparus, tels que Vapor, Perfect, Kitura, qui ont réussi à gagner une renommée suffisante.
De plus, Apple a jeté du bois de chauffage dans le four, facilitant la vie des développeurs avec un cadre SwiftNIO de bas niveau et hautes performances
Pourquoi SwiftNIO est-il cool?SwiftNIO est un cadre d'application réseau asynchrone multiplateforme basé sur des événements pour le développement rapide de serveurs et de clients de protocole hautes performances maintenables.
C'est comme Netty , mais écrit pour Swift.
SwiftNIO est fondamentalement un outil de bas niveau pour créer des applications de mise en réseau hautes performances dans Swift. Il cible particulièrement les cas d'utilisation où l'utilisation d'un modèle de concurrence par threads par connexion est inefficace ou intenable. Il s'agit d'une limitation courante lors de la création de serveurs qui utilisent un grand nombre de connexions à relativement faible utilisation, telles que les serveurs HTTP.
Pour atteindre ses objectifs, SwiftNIO utilise largement les "E / S non bloquantes": d'où le nom! Les E / S non bloquantes diffèrent du modèle d'E / S de blocage le plus courant car l'application n'attend pas que des données soient envoyées ou reçues du réseau: à la place, SwiftNIO demande au noyau de le notifier lorsque les opérations d'E / S peuvent être effectuée sans attendre.
SwiftNIO n'a pas pour objectif de fournir des solutions de haut niveau comme, par exemple, les frameworks Web. Au lieu de cela, SwiftNIO se concentre sur la fourniture des blocs de construction de bas niveau pour ces applications de niveau supérieur. Lorsqu'il s'agit de créer une application Web, la plupart des utilisateurs ne voudront pas utiliser SwiftNIO directement: ils voudront plutôt utiliser l'un des nombreux excellents cadres Web disponibles dans l'écosystème Swift. Ces frameworks Web peuvent toutefois choisir d'utiliser SwiftNIO sous les couvertures pour fournir leur support réseau.
Ce que j'ai considéré des bibliothèques Telegram Bot Swift terminées:
zmeyc / telegram-bot-swift - Une bibliothèque assez avancée, l'intégralité de l'API Telegram Bot est analysée à partir du site, à la fois les méthodes et les modèles, le routage avancé, fonctionne à la fois sur macOS et Linux.
Les inconvénients liés au fait qu'il a été écrit il y a longtemps, et à cette époque, tous les frameworks Apple (en particulier Foundation) fonctionnaient sous Linux très instables:
- Envoie des demandes via curl
- Au moment de l'étude, la bibliothèque elle-même et les bibliothèques dépendantes n'étaient pas portées vers swift 4
- Non pris en charge par les webhooks
- Un référentiel qui n'a pas été mis à jour depuis longtemps, par conséquent, certaines fonctionnalités de l'API Telegram Bot mise à jour ne sont pas prises en charge.
FabrizioBrancati / SwiftyBot - Pardonnez-moi, je ne comprends pas pourquoi ce bot a le plus d'étoiles, le Vapor 2.4.0 obsolète est sous le capot et le solitaire main.swift, qui démontre simplement le travail le plus simple avec le bot. Pas de modèles, d'aides, de files d'attente de répartition, rien. Oh non! Contrairement aux concurrents, il prend en charge les WebHooks.
ShaneQi / ZEGBot - Une implémentation très simple, les méthodes de base, les modèles, et encore seulement LongPolling sont implémentés.
Donc, c'est décidé, nous allons écrire notre propre framework. Honnêtement, Andrey Fidrya m'a inspiré avec son bot, mais j'ai décidé que je pouvais essayer de faire mieux.
Climax: Bienvenue dans le monde du backend. SwiftNIO, merci pour le cerveau éclaté.
J'avoue, après les applications iOS, écrire une application pour Server Side est assez difficile, je dois penser différemment.
Au moment où le framework a été écrit, les gars de Vapor avaient annoncé une bêta et étaient déjà basés sur SwiftNIO. Vapor a une architecture modulaire, chaque couche vit dans son propre référentiel, ce qui est très pratique, vous ne pouvez utiliser qu'une partie des implémentations.
J'ai décidé d'utiliser:
Dans le processus, certains bogues ont été trouvés dans Vapor HTTPClient, résolus avec succès, le HTTPServer a été amélioré, pour fonctionner avec https hors de la boîte, sans avoir besoin d'utiliser nginx et autres.
Que s'est-il passé:
- L'API du bot a été conçue avec un œil fort sur un acteur de confiance dans ce domaine python-telegram-bot
- Comme zmeyc / telegram-bot-swift, tous les modèles et méthodes de bots de l' API Telegram Bot peuvent être générés en exécutant un script.
- Implémentation des modes Longpolling et WebHooks
- Gestionnaires implémentés: CommandHandler, CallbackQueryHandler, RegexpHandler, MessageHandler
- De nombreux filtres pour les mises à jour
- Deux robots simples, par exemple, EchoBot standard et HelloBot
Échange: Nous écrivons un bot qui est généralement utile, laissez-le vérifier l'orthographe.
Bot: @yandex_spell_checker_bot
Code source: https://github.com/givip/YandexSpellCheckerBot
main.swift ressemble à ceci:
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) }
Épilogue: développeurs iOS et plus, utilisez-le!
Le cadre est en version bêta, et tout le monde peut l'utiliser pour leurs besoins.
Après un mois de tests et d'améliorations, il y avait quelques lacunes, liste de souhaits et beaucoup de problèmes d'amélioration, mais néanmoins, "Spell Checking" tourne depuis longtemps sur Ubuntu.
Je serais reconnaissant pour toute rétroaction et pour lancer le ventilateur.