Echo bot para Telegram em Kotlin

Introdução

Como parte deste artigo, criaremos nosso próprio bot capaz de reenviar as mensagens enviadas pelo usuário, levando em consideração a formatação e a mídia.





O tópico dos bots foi destruído por muitos blogs, posts, posts de blog e outros programadores. No entanto, na maioria das vezes, são bots Python / JS / PHP condicionais, nos quais você geralmente pode fazer como vai e tudo parece até mesmo funcionar. Ao mesmo tempo, eu (quase) deixei essas linguagens no mundo da forte digitação e orientação a objetos em Java e, posteriormente, em Kotlin. Na época em que eu estava interessado em escrever meu primeiro bot, apenas a biblioteca pengrad / java-telegram-bot-api estava presente no mercado de github , mas para mim pessoalmente tinha uma desvantagem fatal: naquela época, ela duplicou completamente o Telegram API de bot . Ou seja, era, na verdade, uma gaxeta, que, além da interação por meio de classes Java, não dava mais nada.





Então, tive a ideia de escrever minha própria biblioteca para a API do Telegram Bot. A primeira versão cobrindo a API principal levou um mês, mas surgiram atualizações, os usuários sugeriram ideias para melhorias e eu geralmente não gostava de fazer coisas com as mãos continuamente. Como resultado, a biblioteca está se desenvolvendo até hoje, tem uma API conveniente, sua própria DSL, mas o mais importante, ela não perdeu sua ideia original de trabalho de digitação estrito com a API do Telegram Bot.





Como os bots do Telegram geralmente funcionam

Os bots do Telegram têm muitas restrições. Muitas vezes você pode olhar para belos números aqui , mas em resumo (link para BotFather , para não se repetir) (provavelmente, ele será reabastecido para expandir seus horizontes):





  • - ( group privacy BotFather)





  • - . - , , . , ( BotFather)





    • , - , - ,





  • API . . .





:









  • BotFather /newbot







  • ,









,

  1. BotFather /newbot











Readme , App.kt



. , :





suspend fun main(args: Array<String>) {
    val bot = telegramBot(args.first()) // 1
    val scope = CoroutineScope(Dispatchers.Default) // 2

    bot.buildBehaviour(scope) { // 3
        val me = getMe()

        onCommand("start", requireOnlyCommandInMessage = true) {
            reply(it, "Hello, I am ${me.firstName}")
        }
    }.join() // 4
}
      
      



  1. . args.first()



    , BotFather





  2. CoroutineScope



    . , -





  3. . buildBehaviour











:





onContentMessage { // 1
    execute( // 2
      	it.content.createResend(it.chat.id) // 3
    )
}
      
      



? , :





  1. : , , ..





  2. execute



    - . . , ,





  3. createResend , . -





- -. :





onCommand("start") { // 1
  reply(it, ",       ,    !") // 2
}
onCommand("help") {
  reply(it, "   ,      ?")
}
      
      



  1. /start



    , ,





  2. . it







onContentMessage



, :





fun save(sources: List<TextSource>) {
  //     
  println(sources.makeString()) // 3
}

onContentMessage {
  it.content.asTextContent() ?.let { content -> // 1
    save(content.textSources) // 2
  }
  execute(it.content.createResend(it.chat.id))
}
      
      



  1. asTextContent()



    , let



    ,





  2. content.textSources



    TextSource



    , :





    1. ( TextSource



      kotlinx.serialization



      )





    2. , ,





    3. -





  3. makeString



    irácriar TextSource



    texto da lista que serávisível para o usuário, independentemente da formatação





Conclusão

Então, criamos um bot que:





  • Pode responder a comandos simples /start



    e/help







  • Sabe como reenviar mensagens recebidas ao remetente





  • Seleciona mensagens de texto e realiza operações com seu conteúdo





Além disso, resta apenas desenvolver o bot na medida em que a imaginação for suficiente. Por exemplo, você pode separar os módulos em funções / plug-ins, como fiz no meu PlaguBot e.






Para informações mais detalhadas sobre o projeto, você pode ver sua página principal , wiki , projeto com exemplos e dar uma olhada em nosso canal de telegramas .








All Articles