mirror of
https://github.com/teloxide/teloxide.git
synced 2024-12-22 22:46:39 +01:00
commit
cedc7df410
11 changed files with 138 additions and 34 deletions
|
@ -62,7 +62,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
- Add the `Key: Clone` requirement for `impl Dispatcher` [**BC**].
|
- Add the `Key: Clone` requirement for `impl Dispatcher` [**BC**].
|
||||||
- `dispatching::update_listeners::{polling_default, polling}` now return a named, `Polling<_>` type.
|
- `dispatching::update_listeners::{polling_default, polling}` now return a named, `Polling<_>` type.
|
||||||
- Update teloxide-core to v0.7.0 with Bot API 6.1 support, see [its changelog][core07c] for more information [**BC**].
|
- Update `teloxide-core` to v0.7.0 with Bot API 6.1 support, see [its changelog][core07c] for more information [**BC**].
|
||||||
|
|
||||||
[core07c]: https://github.com/teloxide/teloxide-core/blob/master/CHANGELOG.md#070---2022-07-19
|
[core07c]: https://github.com/teloxide/teloxide-core/blob/master/CHANGELOG.md#070---2022-07-19
|
||||||
|
|
||||||
|
@ -92,7 +92,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- Update teloxide-core to v0.6.0 with [Bot API 6.0] support [**BC**].
|
- Update `teloxide-core` to v0.6.0 with [Bot API 6.0] support [**BC**].
|
||||||
|
|
||||||
[Bot API 6.0]: https://core.telegram.org/bots/api#april-16-2022
|
[Bot API 6.0]: https://core.telegram.org/bots/api#april-16-2022
|
||||||
|
|
||||||
|
|
|
@ -83,6 +83,7 @@ impl<T: Trait> Trait for Wrap<T> { ... }
|
||||||
/// [`tokio::fs::File`]: tokio::fs::File
|
/// [`tokio::fs::File`]: tokio::fs::File
|
||||||
/// [`Bot::download_file`]: crate::Bot::download_file
|
/// [`Bot::download_file`]: crate::Bot::download_file
|
||||||
```
|
```
|
||||||
|
4. Write `teloxide`, `teloxide-macros`, and `teloxide-core`, not "teloxide", "Teloxide", "teloxide-macros" or any other variant.
|
||||||
|
|
||||||
## Use `Self` where possible
|
## Use `Self` where possible
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,108 @@
|
||||||
This document describes breaking changes of `teloxide` crate, as well as the ways to update code.
|
This document describes breaking changes of `teloxide` crate, as well as the ways to update code.
|
||||||
Note that the list of required changes is not fully exhaustive and it may lack something in rare cases.
|
Note that the list of required changes is not fully exhaustive and it may lack something in rare cases.
|
||||||
|
|
||||||
|
## 0.10 -> 0.11
|
||||||
|
|
||||||
|
### core
|
||||||
|
|
||||||
|
Requests can now be `.await`ed directly, without need of `.send()` or `AutoSend`.
|
||||||
|
If you previously used `AutoSend` adaptor, you can safely remove it:
|
||||||
|
|
||||||
|
```diff,rust
|
||||||
|
-let bot = Bot::from_env().auto_send();
|
||||||
|
+let bot = Bot::from_env();
|
||||||
|
```
|
||||||
|
|
||||||
|
```diff,rust
|
||||||
|
-async fn start(bot: AutoSend<Bot>, dialogue: MyDialogue, msg: Message) -> HandlerResult {
|
||||||
|
+async fn start(bot: Bot, dialogue: MyDialogue, msg: Message) -> HandlerResult {
|
||||||
|
```
|
||||||
|
|
||||||
|
`File`'s and `FileMeta`'s fields now don't have `file_` prefix.
|
||||||
|
If you previously accessed the fields, you'll need to change remove the prefix:
|
||||||
|
|
||||||
|
```diff
|
||||||
|
-_ = file.file_size;
|
||||||
|
+_ = file.size;
|
||||||
|
```
|
||||||
|
|
||||||
|
`Animation`, `Audio`, `Document`, `PassportFile`, `PhotoSize`, `Video`, `VideoNote` and `Voice` now contain `FileMeta` instead of its fields.
|
||||||
|
Together with rename of `FileMeta`'s fields, you'll need to change `_` to `.`:
|
||||||
|
|
||||||
|
```diff
|
||||||
|
-_ = animation.file_size;
|
||||||
|
+_ = animation.file.size;
|
||||||
|
```
|
||||||
|
|
||||||
|
Message id fields and parameters now use `MessageId` type, instead of `i32`.
|
||||||
|
You may need to change code accordingly:
|
||||||
|
|
||||||
|
```diff
|
||||||
|
-let id: i32 = message.id;
|
||||||
|
+let id: MessageId = message.id;
|
||||||
|
```
|
||||||
|
```diff,rust
|
||||||
|
let (cid, mid): (ChatId, i32) = get_message_to_delete_from_db();
|
||||||
|
-bot.delete_message(cid, mid).await?;
|
||||||
|
+bot.delete_message(cid, MessageId(mid)).await?;
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that at the same time `MessageId` is now a tuple struct.
|
||||||
|
If you've accessed its only field you'll need to change it too:
|
||||||
|
|
||||||
|
```diff,rust
|
||||||
|
-let MessageId { message_id } = bot.copy_message(dst_chat, src_chat, mid).await?;
|
||||||
|
+let MessageId(message_id) = bot.copy_message(dst_chat, src_chat, mid).await?;
|
||||||
|
save_to_db(message_id);
|
||||||
|
```
|
||||||
|
|
||||||
|
Because of API updates `Sticker` type was refactored again.
|
||||||
|
You may need to change code accordingly.
|
||||||
|
See `Sticker` documentation for more information about the new structure.
|
||||||
|
|
||||||
|
### teloxide
|
||||||
|
|
||||||
|
You can now write `Ok(())` instead of `respond(())` at the end of closures provided to RELPs:
|
||||||
|
|
||||||
|
```diff,rust
|
||||||
|
teloxide::repl(bot, |bot: Bot, msg: Message| async move {
|
||||||
|
bot.send_dice(msg.chat.id).await?;
|
||||||
|
- respond(())
|
||||||
|
+ Ok(())
|
||||||
|
})
|
||||||
|
.await;
|
||||||
|
```
|
||||||
|
|
||||||
|
This is because REPLs now require the closure to return `RequestError` instead of a generic error type, so type inference works perfectly for a return value. If you use something other than `RequestError`, you can transfer your code to `teloxide::dispatching`, which still permits a generic error type.
|
||||||
|
|
||||||
|
### macros
|
||||||
|
|
||||||
|
`parse_with` now accepts a Rust _path_ to a custom parser function instead of a string:
|
||||||
|
|
||||||
|
```diff,rust
|
||||||
|
fn custom_parser(input: String) -> Result<(u8,), ParseError> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(BotCommands)]
|
||||||
|
enum Command {
|
||||||
|
- #[command(parse_with = "custom_parser")]
|
||||||
|
+ #[command(parse_with = custom_parser)]
|
||||||
|
Num(u8),
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
`rename` now only renames a command literally; use `rename_rule` to change the case of a command:
|
||||||
|
|
||||||
|
```diff,rust
|
||||||
|
#[derive(BotCommands)]
|
||||||
|
- #[command(rename = "lowercase", description = "These commands are supported:")]
|
||||||
|
+ #[command(rename_rule = "lowercase", description = "These commands are supported:")]
|
||||||
|
enum Command {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## 0.9 -> 0.10
|
## 0.9 -> 0.10
|
||||||
|
|
||||||
### core
|
### core
|
||||||
|
|
20
README.md
20
README.md
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="./ICON.png" width="250"/>
|
<img src="./ICON.png" width="250"/>
|
||||||
<h1>teloxide</h1>
|
<h1><code>teloxide</code></h1>
|
||||||
<a href="https://docs.rs/teloxide/">
|
<a href="https://docs.rs/teloxide/">
|
||||||
<img src="https://docs.rs/teloxide/badge.svg">
|
<img src="https://docs.rs/teloxide/badge.svg">
|
||||||
</a>
|
</a>
|
||||||
|
@ -24,18 +24,20 @@
|
||||||
|
|
||||||
## Highlights
|
## Highlights
|
||||||
|
|
||||||
- **Declarative design.** teloxide is based upon [`dptree`], a functional [chain of responsibility] pattern that allows you to express pipelines of message processing in a highly declarative and extensible style.
|
- **Declarative design.** `teloxide` is based upon [`dptree`], a functional [chain of responsibility] pattern that allows you to express pipelines of message processing in a highly declarative and extensible style.
|
||||||
|
|
||||||
[`dptree`]: https://github.com/teloxide/dptree
|
[`dptree`]: https://github.com/teloxide/dptree
|
||||||
[chain of responsibility]: https://en.wikipedia.org/wiki/Chain-of-responsibility_pattern
|
[chain of responsibility]: https://en.wikipedia.org/wiki/Chain-of-responsibility_pattern
|
||||||
|
|
||||||
- **Dialogues management subsystem.** Our dialogues management subsystem is simple and easy-to-use, and, furthermore, is agnostic of how/where dialogues are stored. For example, you can just replace a one line to achieve [persistence]. Out-of-the-box storages include [Redis] and [Sqlite].
|
- **Feature-rich.** You can use both long polling and webhooks, configure an underlying HTTPS client, set a custom URL of a Telegram API server, and much more.
|
||||||
|
|
||||||
|
- **Simple dialogues.** Our dialogues subsystem is simple and easy-to-use, and, furthermore, is agnostic of how/where dialogues are stored. For example, you can just replace a one line to achieve [persistence]. Out-of-the-box storages include [Redis] and [Sqlite].
|
||||||
|
|
||||||
[persistence]: https://en.wikipedia.org/wiki/Persistence_(computer_science)
|
[persistence]: https://en.wikipedia.org/wiki/Persistence_(computer_science)
|
||||||
[Redis]: https://redis.io/
|
[Redis]: https://redis.io/
|
||||||
[Sqlite]: https://www.sqlite.org
|
[Sqlite]: https://www.sqlite.org
|
||||||
|
|
||||||
- **Strongly typed commands.** You can describe bot commands as enumerations, and then they'll be automatically constructed from strings — just like JSON structures in [`serde-json`] and command-line arguments in [`structopt`].
|
- **Strongly typed commands.** Define bot commands as an `enum` and teloxide will parse them automatically — just like JSON structures in [`serde-json`] and command-line arguments in [`structopt`].
|
||||||
|
|
||||||
[`structopt`]: https://github.com/TeXitoi/structopt
|
[`structopt`]: https://github.com/TeXitoi/structopt
|
||||||
[`serde-json`]: https://github.com/serde-rs/json
|
[`serde-json`]: https://github.com/serde-rs/json
|
||||||
|
@ -54,9 +56,9 @@ $ set TELOXIDE_TOKEN=<Your token here>
|
||||||
|
|
||||||
# Windows PowerShell
|
# Windows PowerShell
|
||||||
$ $env:TELOXIDE_TOKEN=<Your token here>
|
$ $env:TELOXIDE_TOKEN=<Your token here>
|
||||||
|
|
||||||
```
|
```
|
||||||
4. Make sure that your Rust compiler is up to date (teloxide currently requires rustc at least version 1.64):
|
|
||||||
|
4. Make sure that your Rust compiler is up to date (`teloxide` currently requires rustc at least version 1.64):
|
||||||
```bash
|
```bash
|
||||||
# If you're using stable
|
# If you're using stable
|
||||||
$ rustup update stable
|
$ rustup update stable
|
||||||
|
@ -304,7 +306,7 @@ A: No, only the bots API.
|
||||||
|
|
||||||
**Q: Can I use webhooks?**
|
**Q: Can I use webhooks?**
|
||||||
|
|
||||||
A: You can! Teloxide has a built-in support for webhooks in `dispatching::update_listeners::webhooks` module. See how it's used in [`examples/ngrok_ping_pong_bot`](examples/ngrok_ping_pong.rs) and [`examples/heroku_ping_pong_bot`](examples/heroku_ping_pong.rs).
|
A: You can! `teloxide` has a built-in support for webhooks in `dispatching::update_listeners::webhooks` module. See how it's used in [`examples/ngrok_ping_pong_bot`](examples/ngrok_ping_pong.rs) and [`examples/heroku_ping_pong_bot`](examples/heroku_ping_pong.rs).
|
||||||
|
|
||||||
**Q: Can I handle both callback queries and messages within a single dialogue?**
|
**Q: Can I handle both callback queries and messages within a single dialogue?**
|
||||||
|
|
||||||
|
@ -328,7 +330,7 @@ Feel free to propose your own bot to our collection!
|
||||||
- [`zamazan4ik/npaperbot-telegram`](https://github.com/zamazan4ik/npaperbot-telegram) — Telegram bot for searching via C++ proposals.
|
- [`zamazan4ik/npaperbot-telegram`](https://github.com/zamazan4ik/npaperbot-telegram) — Telegram bot for searching via C++ proposals.
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>Show bots using teloxide older than v0.6.0</summary>
|
<summary>Show bots using `teloxide` older than v0.6.0</summary>
|
||||||
|
|
||||||
- [`mxseev/logram`](https://github.com/mxseev/logram) — Utility that takes logs from anywhere and sends them to Telegram.
|
- [`mxseev/logram`](https://github.com/mxseev/logram) — Utility that takes logs from anywhere and sends them to Telegram.
|
||||||
- [`alexkonovalov/PedigreeBot`](https://github.com/alexkonovalov/PedigreeBot) — A Telegram bot for building family trees.
|
- [`alexkonovalov/PedigreeBot`](https://github.com/alexkonovalov/PedigreeBot) — A Telegram bot for building family trees.
|
||||||
|
@ -340,7 +342,7 @@ Feel free to propose your own bot to our collection!
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
See [700+ other public repositories using teloxide >>](https://github.com/teloxide/teloxide/network/dependents)
|
See [700+ other public repositories using `teloxide` >>](https://github.com/teloxide/teloxide/network/dependents)
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
|
|
|
@ -220,12 +220,11 @@ where
|
||||||
Upd: GetChatId + Clone + Send + Sync + 'static,
|
Upd: GetChatId + Clone + Send + Sync + 'static,
|
||||||
Output: Send + Sync + 'static,
|
Output: Send + Sync + 'static,
|
||||||
{
|
{
|
||||||
dptree::entry()
|
dptree::filter_map(|storage: Arc<S>, upd: Upd| {
|
||||||
.chain(dptree::filter_map(|storage: Arc<S>, upd: Upd| {
|
|
||||||
let chat_id = upd.chat_id()?;
|
let chat_id = upd.chat_id()?;
|
||||||
Some(Dialogue::new(storage, chat_id))
|
Some(Dialogue::new(storage, chat_id))
|
||||||
}))
|
})
|
||||||
.chain(dptree::filter_map_async(|dialogue: Dialogue<D, S>| async move {
|
.filter_map_async(|dialogue: Dialogue<D, S>| async move {
|
||||||
match dialogue.get_or_default().await {
|
match dialogue.get_or_default().await {
|
||||||
Ok(dialogue) => Some(dialogue),
|
Ok(dialogue) => Some(dialogue),
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
|
@ -233,5 +232,5 @@ where
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}))
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -88,8 +88,8 @@ where
|
||||||
C: BotCommands + Send + Sync + 'static,
|
C: BotCommands + Send + Sync + 'static,
|
||||||
Output: Send + Sync + 'static,
|
Output: Send + Sync + 'static,
|
||||||
{
|
{
|
||||||
dptree::entry().chain(dptree::filter_map(move |message: Message, me: Me| {
|
dptree::filter_map(move |message: Message, me: Me| {
|
||||||
let bot_name = me.user.username.expect("Bots must have a username");
|
let bot_name = me.user.username.expect("Bots must have a username");
|
||||||
message.text().and_then(|text| C::parse(text, &bot_name).ok())
|
message.text().and_then(|text| C::parse(text, &bot_name).ok())
|
||||||
}))
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,7 @@ use std::{fmt::Debug, marker::PhantomData};
|
||||||
///
|
///
|
||||||
/// ## Handler arguments
|
/// ## Handler arguments
|
||||||
///
|
///
|
||||||
/// Teloxide provides the following types to the `handler`:
|
/// `teloxide` provides the following types to the `handler`:
|
||||||
/// - [`Message`]
|
/// - [`Message`]
|
||||||
/// - `R` (type of the `bot`)
|
/// - `R` (type of the `bot`)
|
||||||
/// - `Cmd` (type of the parsed command)
|
/// - `Cmd` (type of the parsed command)
|
||||||
|
@ -105,7 +105,7 @@ where
|
||||||
///
|
///
|
||||||
/// ## Handler arguments
|
/// ## Handler arguments
|
||||||
///
|
///
|
||||||
/// Teloxide provides the following types to the `handler`:
|
/// `teloxide` provides the following types to the `handler`:
|
||||||
/// - [`Message`]
|
/// - [`Message`]
|
||||||
/// - `R` (type of the `bot`)
|
/// - `R` (type of the `bot`)
|
||||||
/// - `Cmd` (type of the parsed command)
|
/// - `Cmd` (type of the parsed command)
|
||||||
|
|
|
@ -27,7 +27,7 @@ use std::fmt::Debug;
|
||||||
///
|
///
|
||||||
/// ## Handler arguments
|
/// ## Handler arguments
|
||||||
///
|
///
|
||||||
/// Teloxide provides the following types to the `handler`:
|
/// `teloxide` provides the following types to the `handler`:
|
||||||
/// - [`Message`]
|
/// - [`Message`]
|
||||||
/// - `R` (type of the `bot`)
|
/// - `R` (type of the `bot`)
|
||||||
/// - [`Me`]
|
/// - [`Me`]
|
||||||
|
@ -81,7 +81,7 @@ where
|
||||||
///
|
///
|
||||||
/// ## Handler arguments
|
/// ## Handler arguments
|
||||||
///
|
///
|
||||||
/// Teloxide provides the following types to the `handler`:
|
/// `teloxide` provides the following types to the `handler`:
|
||||||
/// - [`Message`]
|
/// - [`Message`]
|
||||||
/// - `R` (type of the `bot`)
|
/// - `R` (type of the `bot`)
|
||||||
/// - [`Me`]
|
/// - [`Me`]
|
||||||
|
|
|
@ -67,7 +67,7 @@ where
|
||||||
///
|
///
|
||||||
/// ## Note
|
/// ## Note
|
||||||
///
|
///
|
||||||
/// Teloxide normally (when using [`Dispatcher`] or [`repl`]s) sets this
|
/// `teloxide` normally (when using [`Dispatcher`] or [`repl`]s) sets this
|
||||||
/// automatically via [`hint_allowed_updates`], so you rarely need to use
|
/// automatically via [`hint_allowed_updates`], so you rarely need to use
|
||||||
/// `allowed_updates` explicitly.
|
/// `allowed_updates` explicitly.
|
||||||
///
|
///
|
||||||
|
|
|
@ -49,7 +49,7 @@ pub struct Options {
|
||||||
/// `a-z`, `0-9`, `_` and `-` are allowed. The header is useful to ensure
|
/// `a-z`, `0-9`, `_` and `-` are allowed. The header is useful to ensure
|
||||||
/// that the request comes from a webhook set by you.
|
/// that the request comes from a webhook set by you.
|
||||||
///
|
///
|
||||||
/// Default - teloxide will generate a random token.
|
/// Default - `teloxide` will generate a random token.
|
||||||
pub secret_token: Option<String>,
|
pub secret_token: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
| `trace-adaptor` | Enables the [`Trace`](adaptors::Trace) bot adaptor. |
|
| `trace-adaptor` | Enables the [`Trace`](adaptors::Trace) bot adaptor. |
|
||||||
| `erased` | Enables the [`ErasedRequester`](adaptors::ErasedRequester) bot adaptor. |
|
| `erased` | Enables the [`ErasedRequester`](adaptors::ErasedRequester) bot adaptor. |
|
||||||
| `full` | Enables all the features except `nightly`. |
|
| `full` | Enables all the features except `nightly`. |
|
||||||
| `nightly` | Enables nightly-only features (see the [teloxide-core features]). |
|
| `nightly` | Enables nightly-only features (see the [`teloxide-core` features]). |
|
||||||
| `native-tls` | Enables the [`native-tls`] TLS implementation (**enabled by default**). |
|
| `native-tls` | Enables the [`native-tls`] TLS implementation (**enabled by default**). |
|
||||||
| `rustls` | Enables the [`rustls`] TLS implementation. |
|
| `rustls` | Enables the [`rustls`] TLS implementation. |
|
||||||
| `redis-storage` | Enables the [Redis] storage support for dialogues. |
|
| `redis-storage` | Enables the [Redis] storage support for dialogues. |
|
||||||
|
@ -29,6 +29,6 @@
|
||||||
[`native-tls`]: https://docs.rs/native-tls
|
[`native-tls`]: https://docs.rs/native-tls
|
||||||
[`rustls`]: https://docs.rs/rustls
|
[`rustls`]: https://docs.rs/rustls
|
||||||
[`teloxide::utils::UpState`]: utils::UpState
|
[`teloxide::utils::UpState`]: utils::UpState
|
||||||
[teloxide-core features]: https://docs.rs/teloxide-core/latest/teloxide_core/#cargo-features
|
[`teloxide-core` features]: https://docs.rs/teloxide-core/latest/teloxide_core/#cargo-features
|
||||||
|
|
||||||
[`DispatcherBuilder::enable_ctrlc_handler`]: dispatching::DispatcherBuilder::enable_ctrlc_handler
|
[`DispatcherBuilder::enable_ctrlc_handler`]: dispatching::DispatcherBuilder::enable_ctrlc_handler
|
Loading…
Reference in a new issue