Kotlin telegram bot api

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

License

AgeOfWar/KTelegram

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Читайте также:  Сколько времени займет изучение html

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

Telegram Bot Kotlin Library

A simple-to-use library to create Telegram Bots in Kotlin multiplatform (actually only JVM target is supported). This library uses the Telegram Bot API

This program re-sends messages.

fun main(vararg args: String) = runBlocking < if (args.size != 1) error("Pass the bot token as unique program argument.") val token = args[0] val api = TelegramApi(token) discardPreviousUpdates(api) // if you want discard previous updates getUpdates(api).handle(MessageRepeater(api)) > class MessageRepeater(private val api: TelegramApi) : UpdateHandler < override suspend fun handle(update: Update) = update.handleMessage < message -> val content = message.toMessageContent() if (content != null) < api.sendMessage(message.messageId, content) >> >

About

Источник

Telegram Bot на Kotlin: Введение

Прошло уже какое-то время с момента, когда я публиковал свой первый туториал по tgbotapi и пришло время начать уже серию статей, которая должна разложить по полочкам, как можно разбивать логику Telegram ботов (а потенциально, любых ботов 🙂 ) в целом и как это делать в вышеупомянутой библиотеке в связке с надстройкой PlaguBot.

Оглавление

С чего бы начать?

Начнем с того, какой инструментарий будет использован:

  • Kotlin 😊
  • Gradle (Groovy)
  • tgbotapi 😊
  • PlaguBot
  • Koin
  • KSLog
  • Exposed (базы данных)

Все исходники туториалов будут доступны в этом репозитории, запуск описан там же, но если вкратце — просто замените значение по ключу botToken в конфиге репозитория и вызовите ./gradlew run —args=»config.json» . В идеале, нужно создать отдельный конфигурационный файл local.config.json и положить конфигурацию в него, потому что он не попадет в репозиторий, но если вы хотите использовать config.json — не забудьте вычистить это токен, если захотите пушить изменения в свой форк или репозиторий

О хитрости local.config.json

В рамках репозитория в .gitignore внесены две строчки:

Это значит, что все файлы и папки, начинающиейся с local. будут проигнорированы гитом. Таким образом, достаточно назвать вашу конфигурацию local.config.json и она точно не попадёт в репозиторий

Для собственно кодинга я использую Intellij IDEA из-под линукс (Elementary OS), но практика показывает, что обычно можно работать и под любыми другими системами (а обладатели Linux могут обойтись текстовым редактором и терминалом для сборки/запуска)

Код данного туториала доступен в модуле introduction, а конкретно нас больше всего будет интересовать создаваемый там плагин.

А? (Или как оно там работает)

PlaguBot устроен достаточно просто: он берёт путь до файла, превращает его в конфиг, берёт все плагины из конфига и дальше в два этапа загружает бота:

  • Этап загрузки конфигураций — на этом этапе в Koin DI необходимо объявить свои объекты и прочие настройки.
  • Этап конфигурирования поведения бота — тут мы уже настраиваем реакцию на сообщения от пользователей и прочее такое.

это не очень соответствует общей парадигме плагинов. Плагины по своей сути это фабрики, которые должны при необходимости настраивать работу в рамках нескольких ботов

А теперь введение

Первое ( почти ), что мы делаем в рамках плагина — объявляем его класс конфигурации:

@Serializable private class Config( val onStartCommandMessage: String )

Тут у нас приватный класс, который будет недоступен в других классах никак кроме чёрной магии рефлексии. Собственно, в этом классе у нас есть только одно поле onStartCommandMessage , которое мы будем использовать далее для ответа пользователям.

На самом деле, первое, что мы делаем — определяем логгер для плагина

logger создаст нам объект KSLog для автоматического логгирования с тэгом нашего плагина. Подробнее можно посмотреть тут.

Отдельный логгер удобнее создавать так, поскольку logger — это метод-расширение к любому объекту, а посколько мы не хотим, чтобы тэги перепутались, лучше создать отдельный логгер. Кроме прочего, это еще и будет оптимальней в плане быстродействия 🙂

Вторая вещь, которую мы делаем — это переопределяем setupDI метод для собственно десериализации конфига и его передачи в Koin .

override fun Module.setupDI(database: Database, params: JsonObject) < single < /*1*/get()./*4*/decodeFromJsonElement(/*3*/Config.serializer(), /*2*/params["introduction"] ?: return@single null) > >

Для начала, на вход setupDI мы получаем три параметра:

  • Module является ресивером ( receiver ) функции и доступен в её рамках как this .
  • database: Database — собственно, Exposed Database, которую можно будет использовать для сохранения данных (но в этой части мы этого делать не будем).
  • params: JsonObject — конфигурация PlaguBot’а как она была декодирована из конфигурационного файла.

