Tourmaline : Telegram Bot Framework For Crystal

Tourmaline is a Telegram Bot (and hopefully soon Client) API framework for Crystal. Based heavily off of Telegraf this Crystal implementation allows your Telegram bot to be written in a language that’s both beautiful and fast. Benchmarks coming soon.

Installation

Add this to your application’s shard.yml:

dependencies:
tourmaline:
github: watzon/tourmaline
version: ~> 0.7.0

Also Read – SwiftMonkey : A Framework For Doing Randomised UI Testing Of iOS Apps

Usage

Basic usage

require “tourmaline/bot”

alias TGBot = Tourmaline::Bot

bot = TGBot::Client.new(ENV[“API_KEY”])

bot.command([“start”, “help”]) do |message|
text = “Echo bot is a sample bot created with the Tourmaline bot framework.”
bot.send_message(message.chat.id, text)
end

bot.command(“echo”) do |message, params|
text = params.join(” “)
bot.send_message(message.chat.id, text)
end

bot.poll

Listening for events

Tourmaline has a number of events that you can listen for (the same events as Telegraf actually). The full list of events is as can be found in the documentation.

bot.on(:text) do |update|
text = update.message.not_nil!.text.not_nil!
puts “TEXT: #{text}”
end

Adding middleware

Middleware can be created by extending the Tourmaline::Bot::Middleware class. All middleware classes need to have a call(update : Update) method. The middleware will be called on every update.

class MyMiddleware < TGBot::Middleware

# All middlware include a reference to the parent bot.
# @bot : Tourmaline::Bot::Client

def call(update : Update)
if message = update.message
if user = message.from_user
if text = message.text
puts “#{user.first_name}: #{text}”
end
end
end
end
end

bot.use MyMiddleware

Webhooks

Using webhooks is easy, even locally if you use the ngrok.cr package.

bot.command(“buy”) do |message, params|
bot.send_invoice(
message.chat.id,
“Sample Invoice”,
“This is a test…”,
“123344232323”,
“YOUR_PROVIDER_TOKEN”,
“test1”,
“USD”,
bot.labeled_prices([{label: “Sample”, amount: 299}, {label: “Another”, amount: 369}]).to_json
)
end

Games

Ability to create and run games with your Tourmaline Bot is a recent feature that hasn’t been tested yet. Please use the issue tracker if you experience problems.

Kemal Middleware

Tourmaline provides middleware for Kemal, just in case you want to use Kemal as the server.

require “kemal”
require “tourmaline/kemal/tourmaline_handler”

require “./your_bot”

add_handler Kemal::TourmalineHandler.new(
bot: YourBot.new,
url: “https://something.com”,
path: “/bot-webhook/#{ENV[“TGBOT_API_KEY”]}”
)

Kemal.run

Note: Telegram won’t send webhook requests to non-ssl domains. This means that you need to be running your kemal server with ssl enabled. For local development this can be a pain, but it is made much easier with ngrok.cr.

Development

This currently supports the following features:

  • Bot API
    • Implementation examples
    • Easy command syntax
    • Robust middleware system
    • Standard API queries
    • Stickers
    • Inline mode
    • Long polling
    • Webhooks
    • Payments
    • Games
  • Client API (in development)

If you want a new feature feel free to submit an issue or open a pull request.

R K

Recent Posts

git fetch vs git pull: How They Work and When to Use Each

Both git fetch and git pull talk to a remote repository, but they do very different things to your…

5 days ago

git cherry-pick Command: Apply Commits from Another Branch

Sometimes the change you need already exists, just on the wrong branch. A hotfix lands…

5 days ago

Best Email APIs for Secure Business Email: Why Developers Are Moving Beyond SMTP

Email is still one of the most important communication channels inside modern applications. Password resets,…

6 days ago

Nginx Commands in Linux: Start, Stop, Reload, Test, and Log

Nginx is a high-performance web server and reverse proxy trusted by some of the largest…

1 week ago

ufw Command in Linux: Manage Firewall Rules with Examples

ufw (Uncomplicated Firewall) sits on top of iptables (or nftables on newer systems) and replaces…

1 week ago

who Command in Linux: Show All Logged-In Users and Sessions

When you share a server with a team or investigate unexpected activity, the first question…

1 week ago