1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
use serde::{Serialize, Deserialize};
use uuid::Uuid;

use super::chat_type::ChatType;

// #[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
// #[serde(untagged)]
// pub enum CommandData {
//     /// Событие отправляется при создание чата
//     ChatCreated(ChatCreatedCommand),
//     /// Событие отправляется при добавление мемберов в чат
//     AddedToChat(AddedToChatCommand),
//     /// Событие отправляется при удалении администратором участников чата
//     DeletedFromChat(DeletedFromChatCommand),
//     /// Событие отправляется при выходе участников из чата
//     LeftFromChat(LeftFromChatCommand),
//     /// Событие отправляется клиентом при взаимодействии со smartapp приложением
//     SmartappEvent(SmartappEventCommand),
//     /// Событие отправляется ботом при взаимодействие с другими ботами
//     InternalBotNotification(InternalBotNotificationCommand),
//     /// Событие отправляется при успешном логине пользователя на CTS
//     CtsLogin(CtsLoginLogoutCommand),
//     /// Событие отправляется при успешном выходе пользователя с CTS
//     CtsLogout(CtsLoginLogoutCommand),
//     /// Текстовая информация события
//     Text(String),
//     /// Кстомная информация события
//     Other(serde_json::Value),
// }

// impl CommandData {
//     pub fn unwrap_other(&self) -> &serde_json::Value {
//         match self {
//             CommandData::Other(other) => other,
//             _ => panic!("Unexpected command data"),
//         }
//     }
// }

/// Событие отправляется при создание чата
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct ChatCreatedCommandData {
    /// uuid чата
    pub group_chat_id: Uuid,

    /// тип чата
    pub chat_type: ChatType,

    /// имя чата
    pub name: String,

    /// huid создателя чата
    pub creator: Uuid,
    
    pub members: Vec<ChatCreatedCommandMembers>,
}

#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct ChatCreatedCommandMembers {
    /// huid участника  
    pub huid: Uuid,

    /// имя участника
    pub name: Option<String>,

    /// тип участника
    pub user_kind: UserKind,

    /// является/не является админом
    pub admin: bool,
}

/// тип участника
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
pub enum UserKind {
    #[serde(rename(serialize = "user", deserialize = "user"))]
    User,
    #[serde(rename(serialize = "cts_user", deserialize = "cts_user"))]
    CtsUser,
    #[serde(rename(serialize = "unregistered", deserialize = "unregistered"))]
    Unregistered,
    #[serde(rename(serialize = "botx", deserialize = "botx"))]
    Botx
}

/// Событие отправляется при добавление мемберов в чат
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct AddedToChatCommandData {
    /// список добавленных мемберов
    pub added_members: Vec<Uuid>,
}

/// Событие отправляется при удалении администратором участников чата
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct DeletedFromChatCommandData {
    /// список идентификаторов удаленных пользователей
    pub deleted_members: Vec<Uuid>,
}

/// Событие отправляется при выходе участников из чата
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct LeftFromChatCommandData {
    /// список идентификаторов покинувших чат пользователей
    pub left_members: Vec<Uuid>,
}

/// Событие отправляется клиентом при взаимодействии со smartapp приложением
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct SmartappEventCommandData {
    /// уникальный идентификатор запроса
    #[serde(rename(serialize = "ref", deserialize = "ref"))] // ref зарезервировано
    pub request_ref: Uuid,

    /// ID смарт аппа
    pub smartapp_id: Uuid,

    /// пользовательские данные
    pub data: serde_json::Value,

    /// опции запроса
    pub opts: serde_json::Value,

    /// версия протокола smartapp <-> bot
    pub smartapp_api_version: u16,
}

/// Событие отправляется ботом при взаимодействие с другими ботами
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct InternalBotNotificationCommandData {
    /// пользовательские данные
    pub data: serde_json::Value,

    /// опции запроса
    pub opts: serde_json::Value,
}

/// Событие отправляется при успешном логине пользователя на CTS
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct CtsLoginCommandData {
    /// huid пользователя
    pub user_huid: Uuid,

    /// id сервера на который был произведен логин или <br/>
    /// id сервера с которого был произведен выход
    pub cts_id: Uuid,
}

/// Событие отправляется при успешном выходе пользователя с CTS
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct CtsLogoutCommandData {
    /// huid пользователя
    pub user_huid: Uuid,

    /// id сервера на который был произведен логин или <br/>
    /// id сервера с которого был произведен выход
    pub cts_id: Uuid,
}