А теперь построчно разберем, что тут происходит:

  1. get() — получаем объект типа Json для дальнейшей десериализации конфига.
  2. params[«introduction»] ?: return@single null — берем элемент из PlaguBot конфига по ключу introduction , а если такого нет — возвращаем null (то есть нельзя создать конфиг).
  3. Config.serializer() — получаем сериализатор конфига (он доступен благодаря аннотации @Serializable ).
  4. decodeFromJsonElement(сериализатор, наш элемент из конфига) — собственно, превращаем элемент из конфига в объект конфигурации нашего плагина.

Собственно, вызов single скажет Koin вызвать этот код один раз и сохранить его результат.

Уф, да чего так сложно/просто-то?

Во введении я старался максимально подробно расписать все пришедшие в голову важные моменты, поэтому с одной стороны информации много, а с другой — она вся очень скучная 😔

Ну и третья, самая сложная часть — это настройка бота. Собственно, код:

override suspend fun BehaviourContext.setupBotPlugin(koin: Koin) < val config = koin.getOrNull() if (config == null) < log.w("Plugin has been disabled due to absence of \"introduction\" field in config or some error during configuration loading") return >onCommand("start", initialFilter = < it.chat is PrivateChat >) < sendMessage( it.chat, config.onStartCommandMessage ) >>

Ну что ж, а вот здесь давайте построчно

  • (1) На вход получаем два параметра: BehaviourContext , сочетающий в себе контекст для асинхронности, бота и информацию об обновлениях, приходящих в бота; и koin: Koin — наш источник зависимостей и параметров, в том числе тех, что мы зарегистрировали в setupDI .
  • (2) val config = koin.getOrNull() — получение текущего конфига нашего плагина либо null — то самое отсутствие конфига в случае, если поле introduction было пропущено в json конфигурации.
  • (4 — 7) Если конфиг не был получен — ругаемся об этом в консоль и заканчиваем настройку плагина.
  • (9) — onCommand(«start», initialFilter = < it.chat is PrivateChat >) — конфигурация ожидания команды start. Кроме того, тут используется фильтрация — блок, который будет описан далее, вызовется только для приватных сообщений. Подробнее можно почитать тут.
  • sendMessage(it.chat, config.onStartCommandMessage) — отправка сообщений в чат, в котором нам пришла команда старта. Тут it — это CommonMessage — то есть обычное сообщение с текстом.

Итоги

  • Разобрались, как запускать ботов и конфигурировать их.
  • Создали свой плагин для PlaguBot .
  • Научились отвечать пользователям на команду /start .

Кроме прочего, немного разобрались в терминологии и строении ботов в рамках этой серии туториалов. Для создания своего бота с нуля можно использовать вот этот шаблон, а если вы хотите использовать tgbotapi без каких-либо лишних обвязок вроде Koin/PlaguBot/Exposed — можно воспользоваться этим шаблоном.

Спасибо за внимание к статье и буду рад комментариям/замечаниям/предложениям 😊

Источник

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

🤖 A wrapper for the Telegram Bot API written in Kotlin

License

kotlin-telegram-bot/kotlin-telegram-bot

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

A wrapper for the Telegram Bot API written in Kotlin.

Creating a bot instance is really simple:

fun main() < val bot = bot < token = "YOUR_API_KEY" > >

Now lets poll telegram API and route all text updates:

fun main() < val bot = bot < token = "YOUR_API_KEY" dispatch < text < bot.sendMessage(ChatId.fromId(message.chat.id), text = text) > > > bot.startPolling() >
fun main() < val bot = bot < token = "YOUR_API_KEY" dispatch < command("start") < val result = bot.sendMessage(chatId = ChatId.fromId(message.chat.id), text = "Hi there!") result.fold(< // do something here with the response >,< // do something with the error >) > > > bot.startPolling() >

There are several samples:

  • A simple echo bot
  • A more complex sample with commands, filter, reply markup keyboard and more
  • A sample getting updates through Telegram’s webhook using a Netty server
  • An example bot sending polls and listening to poll answers
repositories < maven < url "https://jitpack.io" > >
dependencies < implementation 'io.github.kotlin-telegram-bot.kotlin-telegram-bot:telegram:x.y.z' >
  1. Fork and clone the repo
  2. Run ./gradlew ktlintFormat
  3. Run ./gradlew build to see if tests, ktlint and abi checks pass.
  4. Commit and push your changes
  5. Submit a pull request to get your changes reviewed
  • Big part of the architecture of this project is inspired by python-telegram-bot, check it out!
  • Some awesome kotlin ninja techniques were grabbed from Fuel.

Kotlin Telegram Bot is under the Apache 2.0 license. See the LICENSE for more information.

About

🤖 A wrapper for the Telegram Bot API written in Kotlin

Источник

Оцените статью