Como escribió el apodo Telegram bot de iOS, en Swift

Se tratará de Telegrammer, el marco Telegram Bot para Linux / macOS , escrito completamente en Swift 4.1



Exposición: ¿Cómo se me ocurrió tal pensamiento?


Uno de mis proyectos favoritos (una aplicación de iOS relacionada con Telegram, pero ahora no se trata de él) necesitaba una interfaz web para que el administrador de contenido creara una descripción, una etiqueta y más. Dado que la aplicación ya estaba ideológicamente conectada con Telegram, inmediatamente me vino a la mente enviar contenido directamente al messenger y allí ya realizar las acciones anteriores.


Resultó que puede enviar dichos datos a través de bots (cómo se organizan los bots en Telegram ).


Configuración: Estaba buscando una solución preparada, no pude encontrar una adecuada.


Y luego todas las estrellas se alinearon en una fila, ahora entenderás a lo que me refiero ...


Hay muchos marcos confiables y probados del lado del servidor en Java, Go, Python, PHP y otros que ya le permiten crear un bot sin ningún problema. Pero esto no se trata de nosotros (testigos Jehová Apple), no estamos buscando formas fáciles.


¿Qué pasa si escribes un bot en Swift?


Más recientemente (según los estándares de los lenguajes de programación), la comunidad Server Side Swift comenzó a desarrollarse activamente, y aparecieron varios marcos, como Vapor, Perfect, Kitura, que lograron ganar suficiente fama.


Además, Apple arrojó leña al horno, facilitando la vida de los desarrolladores con un marco SwiftNIO de bajo nivel y alto rendimiento .


¿Por qué es genial SwiftNIO?

SwiftNIO es un marco de aplicación de red asincrónica de eventos multiplataforma para el desarrollo rápido de servidores y clientes de protocolo de alto rendimiento mantenibles.


Es como Netty , pero escrito para Swift.


SwiftNIO es fundamentalmente una herramienta de bajo nivel para crear aplicaciones de red de alto rendimiento en Swift. Se dirige particularmente a aquellos casos de uso en los que el uso de un modelo de concurrencia "hilo por conexión" es ineficiente o insostenible. Esta es una limitación común cuando se compilan servidores que usan una gran cantidad de conexiones de uso relativamente bajo, como los servidores HTTP.


Para lograr sus objetivos, SwiftNIO utiliza ampliamente "E / S sin bloqueo": de ahí el nombre. La E / S sin bloqueo difiere del modelo de E / S de bloqueo más común porque la aplicación no espera a que se envíen o reciban datos de la red: en cambio, SwiftNIO solicita que el núcleo lo notifique cuando las operaciones de E / S pueden ser realizado sin esperar.


SwiftNIO no tiene como objetivo proporcionar soluciones de alto nivel como, por ejemplo, los marcos web. En cambio, SwiftNIO se centra en proporcionar los bloques de construcción de bajo nivel para estas aplicaciones de nivel superior. Cuando se trata de crear una aplicación web, la mayoría de los usuarios no querrán usar SwiftNIO directamente: en su lugar, querrán usar uno de los muchos marcos web excelentes disponibles en el ecosistema Swift. Sin embargo, esos marcos web pueden optar por usar SwiftNIO debajo de las cubiertas para proporcionar su soporte de red.


Lo que consideré de las bibliotecas Telegram Bot Swift terminadas:


  1. zmeyc / telegram-bot-swift : una biblioteca bastante avanzada, toda la API de Telegram Bot se analiza desde el sitio, tanto los métodos como los modelos, el enrutamiento avanzado, funcionan tanto en macOS como en Linux.
    Las desventajas asociadas con el hecho de que fue escrito hace mucho tiempo, y en ese momento, todos los frameworks de Apple (especialmente Foundation) funcionaban en Linux muy inestables:


    • Envía solicitudes a través de curl
    • En el momento del estudio, tanto la biblioteca en sí como las bibliotecas dependientes no fueron portadas a swift 4
    • No es compatible con webhooks
    • Un repositorio que no se ha actualizado durante mucho tiempo, como resultado, algunas características de la API actualizada de Telegram Bot no son compatibles.

  2. FabrizioBrancati / SwiftyBot - Perdóname, no entiendo por qué este bot tiene más estrellas, el Vapor 2.4.0 obsoleto está bajo el capó y el main.swift solitario, que simplemente demuestra el trabajo más simple con el bot. Sin modelos, ayudantes, colas de despacho, nada. Oh no! A diferencia de la competencia, es compatible con WebHooks.


  3. ShaneQi / ZEGBot : una implementación muy simple, los métodos básicos, los modelos y, de nuevo, solo se implementan LongPolling.



Entonces, está decidido, escribiremos nuestro propio marco. Honestamente, Andrey Fidrya me inspiró con su bot, pero decidí que podía intentar hacerlo mejor.


Climax: Bienvenido al mundo del backend. SwiftNIO, gracias por el cerebro explotado.


Admito que, después de las aplicaciones de iOS, escribir una aplicación para Server Side es bastante difícil, tengo que pensar de manera diferente.


Para cuando se escribió el marco, los chicos de Vapor habían anunciado una versión beta y ya estaban basados ​​en SwiftNIO. Vapor tiene una arquitectura modular, cada capa vive en su propio repositorio, lo cual es muy conveniente, solo puede usar parte de las implementaciones.


Decidí usar:



En el proceso, se encontraron algunos errores en Vapor HTTPClient, corregidos con éxito, se mejoró el HTTPServer para trabajar con https de fábrica, sin la necesidad de usar nginx y similares.


Que paso:


  • La API de bot se diseñó con un ojo fuerte en un jugador de confianza en esta área python-telegram-bot
  • Al igual que zmeyc / telegram-bot-swift, todos los modelos y métodos de bot API de Telegram Bot se pueden generar ejecutando un script.
  • Se implementaron los modos Longpolling y WebHooks
  • Controladores implementados: CommandHandler, CallbackQueryHandler, RegexpHandler, MessageHandler
  • Muchos filtros para actualizaciones
  • Dos bots simples, como ejemplo, EchoBot estándar y HelloBot

Intercambio: Escribimos un bot que generalmente es útil, deja que verifique la ortografía.


Bot: @yandex_spell_checker_bot
Código fuente: https://github.com/givip/YandexSpellCheckerBot


main.swift se ve así:


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) } 

Epílogo: desarrolladores de iOS y más, ¡utilízalo!


El marco está en beta, y cualquiera puede usarlo para sus necesidades.


Después de un mes de pruebas y mejoras, hubo algunas deficiencias, lista de deseos y muchos problemas de mejora, pero sin embargo, la "Revisión ortográfica" ha estado girando en Ubuntu durante mucho tiempo.


Estaría agradecido por cualquier comentario, y lanzando sobre el ventilador.

Source: https://habr.com/ru/post/es416023/


All Articles