mirror of
https://github.com/teloxide/teloxide.git
synced 2024-12-22 22:46:39 +01:00
Add UserId::{url, is_anonymous, is_channel, is_telegram}
functions
This commit is contained in:
parent
1746be2b7f
commit
705083c2d9
3 changed files with 57 additions and 19 deletions
|
@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||
|
||||
## unreleased
|
||||
|
||||
### Added
|
||||
|
||||
- `UserId::{url, is_anonymous, is_channel, is_telegram}` convenience functions ([#197][pr197])
|
||||
|
||||
[pr197]: https://github.com/teloxide/teloxide-core/pull/197
|
||||
|
||||
### Changed
|
||||
|
||||
- `user.id` now uses `UserId` type, `ChatId` now represents only _chat id_, not channel username, all `chat_id` function parameters now accept `Recipient` [**BC**]
|
||||
|
|
|
@ -46,65 +46,57 @@ impl User {
|
|||
}
|
||||
|
||||
/// Returns an URL that links to this user in the form of
|
||||
/// `tg://user/?id=<...>`
|
||||
/// `tg://user/?id=<...>`.
|
||||
pub fn url(&self) -> reqwest::Url {
|
||||
reqwest::Url::parse(&format!("tg://user/?id={}", self.id)).unwrap()
|
||||
self.id.url()
|
||||
}
|
||||
|
||||
/// Returns `true` if this is special user used by telegram bot API to
|
||||
/// Returns `true` if this is the special user used by telegram bot API to
|
||||
/// denote an anonymous user that sends messages on behalf of a group.
|
||||
pub fn is_anonymous(&self) -> bool {
|
||||
// https://github.com/tdlib/td/blob/4791fb6a2af0257f6cad8396e10424a79ee5f768/td/telegram/ContactsManager.cpp#L4941-L4943
|
||||
const ANON_ID: UserId = UserId(1087968824);
|
||||
|
||||
// Sanity check
|
||||
debug_assert!(
|
||||
(self.id != ANON_ID)
|
||||
!self.id.is_anonymous()
|
||||
|| (self.is_bot
|
||||
&& self.first_name == "Group"
|
||||
&& self.last_name.is_none()
|
||||
&& self.username.as_deref() == Some("GroupAnonymousBot"))
|
||||
);
|
||||
|
||||
self.id == ANON_ID
|
||||
self.id.is_anonymous()
|
||||
}
|
||||
|
||||
/// Returns `true` if this is special user used by telegram bot API to
|
||||
/// Returns `true` if this is the special user used by telegram bot API to
|
||||
/// denote an anonymous user that sends messages on behalf of a channel.
|
||||
pub fn is_channel(&self) -> bool {
|
||||
// https://github.com/tdlib/td/blob/4791fb6a2af0257f6cad8396e10424a79ee5f768/td/telegram/ContactsManager.cpp#L4945-L4947
|
||||
const ANON_CHANNEL_ID: UserId = UserId(136817688);
|
||||
|
||||
// Sanity check
|
||||
debug_assert!(
|
||||
(self.id != ANON_CHANNEL_ID)
|
||||
!self.id.is_channel()
|
||||
|| (self.is_bot
|
||||
&& self.first_name == "Group"
|
||||
&& self.last_name.is_none()
|
||||
&& self.username.as_deref() == Some("GroupAnonymousBot"))
|
||||
);
|
||||
|
||||
self.id == ANON_CHANNEL_ID
|
||||
self.id.is_channel()
|
||||
}
|
||||
|
||||
/// Returns `true` if this is special user used by telegram itself.
|
||||
/// Returns `true` if this is the special user used by telegram itself.
|
||||
///
|
||||
/// It is sometimes also used as a fallback, for example when a channel post
|
||||
/// is automatically forwarded to a group, bots in a group will get a
|
||||
/// message where `from` is the Telegram user.
|
||||
pub fn is_telegram(&self) -> bool {
|
||||
const TELEGRAM_USER_ID: UserId = UserId(777000);
|
||||
|
||||
// Sanity check
|
||||
debug_assert!(
|
||||
(self.id != TELEGRAM_USER_ID)
|
||||
!self.id.is_telegram()
|
||||
|| (!self.is_bot
|
||||
&& self.first_name == "Telegram"
|
||||
&& self.last_name.is_none()
|
||||
&& self.username.is_none())
|
||||
);
|
||||
|
||||
self.id == TELEGRAM_USER_ID
|
||||
self.id.is_telegram()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -8,6 +8,46 @@ use serde::{Deserialize, Serialize};
|
|||
#[serde(transparent)]
|
||||
pub struct UserId(pub u64);
|
||||
|
||||
impl UserId {
|
||||
/// Returns an URL that links to the user with this id in the form of
|
||||
/// `tg://user/?id=<...>`.
|
||||
pub fn url(self) -> reqwest::Url {
|
||||
reqwest::Url::parse(&format!("tg://user/?id={}", self)).unwrap()
|
||||
}
|
||||
|
||||
/// Returns `true` if this is the id of the special user used by telegram
|
||||
/// bot API to denote an anonymous user that sends messages on behalf of
|
||||
/// a group.
|
||||
pub fn is_anonymous(self) -> bool {
|
||||
// https://github.com/tdlib/td/blob/4791fb6a2af0257f6cad8396e10424a79ee5f768/td/telegram/ContactsManager.cpp#L4941-L4943
|
||||
const ANON_ID: UserId = UserId(1087968824);
|
||||
|
||||
self == ANON_ID
|
||||
}
|
||||
|
||||
/// Returns `true` if this is the id of the special user used by telegram
|
||||
/// bot API to denote an anonymous user that sends messages on behalf of
|
||||
/// a channel.
|
||||
pub fn is_channel(self) -> bool {
|
||||
// https://github.com/tdlib/td/blob/4791fb6a2af0257f6cad8396e10424a79ee5f768/td/telegram/ContactsManager.cpp#L4945-L4947
|
||||
const ANON_CHANNEL_ID: UserId = UserId(136817688);
|
||||
|
||||
self == ANON_CHANNEL_ID
|
||||
}
|
||||
|
||||
/// Returns `true` if this is the id of the special user used by telegram
|
||||
/// itself.
|
||||
///
|
||||
/// It is sometimes also used as a fallback, for example when a channel post
|
||||
/// is automatically forwarded to a group, bots in a group will get a
|
||||
/// message where `from` is the Telegram user.
|
||||
pub fn is_telegram(self) -> bool {
|
||||
const TELEGRAM_USER_ID: UserId = UserId(777000);
|
||||
|
||||
self == TELEGRAM_USER_ID
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
|
Loading…
Reference in a new issue