use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Default, Serialize, Deserialize)]
pub struct Uin(pub i64);
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Scene {
Friend,
Group,
Temp,
}
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Serialize, Deserialize)]
pub struct Peer {
pub scene: Scene,
pub id: Uin,
}
#[derive(Clone, PartialEq, Eq, Hash, Debug, Serialize, Deserialize)]
pub struct MessageId {
pub peer: Peer,
pub seq: i64,
pub onebot_id: Option<i32>,
}
impl From<i64> for Uin {
fn from(v: i64) -> Self {
Uin(v)
}
}
impl Uin {
pub fn is_user(self) -> bool {
self.0 >= 10_000
}
}
impl fmt::Display for Uin {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.0)
}
}
impl Peer {
pub fn group(id: impl Into<Uin>) -> Self {
Peer { scene: Scene::Group, id: id.into() }
}
pub fn friend(id: impl Into<Uin>) -> Self {
Peer { scene: Scene::Friend, id: id.into() }
}
pub fn temp(id: impl Into<Uin>) -> Self {
Peer { scene: Scene::Temp, id: id.into() }
}
pub fn is_group(&self) -> bool {
matches!(self.scene, Scene::Group)
}
}
impl MessageId {
pub fn from_seq(peer: Peer, seq: i64) -> Self {
MessageId { peer, seq, onebot_id: None }
}
}