Será sobre o Telegrammer, estrutura do Telegram Bot para Linux / macOS , escrita inteiramente no Swift 4.1

Exposição: Como esse pensamento veio à mente?
Um dos meus projetos de animais de estimação (um aplicativo iOS relacionado ao Telegram, mas agora não é sobre ele) precisava de uma interface da web para o gerente de conteúdo criar uma descrição, tag e muito mais. Como o aplicativo já estava ideologicamente conectado ao Telegram, imediatamente me ocorreu enviar conteúdo diretamente para o messenger e já executar as ações acima.
Acontece que você pode enviar esses dados através de bots (como os bots são organizados no Telegram ).
Início: estava procurando uma solução pronta, não consegui encontrar uma solução adequada.
E então todas as estrelas alinhadas em uma fileira, agora você vai entender o que eu quero dizer ...
Existem muitas estruturas comprovadas e confiáveis do lado do servidor em Java, Go, Python, PHP e outras que já permitem criar um bot sem problemas. Mas isso não é sobre nós (testemunhas De Jeová Apple), não estamos procurando maneiras fáceis.
E se você escrever um bot no Swift?
Mais recentemente (pelos padrões das linguagens de programação), a comunidade Server Side Swift começou a se desenvolver ativamente, e várias estruturas apareceram, como Vapor, Perfect, Kitura, que conseguiram ganhar fama suficiente.
Além disso, a Apple jogou lenha no forno, facilitando a vida dos desenvolvedores com uma estrutura SwiftNIO de baixo nível e alto desempenho
Por que o SwiftNIO é legal?O SwiftNIO é uma estrutura de aplicativos de rede assíncrona baseada em eventos e multiplataforma para o desenvolvimento rápido de servidores e clientes de protocolo de alto desempenho e manutenção.
É como Netty , mas escrito para Swift.
O SwiftNIO é fundamentalmente uma ferramenta de baixo nível para a criação de aplicativos de rede de alto desempenho no Swift. Destina-se particularmente aos casos de uso em que o uso de um modelo de simultaneidade "encadeamento por conexão" é ineficiente ou insustentável. Essa é uma limitação comum ao criar servidores que usam um grande número de conexões de utilização relativamente baixa, como servidores HTTP.
Para atingir seus objetivos, o SwiftNIO usa extensivamente "E / S sem bloqueio": daí o nome! A E / S sem bloqueio difere do modelo de E / S de bloqueio mais comum porque o aplicativo não espera que os dados sejam enviados ou recebidos da rede: em vez disso, o SwiftNIO solicita que o kernel o notifique quando as operações de E / S puderem ser realizadas. ser realizado sem esperar.
O SwiftNIO não tem como objetivo fornecer soluções de alto nível, como, por exemplo, estruturas da web. Em vez disso, o SwiftNIO está focado em fornecer os componentes básicos de baixo nível para esses aplicativos de nível superior. Quando se trata de criar um aplicativo da Web, a maioria dos usuários não deseja usar o SwiftNIO diretamente: em vez disso, eles desejam usar uma das muitas excelentes estruturas da Web disponíveis no ecossistema Swift. Essas estruturas da web, no entanto, podem optar por usar o SwiftNIO nos bastidores para fornecer suporte à rede.
O que eu considerei das bibliotecas concluídas do Telegram Bot Swift:
zmeyc / telegram-bot-swift - Uma biblioteca bastante avançada, toda a API do Telegram Bot é analisada no site, ambos os métodos e modelos, roteamento avançado, funcionam no macOS e no Linux.
As desvantagens associadas ao fato de ter sido escrito há muito tempo e, naquele momento, todas as estruturas da Apple (especialmente a Foundation) funcionavam no Linux muito instáveis:
- Envia solicitações via curl
- No momento do estudo, a biblioteca em si e as bibliotecas dependentes não eram portadas para rápida
- Não suportado por webhooks
- Um repositório que não é atualizado há muito tempo, como resultado, alguns recursos da API atualizada do Telegram Bot não são suportados.
FabrizioBrancati / SwiftyBot - Perdoe-me, não entendo por que esse bot tem mais estrelas, o Vapor 2.4.0 desatualizado está oculto e o main.swift solitário, que simplesmente demonstra o trabalho mais simples do bot. Sem modelos, ajudantes, filas de expedição, nada. Oh não! Ao contrário dos concorrentes, ele suporta WebHooks.
ShaneQi / ZEGBot - Uma implementação muito simples, os métodos básicos, modelos e, novamente, apenas o LongPolling são implementados.
Então, está decidido, vamos escrever nossa própria estrutura. Honestamente, Andrey Fidrya me inspirou com seu bot, mas decidi que poderia tentar fazer melhor.
Climax: Bem-vindo ao mundo back-end. SwiftNIO, obrigado pelo cérebro explodido.
Admito que, após os aplicativos iOS, escrever um aplicativo para o Server Side é bastante difícil, tenho que pensar de maneira diferente.
Quando a estrutura foi escrita, os caras da Vapor anunciaram uma versão beta e já estavam baseados no SwiftNIO. O Vapor possui uma arquitetura modular, cada camada vive em seu próprio repositório, o que é muito conveniente, você pode usar apenas parte das implementações.
Eu decidi usar:
No processo, alguns bugs foram encontrados no Vapor HTTPClient, corrigidos com sucesso, o HTTPServer foi aprimorado para trabalhar com https pronto para uso, sem a necessidade de usar nginx e similares.
O que aconteceu:
- A API de bot foi projetada com um forte olho em um player confiável nessa área python-telegram-bot
- Como zmeyc / telegram-bot-swift, todos os modelos e métodos de bot da API do Telegram Bot podem ser gerados executando um script.
- Modos Longpolling e WebHooks implementados
- Manipuladores implementados: CommandHandler, CallbackQueryHandler, RegexpHandler, MessageHandler
- Muitos filtros para atualizações
- Dois bots simples, como exemplo, EchoBot padrão e HelloBot
Intercâmbio: nós escrevemos um bot que geralmente é útil, vamos verificar a ortografia.
Bot: @yandex_spell_checker_bot
Código fonte: https://github.com/givip/YandexSpellCheckerBot
main.swift fica assim:
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: desenvolvedores de iOS e muito mais, use-o!
A estrutura está na versão beta e qualquer pessoa pode usá-la para suas necessidades.
Após um mês de testes e melhorias, houve algumas falhas, lista de desejos e muitos problemas de aprimoramento, mas, no entanto, a "Verificação Ortográfica" está girando no Ubuntu há muito tempo.
Ficaria muito grato por qualquer feedback, e jogando no ventilador.