1use serde::{Deserialize, Serialize};
4use std::fmt;
5
6#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Default, Serialize, Deserialize)]
8pub struct Uin(pub i64);
9
10#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Serialize, Deserialize)]
12#[serde(rename_all = "snake_case")]
13pub enum Scene {
14 Friend,
15 Group,
16 Temp,
17}
18
19#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Serialize, Deserialize)]
21pub struct Peer {
22 pub scene: Scene,
23 pub id: Uin,
24}
25
26#[derive(Clone, PartialEq, Eq, Hash, Debug, Serialize, Deserialize)]
37pub struct MessageId {
38 pub peer: Peer,
39 pub seq: i64,
40 pub onebot_id: Option<i32>,
41}
42
43impl From<i64> for Uin {
44 fn from(v: i64) -> Self {
45 Uin(v)
46 }
47}
48
49impl Uin {
50 pub fn is_user(self) -> bool {
54 self.0 >= 10_000
55 }
56}
57
58impl fmt::Display for Uin {
59 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
60 write!(f, "{}", self.0)
61 }
62}
63
64impl Peer {
65 pub fn group(id: impl Into<Uin>) -> Self {
66 Peer { scene: Scene::Group, id: id.into() }
67 }
68 pub fn friend(id: impl Into<Uin>) -> Self {
69 Peer { scene: Scene::Friend, id: id.into() }
70 }
71 pub fn temp(id: impl Into<Uin>) -> Self {
72 Peer { scene: Scene::Temp, id: id.into() }
73 }
74 pub fn is_group(&self) -> bool {
75 matches!(self.scene, Scene::Group)
76 }
77}
78
79impl MessageId {
80 pub fn from_seq(peer: Peer, seq: i64) -> Self {
82 MessageId { peer, seq, onebot_id: None }
83 }
84}