tgbot-callback-queries: адаптируем http4s для разработки Telegram-ботов

Опубликовал небольшую 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
    }
}
Читать полностью

Telegramium – библиотека для разработки Telegram-ботов на Scala

Прошел уже год, как я стал мейнтейнером библиотеки 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
}
Читать полностью

Как я определил место съемки клипа Evanescence — Everybody’s Fool


В нашу информационную эпоху важно уметь искать информацию. Блогер Вастрик в свое время публиковал очень популярные среди читателей поисковые челленджи, упражнения на поиск информации в интернете. Я не очень ими интересовался из-за их искусственности, но недавно передо мной встала реальная и интересная поисковая задача.

Один из пользователей сабреддита группы Evanescence опубликовал вопрос "В каком отеле снимали музыкальное видео для песни Everybody's Fool?". Хорошо известно, где снимался другой клип группы, для песни My Immortal. Это прекрасная площадь Plaça de Sant Felip Neri, Gothic Quarter в Барселоне. Но про видео для Everybody's Fool известно только, что его снимали в Лос-Анджелесе. Мне не удалось найти более конкретное место съемки на Википедии, в интервью режиссера и членов группы или на фан-сайтах. И тогда я решил определить локацию, опираясь на кадры из ролика — как в фильмах про спецслужбы.


Читать полностью

(Де)сериализация алгебраических типов в CSV на Scala с Magnolia и kantan.csv

white petaled flower near window during daytime

Фото Larisa Birta на Unsplash


Для разработки очередного Telegram-бота мне нужно было выбрать формат данных CallbackQuery — это запрос, отправляемый боту при нажатии на кнопку инлайн-клавиатуры.

Notification at the top

Дефолтный выбор, JSON, не подходит из-за ограничения в 64 байта, имена полей отнимают место у полезной нагрузки. Поэтому я остановился на CSV из-за его компактности и распространенности. Это текстовый формат, что удобно для отладки и диагностики.

Однако можно использовать и другие форматы, например base64, protobuf или кастомный. Самый гибкий вариант — положить данные в базу, и в кнопке передавать только их идентификатор. Но тогда для обработки любого нажатия на кнопку понадобится сделать лишний запрос в БД.

Читать полностью

Поиск