12.05.2021
Опубликовал небольшую Scala-библиотеку tgbot-utils, набор расширений для Telegramium, которые я использую для разработки своих Telegram-ботов; в этом посте расскажу об одном из них.
Представим, что нужно создать бота для продажи мороженого. Он умеет обрабатывать два типа callback query запросов (далее просто “запросы”), представленные в виде ADT:
sealed abstract class CallbackData
final case class BuyIcecream(flavor: String) extends CallbackData
case object SayHello extends CallbackData
В прошлом посте показывал, как можно преобразовывать ADT в CSV-строку для передачи в Telegram API и обратно.
Модуль tgbot-callback-queries позволяет описывать обработчики для callback query запросов в стиле сервисов http4s (HTTP-библиотека для Scala):
import cats.effect.IO
import ru.johnspade.tgbot.callbackqueries.CallbackQueryDsl._
import ru.johnspade.tgbot.callbackqueries.CallbackQueryRoutes
import telegramium.bots.client.Method
val routes = CallbackQueryRoutes.of[CallbackData, Option[Method[_]], IO] {
case BuyIcecream(flavor) in cb =>
IO {
println(s"${cb.from.firstName} have chosen: $flavor")
None
}
}
14.04.2021
Прошел уже год, как я стал мейнтейнером библиотеки Telegramium, идиоматичной имплементации Telegram Bot API на языке Scala. В этом посте хочу рассказать, почему стоит использовать эту библиотеку для ваших Telegram-ботов.
class MyLongPollBot[F[_]: Sync: Timer: Parallel]()(implicit api: Api[F]) extends LongPollBot[F](api) {
override def onMessage(msg: Message): F[Unit] =
sendMessage(chatId = ChatIntId(msg.chat.id), text = "Hello, world!").exec.void
}
16.09.2020
В нашу информационную эпоху важно уметь искать информацию. Блогер Вастрик в свое время публиковал очень популярные среди читателей поисковые челленджи, упражнения на поиск информации в интернете. Я не очень ими интересовался из-за их искусственности, но недавно передо мной встала реальная и интересная поисковая задача.
Один из пользователей сабреддита группы Evanescence опубликовал вопрос "В каком отеле снимали музыкальное видео для песни Everybody's Fool?". Хорошо известно, где снимался другой клип группы, для песни My Immortal. Это прекрасная площадь Plaça de Sant Felip Neri, Gothic Quarter в Барселоне. Но про видео для Everybody's Fool известно только, что его снимали в Лос-Анджелесе. Мне не удалось найти более конкретное место съемки на Википедии, в интервью режиссера и членов группы или на фан-сайтах. И тогда я решил определить локацию, опираясь на кадры из ролика — как в фильмах про спецслужбы.
20.08.2020
Фото Larisa Birta на Unsplash
Для разработки очередного Telegram-бота мне нужно было выбрать формат данных CallbackQuery — это запрос, отправляемый боту при нажатии на кнопку инлайн-клавиатуры.
Дефолтный выбор, JSON, не подходит из-за ограничения в 64 байта, имена полей отнимают место у полезной нагрузки. Поэтому я остановился на CSV из-за его компактности и распространенности. Это текстовый формат, что удобно для отладки и диагностики.
Однако можно использовать и другие форматы, например base64, protobuf или кастомный. Самый гибкий вариант — положить данные в базу, и в кнопке передавать только их идентификатор. Но тогда для обработки любого нажатия на кнопку понадобится сделать лишний запрос в БД.