mirror of
https://github.com/teloxide/teloxide.git
synced 2024-12-23 06:51:01 +01:00
Merge pull request #905 from teloxide/assorted_user_chat_id_additions
Assorted user/chat id additions
This commit is contained in:
commit
c963078973
3 changed files with 48 additions and 2 deletions
|
@ -16,9 +16,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
- `Seconds` type, which represents a duration is seconds ([#859][pr859])
|
- `Seconds` type, which represents a duration is seconds ([#859][pr859])
|
||||||
- `VideoChatEnded::duration` field that was previously missed ([#859][pr859])
|
- `VideoChatEnded::duration` field that was previously missed ([#859][pr859])
|
||||||
- `ThreadId` newtype over `MessageId`, used for identifying reply threads ([#887][pr887])
|
- `ThreadId` newtype over `MessageId`, used for identifying reply threads ([#887][pr887])
|
||||||
|
- `ChatId::as_user` ([#905][pr905])
|
||||||
|
- Implement `PartialEq<ChatId> for UserId` and `PartialEq<UserId> for ChatId` ([#905][pr905])
|
||||||
|
- `ChatId::{MIN, MAX}` ([#905][pr905])
|
||||||
|
|
||||||
[pr851]: https://github.com/teloxide/teloxide/pull/851
|
[pr851]: https://github.com/teloxide/teloxide/pull/851
|
||||||
[pr887]: https://github.com/teloxide/teloxide/pull/887
|
[pr887]: https://github.com/teloxide/teloxide/pull/887
|
||||||
|
[pr905]: https://github.com/teloxide/teloxide/pull/905
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,15 @@ impl ChatId {
|
||||||
matches!(self.to_bare(), BareChatId::Channel(_))
|
matches!(self.to_bare(), BareChatId::Channel(_))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns user id, if this is an id of a user.
|
||||||
|
#[must_use]
|
||||||
|
pub fn as_user(self) -> Option<UserId> {
|
||||||
|
match self.to_bare() {
|
||||||
|
BareChatId::User(u) => Some(u),
|
||||||
|
BareChatId::Group(_) | BareChatId::Channel(_) => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Converts this id to "bare" MTProto peer id.
|
/// Converts this id to "bare" MTProto peer id.
|
||||||
///
|
///
|
||||||
/// See [`BareChatId`] for more.
|
/// See [`BareChatId`] for more.
|
||||||
|
@ -73,6 +82,12 @@ impl From<UserId> for ChatId {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl PartialEq<UserId> for ChatId {
|
||||||
|
fn eq(&self, other: &UserId) -> bool {
|
||||||
|
self.is_user() && *self == ChatId::from(*other)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl BareChatId {
|
impl BareChatId {
|
||||||
/// Converts bare chat id back to normal bot API [`ChatId`].
|
/// Converts bare chat id back to normal bot API [`ChatId`].
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
|
@ -92,8 +107,8 @@ const MIN_MARKED_CHANNEL_ID: i64 = -1997852516352;
|
||||||
const MAX_MARKED_CHANNEL_ID: i64 = -1000000000000;
|
const MAX_MARKED_CHANNEL_ID: i64 = -1000000000000;
|
||||||
const MIN_MARKED_CHAT_ID: i64 = MAX_MARKED_CHANNEL_ID + 1;
|
const MIN_MARKED_CHAT_ID: i64 = MAX_MARKED_CHANNEL_ID + 1;
|
||||||
const MAX_MARKED_CHAT_ID: i64 = MIN_USER_ID - 1;
|
const MAX_MARKED_CHAT_ID: i64 = MIN_USER_ID - 1;
|
||||||
const MIN_USER_ID: i64 = 0;
|
pub(crate) const MIN_USER_ID: i64 = 0;
|
||||||
const MAX_USER_ID: i64 = (1 << 40) - 1;
|
pub(crate) const MAX_USER_ID: i64 = (1 << 40) - 1;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
@ -143,4 +158,16 @@ mod tests {
|
||||||
fn display() {
|
fn display() {
|
||||||
assert_eq!(ChatId(1).to_string(), "1");
|
assert_eq!(ChatId(1).to_string(), "1");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn user_id_eq() {
|
||||||
|
assert_eq!(ChatId(12), UserId(12));
|
||||||
|
assert_eq!(ChatId(4652762), UserId(4652762));
|
||||||
|
assert_ne!(ChatId(17), UserId(42));
|
||||||
|
|
||||||
|
// The user id is not well formed, so even though `-1 == max` is true,
|
||||||
|
// we don't want user id to match
|
||||||
|
assert_eq!(-1i64, u64::MAX as i64);
|
||||||
|
assert_ne!(ChatId(-1), UserId(u64::MAX));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
use crate::types::{ChatId, MAX_USER_ID, MIN_USER_ID};
|
||||||
|
|
||||||
/// Identifier of a user.
|
/// Identifier of a user.
|
||||||
#[derive(Clone, Copy)]
|
#[derive(Clone, Copy)]
|
||||||
#[derive(Debug, derive_more::Display)]
|
#[derive(Debug, derive_more::Display)]
|
||||||
|
@ -50,6 +52,19 @@ impl UserId {
|
||||||
|
|
||||||
self == TELEGRAM_USER_ID
|
self == TELEGRAM_USER_ID
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The smallest user id that could possibly be returned by Telegram.
|
||||||
|
pub const MIN: Self = Self(MIN_USER_ID as u64);
|
||||||
|
|
||||||
|
/// The largest user id that could possibly be returned by Telegram.
|
||||||
|
pub const MAX: Self = Self(MAX_USER_ID as u64);
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PartialEq<ChatId> for UserId {
|
||||||
|
fn eq(&self, other: &ChatId) -> bool {
|
||||||
|
// Reuse `PartialEq<UserId> for ChatId` impl
|
||||||
|
other == self
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
Loading…
Reference in a new issue