feat: start Songlify article
continuous-integration/drone/push Build is failing
Details
continuous-integration/drone/push Build is failing
Details
parent
3e16968154
commit
b4e0e00219
|
@ -0,0 +1,91 @@
|
||||||
|
---
|
||||||
|
title: "Building a Telegram bot in Rust: a journey"
|
||||||
|
description: An adventure through Rust and Telegram
|
||||||
|
tags:
|
||||||
|
- blog
|
||||||
|
- tech
|
||||||
|
- rust
|
||||||
|
- telegram
|
||||||
|
date: 2022-01-02T15:32:00+02:00
|
||||||
|
---
|
||||||
|
|
||||||
|
Some time passed since the last article I wrote there. A lot of stuff happened
|
||||||
|
meanwhile, especially with COVID, but here we are again. While busy dealing with
|
||||||
|
the mess of real life tasks, three months ago I started to write a little bot
|
||||||
|
for Telegram in Rust. It is a simple one, but I consider the journey interesting
|
||||||
|
and worth of writing it down.
|
||||||
|
|
||||||
|
## Telegram bots
|
||||||
|
|
||||||
|
Telegram bots are not something new to me and nowdays are pretty much easy to
|
||||||
|
make, so I consider them like a gym where to try out new technologies and
|
||||||
|
experiment with stuff. I wrote plentiful of them, some of those are open source
|
||||||
|
like for example https://github.com/Augugrumi/TorreArchimedeBot (I checked it
|
||||||
|
out and now it is broken 😭) that was useful when going to University, because
|
||||||
|
it scraped the university free room web page and from there it was able to tell
|
||||||
|
you which rooms where without any lessons and for how much time, allowing you to
|
||||||
|
easily find a place where to study with your mates (yep, we didn't like library
|
||||||
|
too much).
|
||||||
|
|
||||||
|
{{< figure src="/content/songlify/telegramscreen.png" alt=`A screenshot of
|
||||||
|
TorreArchimedeBot in action.` caption=`A screenshot of TorreArchimedeBot in
|
||||||
|
action.` >}}
|
||||||
|
|
||||||
|
Also another one bot worthy of mention is
|
||||||
|
https://github.com/Polpetta/RedditToTelegram, that allowed our D&D group to
|
||||||
|
receive push notifications of our private Subreddit in our Telegram group.
|
||||||
|
|
||||||
|
As you can see, all of these bots are quite simple, but they have the added
|
||||||
|
value of teaching you some new programming concepts, technologies or frameworks
|
||||||
|
that can be later applied in something that can be more production environment.
|
||||||
|
|
||||||
|
## Rust
|
||||||
|
|
||||||
|
I started to approach Rust many years ago (I don't remember exactly when). First
|
||||||
|
interaction with it was quite interesting to say at least: there were way less
|
||||||
|
compiler features (for example now the compiler is able to understand object
|
||||||
|
lifetime at compile time most of the time alone, without specifying them) that
|
||||||
|
made it a... _not-so-pleasant programming experience_. It had potential thought,
|
||||||
|
so by following Rust news I picked it up last year again, noticing that now it
|
||||||
|
has improved a lot and it is more pleasant to write. Meanwhile, also JetBrains
|
||||||
|
developed a good support for IntelliJ, so now it is even possible to debug and
|
||||||
|
perform every operation directly from your IDE UI.
|
||||||
|
|
||||||
|
## World collision: Rust + Telegram
|
||||||
|
|
||||||
|
One of the features I wanted to learn this time regarding Rust was the
|
||||||
|
asynchronous support it offers. Rust started to have `async` support with
|
||||||
|
[Tokio](https://tokio.rs/) framework, and recently the Rust team started to
|
||||||
|
build the asynchronous functionality inside Rust itself. Even if in the first
|
||||||
|
steps, it looks promising and the idea of a low-level language, without GC, with
|
||||||
|
automatic memory management and so much safety having asynchronous support is
|
||||||
|
exciting to me! 🥳 So the only option left, at this point, was to start messing
|
||||||
|
around with it. I started by picking up one of the many frameworks that provides
|
||||||
|
a layer for the Telegram APIs, [Teloxide](https://github.com/teloxide/teloxide).
|
||||||
|
In particular, as you can see from its _README_, one of the examples starts by
|
||||||
|
using `#[tokio:main]` macro:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
use teloxide::prelude::*;
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() {
|
||||||
|
teloxide::enable_logging!();
|
||||||
|
log::info!("Starting dices_bot...");
|
||||||
|
|
||||||
|
let bot = Bot::from_env().auto_send();
|
||||||
|
|
||||||
|
teloxide::repl(bot, |message| async move {
|
||||||
|
message.answer_dice().await?;
|
||||||
|
respond(())
|
||||||
|
})
|
||||||
|
.await;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This was the reason I picked it up, given that it looked the most promising by
|
||||||
|
the time I started the project.
|
||||||
|
|
||||||
|
### Building _Songlify_
|
||||||
|
|
||||||
|
So, after choosing what was going to use to build the bot, I needed a _reason_ to build it.
|
Binary file not shown.
Loading…
Reference in New Issue