Skip to main content

simploxide_api_types/
lib.rs

1//! This crate is auto-generated
2
3#![allow(clippy::large_enum_variant)]
4#![allow(clippy::new_without_default)]
5
6pub mod client_api;
7pub mod commands;
8pub mod errors;
9pub mod events;
10pub mod responses;
11pub mod utils;
12
13use errors::*;
14use serde::{Deserialize, Serialize};
15use serde_aux::field_attributes::{
16    deserialize_number_from_string, deserialize_option_number_from_string,
17};
18use std::{collections::BTreeMap, fmt::Write as _, sync::Arc};
19use utils::CommandSyntax;
20
21pub type UtcTime = String;
22pub type JsonObject = serde_json::Value;
23
24#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
25#[cfg_attr(feature = "bon", derive(::bon::Builder))]
26#[cfg_attr(feature = "bon", builder(on(String, into)))]
27pub struct ACIReaction {
28    #[serde(rename = "chatInfo")]
29    pub chat_info: ChatInfo,
30
31    #[serde(rename = "chatReaction")]
32    pub chat_reaction: CIReaction,
33
34    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
35    #[cfg_attr(feature = "bon", builder(default))]
36    pub undocumented: JsonObject,
37}
38
39#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
40#[cfg_attr(feature = "bon", derive(::bon::Builder))]
41#[cfg_attr(feature = "bon", builder(on(String, into)))]
42pub struct AChat {
43    #[serde(rename = "chatInfo")]
44    pub chat_info: ChatInfo,
45
46    #[serde(rename = "chatItems")]
47    pub chat_items: Vec<ChatItem>,
48
49    #[serde(rename = "chatStats")]
50    pub chat_stats: ChatStats,
51
52    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
53    #[cfg_attr(feature = "bon", builder(default))]
54    pub undocumented: JsonObject,
55}
56
57#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
58#[cfg_attr(feature = "bon", derive(::bon::Builder))]
59#[cfg_attr(feature = "bon", builder(on(String, into)))]
60pub struct AChatItem {
61    #[serde(rename = "chatInfo")]
62    pub chat_info: ChatInfo,
63
64    #[serde(rename = "chatItem")]
65    pub chat_item: ChatItem,
66
67    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
68    #[cfg_attr(feature = "bon", builder(default))]
69    pub undocumented: JsonObject,
70}
71
72#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
73#[cfg_attr(feature = "bon", derive(::bon::Builder))]
74#[cfg_attr(feature = "bon", builder(on(String, into)))]
75pub struct AddressSettings {
76    #[serde(rename = "businessAddress")]
77    pub business_address: bool,
78
79    #[serde(rename = "autoAccept", skip_serializing_if = "Option::is_none")]
80    pub auto_accept: Option<AutoAccept>,
81
82    #[serde(rename = "autoReply", skip_serializing_if = "Option::is_none")]
83    pub auto_reply: Option<MsgContent>,
84
85    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
86    #[cfg_attr(feature = "bon", builder(default))]
87    pub undocumented: JsonObject,
88}
89
90#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
91#[cfg_attr(feature = "bon", derive(::bon::Builder))]
92#[cfg_attr(feature = "bon", builder(on(String, into)))]
93pub struct AutoAccept {
94    #[serde(rename = "acceptIncognito")]
95    pub accept_incognito: bool,
96
97    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
98    #[cfg_attr(feature = "bon", builder(default))]
99    pub undocumented: JsonObject,
100}
101
102#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
103#[cfg_attr(feature = "bon", derive(::bon::Builder))]
104#[cfg_attr(feature = "bon", builder(on(String, into)))]
105pub struct BlockingInfo {
106    #[serde(rename = "reason")]
107    pub reason: BlockingReason,
108
109    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
110    #[cfg_attr(feature = "bon", builder(default))]
111    pub undocumented: JsonObject,
112}
113
114#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
115#[non_exhaustive]
116pub enum BlockingReason {
117    #[default]
118    #[serde(rename = "spam")]
119    Spam,
120    #[serde(rename = "content")]
121    Content,
122}
123
124#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
125#[cfg_attr(feature = "bon", derive(::bon::Builder))]
126#[cfg_attr(feature = "bon", builder(on(String, into)))]
127pub struct BusinessChatInfo {
128    #[serde(rename = "chatType")]
129    pub chat_type: BusinessChatType,
130
131    #[serde(rename = "businessId")]
132    pub business_id: String,
133
134    #[serde(rename = "customerId")]
135    pub customer_id: String,
136
137    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
138    #[cfg_attr(feature = "bon", builder(default))]
139    pub undocumented: JsonObject,
140}
141
142#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
143#[non_exhaustive]
144pub enum BusinessChatType {
145    #[default]
146    #[serde(rename = "business")]
147    Business,
148    #[serde(rename = "customer")]
149    Customer,
150}
151
152#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
153#[non_exhaustive]
154pub enum CICallStatus {
155    #[default]
156    #[serde(rename = "pending")]
157    Pending,
158    #[serde(rename = "missed")]
159    Missed,
160    #[serde(rename = "rejected")]
161    Rejected,
162    #[serde(rename = "accepted")]
163    Accepted,
164    #[serde(rename = "negotiated")]
165    Negotiated,
166    #[serde(rename = "progress")]
167    Progress,
168    #[serde(rename = "ended")]
169    Ended,
170    #[serde(rename = "error")]
171    Error,
172}
173
174#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
175#[serde(tag = "type")]
176#[non_exhaustive]
177pub enum CIContent {
178    #[serde(rename = "sndMsgContent")]
179    SndMsgContent {
180        #[serde(rename = "msgContent")]
181        msg_content: MsgContent,
182
183        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
184        undocumented: JsonObject,
185    },
186    #[serde(rename = "rcvMsgContent")]
187    RcvMsgContent {
188        #[serde(rename = "msgContent")]
189        msg_content: MsgContent,
190
191        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
192        undocumented: JsonObject,
193    },
194    #[serde(rename = "sndDeleted")]
195    SndDeleted {
196        #[serde(rename = "deleteMode")]
197        delete_mode: CIDeleteMode,
198
199        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
200        undocumented: JsonObject,
201    },
202    #[serde(rename = "rcvDeleted")]
203    RcvDeleted {
204        #[serde(rename = "deleteMode")]
205        delete_mode: CIDeleteMode,
206
207        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
208        undocumented: JsonObject,
209    },
210    #[serde(rename = "sndCall")]
211    SndCall {
212        #[serde(rename = "status")]
213        status: CICallStatus,
214
215        #[serde(
216            rename = "duration",
217            deserialize_with = "deserialize_number_from_string"
218        )]
219        duration: i32,
220
221        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
222        undocumented: JsonObject,
223    },
224    #[serde(rename = "rcvCall")]
225    RcvCall {
226        #[serde(rename = "status")]
227        status: CICallStatus,
228
229        #[serde(
230            rename = "duration",
231            deserialize_with = "deserialize_number_from_string"
232        )]
233        duration: i32,
234
235        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
236        undocumented: JsonObject,
237    },
238    #[serde(rename = "rcvIntegrityError")]
239    RcvIntegrityError {
240        #[serde(rename = "msgError")]
241        msg_error: MsgErrorType,
242
243        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
244        undocumented: JsonObject,
245    },
246    #[serde(rename = "rcvDecryptionError")]
247    RcvDecryptionError {
248        #[serde(rename = "msgDecryptError")]
249        msg_decrypt_error: MsgDecryptError,
250
251        #[serde(
252            rename = "msgCount",
253            deserialize_with = "deserialize_number_from_string"
254        )]
255        msg_count: u32,
256
257        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
258        undocumented: JsonObject,
259    },
260    #[serde(rename = "rcvGroupInvitation")]
261    RcvGroupInvitation {
262        #[serde(rename = "groupInvitation")]
263        group_invitation: CIGroupInvitation,
264
265        #[serde(rename = "memberRole")]
266        member_role: GroupMemberRole,
267
268        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
269        undocumented: JsonObject,
270    },
271    #[serde(rename = "sndGroupInvitation")]
272    SndGroupInvitation {
273        #[serde(rename = "groupInvitation")]
274        group_invitation: CIGroupInvitation,
275
276        #[serde(rename = "memberRole")]
277        member_role: GroupMemberRole,
278
279        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
280        undocumented: JsonObject,
281    },
282    #[serde(rename = "rcvDirectEvent")]
283    RcvDirectEvent {
284        #[serde(rename = "rcvDirectEvent")]
285        rcv_direct_event: RcvDirectEvent,
286
287        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
288        undocumented: JsonObject,
289    },
290    #[serde(rename = "rcvGroupEvent")]
291    RcvGroupEvent {
292        #[serde(rename = "rcvGroupEvent")]
293        rcv_group_event: RcvGroupEvent,
294
295        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
296        undocumented: JsonObject,
297    },
298    #[serde(rename = "sndGroupEvent")]
299    SndGroupEvent {
300        #[serde(rename = "sndGroupEvent")]
301        snd_group_event: SndGroupEvent,
302
303        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
304        undocumented: JsonObject,
305    },
306    #[serde(rename = "rcvConnEvent")]
307    RcvConnEvent {
308        #[serde(rename = "rcvConnEvent")]
309        rcv_conn_event: RcvConnEvent,
310
311        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
312        undocumented: JsonObject,
313    },
314    #[serde(rename = "sndConnEvent")]
315    SndConnEvent {
316        #[serde(rename = "sndConnEvent")]
317        snd_conn_event: SndConnEvent,
318
319        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
320        undocumented: JsonObject,
321    },
322    #[serde(rename = "rcvChatFeature")]
323    RcvChatFeature {
324        #[serde(rename = "feature")]
325        feature: ChatFeature,
326
327        #[serde(rename = "enabled")]
328        enabled: PrefEnabled,
329
330        #[serde(
331            rename = "param",
332            skip_serializing_if = "Option::is_none",
333            deserialize_with = "deserialize_option_number_from_string",
334            default
335        )]
336        param: Option<i32>,
337
338        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
339        undocumented: JsonObject,
340    },
341    #[serde(rename = "sndChatFeature")]
342    SndChatFeature {
343        #[serde(rename = "feature")]
344        feature: ChatFeature,
345
346        #[serde(rename = "enabled")]
347        enabled: PrefEnabled,
348
349        #[serde(
350            rename = "param",
351            skip_serializing_if = "Option::is_none",
352            deserialize_with = "deserialize_option_number_from_string",
353            default
354        )]
355        param: Option<i32>,
356
357        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
358        undocumented: JsonObject,
359    },
360    #[serde(rename = "rcvChatPreference")]
361    RcvChatPreference {
362        #[serde(rename = "feature")]
363        feature: ChatFeature,
364
365        #[serde(rename = "allowed")]
366        allowed: FeatureAllowed,
367
368        #[serde(
369            rename = "param",
370            skip_serializing_if = "Option::is_none",
371            deserialize_with = "deserialize_option_number_from_string",
372            default
373        )]
374        param: Option<i32>,
375
376        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
377        undocumented: JsonObject,
378    },
379    #[serde(rename = "sndChatPreference")]
380    SndChatPreference {
381        #[serde(rename = "feature")]
382        feature: ChatFeature,
383
384        #[serde(rename = "allowed")]
385        allowed: FeatureAllowed,
386
387        #[serde(
388            rename = "param",
389            skip_serializing_if = "Option::is_none",
390            deserialize_with = "deserialize_option_number_from_string",
391            default
392        )]
393        param: Option<i32>,
394
395        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
396        undocumented: JsonObject,
397    },
398    #[serde(rename = "rcvGroupFeature")]
399    RcvGroupFeature {
400        #[serde(rename = "groupFeature")]
401        group_feature: GroupFeature,
402
403        #[serde(rename = "preference")]
404        preference: GroupPreference,
405
406        #[serde(
407            rename = "param",
408            skip_serializing_if = "Option::is_none",
409            deserialize_with = "deserialize_option_number_from_string",
410            default
411        )]
412        param: Option<i32>,
413
414        #[serde(rename = "memberRole_", skip_serializing_if = "Option::is_none")]
415        member_role: Option<GroupMemberRole>,
416
417        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
418        undocumented: JsonObject,
419    },
420    #[serde(rename = "sndGroupFeature")]
421    SndGroupFeature {
422        #[serde(rename = "groupFeature")]
423        group_feature: GroupFeature,
424
425        #[serde(rename = "preference")]
426        preference: GroupPreference,
427
428        #[serde(
429            rename = "param",
430            skip_serializing_if = "Option::is_none",
431            deserialize_with = "deserialize_option_number_from_string",
432            default
433        )]
434        param: Option<i32>,
435
436        #[serde(rename = "memberRole_", skip_serializing_if = "Option::is_none")]
437        member_role: Option<GroupMemberRole>,
438
439        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
440        undocumented: JsonObject,
441    },
442    #[serde(rename = "rcvChatFeatureRejected")]
443    RcvChatFeatureRejected {
444        #[serde(rename = "feature")]
445        feature: ChatFeature,
446
447        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
448        undocumented: JsonObject,
449    },
450    #[serde(rename = "rcvGroupFeatureRejected")]
451    RcvGroupFeatureRejected {
452        #[serde(rename = "groupFeature")]
453        group_feature: GroupFeature,
454
455        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
456        undocumented: JsonObject,
457    },
458    #[serde(rename = "sndModerated")]
459    SndModerated,
460    #[serde(rename = "rcvModerated")]
461    RcvModerated,
462    #[serde(rename = "rcvBlocked")]
463    RcvBlocked,
464    #[serde(rename = "sndDirectE2EEInfo")]
465    SndDirectE2EeInfo {
466        #[serde(rename = "e2eeInfo")]
467        e_2_ee_info: E2EInfo,
468
469        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
470        undocumented: JsonObject,
471    },
472    #[serde(rename = "rcvDirectE2EEInfo")]
473    RcvDirectE2EeInfo {
474        #[serde(rename = "e2eeInfo")]
475        e_2_ee_info: E2EInfo,
476
477        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
478        undocumented: JsonObject,
479    },
480    #[serde(rename = "sndGroupE2EEInfo")]
481    SndGroupE2EeInfo {
482        #[serde(rename = "e2eeInfo")]
483        e_2_ee_info: E2EInfo,
484
485        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
486        undocumented: JsonObject,
487    },
488    #[serde(rename = "rcvGroupE2EEInfo")]
489    RcvGroupE2EeInfo {
490        #[serde(rename = "e2eeInfo")]
491        e_2_ee_info: E2EInfo,
492
493        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
494        undocumented: JsonObject,
495    },
496    #[serde(rename = "chatBanner")]
497    ChatBanner,
498    #[serde(untagged)]
499    Undocumented(JsonObject),
500}
501
502impl CIContent {
503    pub fn snd_msg_content(msg_content: MsgContent) -> Self {
504        Self::SndMsgContent {
505            msg_content,
506            undocumented: Default::default(),
507        }
508    }
509
510    pub fn rcv_msg_content(msg_content: MsgContent) -> Self {
511        Self::RcvMsgContent {
512            msg_content,
513            undocumented: Default::default(),
514        }
515    }
516
517    pub fn snd_deleted(delete_mode: CIDeleteMode) -> Self {
518        Self::SndDeleted {
519            delete_mode,
520            undocumented: Default::default(),
521        }
522    }
523
524    pub fn rcv_deleted(delete_mode: CIDeleteMode) -> Self {
525        Self::RcvDeleted {
526            delete_mode,
527            undocumented: Default::default(),
528        }
529    }
530
531    pub fn snd_call(status: CICallStatus, duration: i32) -> Self {
532        Self::SndCall {
533            status,
534            duration,
535            undocumented: Default::default(),
536        }
537    }
538
539    pub fn rcv_call(status: CICallStatus, duration: i32) -> Self {
540        Self::RcvCall {
541            status,
542            duration,
543            undocumented: Default::default(),
544        }
545    }
546
547    pub fn rcv_integrity_error(msg_error: MsgErrorType) -> Self {
548        Self::RcvIntegrityError {
549            msg_error,
550            undocumented: Default::default(),
551        }
552    }
553
554    pub fn rcv_decryption_error(msg_decrypt_error: MsgDecryptError, msg_count: u32) -> Self {
555        Self::RcvDecryptionError {
556            msg_decrypt_error,
557            msg_count,
558            undocumented: Default::default(),
559        }
560    }
561
562    pub fn rcv_group_invitation(
563        group_invitation: CIGroupInvitation,
564        member_role: GroupMemberRole,
565    ) -> Self {
566        Self::RcvGroupInvitation {
567            group_invitation,
568            member_role,
569            undocumented: Default::default(),
570        }
571    }
572
573    pub fn snd_group_invitation(
574        group_invitation: CIGroupInvitation,
575        member_role: GroupMemberRole,
576    ) -> Self {
577        Self::SndGroupInvitation {
578            group_invitation,
579            member_role,
580            undocumented: Default::default(),
581        }
582    }
583
584    pub fn rcv_direct_event(rcv_direct_event: RcvDirectEvent) -> Self {
585        Self::RcvDirectEvent {
586            rcv_direct_event,
587            undocumented: Default::default(),
588        }
589    }
590
591    pub fn rcv_group_event(rcv_group_event: RcvGroupEvent) -> Self {
592        Self::RcvGroupEvent {
593            rcv_group_event,
594            undocumented: Default::default(),
595        }
596    }
597
598    pub fn snd_group_event(snd_group_event: SndGroupEvent) -> Self {
599        Self::SndGroupEvent {
600            snd_group_event,
601            undocumented: Default::default(),
602        }
603    }
604
605    pub fn rcv_conn_event(rcv_conn_event: RcvConnEvent) -> Self {
606        Self::RcvConnEvent {
607            rcv_conn_event,
608            undocumented: Default::default(),
609        }
610    }
611
612    pub fn snd_conn_event(snd_conn_event: SndConnEvent) -> Self {
613        Self::SndConnEvent {
614            snd_conn_event,
615            undocumented: Default::default(),
616        }
617    }
618
619    pub fn rcv_chat_feature(
620        feature: ChatFeature,
621        enabled: PrefEnabled,
622        param: Option<i32>,
623    ) -> Self {
624        Self::RcvChatFeature {
625            feature,
626            enabled,
627            param,
628            undocumented: Default::default(),
629        }
630    }
631
632    pub fn snd_chat_feature(
633        feature: ChatFeature,
634        enabled: PrefEnabled,
635        param: Option<i32>,
636    ) -> Self {
637        Self::SndChatFeature {
638            feature,
639            enabled,
640            param,
641            undocumented: Default::default(),
642        }
643    }
644
645    pub fn rcv_chat_preference(
646        feature: ChatFeature,
647        allowed: FeatureAllowed,
648        param: Option<i32>,
649    ) -> Self {
650        Self::RcvChatPreference {
651            feature,
652            allowed,
653            param,
654            undocumented: Default::default(),
655        }
656    }
657
658    pub fn snd_chat_preference(
659        feature: ChatFeature,
660        allowed: FeatureAllowed,
661        param: Option<i32>,
662    ) -> Self {
663        Self::SndChatPreference {
664            feature,
665            allowed,
666            param,
667            undocumented: Default::default(),
668        }
669    }
670
671    pub fn rcv_group_feature(
672        group_feature: GroupFeature,
673        preference: GroupPreference,
674        param: Option<i32>,
675        member_role: Option<GroupMemberRole>,
676    ) -> Self {
677        Self::RcvGroupFeature {
678            group_feature,
679            preference,
680            param,
681            member_role,
682            undocumented: Default::default(),
683        }
684    }
685
686    pub fn snd_group_feature(
687        group_feature: GroupFeature,
688        preference: GroupPreference,
689        param: Option<i32>,
690        member_role: Option<GroupMemberRole>,
691    ) -> Self {
692        Self::SndGroupFeature {
693            group_feature,
694            preference,
695            param,
696            member_role,
697            undocumented: Default::default(),
698        }
699    }
700
701    pub fn rcv_chat_feature_rejected(feature: ChatFeature) -> Self {
702        Self::RcvChatFeatureRejected {
703            feature,
704            undocumented: Default::default(),
705        }
706    }
707
708    pub fn rcv_group_feature_rejected(group_feature: GroupFeature) -> Self {
709        Self::RcvGroupFeatureRejected {
710            group_feature,
711            undocumented: Default::default(),
712        }
713    }
714
715    pub fn snd_moderated() -> Self {
716        Self::SndModerated
717    }
718
719    pub fn rcv_moderated() -> Self {
720        Self::RcvModerated
721    }
722
723    pub fn rcv_blocked() -> Self {
724        Self::RcvBlocked
725    }
726
727    pub fn snd_direct_e_2_ee_info(e_2_ee_info: E2EInfo) -> Self {
728        Self::SndDirectE2EeInfo {
729            e_2_ee_info,
730            undocumented: Default::default(),
731        }
732    }
733
734    pub fn rcv_direct_e_2_ee_info(e_2_ee_info: E2EInfo) -> Self {
735        Self::RcvDirectE2EeInfo {
736            e_2_ee_info,
737            undocumented: Default::default(),
738        }
739    }
740
741    pub fn snd_group_e_2_ee_info(e_2_ee_info: E2EInfo) -> Self {
742        Self::SndGroupE2EeInfo {
743            e_2_ee_info,
744            undocumented: Default::default(),
745        }
746    }
747
748    pub fn rcv_group_e_2_ee_info(e_2_ee_info: E2EInfo) -> Self {
749        Self::RcvGroupE2EeInfo {
750            e_2_ee_info,
751            undocumented: Default::default(),
752        }
753    }
754
755    pub fn chat_banner() -> Self {
756        Self::ChatBanner
757    }
758}
759
760#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
761#[non_exhaustive]
762pub enum CIDeleteMode {
763    #[default]
764    #[serde(rename = "broadcast")]
765    Broadcast,
766    #[serde(rename = "internal")]
767    Internal,
768    #[serde(rename = "internalMark")]
769    InternalMark,
770}
771
772#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
773#[serde(tag = "type")]
774#[non_exhaustive]
775pub enum CIDeleted {
776    #[serde(rename = "deleted")]
777    Deleted {
778        #[serde(rename = "deletedTs", skip_serializing_if = "Option::is_none")]
779        deleted_ts: Option<UtcTime>,
780
781        #[serde(rename = "chatType")]
782        chat_type: ChatType,
783
784        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
785        undocumented: JsonObject,
786    },
787    #[serde(rename = "blocked")]
788    Blocked {
789        #[serde(rename = "deletedTs", skip_serializing_if = "Option::is_none")]
790        deleted_ts: Option<UtcTime>,
791
792        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
793        undocumented: JsonObject,
794    },
795    #[serde(rename = "blockedByAdmin")]
796    BlockedByAdmin {
797        #[serde(rename = "deletedTs", skip_serializing_if = "Option::is_none")]
798        deleted_ts: Option<UtcTime>,
799
800        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
801        undocumented: JsonObject,
802    },
803    #[serde(rename = "moderated")]
804    Moderated {
805        #[serde(rename = "deletedTs", skip_serializing_if = "Option::is_none")]
806        deleted_ts: Option<UtcTime>,
807
808        #[serde(rename = "byGroupMember")]
809        by_group_member: GroupMember,
810
811        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
812        undocumented: JsonObject,
813    },
814    #[serde(untagged)]
815    Undocumented(JsonObject),
816}
817
818impl CIDeleted {
819    pub fn deleted(deleted_ts: Option<UtcTime>, chat_type: ChatType) -> Self {
820        Self::Deleted {
821            deleted_ts,
822            chat_type,
823            undocumented: Default::default(),
824        }
825    }
826
827    pub fn blocked(deleted_ts: Option<UtcTime>) -> Self {
828        Self::Blocked {
829            deleted_ts,
830            undocumented: Default::default(),
831        }
832    }
833
834    pub fn blocked_by_admin(deleted_ts: Option<UtcTime>) -> Self {
835        Self::BlockedByAdmin {
836            deleted_ts,
837            undocumented: Default::default(),
838        }
839    }
840
841    pub fn moderated(deleted_ts: Option<UtcTime>, by_group_member: GroupMember) -> Self {
842        Self::Moderated {
843            deleted_ts,
844            by_group_member,
845            undocumented: Default::default(),
846        }
847    }
848}
849
850#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
851#[serde(tag = "type")]
852#[non_exhaustive]
853pub enum CIDirection {
854    #[serde(rename = "directSnd")]
855    DirectSnd,
856    #[serde(rename = "directRcv")]
857    DirectRcv,
858    #[serde(rename = "groupSnd")]
859    GroupSnd,
860    #[serde(rename = "groupRcv")]
861    GroupRcv {
862        #[serde(rename = "groupMember")]
863        group_member: GroupMember,
864
865        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
866        undocumented: JsonObject,
867    },
868    #[serde(rename = "localSnd")]
869    LocalSnd,
870    #[serde(rename = "localRcv")]
871    LocalRcv,
872    #[serde(untagged)]
873    Undocumented(JsonObject),
874}
875
876impl CIDirection {
877    pub fn direct_snd() -> Self {
878        Self::DirectSnd
879    }
880
881    pub fn direct_rcv() -> Self {
882        Self::DirectRcv
883    }
884
885    pub fn group_snd() -> Self {
886        Self::GroupSnd
887    }
888
889    pub fn group_rcv(group_member: GroupMember) -> Self {
890        Self::GroupRcv {
891            group_member,
892            undocumented: Default::default(),
893        }
894    }
895
896    pub fn local_snd() -> Self {
897        Self::LocalSnd
898    }
899
900    pub fn local_rcv() -> Self {
901        Self::LocalRcv
902    }
903}
904
905#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
906#[cfg_attr(feature = "bon", derive(::bon::Builder))]
907#[cfg_attr(feature = "bon", builder(on(String, into)))]
908pub struct CIFile {
909    #[serde(rename = "fileId", deserialize_with = "deserialize_number_from_string")]
910    pub file_id: i64,
911
912    #[serde(rename = "fileName")]
913    pub file_name: String,
914
915    #[serde(
916        rename = "fileSize",
917        deserialize_with = "deserialize_number_from_string"
918    )]
919    pub file_size: i64,
920
921    #[serde(rename = "fileSource", skip_serializing_if = "Option::is_none")]
922    pub file_source: Option<CryptoFile>,
923
924    #[serde(rename = "fileStatus")]
925    pub file_status: CIFileStatus,
926
927    #[serde(rename = "fileProtocol")]
928    pub file_protocol: FileProtocol,
929
930    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
931    #[cfg_attr(feature = "bon", builder(default))]
932    pub undocumented: JsonObject,
933}
934
935#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
936#[serde(tag = "type")]
937#[non_exhaustive]
938pub enum CIFileStatus {
939    #[serde(rename = "sndStored")]
940    SndStored,
941    #[serde(rename = "sndTransfer")]
942    SndTransfer {
943        #[serde(
944            rename = "sndProgress",
945            deserialize_with = "deserialize_number_from_string"
946        )]
947        snd_progress: i64,
948
949        #[serde(
950            rename = "sndTotal",
951            deserialize_with = "deserialize_number_from_string"
952        )]
953        snd_total: i64,
954
955        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
956        undocumented: JsonObject,
957    },
958    #[serde(rename = "sndCancelled")]
959    SndCancelled,
960    #[serde(rename = "sndComplete")]
961    SndComplete,
962    #[serde(rename = "sndError")]
963    SndError {
964        #[serde(rename = "sndFileError")]
965        snd_file_error: FileError,
966
967        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
968        undocumented: JsonObject,
969    },
970    #[serde(rename = "sndWarning")]
971    SndWarning {
972        #[serde(rename = "sndFileError")]
973        snd_file_error: FileError,
974
975        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
976        undocumented: JsonObject,
977    },
978    #[serde(rename = "rcvInvitation")]
979    RcvInvitation,
980    #[serde(rename = "rcvAccepted")]
981    RcvAccepted,
982    #[serde(rename = "rcvTransfer")]
983    RcvTransfer {
984        #[serde(
985            rename = "rcvProgress",
986            deserialize_with = "deserialize_number_from_string"
987        )]
988        rcv_progress: i64,
989
990        #[serde(
991            rename = "rcvTotal",
992            deserialize_with = "deserialize_number_from_string"
993        )]
994        rcv_total: i64,
995
996        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
997        undocumented: JsonObject,
998    },
999    #[serde(rename = "rcvAborted")]
1000    RcvAborted,
1001    #[serde(rename = "rcvComplete")]
1002    RcvComplete,
1003    #[serde(rename = "rcvCancelled")]
1004    RcvCancelled,
1005    #[serde(rename = "rcvError")]
1006    RcvError {
1007        #[serde(rename = "rcvFileError")]
1008        rcv_file_error: FileError,
1009
1010        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1011        undocumented: JsonObject,
1012    },
1013    #[serde(rename = "rcvWarning")]
1014    RcvWarning {
1015        #[serde(rename = "rcvFileError")]
1016        rcv_file_error: FileError,
1017
1018        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1019        undocumented: JsonObject,
1020    },
1021    #[serde(rename = "invalid")]
1022    Invalid {
1023        #[serde(rename = "text")]
1024        text: String,
1025
1026        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1027        undocumented: JsonObject,
1028    },
1029    #[serde(untagged)]
1030    Undocumented(JsonObject),
1031}
1032
1033impl CIFileStatus {
1034    pub fn snd_stored() -> Self {
1035        Self::SndStored
1036    }
1037
1038    pub fn snd_transfer(snd_progress: i64, snd_total: i64) -> Self {
1039        Self::SndTransfer {
1040            snd_progress,
1041            snd_total,
1042            undocumented: Default::default(),
1043        }
1044    }
1045
1046    pub fn snd_cancelled() -> Self {
1047        Self::SndCancelled
1048    }
1049
1050    pub fn snd_complete() -> Self {
1051        Self::SndComplete
1052    }
1053
1054    pub fn snd_error(snd_file_error: FileError) -> Self {
1055        Self::SndError {
1056            snd_file_error,
1057            undocumented: Default::default(),
1058        }
1059    }
1060
1061    pub fn snd_warning(snd_file_error: FileError) -> Self {
1062        Self::SndWarning {
1063            snd_file_error,
1064            undocumented: Default::default(),
1065        }
1066    }
1067
1068    pub fn rcv_invitation() -> Self {
1069        Self::RcvInvitation
1070    }
1071
1072    pub fn rcv_accepted() -> Self {
1073        Self::RcvAccepted
1074    }
1075
1076    pub fn rcv_transfer(rcv_progress: i64, rcv_total: i64) -> Self {
1077        Self::RcvTransfer {
1078            rcv_progress,
1079            rcv_total,
1080            undocumented: Default::default(),
1081        }
1082    }
1083
1084    pub fn rcv_aborted() -> Self {
1085        Self::RcvAborted
1086    }
1087
1088    pub fn rcv_complete() -> Self {
1089        Self::RcvComplete
1090    }
1091
1092    pub fn rcv_cancelled() -> Self {
1093        Self::RcvCancelled
1094    }
1095
1096    pub fn rcv_error(rcv_file_error: FileError) -> Self {
1097        Self::RcvError {
1098            rcv_file_error,
1099            undocumented: Default::default(),
1100        }
1101    }
1102
1103    pub fn rcv_warning(rcv_file_error: FileError) -> Self {
1104        Self::RcvWarning {
1105            rcv_file_error,
1106            undocumented: Default::default(),
1107        }
1108    }
1109
1110    pub fn invalid(text: String) -> Self {
1111        Self::Invalid {
1112            text,
1113            undocumented: Default::default(),
1114        }
1115    }
1116}
1117
1118#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1119#[serde(tag = "type")]
1120#[non_exhaustive]
1121pub enum CIForwardedFrom {
1122    #[serde(rename = "unknown")]
1123    Unknown,
1124    #[serde(rename = "contact")]
1125    Contact {
1126        #[serde(rename = "chatName")]
1127        chat_name: String,
1128
1129        #[serde(rename = "msgDir")]
1130        msg_dir: MsgDirection,
1131
1132        #[serde(
1133            rename = "contactId",
1134            skip_serializing_if = "Option::is_none",
1135            deserialize_with = "deserialize_option_number_from_string",
1136            default
1137        )]
1138        contact_id: Option<i64>,
1139
1140        #[serde(
1141            rename = "chatItemId",
1142            skip_serializing_if = "Option::is_none",
1143            deserialize_with = "deserialize_option_number_from_string",
1144            default
1145        )]
1146        chat_item_id: Option<i64>,
1147
1148        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1149        undocumented: JsonObject,
1150    },
1151    #[serde(rename = "group")]
1152    Group {
1153        #[serde(rename = "chatName")]
1154        chat_name: String,
1155
1156        #[serde(rename = "msgDir")]
1157        msg_dir: MsgDirection,
1158
1159        #[serde(
1160            rename = "groupId",
1161            skip_serializing_if = "Option::is_none",
1162            deserialize_with = "deserialize_option_number_from_string",
1163            default
1164        )]
1165        group_id: Option<i64>,
1166
1167        #[serde(
1168            rename = "chatItemId",
1169            skip_serializing_if = "Option::is_none",
1170            deserialize_with = "deserialize_option_number_from_string",
1171            default
1172        )]
1173        chat_item_id: Option<i64>,
1174
1175        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1176        undocumented: JsonObject,
1177    },
1178    #[serde(untagged)]
1179    Undocumented(JsonObject),
1180}
1181
1182impl CIForwardedFrom {
1183    pub fn unknown() -> Self {
1184        Self::Unknown
1185    }
1186
1187    pub fn contact(
1188        chat_name: String,
1189        msg_dir: MsgDirection,
1190        contact_id: Option<i64>,
1191        chat_item_id: Option<i64>,
1192    ) -> Self {
1193        Self::Contact {
1194            chat_name,
1195            msg_dir,
1196            contact_id,
1197            chat_item_id,
1198            undocumented: Default::default(),
1199        }
1200    }
1201
1202    pub fn group(
1203        chat_name: String,
1204        msg_dir: MsgDirection,
1205        group_id: Option<i64>,
1206        chat_item_id: Option<i64>,
1207    ) -> Self {
1208        Self::Group {
1209            chat_name,
1210            msg_dir,
1211            group_id,
1212            chat_item_id,
1213            undocumented: Default::default(),
1214        }
1215    }
1216}
1217
1218#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1219#[cfg_attr(feature = "bon", derive(::bon::Builder))]
1220#[cfg_attr(feature = "bon", builder(on(String, into)))]
1221pub struct CIGroupInvitation {
1222    #[serde(
1223        rename = "groupId",
1224        deserialize_with = "deserialize_number_from_string"
1225    )]
1226    pub group_id: i64,
1227
1228    #[serde(
1229        rename = "groupMemberId",
1230        deserialize_with = "deserialize_number_from_string"
1231    )]
1232    pub group_member_id: i64,
1233
1234    #[serde(rename = "localDisplayName")]
1235    pub local_display_name: String,
1236
1237    #[serde(rename = "groupProfile")]
1238    pub group_profile: GroupProfile,
1239
1240    #[serde(rename = "status")]
1241    pub status: CIGroupInvitationStatus,
1242
1243    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1244    #[cfg_attr(feature = "bon", builder(default))]
1245    pub undocumented: JsonObject,
1246}
1247
1248#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
1249#[non_exhaustive]
1250pub enum CIGroupInvitationStatus {
1251    #[default]
1252    #[serde(rename = "pending")]
1253    Pending,
1254    #[serde(rename = "accepted")]
1255    Accepted,
1256    #[serde(rename = "rejected")]
1257    Rejected,
1258    #[serde(rename = "expired")]
1259    Expired,
1260}
1261
1262#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1263#[cfg_attr(feature = "bon", derive(::bon::Builder))]
1264#[cfg_attr(feature = "bon", builder(on(String, into)))]
1265pub struct CIMention {
1266    #[serde(rename = "memberId")]
1267    pub member_id: String,
1268
1269    #[serde(rename = "memberRef", skip_serializing_if = "Option::is_none")]
1270    pub member_ref: Option<CIMentionMember>,
1271
1272    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1273    #[cfg_attr(feature = "bon", builder(default))]
1274    pub undocumented: JsonObject,
1275}
1276
1277#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1278#[cfg_attr(feature = "bon", derive(::bon::Builder))]
1279#[cfg_attr(feature = "bon", builder(on(String, into)))]
1280pub struct CIMentionMember {
1281    #[serde(
1282        rename = "groupMemberId",
1283        deserialize_with = "deserialize_number_from_string"
1284    )]
1285    pub group_member_id: i64,
1286
1287    #[serde(rename = "displayName")]
1288    pub display_name: String,
1289
1290    #[serde(rename = "localAlias", skip_serializing_if = "Option::is_none")]
1291    pub local_alias: Option<String>,
1292
1293    #[serde(rename = "memberRole")]
1294    pub member_role: GroupMemberRole,
1295
1296    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1297    #[cfg_attr(feature = "bon", builder(default))]
1298    pub undocumented: JsonObject,
1299}
1300
1301#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1302#[cfg_attr(feature = "bon", derive(::bon::Builder))]
1303#[cfg_attr(feature = "bon", builder(on(String, into)))]
1304pub struct CIMeta {
1305    #[serde(rename = "itemId", deserialize_with = "deserialize_number_from_string")]
1306    pub item_id: i64,
1307
1308    #[serde(rename = "itemTs")]
1309    pub item_ts: UtcTime,
1310
1311    #[serde(rename = "itemText")]
1312    pub item_text: String,
1313
1314    #[serde(rename = "itemStatus")]
1315    pub item_status: CIStatus,
1316
1317    #[serde(rename = "sentViaProxy", skip_serializing_if = "Option::is_none")]
1318    pub sent_via_proxy: Option<bool>,
1319
1320    #[serde(rename = "itemSharedMsgId", skip_serializing_if = "Option::is_none")]
1321    pub item_shared_msg_id: Option<String>,
1322
1323    #[serde(rename = "itemForwarded", skip_serializing_if = "Option::is_none")]
1324    pub item_forwarded: Option<CIForwardedFrom>,
1325
1326    #[serde(rename = "itemDeleted", skip_serializing_if = "Option::is_none")]
1327    pub item_deleted: Option<CIDeleted>,
1328
1329    #[serde(rename = "itemEdited")]
1330    pub item_edited: bool,
1331
1332    #[serde(rename = "itemTimed", skip_serializing_if = "Option::is_none")]
1333    pub item_timed: Option<CITimed>,
1334
1335    #[serde(rename = "itemLive", skip_serializing_if = "Option::is_none")]
1336    pub item_live: Option<bool>,
1337
1338    #[serde(rename = "userMention")]
1339    pub user_mention: bool,
1340
1341    #[serde(rename = "deletable")]
1342    pub deletable: bool,
1343
1344    #[serde(rename = "editable")]
1345    pub editable: bool,
1346
1347    #[serde(
1348        rename = "forwardedByMember",
1349        skip_serializing_if = "Option::is_none",
1350        deserialize_with = "deserialize_option_number_from_string",
1351        default
1352    )]
1353    pub forwarded_by_member: Option<i64>,
1354
1355    #[serde(rename = "showGroupAsSender")]
1356    pub show_group_as_sender: bool,
1357
1358    #[serde(rename = "createdAt")]
1359    pub created_at: UtcTime,
1360
1361    #[serde(rename = "updatedAt")]
1362    pub updated_at: UtcTime,
1363
1364    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1365    #[cfg_attr(feature = "bon", builder(default))]
1366    pub undocumented: JsonObject,
1367}
1368
1369#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1370#[cfg_attr(feature = "bon", derive(::bon::Builder))]
1371#[cfg_attr(feature = "bon", builder(on(String, into)))]
1372pub struct CIQuote {
1373    #[serde(rename = "chatDir", skip_serializing_if = "Option::is_none")]
1374    pub chat_dir: Option<CIDirection>,
1375
1376    #[serde(
1377        rename = "itemId",
1378        skip_serializing_if = "Option::is_none",
1379        deserialize_with = "deserialize_option_number_from_string",
1380        default
1381    )]
1382    pub item_id: Option<i64>,
1383
1384    #[serde(rename = "sharedMsgId", skip_serializing_if = "Option::is_none")]
1385    pub shared_msg_id: Option<String>,
1386
1387    #[serde(rename = "sentAt")]
1388    pub sent_at: UtcTime,
1389
1390    #[serde(rename = "content")]
1391    pub content: MsgContent,
1392
1393    #[serde(rename = "formattedText", skip_serializing_if = "Option::is_none")]
1394    pub formatted_text: Option<Vec<FormattedText>>,
1395
1396    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1397    #[cfg_attr(feature = "bon", builder(default))]
1398    pub undocumented: JsonObject,
1399}
1400
1401#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1402#[cfg_attr(feature = "bon", derive(::bon::Builder))]
1403#[cfg_attr(feature = "bon", builder(on(String, into)))]
1404pub struct CIReaction {
1405    #[serde(rename = "chatDir")]
1406    pub chat_dir: CIDirection,
1407
1408    #[serde(rename = "chatItem")]
1409    pub chat_item: ChatItem,
1410
1411    #[serde(rename = "sentAt")]
1412    pub sent_at: UtcTime,
1413
1414    #[serde(rename = "reaction")]
1415    pub reaction: MsgReaction,
1416
1417    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1418    #[cfg_attr(feature = "bon", builder(default))]
1419    pub undocumented: JsonObject,
1420}
1421
1422#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1423#[cfg_attr(feature = "bon", derive(::bon::Builder))]
1424#[cfg_attr(feature = "bon", builder(on(String, into)))]
1425pub struct CIReactionCount {
1426    #[serde(rename = "reaction")]
1427    pub reaction: MsgReaction,
1428
1429    #[serde(rename = "userReacted")]
1430    pub user_reacted: bool,
1431
1432    #[serde(
1433        rename = "totalReacted",
1434        deserialize_with = "deserialize_number_from_string"
1435    )]
1436    pub total_reacted: i32,
1437
1438    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1439    #[cfg_attr(feature = "bon", builder(default))]
1440    pub undocumented: JsonObject,
1441}
1442
1443#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1444#[serde(tag = "type")]
1445#[non_exhaustive]
1446pub enum CIStatus {
1447    #[serde(rename = "sndNew")]
1448    SndNew,
1449    #[serde(rename = "sndSent")]
1450    SndSent {
1451        #[serde(rename = "sndProgress")]
1452        snd_progress: SndCIStatusProgress,
1453
1454        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1455        undocumented: JsonObject,
1456    },
1457    #[serde(rename = "sndRcvd")]
1458    SndRcvd {
1459        #[serde(rename = "msgRcptStatus")]
1460        msg_rcpt_status: MsgReceiptStatus,
1461
1462        #[serde(rename = "sndProgress")]
1463        snd_progress: SndCIStatusProgress,
1464
1465        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1466        undocumented: JsonObject,
1467    },
1468    #[serde(rename = "sndErrorAuth")]
1469    SndErrorAuth,
1470    #[serde(rename = "sndError")]
1471    SndError {
1472        #[serde(rename = "agentError")]
1473        agent_error: SndError,
1474
1475        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1476        undocumented: JsonObject,
1477    },
1478    #[serde(rename = "sndWarning")]
1479    SndWarning {
1480        #[serde(rename = "agentError")]
1481        agent_error: SndError,
1482
1483        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1484        undocumented: JsonObject,
1485    },
1486    #[serde(rename = "rcvNew")]
1487    RcvNew,
1488    #[serde(rename = "rcvRead")]
1489    RcvRead,
1490    #[serde(rename = "invalid")]
1491    Invalid {
1492        #[serde(rename = "text")]
1493        text: String,
1494
1495        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1496        undocumented: JsonObject,
1497    },
1498    #[serde(untagged)]
1499    Undocumented(JsonObject),
1500}
1501
1502impl CIStatus {
1503    pub fn snd_new() -> Self {
1504        Self::SndNew
1505    }
1506
1507    pub fn snd_sent(snd_progress: SndCIStatusProgress) -> Self {
1508        Self::SndSent {
1509            snd_progress,
1510            undocumented: Default::default(),
1511        }
1512    }
1513
1514    pub fn snd_rcvd(msg_rcpt_status: MsgReceiptStatus, snd_progress: SndCIStatusProgress) -> Self {
1515        Self::SndRcvd {
1516            msg_rcpt_status,
1517            snd_progress,
1518            undocumented: Default::default(),
1519        }
1520    }
1521
1522    pub fn snd_error_auth() -> Self {
1523        Self::SndErrorAuth
1524    }
1525
1526    pub fn snd_error(agent_error: SndError) -> Self {
1527        Self::SndError {
1528            agent_error,
1529            undocumented: Default::default(),
1530        }
1531    }
1532
1533    pub fn snd_warning(agent_error: SndError) -> Self {
1534        Self::SndWarning {
1535            agent_error,
1536            undocumented: Default::default(),
1537        }
1538    }
1539
1540    pub fn rcv_new() -> Self {
1541        Self::RcvNew
1542    }
1543
1544    pub fn rcv_read() -> Self {
1545        Self::RcvRead
1546    }
1547
1548    pub fn invalid(text: String) -> Self {
1549        Self::Invalid {
1550            text,
1551            undocumented: Default::default(),
1552        }
1553    }
1554}
1555
1556#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1557#[cfg_attr(feature = "bon", derive(::bon::Builder))]
1558#[cfg_attr(feature = "bon", builder(on(String, into)))]
1559pub struct CITimed {
1560    #[serde(rename = "ttl", deserialize_with = "deserialize_number_from_string")]
1561    pub ttl: i32,
1562
1563    #[serde(rename = "deleteAt", skip_serializing_if = "Option::is_none")]
1564    pub delete_at: Option<UtcTime>,
1565
1566    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1567    #[cfg_attr(feature = "bon", builder(default))]
1568    pub undocumented: JsonObject,
1569}
1570
1571#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1572#[serde(tag = "type")]
1573#[non_exhaustive]
1574pub enum ChatBotCommand {
1575    #[serde(rename = "command")]
1576    Command {
1577        #[serde(rename = "keyword")]
1578        keyword: String,
1579
1580        #[serde(rename = "label")]
1581        label: String,
1582
1583        #[serde(rename = "params", skip_serializing_if = "Option::is_none")]
1584        params: Option<String>,
1585
1586        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1587        undocumented: JsonObject,
1588    },
1589    #[serde(rename = "menu")]
1590    Menu {
1591        #[serde(rename = "label")]
1592        label: String,
1593
1594        #[serde(rename = "commands")]
1595        commands: Vec<ChatBotCommand>,
1596
1597        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1598        undocumented: JsonObject,
1599    },
1600    #[serde(untagged)]
1601    Undocumented(JsonObject),
1602}
1603
1604impl ChatBotCommand {
1605    pub fn command(keyword: String, label: String, params: Option<String>) -> Self {
1606        Self::Command {
1607            keyword,
1608            label,
1609            params,
1610            undocumented: Default::default(),
1611        }
1612    }
1613
1614    pub fn menu(label: String, commands: Vec<ChatBotCommand>) -> Self {
1615        Self::Menu {
1616            label,
1617            commands,
1618            undocumented: Default::default(),
1619        }
1620    }
1621}
1622
1623/// *Syntax:*
1624///
1625/// ```
1626/// full|entity|messages[ notify=off]
1627/// ```
1628#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1629#[serde(tag = "type")]
1630#[non_exhaustive]
1631pub enum ChatDeleteMode {
1632    #[serde(rename = "full")]
1633    Full {
1634        #[serde(rename = "notify")]
1635        notify: bool,
1636
1637        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1638        undocumented: JsonObject,
1639    },
1640    #[serde(rename = "entity")]
1641    Entity {
1642        #[serde(rename = "notify")]
1643        notify: bool,
1644
1645        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1646        undocumented: JsonObject,
1647    },
1648    #[serde(rename = "messages")]
1649    Messages,
1650    #[serde(untagged)]
1651    Undocumented(JsonObject),
1652}
1653
1654impl CommandSyntax for ChatDeleteMode {
1655    const COMMAND_BUF_SIZE: usize = 64;
1656
1657    fn append_command_syntax(&self, buf: &mut String) {
1658        match self {
1659            Self::Full { notify, .. } => {
1660                buf.push_str("full");
1661                if !notify {
1662                    buf.push_str(" notify=off");
1663                }
1664            }
1665            Self::Entity { notify, .. } => {
1666                buf.push_str("entity");
1667                if !notify {
1668                    buf.push_str(" notify=off");
1669                }
1670            }
1671            Self::Messages | Self::Undocumented(_) => {}
1672        }
1673    }
1674}
1675
1676impl ChatDeleteMode {
1677    pub fn full(notify: bool) -> Self {
1678        Self::Full {
1679            notify,
1680            undocumented: Default::default(),
1681        }
1682    }
1683
1684    pub fn entity(notify: bool) -> Self {
1685        Self::Entity {
1686            notify,
1687            undocumented: Default::default(),
1688        }
1689    }
1690
1691    pub fn messages() -> Self {
1692        Self::Messages
1693    }
1694}
1695
1696#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
1697#[non_exhaustive]
1698pub enum ChatFeature {
1699    #[default]
1700    #[serde(rename = "timedMessages")]
1701    TimedMessages,
1702    #[serde(rename = "fullDelete")]
1703    FullDelete,
1704    #[serde(rename = "reactions")]
1705    Reactions,
1706    #[serde(rename = "voice")]
1707    Voice,
1708    #[serde(rename = "files")]
1709    Files,
1710    #[serde(rename = "calls")]
1711    Calls,
1712    #[serde(rename = "sessions")]
1713    Sessions,
1714}
1715
1716#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1717#[serde(tag = "type")]
1718#[non_exhaustive]
1719pub enum ChatInfo {
1720    #[serde(rename = "direct")]
1721    Direct {
1722        #[serde(rename = "contact")]
1723        contact: Contact,
1724
1725        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1726        undocumented: JsonObject,
1727    },
1728    #[serde(rename = "group")]
1729    Group {
1730        #[serde(rename = "groupInfo")]
1731        group_info: GroupInfo,
1732
1733        #[serde(rename = "groupChatScope", skip_serializing_if = "Option::is_none")]
1734        group_chat_scope: Option<GroupChatScopeInfo>,
1735
1736        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1737        undocumented: JsonObject,
1738    },
1739    #[serde(rename = "local")]
1740    Local {
1741        #[serde(rename = "noteFolder")]
1742        note_folder: NoteFolder,
1743
1744        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1745        undocumented: JsonObject,
1746    },
1747    #[serde(rename = "contactRequest")]
1748    ContactRequest {
1749        #[serde(rename = "contactRequest")]
1750        contact_request: UserContactRequest,
1751
1752        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1753        undocumented: JsonObject,
1754    },
1755    #[serde(rename = "contactConnection")]
1756    ContactConnection {
1757        #[serde(rename = "contactConnection")]
1758        contact_connection: PendingContactConnection,
1759
1760        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1761        undocumented: JsonObject,
1762    },
1763    #[serde(untagged)]
1764    Undocumented(JsonObject),
1765}
1766
1767impl ChatInfo {
1768    pub fn direct(contact: Contact) -> Self {
1769        Self::Direct {
1770            contact,
1771            undocumented: Default::default(),
1772        }
1773    }
1774
1775    pub fn group(group_info: GroupInfo, group_chat_scope: Option<GroupChatScopeInfo>) -> Self {
1776        Self::Group {
1777            group_info,
1778            group_chat_scope,
1779            undocumented: Default::default(),
1780        }
1781    }
1782
1783    pub fn local(note_folder: NoteFolder) -> Self {
1784        Self::Local {
1785            note_folder,
1786            undocumented: Default::default(),
1787        }
1788    }
1789
1790    pub fn contact_request(contact_request: UserContactRequest) -> Self {
1791        Self::ContactRequest {
1792            contact_request,
1793            undocumented: Default::default(),
1794        }
1795    }
1796
1797    pub fn contact_connection(contact_connection: PendingContactConnection) -> Self {
1798        Self::ContactConnection {
1799            contact_connection,
1800            undocumented: Default::default(),
1801        }
1802    }
1803}
1804
1805#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1806#[cfg_attr(feature = "bon", derive(::bon::Builder))]
1807#[cfg_attr(feature = "bon", builder(on(String, into)))]
1808pub struct ChatItem {
1809    #[serde(rename = "chatDir")]
1810    pub chat_dir: CIDirection,
1811
1812    #[serde(rename = "meta")]
1813    pub meta: CIMeta,
1814
1815    #[serde(rename = "content")]
1816    pub content: CIContent,
1817
1818    #[serde(rename = "mentions")]
1819    pub mentions: BTreeMap<String, CIMention>,
1820
1821    #[serde(rename = "formattedText", skip_serializing_if = "Option::is_none")]
1822    pub formatted_text: Option<Vec<FormattedText>>,
1823
1824    #[serde(rename = "quotedItem", skip_serializing_if = "Option::is_none")]
1825    pub quoted_item: Option<CIQuote>,
1826
1827    #[serde(rename = "reactions")]
1828    pub reactions: Vec<CIReactionCount>,
1829
1830    #[serde(rename = "file", skip_serializing_if = "Option::is_none")]
1831    pub file: Option<CIFile>,
1832
1833    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1834    #[cfg_attr(feature = "bon", builder(default))]
1835    pub undocumented: JsonObject,
1836}
1837
1838/// Message deletion result.
1839#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1840#[cfg_attr(feature = "bon", derive(::bon::Builder))]
1841#[cfg_attr(feature = "bon", builder(on(String, into)))]
1842pub struct ChatItemDeletion {
1843    #[serde(rename = "deletedChatItem")]
1844    pub deleted_chat_item: AChatItem,
1845
1846    #[serde(rename = "toChatItem", skip_serializing_if = "Option::is_none")]
1847    pub to_chat_item: Option<AChatItem>,
1848
1849    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1850    #[cfg_attr(feature = "bon", builder(default))]
1851    pub undocumented: JsonObject,
1852}
1853
1854#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
1855#[non_exhaustive]
1856pub enum ChatPeerType {
1857    #[default]
1858    #[serde(rename = "human")]
1859    Human,
1860    #[serde(rename = "bot")]
1861    Bot,
1862}
1863
1864/// Used in API commands. Chat scope can only be passed with groups.
1865///
1866/// *Syntax:*
1867///
1868/// ```
1869/// <str(chatType)><chatId>[<str(chatScope)>]
1870/// ```
1871#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1872#[cfg_attr(feature = "bon", derive(::bon::Builder))]
1873#[cfg_attr(feature = "bon", builder(on(String, into)))]
1874pub struct ChatRef {
1875    #[serde(rename = "chatType")]
1876    pub chat_type: ChatType,
1877
1878    #[serde(rename = "chatId", deserialize_with = "deserialize_number_from_string")]
1879    pub chat_id: i64,
1880
1881    #[serde(rename = "chatScope", skip_serializing_if = "Option::is_none")]
1882    pub chat_scope: Option<GroupChatScope>,
1883
1884    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1885    #[cfg_attr(feature = "bon", builder(default))]
1886    pub undocumented: JsonObject,
1887}
1888
1889impl CommandSyntax for ChatRef {
1890    const COMMAND_BUF_SIZE: usize = 256;
1891
1892    fn append_command_syntax(&self, buf: &mut String) {
1893        self.chat_type.append_command_syntax(buf);
1894        write!(buf, "{}", self.chat_id).unwrap();
1895        if let Some(chat_scope) = &self.chat_scope {
1896            chat_scope.append_command_syntax(buf);
1897        }
1898    }
1899}
1900
1901#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1902#[cfg_attr(feature = "bon", derive(::bon::Builder))]
1903#[cfg_attr(feature = "bon", builder(on(String, into)))]
1904pub struct ChatSettings {
1905    #[serde(rename = "enableNtfs")]
1906    pub enable_ntfs: MsgFilter,
1907
1908    #[serde(rename = "sendRcpts", skip_serializing_if = "Option::is_none")]
1909    pub send_rcpts: Option<bool>,
1910
1911    #[serde(rename = "favorite")]
1912    pub favorite: bool,
1913
1914    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1915    #[cfg_attr(feature = "bon", builder(default))]
1916    pub undocumented: JsonObject,
1917}
1918
1919#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1920#[cfg_attr(feature = "bon", derive(::bon::Builder))]
1921#[cfg_attr(feature = "bon", builder(on(String, into)))]
1922pub struct ChatStats {
1923    #[serde(
1924        rename = "unreadCount",
1925        deserialize_with = "deserialize_number_from_string"
1926    )]
1927    pub unread_count: i32,
1928
1929    #[serde(
1930        rename = "unreadMentions",
1931        deserialize_with = "deserialize_number_from_string"
1932    )]
1933    pub unread_mentions: i32,
1934
1935    #[serde(
1936        rename = "reportsCount",
1937        deserialize_with = "deserialize_number_from_string"
1938    )]
1939    pub reports_count: i32,
1940
1941    #[serde(
1942        rename = "minUnreadItemId",
1943        deserialize_with = "deserialize_number_from_string"
1944    )]
1945    pub min_unread_item_id: i64,
1946
1947    #[serde(rename = "unreadChat")]
1948    pub unread_chat: bool,
1949
1950    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
1951    #[cfg_attr(feature = "bon", builder(default))]
1952    pub undocumented: JsonObject,
1953}
1954
1955/// *Syntax:*
1956///
1957/// ```
1958/// @|#|*|
1959/// ```
1960#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
1961#[non_exhaustive]
1962pub enum ChatType {
1963    #[default]
1964    #[serde(rename = "direct")]
1965    Direct,
1966    #[serde(rename = "group")]
1967    Group,
1968    #[serde(rename = "local")]
1969    Local,
1970}
1971
1972impl CommandSyntax for ChatType {
1973    const COMMAND_BUF_SIZE: usize = 16;
1974
1975    fn append_command_syntax(&self, buf: &mut String) {
1976        match self {
1977            Self::Direct => {
1978                buf.push('@');
1979            }
1980            Self::Group => {
1981                buf.push('#');
1982            }
1983            Self::Local => {
1984                buf.push('*');
1985            }
1986        }
1987    }
1988}
1989
1990#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1991#[cfg_attr(feature = "bon", derive(::bon::Builder))]
1992#[cfg_attr(feature = "bon", builder(on(String, into)))]
1993pub struct ChatWallpaper {
1994    #[serde(rename = "preset", skip_serializing_if = "Option::is_none")]
1995    pub preset: Option<String>,
1996
1997    #[serde(rename = "imageFile", skip_serializing_if = "Option::is_none")]
1998    pub image_file: Option<String>,
1999
2000    #[serde(rename = "background", skip_serializing_if = "Option::is_none")]
2001    pub background: Option<String>,
2002
2003    #[serde(rename = "tint", skip_serializing_if = "Option::is_none")]
2004    pub tint: Option<String>,
2005
2006    #[serde(rename = "scaleType", skip_serializing_if = "Option::is_none")]
2007    pub scale_type: Option<ChatWallpaperScale>,
2008
2009    #[serde(
2010        rename = "scale",
2011        skip_serializing_if = "Option::is_none",
2012        deserialize_with = "deserialize_option_number_from_string",
2013        default
2014    )]
2015    pub scale: Option<f64>,
2016
2017    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2018    #[cfg_attr(feature = "bon", builder(default))]
2019    pub undocumented: JsonObject,
2020}
2021
2022#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
2023#[non_exhaustive]
2024pub enum ChatWallpaperScale {
2025    #[default]
2026    #[serde(rename = "fill")]
2027    Fill,
2028    #[serde(rename = "fit")]
2029    Fit,
2030    #[serde(rename = "repeat")]
2031    Repeat,
2032}
2033
2034#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
2035#[non_exhaustive]
2036pub enum Color {
2037    #[default]
2038    #[serde(rename = "black")]
2039    Black,
2040    #[serde(rename = "red")]
2041    Red,
2042    #[serde(rename = "green")]
2043    Green,
2044    #[serde(rename = "yellow")]
2045    Yellow,
2046    #[serde(rename = "blue")]
2047    Blue,
2048    #[serde(rename = "magenta")]
2049    Magenta,
2050    #[serde(rename = "cyan")]
2051    Cyan,
2052    #[serde(rename = "white")]
2053    White,
2054}
2055
2056#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2057#[cfg_attr(feature = "bon", derive(::bon::Builder))]
2058#[cfg_attr(feature = "bon", builder(on(String, into)))]
2059pub struct ComposedMessage {
2060    #[serde(rename = "fileSource", skip_serializing_if = "Option::is_none")]
2061    pub file_source: Option<CryptoFile>,
2062
2063    #[serde(
2064        rename = "quotedItemId",
2065        skip_serializing_if = "Option::is_none",
2066        deserialize_with = "deserialize_option_number_from_string",
2067        default
2068    )]
2069    pub quoted_item_id: Option<i64>,
2070
2071    #[serde(rename = "msgContent")]
2072    pub msg_content: MsgContent,
2073
2074    #[serde(rename = "mentions")]
2075    pub mentions: BTreeMap<String, i64>,
2076
2077    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2078    #[cfg_attr(feature = "bon", builder(default))]
2079    pub undocumented: JsonObject,
2080}
2081
2082#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
2083#[non_exhaustive]
2084pub enum ConnStatus {
2085    #[default]
2086    #[serde(rename = "new")]
2087    New,
2088    #[serde(rename = "prepared")]
2089    Prepared,
2090    #[serde(rename = "joined")]
2091    Joined,
2092    #[serde(rename = "requested")]
2093    Requested,
2094    #[serde(rename = "accepted")]
2095    Accepted,
2096    #[serde(rename = "snd-ready")]
2097    SndReady,
2098    #[serde(rename = "ready")]
2099    Ready,
2100    #[serde(rename = "deleted")]
2101    Deleted,
2102}
2103
2104#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
2105#[non_exhaustive]
2106pub enum ConnType {
2107    #[default]
2108    #[serde(rename = "contact")]
2109    Contact,
2110    #[serde(rename = "member")]
2111    Member,
2112    #[serde(rename = "user_contact")]
2113    UserContact,
2114}
2115
2116#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2117#[cfg_attr(feature = "bon", derive(::bon::Builder))]
2118#[cfg_attr(feature = "bon", builder(on(String, into)))]
2119pub struct Connection {
2120    #[serde(rename = "connId", deserialize_with = "deserialize_number_from_string")]
2121    pub conn_id: i64,
2122
2123    #[serde(rename = "agentConnId")]
2124    pub agent_conn_id: String,
2125
2126    #[serde(
2127        rename = "connChatVersion",
2128        deserialize_with = "deserialize_number_from_string"
2129    )]
2130    pub conn_chat_version: i32,
2131
2132    #[serde(rename = "peerChatVRange")]
2133    pub peer_chat_v_range: VersionRange,
2134
2135    #[serde(
2136        rename = "connLevel",
2137        deserialize_with = "deserialize_number_from_string"
2138    )]
2139    pub conn_level: i32,
2140
2141    #[serde(
2142        rename = "viaContact",
2143        skip_serializing_if = "Option::is_none",
2144        deserialize_with = "deserialize_option_number_from_string",
2145        default
2146    )]
2147    pub via_contact: Option<i64>,
2148
2149    #[serde(
2150        rename = "viaUserContactLink",
2151        skip_serializing_if = "Option::is_none",
2152        deserialize_with = "deserialize_option_number_from_string",
2153        default
2154    )]
2155    pub via_user_contact_link: Option<i64>,
2156
2157    #[serde(rename = "viaGroupLink")]
2158    pub via_group_link: bool,
2159
2160    #[serde(rename = "groupLinkId", skip_serializing_if = "Option::is_none")]
2161    pub group_link_id: Option<String>,
2162
2163    #[serde(rename = "xContactId", skip_serializing_if = "Option::is_none")]
2164    pub x_contact_id: Option<String>,
2165
2166    #[serde(
2167        rename = "customUserProfileId",
2168        skip_serializing_if = "Option::is_none",
2169        deserialize_with = "deserialize_option_number_from_string",
2170        default
2171    )]
2172    pub custom_user_profile_id: Option<i64>,
2173
2174    #[serde(rename = "connType")]
2175    pub conn_type: ConnType,
2176
2177    #[serde(rename = "connStatus")]
2178    pub conn_status: ConnStatus,
2179
2180    #[serde(rename = "contactConnInitiated")]
2181    pub contact_conn_initiated: bool,
2182
2183    #[serde(rename = "localAlias")]
2184    pub local_alias: String,
2185
2186    #[serde(
2187        rename = "entityId",
2188        skip_serializing_if = "Option::is_none",
2189        deserialize_with = "deserialize_option_number_from_string",
2190        default
2191    )]
2192    pub entity_id: Option<i64>,
2193
2194    #[serde(rename = "connectionCode", skip_serializing_if = "Option::is_none")]
2195    pub connection_code: Option<SecurityCode>,
2196
2197    #[serde(rename = "pqSupport")]
2198    pub pq_support: bool,
2199
2200    #[serde(rename = "pqEncryption")]
2201    pub pq_encryption: bool,
2202
2203    #[serde(rename = "pqSndEnabled", skip_serializing_if = "Option::is_none")]
2204    pub pq_snd_enabled: Option<bool>,
2205
2206    #[serde(rename = "pqRcvEnabled", skip_serializing_if = "Option::is_none")]
2207    pub pq_rcv_enabled: Option<bool>,
2208
2209    #[serde(
2210        rename = "authErrCounter",
2211        deserialize_with = "deserialize_number_from_string"
2212    )]
2213    pub auth_err_counter: i32,
2214
2215    #[serde(
2216        rename = "quotaErrCounter",
2217        deserialize_with = "deserialize_number_from_string"
2218    )]
2219    pub quota_err_counter: i32,
2220
2221    #[serde(rename = "createdAt")]
2222    pub created_at: UtcTime,
2223
2224    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2225    #[cfg_attr(feature = "bon", builder(default))]
2226    pub undocumented: JsonObject,
2227}
2228
2229#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2230#[serde(tag = "type")]
2231#[non_exhaustive]
2232pub enum ConnectionEntity {
2233    #[serde(rename = "rcvDirectMsgConnection")]
2234    RcvDirectMsgConnection {
2235        #[serde(rename = "entityConnection")]
2236        entity_connection: Connection,
2237
2238        #[serde(rename = "contact", skip_serializing_if = "Option::is_none")]
2239        contact: Option<Contact>,
2240
2241        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2242        undocumented: JsonObject,
2243    },
2244    #[serde(rename = "rcvGroupMsgConnection")]
2245    RcvGroupMsgConnection {
2246        #[serde(rename = "entityConnection")]
2247        entity_connection: Connection,
2248
2249        #[serde(rename = "groupInfo")]
2250        group_info: GroupInfo,
2251
2252        #[serde(rename = "groupMember")]
2253        group_member: GroupMember,
2254
2255        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2256        undocumented: JsonObject,
2257    },
2258    #[serde(rename = "sndFileConnection")]
2259    SndFileConnection {
2260        #[serde(rename = "entityConnection")]
2261        entity_connection: Connection,
2262
2263        #[serde(rename = "sndFileTransfer")]
2264        snd_file_transfer: SndFileTransfer,
2265
2266        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2267        undocumented: JsonObject,
2268    },
2269    #[serde(rename = "rcvFileConnection")]
2270    RcvFileConnection {
2271        #[serde(rename = "entityConnection")]
2272        entity_connection: Connection,
2273
2274        #[serde(rename = "rcvFileTransfer")]
2275        rcv_file_transfer: RcvFileTransfer,
2276
2277        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2278        undocumented: JsonObject,
2279    },
2280    #[serde(rename = "userContactConnection")]
2281    UserContactConnection {
2282        #[serde(rename = "entityConnection")]
2283        entity_connection: Connection,
2284
2285        #[serde(rename = "userContact")]
2286        user_contact: UserContact,
2287
2288        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2289        undocumented: JsonObject,
2290    },
2291    #[serde(untagged)]
2292    Undocumented(JsonObject),
2293}
2294
2295impl ConnectionEntity {
2296    pub fn rcv_direct_msg_connection(
2297        entity_connection: Connection,
2298        contact: Option<Contact>,
2299    ) -> Self {
2300        Self::RcvDirectMsgConnection {
2301            entity_connection,
2302            contact,
2303            undocumented: Default::default(),
2304        }
2305    }
2306
2307    pub fn rcv_group_msg_connection(
2308        entity_connection: Connection,
2309        group_info: GroupInfo,
2310        group_member: GroupMember,
2311    ) -> Self {
2312        Self::RcvGroupMsgConnection {
2313            entity_connection,
2314            group_info,
2315            group_member,
2316            undocumented: Default::default(),
2317        }
2318    }
2319
2320    pub fn snd_file_connection(
2321        entity_connection: Connection,
2322        snd_file_transfer: SndFileTransfer,
2323    ) -> Self {
2324        Self::SndFileConnection {
2325            entity_connection,
2326            snd_file_transfer,
2327            undocumented: Default::default(),
2328        }
2329    }
2330
2331    pub fn rcv_file_connection(
2332        entity_connection: Connection,
2333        rcv_file_transfer: RcvFileTransfer,
2334    ) -> Self {
2335        Self::RcvFileConnection {
2336            entity_connection,
2337            rcv_file_transfer,
2338            undocumented: Default::default(),
2339        }
2340    }
2341
2342    pub fn user_contact_connection(
2343        entity_connection: Connection,
2344        user_contact: UserContact,
2345    ) -> Self {
2346        Self::UserContactConnection {
2347            entity_connection,
2348            user_contact,
2349            undocumented: Default::default(),
2350        }
2351    }
2352}
2353
2354#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
2355#[non_exhaustive]
2356pub enum ConnectionMode {
2357    #[default]
2358    #[serde(rename = "inv")]
2359    Inv,
2360    #[serde(rename = "con")]
2361    Con,
2362}
2363
2364#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2365#[serde(tag = "type")]
2366#[non_exhaustive]
2367pub enum ConnectionPlan {
2368    #[serde(rename = "invitationLink")]
2369    InvitationLink {
2370        #[serde(rename = "invitationLinkPlan")]
2371        invitation_link_plan: InvitationLinkPlan,
2372
2373        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2374        undocumented: JsonObject,
2375    },
2376    #[serde(rename = "contactAddress")]
2377    ContactAddress {
2378        #[serde(rename = "contactAddressPlan")]
2379        contact_address_plan: ContactAddressPlan,
2380
2381        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2382        undocumented: JsonObject,
2383    },
2384    #[serde(rename = "groupLink")]
2385    GroupLink {
2386        #[serde(rename = "groupLinkPlan")]
2387        group_link_plan: GroupLinkPlan,
2388
2389        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2390        undocumented: JsonObject,
2391    },
2392    #[serde(rename = "error")]
2393    Error {
2394        #[serde(rename = "chatError")]
2395        chat_error: ChatError,
2396
2397        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2398        undocumented: JsonObject,
2399    },
2400    #[serde(untagged)]
2401    Undocumented(JsonObject),
2402}
2403
2404impl ConnectionPlan {
2405    pub fn invitation_link(invitation_link_plan: InvitationLinkPlan) -> Self {
2406        Self::InvitationLink {
2407            invitation_link_plan,
2408            undocumented: Default::default(),
2409        }
2410    }
2411
2412    pub fn contact_address(contact_address_plan: ContactAddressPlan) -> Self {
2413        Self::ContactAddress {
2414            contact_address_plan,
2415            undocumented: Default::default(),
2416        }
2417    }
2418
2419    pub fn group_link(group_link_plan: GroupLinkPlan) -> Self {
2420        Self::GroupLink {
2421            group_link_plan,
2422            undocumented: Default::default(),
2423        }
2424    }
2425
2426    pub fn error(chat_error: ChatError) -> Self {
2427        Self::Error {
2428            chat_error,
2429            undocumented: Default::default(),
2430        }
2431    }
2432}
2433
2434#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2435#[cfg_attr(feature = "bon", derive(::bon::Builder))]
2436#[cfg_attr(feature = "bon", builder(on(String, into)))]
2437pub struct Contact {
2438    #[serde(
2439        rename = "contactId",
2440        deserialize_with = "deserialize_number_from_string"
2441    )]
2442    pub contact_id: i64,
2443
2444    #[serde(rename = "localDisplayName")]
2445    pub local_display_name: String,
2446
2447    #[serde(rename = "profile")]
2448    pub profile: LocalProfile,
2449
2450    #[serde(rename = "activeConn", skip_serializing_if = "Option::is_none")]
2451    pub active_conn: Option<Connection>,
2452
2453    #[serde(
2454        rename = "viaGroup",
2455        skip_serializing_if = "Option::is_none",
2456        deserialize_with = "deserialize_option_number_from_string",
2457        default
2458    )]
2459    pub via_group: Option<i64>,
2460
2461    #[serde(rename = "contactUsed")]
2462    pub contact_used: bool,
2463
2464    #[serde(rename = "contactStatus")]
2465    pub contact_status: ContactStatus,
2466
2467    #[serde(rename = "chatSettings")]
2468    pub chat_settings: ChatSettings,
2469
2470    #[serde(rename = "userPreferences")]
2471    pub user_preferences: Preferences,
2472
2473    #[serde(rename = "mergedPreferences")]
2474    pub merged_preferences: ContactUserPreferences,
2475
2476    #[serde(rename = "createdAt")]
2477    pub created_at: UtcTime,
2478
2479    #[serde(rename = "updatedAt")]
2480    pub updated_at: UtcTime,
2481
2482    #[serde(rename = "chatTs", skip_serializing_if = "Option::is_none")]
2483    pub chat_ts: Option<UtcTime>,
2484
2485    #[serde(rename = "preparedContact", skip_serializing_if = "Option::is_none")]
2486    pub prepared_contact: Option<PreparedContact>,
2487
2488    #[serde(
2489        rename = "contactRequestId",
2490        skip_serializing_if = "Option::is_none",
2491        deserialize_with = "deserialize_option_number_from_string",
2492        default
2493    )]
2494    pub contact_request_id: Option<i64>,
2495
2496    #[serde(
2497        rename = "contactGroupMemberId",
2498        skip_serializing_if = "Option::is_none",
2499        deserialize_with = "deserialize_option_number_from_string",
2500        default
2501    )]
2502    pub contact_group_member_id: Option<i64>,
2503
2504    #[serde(rename = "contactGrpInvSent")]
2505    pub contact_grp_inv_sent: bool,
2506
2507    #[serde(rename = "groupDirectInv", skip_serializing_if = "Option::is_none")]
2508    pub group_direct_inv: Option<GroupDirectInvitation>,
2509
2510    #[serde(rename = "chatTags")]
2511    pub chat_tags: Vec<i64>,
2512
2513    #[serde(
2514        rename = "chatItemTTL",
2515        skip_serializing_if = "Option::is_none",
2516        deserialize_with = "deserialize_option_number_from_string",
2517        default
2518    )]
2519    pub chat_item_ttl: Option<i64>,
2520
2521    #[serde(rename = "uiThemes", skip_serializing_if = "Option::is_none")]
2522    pub ui_themes: Option<UIThemeEntityOverrides>,
2523
2524    #[serde(rename = "chatDeleted")]
2525    pub chat_deleted: bool,
2526
2527    #[serde(rename = "customData", skip_serializing_if = "Option::is_none")]
2528    pub custom_data: Option<JsonObject>,
2529
2530    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2531    #[cfg_attr(feature = "bon", builder(default))]
2532    pub undocumented: JsonObject,
2533}
2534
2535#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2536#[serde(tag = "type")]
2537#[non_exhaustive]
2538pub enum ContactAddressPlan {
2539    #[serde(rename = "ok")]
2540    Ok {
2541        #[serde(rename = "contactSLinkData_", skip_serializing_if = "Option::is_none")]
2542        contact_s_link_data: Option<ContactShortLinkData>,
2543
2544        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2545        undocumented: JsonObject,
2546    },
2547    #[serde(rename = "ownLink")]
2548    OwnLink,
2549    #[serde(rename = "connectingConfirmReconnect")]
2550    ConnectingConfirmReconnect,
2551    #[serde(rename = "connectingProhibit")]
2552    ConnectingProhibit {
2553        #[serde(rename = "contact")]
2554        contact: Contact,
2555
2556        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2557        undocumented: JsonObject,
2558    },
2559    #[serde(rename = "known")]
2560    Known {
2561        #[serde(rename = "contact")]
2562        contact: Contact,
2563
2564        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2565        undocumented: JsonObject,
2566    },
2567    #[serde(rename = "contactViaAddress")]
2568    ContactViaAddress {
2569        #[serde(rename = "contact")]
2570        contact: Contact,
2571
2572        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2573        undocumented: JsonObject,
2574    },
2575    #[serde(untagged)]
2576    Undocumented(JsonObject),
2577}
2578
2579impl ContactAddressPlan {
2580    pub fn ok(contact_s_link_data: Option<ContactShortLinkData>) -> Self {
2581        Self::Ok {
2582            contact_s_link_data,
2583            undocumented: Default::default(),
2584        }
2585    }
2586
2587    pub fn own_link() -> Self {
2588        Self::OwnLink
2589    }
2590
2591    pub fn connecting_confirm_reconnect() -> Self {
2592        Self::ConnectingConfirmReconnect
2593    }
2594
2595    pub fn connecting_prohibit(contact: Contact) -> Self {
2596        Self::ConnectingProhibit {
2597            contact,
2598            undocumented: Default::default(),
2599        }
2600    }
2601
2602    pub fn known(contact: Contact) -> Self {
2603        Self::Known {
2604            contact,
2605            undocumented: Default::default(),
2606        }
2607    }
2608
2609    pub fn contact_via_address(contact: Contact) -> Self {
2610        Self::ContactViaAddress {
2611            contact,
2612            undocumented: Default::default(),
2613        }
2614    }
2615}
2616
2617#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2618#[cfg_attr(feature = "bon", derive(::bon::Builder))]
2619#[cfg_attr(feature = "bon", builder(on(String, into)))]
2620pub struct ContactShortLinkData {
2621    #[serde(rename = "profile")]
2622    pub profile: Profile,
2623
2624    #[serde(rename = "message", skip_serializing_if = "Option::is_none")]
2625    pub message: Option<MsgContent>,
2626
2627    #[serde(rename = "business")]
2628    pub business: bool,
2629
2630    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2631    #[cfg_attr(feature = "bon", builder(default))]
2632    pub undocumented: JsonObject,
2633}
2634
2635#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
2636#[non_exhaustive]
2637pub enum ContactStatus {
2638    #[default]
2639    #[serde(rename = "active")]
2640    Active,
2641    #[serde(rename = "deleted")]
2642    Deleted,
2643    #[serde(rename = "deletedByUser")]
2644    DeletedByUser,
2645}
2646
2647#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2648#[serde(tag = "type")]
2649#[non_exhaustive]
2650pub enum ContactUserPref {
2651    #[serde(rename = "contact")]
2652    Contact {
2653        #[serde(rename = "preference")]
2654        preference: SimplePreference,
2655
2656        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2657        undocumented: JsonObject,
2658    },
2659    #[serde(rename = "user")]
2660    User {
2661        #[serde(rename = "preference")]
2662        preference: SimplePreference,
2663
2664        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2665        undocumented: JsonObject,
2666    },
2667    #[serde(untagged)]
2668    Undocumented(JsonObject),
2669}
2670
2671impl ContactUserPref {
2672    pub fn contact(preference: SimplePreference) -> Self {
2673        Self::Contact {
2674            preference,
2675            undocumented: Default::default(),
2676        }
2677    }
2678
2679    pub fn user(preference: SimplePreference) -> Self {
2680        Self::User {
2681            preference,
2682            undocumented: Default::default(),
2683        }
2684    }
2685}
2686
2687#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2688#[cfg_attr(feature = "bon", derive(::bon::Builder))]
2689#[cfg_attr(feature = "bon", builder(on(String, into)))]
2690pub struct ContactUserPreference {
2691    #[serde(rename = "enabled")]
2692    pub enabled: PrefEnabled,
2693
2694    #[serde(rename = "userPreference")]
2695    pub user_preference: ContactUserPref,
2696
2697    #[serde(rename = "contactPreference")]
2698    pub contact_preference: SimplePreference,
2699
2700    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2701    #[cfg_attr(feature = "bon", builder(default))]
2702    pub undocumented: JsonObject,
2703}
2704
2705#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2706#[cfg_attr(feature = "bon", derive(::bon::Builder))]
2707#[cfg_attr(feature = "bon", builder(on(String, into)))]
2708pub struct ContactUserPreferences {
2709    #[serde(rename = "timedMessages")]
2710    pub timed_messages: ContactUserPreference,
2711
2712    #[serde(rename = "fullDelete")]
2713    pub full_delete: ContactUserPreference,
2714
2715    #[serde(rename = "reactions")]
2716    pub reactions: ContactUserPreference,
2717
2718    #[serde(rename = "voice")]
2719    pub voice: ContactUserPreference,
2720
2721    #[serde(rename = "files")]
2722    pub files: ContactUserPreference,
2723
2724    #[serde(rename = "calls")]
2725    pub calls: ContactUserPreference,
2726
2727    #[serde(rename = "sessions")]
2728    pub sessions: ContactUserPreference,
2729
2730    #[serde(rename = "commands", skip_serializing_if = "Option::is_none")]
2731    pub commands: Option<Vec<ChatBotCommand>>,
2732
2733    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2734    #[cfg_attr(feature = "bon", builder(default))]
2735    pub undocumented: JsonObject,
2736}
2737
2738/// *Syntax:*
2739///
2740/// ```
2741/// <connFullLink>[ <connShortLink>]
2742/// ```
2743#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2744#[cfg_attr(feature = "bon", derive(::bon::Builder))]
2745#[cfg_attr(feature = "bon", builder(on(String, into)))]
2746pub struct CreatedConnLink {
2747    #[serde(rename = "connFullLink")]
2748    pub conn_full_link: String,
2749
2750    #[serde(rename = "connShortLink", skip_serializing_if = "Option::is_none")]
2751    pub conn_short_link: Option<String>,
2752
2753    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2754    #[cfg_attr(feature = "bon", builder(default))]
2755    pub undocumented: JsonObject,
2756}
2757
2758impl CommandSyntax for CreatedConnLink {
2759    const COMMAND_BUF_SIZE: usize = 64;
2760
2761    fn append_command_syntax(&self, buf: &mut String) {
2762        write!(buf, "{}", self.conn_full_link).unwrap();
2763        if let Some(conn_short_link) = &self.conn_short_link {
2764            buf.push(' ');
2765            write!(buf, "{}", conn_short_link).unwrap();
2766        }
2767    }
2768}
2769
2770#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2771#[cfg_attr(feature = "bon", derive(::bon::Builder))]
2772#[cfg_attr(feature = "bon", builder(on(String, into)))]
2773pub struct CryptoFile {
2774    #[serde(rename = "filePath")]
2775    pub file_path: String,
2776
2777    #[serde(rename = "cryptoArgs", skip_serializing_if = "Option::is_none")]
2778    pub crypto_args: Option<CryptoFileArgs>,
2779
2780    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2781    #[cfg_attr(feature = "bon", builder(default))]
2782    pub undocumented: JsonObject,
2783}
2784
2785#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2786#[cfg_attr(feature = "bon", derive(::bon::Builder))]
2787#[cfg_attr(feature = "bon", builder(on(String, into)))]
2788pub struct CryptoFileArgs {
2789    #[serde(rename = "fileKey")]
2790    pub file_key: String,
2791
2792    #[serde(rename = "fileNonce")]
2793    pub file_nonce: String,
2794
2795    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2796    #[cfg_attr(feature = "bon", builder(default))]
2797    pub undocumented: JsonObject,
2798}
2799
2800#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2801#[cfg_attr(feature = "bon", derive(::bon::Builder))]
2802#[cfg_attr(feature = "bon", builder(on(String, into)))]
2803pub struct E2EInfo {
2804    #[serde(rename = "pqEnabled", skip_serializing_if = "Option::is_none")]
2805    pub pq_enabled: Option<bool>,
2806
2807    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2808    #[cfg_attr(feature = "bon", builder(default))]
2809    pub undocumented: JsonObject,
2810}
2811
2812#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
2813#[non_exhaustive]
2814pub enum FeatureAllowed {
2815    #[default]
2816    #[serde(rename = "always")]
2817    Always,
2818    #[serde(rename = "yes")]
2819    Yes,
2820    #[serde(rename = "no")]
2821    No,
2822}
2823
2824#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2825#[cfg_attr(feature = "bon", derive(::bon::Builder))]
2826#[cfg_attr(feature = "bon", builder(on(String, into)))]
2827pub struct FileDescr {
2828    #[serde(rename = "fileDescrText")]
2829    pub file_descr_text: String,
2830
2831    #[serde(
2832        rename = "fileDescrPartNo",
2833        deserialize_with = "deserialize_number_from_string"
2834    )]
2835    pub file_descr_part_no: i32,
2836
2837    #[serde(rename = "fileDescrComplete")]
2838    pub file_descr_complete: bool,
2839
2840    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2841    #[cfg_attr(feature = "bon", builder(default))]
2842    pub undocumented: JsonObject,
2843}
2844
2845#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2846#[cfg_attr(feature = "bon", derive(::bon::Builder))]
2847#[cfg_attr(feature = "bon", builder(on(String, into)))]
2848pub struct FileInvitation {
2849    #[serde(rename = "fileName")]
2850    pub file_name: String,
2851
2852    #[serde(
2853        rename = "fileSize",
2854        deserialize_with = "deserialize_number_from_string"
2855    )]
2856    pub file_size: i64,
2857
2858    #[serde(rename = "fileDigest", skip_serializing_if = "Option::is_none")]
2859    pub file_digest: Option<String>,
2860
2861    #[serde(rename = "fileConnReq", skip_serializing_if = "Option::is_none")]
2862    pub file_conn_req: Option<String>,
2863
2864    #[serde(rename = "fileInline", skip_serializing_if = "Option::is_none")]
2865    pub file_inline: Option<InlineFileMode>,
2866
2867    #[serde(rename = "fileDescr", skip_serializing_if = "Option::is_none")]
2868    pub file_descr: Option<FileDescr>,
2869
2870    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2871    #[cfg_attr(feature = "bon", builder(default))]
2872    pub undocumented: JsonObject,
2873}
2874
2875#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
2876#[non_exhaustive]
2877pub enum FileProtocol {
2878    #[default]
2879    #[serde(rename = "smp")]
2880    Smp,
2881    #[serde(rename = "xftp")]
2882    Xftp,
2883    #[serde(rename = "local")]
2884    Local,
2885}
2886
2887#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
2888#[non_exhaustive]
2889pub enum FileStatus {
2890    #[default]
2891    #[serde(rename = "new")]
2892    New,
2893    #[serde(rename = "accepted")]
2894    Accepted,
2895    #[serde(rename = "connected")]
2896    Connected,
2897    #[serde(rename = "complete")]
2898    Complete,
2899    #[serde(rename = "cancelled")]
2900    Cancelled,
2901}
2902
2903#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2904#[cfg_attr(feature = "bon", derive(::bon::Builder))]
2905#[cfg_attr(feature = "bon", builder(on(String, into)))]
2906pub struct FileTransferMeta {
2907    #[serde(rename = "fileId", deserialize_with = "deserialize_number_from_string")]
2908    pub file_id: i64,
2909
2910    #[serde(rename = "xftpSndFile", skip_serializing_if = "Option::is_none")]
2911    pub xftp_snd_file: Option<XFTPSndFile>,
2912
2913    #[serde(
2914        rename = "xftpRedirectFor",
2915        skip_serializing_if = "Option::is_none",
2916        deserialize_with = "deserialize_option_number_from_string",
2917        default
2918    )]
2919    pub xftp_redirect_for: Option<i64>,
2920
2921    #[serde(rename = "fileName")]
2922    pub file_name: String,
2923
2924    #[serde(rename = "filePath")]
2925    pub file_path: String,
2926
2927    #[serde(
2928        rename = "fileSize",
2929        deserialize_with = "deserialize_number_from_string"
2930    )]
2931    pub file_size: i64,
2932
2933    #[serde(rename = "fileInline", skip_serializing_if = "Option::is_none")]
2934    pub file_inline: Option<InlineFileMode>,
2935
2936    #[serde(
2937        rename = "chunkSize",
2938        deserialize_with = "deserialize_number_from_string"
2939    )]
2940    pub chunk_size: i64,
2941
2942    #[serde(rename = "cancelled")]
2943    pub cancelled: bool,
2944
2945    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2946    #[cfg_attr(feature = "bon", builder(default))]
2947    pub undocumented: JsonObject,
2948}
2949
2950#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2951#[serde(tag = "type")]
2952#[non_exhaustive]
2953pub enum Format {
2954    #[serde(rename = "bold")]
2955    Bold,
2956    #[serde(rename = "italic")]
2957    Italic,
2958    #[serde(rename = "strikeThrough")]
2959    StrikeThrough,
2960    #[serde(rename = "snippet")]
2961    Snippet,
2962    #[serde(rename = "secret")]
2963    Secret,
2964    #[serde(rename = "colored")]
2965    Colored {
2966        #[serde(rename = "color")]
2967        color: Color,
2968
2969        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2970        undocumented: JsonObject,
2971    },
2972    #[serde(rename = "uri")]
2973    Uri,
2974    #[serde(rename = "hyperLink")]
2975    HyperLink {
2976        #[serde(rename = "showText", skip_serializing_if = "Option::is_none")]
2977        show_text: Option<String>,
2978
2979        #[serde(rename = "linkUri")]
2980        link_uri: String,
2981
2982        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
2983        undocumented: JsonObject,
2984    },
2985    #[serde(rename = "simplexLink")]
2986    SimplexLink {
2987        #[serde(rename = "showText", skip_serializing_if = "Option::is_none")]
2988        show_text: Option<String>,
2989
2990        #[serde(rename = "linkType")]
2991        link_type: SimplexLinkType,
2992
2993        #[serde(rename = "simplexUri")]
2994        simplex_uri: String,
2995
2996        #[serde(rename = "smpHosts")]
2997        smp_hosts: Vec<String>,
2998
2999        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3000        undocumented: JsonObject,
3001    },
3002    #[serde(rename = "command")]
3003    Command {
3004        #[serde(rename = "commandStr")]
3005        command_str: String,
3006
3007        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3008        undocumented: JsonObject,
3009    },
3010    #[serde(rename = "mention")]
3011    Mention {
3012        #[serde(rename = "memberName")]
3013        member_name: String,
3014
3015        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3016        undocumented: JsonObject,
3017    },
3018    #[serde(rename = "email")]
3019    Email,
3020    #[serde(rename = "phone")]
3021    Phone,
3022    #[serde(untagged)]
3023    Undocumented(JsonObject),
3024}
3025
3026impl Format {
3027    pub fn bold() -> Self {
3028        Self::Bold
3029    }
3030
3031    pub fn italic() -> Self {
3032        Self::Italic
3033    }
3034
3035    pub fn strike_through() -> Self {
3036        Self::StrikeThrough
3037    }
3038
3039    pub fn snippet() -> Self {
3040        Self::Snippet
3041    }
3042
3043    pub fn secret() -> Self {
3044        Self::Secret
3045    }
3046
3047    pub fn colored(color: Color) -> Self {
3048        Self::Colored {
3049            color,
3050            undocumented: Default::default(),
3051        }
3052    }
3053
3054    pub fn uri() -> Self {
3055        Self::Uri
3056    }
3057
3058    pub fn hyper_link(show_text: Option<String>, link_uri: String) -> Self {
3059        Self::HyperLink {
3060            show_text,
3061            link_uri,
3062            undocumented: Default::default(),
3063        }
3064    }
3065
3066    pub fn simplex_link(
3067        show_text: Option<String>,
3068        link_type: SimplexLinkType,
3069        simplex_uri: String,
3070        smp_hosts: Vec<String>,
3071    ) -> Self {
3072        Self::SimplexLink {
3073            show_text,
3074            link_type,
3075            simplex_uri,
3076            smp_hosts,
3077            undocumented: Default::default(),
3078        }
3079    }
3080
3081    pub fn command(command_str: String) -> Self {
3082        Self::Command {
3083            command_str,
3084            undocumented: Default::default(),
3085        }
3086    }
3087
3088    pub fn mention(member_name: String) -> Self {
3089        Self::Mention {
3090            member_name,
3091            undocumented: Default::default(),
3092        }
3093    }
3094
3095    pub fn email() -> Self {
3096        Self::Email
3097    }
3098
3099    pub fn phone() -> Self {
3100        Self::Phone
3101    }
3102}
3103
3104#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
3105#[cfg_attr(feature = "bon", derive(::bon::Builder))]
3106#[cfg_attr(feature = "bon", builder(on(String, into)))]
3107pub struct FormattedText {
3108    #[serde(rename = "format", skip_serializing_if = "Option::is_none")]
3109    pub format: Option<Format>,
3110
3111    #[serde(rename = "text")]
3112    pub text: String,
3113
3114    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3115    #[cfg_attr(feature = "bon", builder(default))]
3116    pub undocumented: JsonObject,
3117}
3118
3119#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
3120#[cfg_attr(feature = "bon", derive(::bon::Builder))]
3121#[cfg_attr(feature = "bon", builder(on(String, into)))]
3122pub struct FullGroupPreferences {
3123    #[serde(rename = "timedMessages")]
3124    pub timed_messages: TimedMessagesGroupPreference,
3125
3126    #[serde(rename = "directMessages")]
3127    pub direct_messages: RoleGroupPreference,
3128
3129    #[serde(rename = "fullDelete")]
3130    pub full_delete: GroupPreference,
3131
3132    #[serde(rename = "reactions")]
3133    pub reactions: GroupPreference,
3134
3135    #[serde(rename = "voice")]
3136    pub voice: RoleGroupPreference,
3137
3138    #[serde(rename = "files")]
3139    pub files: RoleGroupPreference,
3140
3141    #[serde(rename = "simplexLinks")]
3142    pub simplex_links: RoleGroupPreference,
3143
3144    #[serde(rename = "reports")]
3145    pub reports: GroupPreference,
3146
3147    #[serde(rename = "history")]
3148    pub history: GroupPreference,
3149
3150    #[serde(rename = "sessions")]
3151    pub sessions: RoleGroupPreference,
3152
3153    #[serde(rename = "commands")]
3154    pub commands: Vec<ChatBotCommand>,
3155
3156    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3157    #[cfg_attr(feature = "bon", builder(default))]
3158    pub undocumented: JsonObject,
3159}
3160
3161#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
3162#[cfg_attr(feature = "bon", derive(::bon::Builder))]
3163#[cfg_attr(feature = "bon", builder(on(String, into)))]
3164pub struct FullPreferences {
3165    #[serde(rename = "timedMessages")]
3166    pub timed_messages: TimedMessagesPreference,
3167
3168    #[serde(rename = "fullDelete")]
3169    pub full_delete: SimplePreference,
3170
3171    #[serde(rename = "reactions")]
3172    pub reactions: SimplePreference,
3173
3174    #[serde(rename = "voice")]
3175    pub voice: SimplePreference,
3176
3177    #[serde(rename = "files")]
3178    pub files: SimplePreference,
3179
3180    #[serde(rename = "calls")]
3181    pub calls: SimplePreference,
3182
3183    #[serde(rename = "sessions")]
3184    pub sessions: SimplePreference,
3185
3186    #[serde(rename = "commands")]
3187    pub commands: Vec<ChatBotCommand>,
3188
3189    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3190    #[cfg_attr(feature = "bon", builder(default))]
3191    pub undocumented: JsonObject,
3192}
3193
3194#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
3195#[cfg_attr(feature = "bon", derive(::bon::Builder))]
3196#[cfg_attr(feature = "bon", builder(on(String, into)))]
3197pub struct Group {
3198    #[serde(rename = "groupInfo")]
3199    pub group_info: GroupInfo,
3200
3201    #[serde(rename = "members")]
3202    pub members: Vec<GroupMember>,
3203
3204    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3205    #[cfg_attr(feature = "bon", builder(default))]
3206    pub undocumented: JsonObject,
3207}
3208
3209/// *Syntax:*
3210///
3211/// ```
3212/// (_support[:<groupMemberId_>])
3213/// ```
3214#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
3215#[serde(tag = "type")]
3216#[non_exhaustive]
3217pub enum GroupChatScope {
3218    #[serde(rename = "memberSupport")]
3219    MemberSupport {
3220        #[serde(
3221            rename = "groupMemberId_",
3222            skip_serializing_if = "Option::is_none",
3223            deserialize_with = "deserialize_option_number_from_string",
3224            default
3225        )]
3226        group_member_id: Option<i64>,
3227
3228        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3229        undocumented: JsonObject,
3230    },
3231    #[serde(untagged)]
3232    Undocumented(JsonObject),
3233}
3234
3235impl CommandSyntax for GroupChatScope {
3236    const COMMAND_BUF_SIZE: usize = 64;
3237
3238    fn append_command_syntax(&self, buf: &mut String) {
3239        buf.push_str("(_support");
3240        match self {
3241            Self::MemberSupport {
3242                group_member_id, ..
3243            } => {
3244                if let Some(group_member_id) = group_member_id {
3245                    buf.push(':');
3246                    write!(buf, "{}", group_member_id).unwrap();
3247                }
3248            }
3249            Self::Undocumented(_) => {}
3250        }
3251        buf.push(')');
3252    }
3253}
3254
3255impl GroupChatScope {
3256    pub fn member_support(group_member_id: Option<i64>) -> Self {
3257        Self::MemberSupport {
3258            group_member_id,
3259            undocumented: Default::default(),
3260        }
3261    }
3262}
3263
3264#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
3265#[serde(tag = "type")]
3266#[non_exhaustive]
3267pub enum GroupChatScopeInfo {
3268    #[serde(rename = "memberSupport")]
3269    MemberSupport {
3270        #[serde(rename = "groupMember_", skip_serializing_if = "Option::is_none")]
3271        group_member: Option<GroupMember>,
3272
3273        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3274        undocumented: JsonObject,
3275    },
3276    #[serde(untagged)]
3277    Undocumented(JsonObject),
3278}
3279
3280impl GroupChatScopeInfo {
3281    pub fn member_support(group_member: Option<GroupMember>) -> Self {
3282        Self::MemberSupport {
3283            group_member,
3284            undocumented: Default::default(),
3285        }
3286    }
3287}
3288
3289#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
3290#[cfg_attr(feature = "bon", derive(::bon::Builder))]
3291#[cfg_attr(feature = "bon", builder(on(String, into)))]
3292pub struct GroupDirectInvitation {
3293    #[serde(rename = "groupDirectInvLink")]
3294    pub group_direct_inv_link: String,
3295
3296    #[serde(
3297        rename = "fromGroupId_",
3298        skip_serializing_if = "Option::is_none",
3299        deserialize_with = "deserialize_option_number_from_string",
3300        default
3301    )]
3302    pub from_group_id: Option<i64>,
3303
3304    #[serde(
3305        rename = "fromGroupMemberId_",
3306        skip_serializing_if = "Option::is_none",
3307        deserialize_with = "deserialize_option_number_from_string",
3308        default
3309    )]
3310    pub from_group_member_id: Option<i64>,
3311
3312    #[serde(
3313        rename = "fromGroupMemberConnId_",
3314        skip_serializing_if = "Option::is_none",
3315        deserialize_with = "deserialize_option_number_from_string",
3316        default
3317    )]
3318    pub from_group_member_conn_id: Option<i64>,
3319
3320    #[serde(rename = "groupDirectInvStartedConnection")]
3321    pub group_direct_inv_started_connection: bool,
3322
3323    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3324    #[cfg_attr(feature = "bon", builder(default))]
3325    pub undocumented: JsonObject,
3326}
3327
3328#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
3329#[non_exhaustive]
3330pub enum GroupFeature {
3331    #[default]
3332    #[serde(rename = "timedMessages")]
3333    TimedMessages,
3334    #[serde(rename = "directMessages")]
3335    DirectMessages,
3336    #[serde(rename = "fullDelete")]
3337    FullDelete,
3338    #[serde(rename = "reactions")]
3339    Reactions,
3340    #[serde(rename = "voice")]
3341    Voice,
3342    #[serde(rename = "files")]
3343    Files,
3344    #[serde(rename = "simplexLinks")]
3345    SimplexLinks,
3346    #[serde(rename = "reports")]
3347    Reports,
3348    #[serde(rename = "history")]
3349    History,
3350    #[serde(rename = "sessions")]
3351    Sessions,
3352}
3353
3354#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
3355#[non_exhaustive]
3356pub enum GroupFeatureEnabled {
3357    #[default]
3358    #[serde(rename = "on")]
3359    On,
3360    #[serde(rename = "off")]
3361    Off,
3362}
3363
3364#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
3365#[cfg_attr(feature = "bon", derive(::bon::Builder))]
3366#[cfg_attr(feature = "bon", builder(on(String, into)))]
3367pub struct GroupInfo {
3368    #[serde(
3369        rename = "groupId",
3370        deserialize_with = "deserialize_number_from_string"
3371    )]
3372    pub group_id: i64,
3373
3374    #[serde(rename = "localDisplayName")]
3375    pub local_display_name: String,
3376
3377    #[serde(rename = "groupProfile")]
3378    pub group_profile: GroupProfile,
3379
3380    #[serde(rename = "localAlias")]
3381    pub local_alias: String,
3382
3383    #[serde(rename = "businessChat", skip_serializing_if = "Option::is_none")]
3384    pub business_chat: Option<BusinessChatInfo>,
3385
3386    #[serde(rename = "fullGroupPreferences")]
3387    pub full_group_preferences: FullGroupPreferences,
3388
3389    #[serde(rename = "membership")]
3390    pub membership: GroupMember,
3391
3392    #[serde(rename = "chatSettings")]
3393    pub chat_settings: ChatSettings,
3394
3395    #[serde(rename = "createdAt")]
3396    pub created_at: UtcTime,
3397
3398    #[serde(rename = "updatedAt")]
3399    pub updated_at: UtcTime,
3400
3401    #[serde(rename = "chatTs", skip_serializing_if = "Option::is_none")]
3402    pub chat_ts: Option<UtcTime>,
3403
3404    #[serde(
3405        rename = "userMemberProfileSentAt",
3406        skip_serializing_if = "Option::is_none"
3407    )]
3408    pub user_member_profile_sent_at: Option<UtcTime>,
3409
3410    #[serde(rename = "preparedGroup", skip_serializing_if = "Option::is_none")]
3411    pub prepared_group: Option<PreparedGroup>,
3412
3413    #[serde(rename = "chatTags")]
3414    pub chat_tags: Vec<i64>,
3415
3416    #[serde(
3417        rename = "chatItemTTL",
3418        skip_serializing_if = "Option::is_none",
3419        deserialize_with = "deserialize_option_number_from_string",
3420        default
3421    )]
3422    pub chat_item_ttl: Option<i64>,
3423
3424    #[serde(rename = "uiThemes", skip_serializing_if = "Option::is_none")]
3425    pub ui_themes: Option<UIThemeEntityOverrides>,
3426
3427    #[serde(rename = "customData", skip_serializing_if = "Option::is_none")]
3428    pub custom_data: Option<JsonObject>,
3429
3430    #[serde(
3431        rename = "membersRequireAttention",
3432        deserialize_with = "deserialize_number_from_string"
3433    )]
3434    pub members_require_attention: i32,
3435
3436    #[serde(rename = "viaGroupLinkUri", skip_serializing_if = "Option::is_none")]
3437    pub via_group_link_uri: Option<String>,
3438
3439    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3440    #[cfg_attr(feature = "bon", builder(default))]
3441    pub undocumented: JsonObject,
3442}
3443
3444#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
3445#[cfg_attr(feature = "bon", derive(::bon::Builder))]
3446#[cfg_attr(feature = "bon", builder(on(String, into)))]
3447pub struct GroupInfoSummary {
3448    #[serde(rename = "groupInfo")]
3449    pub group_info: GroupInfo,
3450
3451    #[serde(rename = "groupSummary")]
3452    pub group_summary: GroupSummary,
3453
3454    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3455    #[cfg_attr(feature = "bon", builder(default))]
3456    pub undocumented: JsonObject,
3457}
3458
3459#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
3460#[cfg_attr(feature = "bon", derive(::bon::Builder))]
3461#[cfg_attr(feature = "bon", builder(on(String, into)))]
3462pub struct GroupLink {
3463    #[serde(
3464        rename = "userContactLinkId",
3465        deserialize_with = "deserialize_number_from_string"
3466    )]
3467    pub user_contact_link_id: i64,
3468
3469    #[serde(rename = "connLinkContact")]
3470    pub conn_link_contact: CreatedConnLink,
3471
3472    #[serde(rename = "shortLinkDataSet")]
3473    pub short_link_data_set: bool,
3474
3475    #[serde(rename = "shortLinkLargeDataSet")]
3476    pub short_link_large_data_set: bool,
3477
3478    #[serde(rename = "groupLinkId")]
3479    pub group_link_id: String,
3480
3481    #[serde(rename = "acceptMemberRole")]
3482    pub accept_member_role: GroupMemberRole,
3483
3484    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3485    #[cfg_attr(feature = "bon", builder(default))]
3486    pub undocumented: JsonObject,
3487}
3488
3489#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
3490#[serde(tag = "type")]
3491#[non_exhaustive]
3492pub enum GroupLinkPlan {
3493    #[serde(rename = "ok")]
3494    Ok {
3495        #[serde(rename = "groupSLinkData_", skip_serializing_if = "Option::is_none")]
3496        group_s_link_data: Option<GroupShortLinkData>,
3497
3498        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3499        undocumented: JsonObject,
3500    },
3501    #[serde(rename = "ownLink")]
3502    OwnLink {
3503        #[serde(rename = "groupInfo")]
3504        group_info: GroupInfo,
3505
3506        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3507        undocumented: JsonObject,
3508    },
3509    #[serde(rename = "connectingConfirmReconnect")]
3510    ConnectingConfirmReconnect,
3511    #[serde(rename = "connectingProhibit")]
3512    ConnectingProhibit {
3513        #[serde(rename = "groupInfo_", skip_serializing_if = "Option::is_none")]
3514        group_info: Option<GroupInfo>,
3515
3516        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3517        undocumented: JsonObject,
3518    },
3519    #[serde(rename = "known")]
3520    Known {
3521        #[serde(rename = "groupInfo")]
3522        group_info: GroupInfo,
3523
3524        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3525        undocumented: JsonObject,
3526    },
3527    #[serde(untagged)]
3528    Undocumented(JsonObject),
3529}
3530
3531impl GroupLinkPlan {
3532    pub fn ok(group_s_link_data: Option<GroupShortLinkData>) -> Self {
3533        Self::Ok {
3534            group_s_link_data,
3535            undocumented: Default::default(),
3536        }
3537    }
3538
3539    pub fn own_link(group_info: GroupInfo) -> Self {
3540        Self::OwnLink {
3541            group_info,
3542            undocumented: Default::default(),
3543        }
3544    }
3545
3546    pub fn connecting_confirm_reconnect() -> Self {
3547        Self::ConnectingConfirmReconnect
3548    }
3549
3550    pub fn connecting_prohibit(group_info: Option<GroupInfo>) -> Self {
3551        Self::ConnectingProhibit {
3552            group_info,
3553            undocumented: Default::default(),
3554        }
3555    }
3556
3557    pub fn known(group_info: GroupInfo) -> Self {
3558        Self::Known {
3559            group_info,
3560            undocumented: Default::default(),
3561        }
3562    }
3563}
3564
3565#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
3566#[cfg_attr(feature = "bon", derive(::bon::Builder))]
3567#[cfg_attr(feature = "bon", builder(on(String, into)))]
3568pub struct GroupMember {
3569    #[serde(
3570        rename = "groupMemberId",
3571        deserialize_with = "deserialize_number_from_string"
3572    )]
3573    pub group_member_id: i64,
3574
3575    #[serde(
3576        rename = "groupId",
3577        deserialize_with = "deserialize_number_from_string"
3578    )]
3579    pub group_id: i64,
3580
3581    #[serde(rename = "memberId")]
3582    pub member_id: String,
3583
3584    #[serde(rename = "memberRole")]
3585    pub member_role: GroupMemberRole,
3586
3587    #[serde(rename = "memberCategory")]
3588    pub member_category: GroupMemberCategory,
3589
3590    #[serde(rename = "memberStatus")]
3591    pub member_status: GroupMemberStatus,
3592
3593    #[serde(rename = "memberSettings")]
3594    pub member_settings: GroupMemberSettings,
3595
3596    #[serde(rename = "blockedByAdmin")]
3597    pub blocked_by_admin: bool,
3598
3599    #[serde(rename = "invitedBy")]
3600    pub invited_by: InvitedBy,
3601
3602    #[serde(
3603        rename = "invitedByGroupMemberId",
3604        skip_serializing_if = "Option::is_none",
3605        deserialize_with = "deserialize_option_number_from_string",
3606        default
3607    )]
3608    pub invited_by_group_member_id: Option<i64>,
3609
3610    #[serde(rename = "localDisplayName")]
3611    pub local_display_name: String,
3612
3613    #[serde(rename = "memberProfile")]
3614    pub member_profile: LocalProfile,
3615
3616    #[serde(
3617        rename = "memberContactId",
3618        skip_serializing_if = "Option::is_none",
3619        deserialize_with = "deserialize_option_number_from_string",
3620        default
3621    )]
3622    pub member_contact_id: Option<i64>,
3623
3624    #[serde(
3625        rename = "memberContactProfileId",
3626        deserialize_with = "deserialize_number_from_string"
3627    )]
3628    pub member_contact_profile_id: i64,
3629
3630    #[serde(rename = "activeConn", skip_serializing_if = "Option::is_none")]
3631    pub active_conn: Option<Connection>,
3632
3633    #[serde(rename = "memberChatVRange")]
3634    pub member_chat_v_range: VersionRange,
3635
3636    #[serde(rename = "createdAt")]
3637    pub created_at: UtcTime,
3638
3639    #[serde(rename = "updatedAt")]
3640    pub updated_at: UtcTime,
3641
3642    #[serde(rename = "supportChat", skip_serializing_if = "Option::is_none")]
3643    pub support_chat: Option<GroupSupportChat>,
3644
3645    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3646    #[cfg_attr(feature = "bon", builder(default))]
3647    pub undocumented: JsonObject,
3648}
3649
3650#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
3651#[cfg_attr(feature = "bon", derive(::bon::Builder))]
3652#[cfg_attr(feature = "bon", builder(on(String, into)))]
3653pub struct GroupMemberAdmission {
3654    #[serde(rename = "review", skip_serializing_if = "Option::is_none")]
3655    pub review: Option<MemberCriteria>,
3656
3657    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3658    #[cfg_attr(feature = "bon", builder(default))]
3659    pub undocumented: JsonObject,
3660}
3661
3662#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
3663#[non_exhaustive]
3664pub enum GroupMemberCategory {
3665    #[default]
3666    #[serde(rename = "user")]
3667    User,
3668    #[serde(rename = "invitee")]
3669    Invitee,
3670    #[serde(rename = "host")]
3671    Host,
3672    #[serde(rename = "pre")]
3673    Pre,
3674    #[serde(rename = "post")]
3675    Post,
3676}
3677
3678#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
3679#[cfg_attr(feature = "bon", derive(::bon::Builder))]
3680#[cfg_attr(feature = "bon", builder(on(String, into)))]
3681pub struct GroupMemberRef {
3682    #[serde(
3683        rename = "groupMemberId",
3684        deserialize_with = "deserialize_number_from_string"
3685    )]
3686    pub group_member_id: i64,
3687
3688    #[serde(rename = "profile")]
3689    pub profile: Profile,
3690
3691    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3692    #[cfg_attr(feature = "bon", builder(default))]
3693    pub undocumented: JsonObject,
3694}
3695
3696#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
3697#[non_exhaustive]
3698pub enum GroupMemberRole {
3699    #[default]
3700    #[serde(rename = "observer")]
3701    Observer,
3702    #[serde(rename = "author")]
3703    Author,
3704    #[serde(rename = "member")]
3705    Member,
3706    #[serde(rename = "moderator")]
3707    Moderator,
3708    #[serde(rename = "admin")]
3709    Admin,
3710    #[serde(rename = "owner")]
3711    Owner,
3712}
3713
3714#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
3715#[cfg_attr(feature = "bon", derive(::bon::Builder))]
3716#[cfg_attr(feature = "bon", builder(on(String, into)))]
3717pub struct GroupMemberSettings {
3718    #[serde(rename = "showMessages")]
3719    pub show_messages: bool,
3720
3721    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3722    #[cfg_attr(feature = "bon", builder(default))]
3723    pub undocumented: JsonObject,
3724}
3725
3726#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
3727#[non_exhaustive]
3728pub enum GroupMemberStatus {
3729    #[default]
3730    #[serde(rename = "rejected")]
3731    Rejected,
3732    #[serde(rename = "removed")]
3733    Removed,
3734    #[serde(rename = "left")]
3735    Left,
3736    #[serde(rename = "deleted")]
3737    Deleted,
3738    #[serde(rename = "unknown")]
3739    Unknown,
3740    #[serde(rename = "invited")]
3741    Invited,
3742    #[serde(rename = "pending_approval")]
3743    PendingApproval,
3744    #[serde(rename = "pending_review")]
3745    PendingReview,
3746    #[serde(rename = "introduced")]
3747    Introduced,
3748    #[serde(rename = "intro-inv")]
3749    IntroInv,
3750    #[serde(rename = "accepted")]
3751    Accepted,
3752    #[serde(rename = "announced")]
3753    Announced,
3754    #[serde(rename = "connected")]
3755    Connected,
3756    #[serde(rename = "complete")]
3757    Complete,
3758    #[serde(rename = "creator")]
3759    Creator,
3760}
3761
3762#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
3763#[cfg_attr(feature = "bon", derive(::bon::Builder))]
3764#[cfg_attr(feature = "bon", builder(on(String, into)))]
3765pub struct GroupPreference {
3766    #[serde(rename = "enable")]
3767    pub enable: GroupFeatureEnabled,
3768
3769    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3770    #[cfg_attr(feature = "bon", builder(default))]
3771    pub undocumented: JsonObject,
3772}
3773
3774#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
3775#[cfg_attr(feature = "bon", derive(::bon::Builder))]
3776#[cfg_attr(feature = "bon", builder(on(String, into)))]
3777pub struct GroupPreferences {
3778    #[serde(rename = "timedMessages", skip_serializing_if = "Option::is_none")]
3779    pub timed_messages: Option<TimedMessagesGroupPreference>,
3780
3781    #[serde(rename = "directMessages", skip_serializing_if = "Option::is_none")]
3782    pub direct_messages: Option<RoleGroupPreference>,
3783
3784    #[serde(rename = "fullDelete", skip_serializing_if = "Option::is_none")]
3785    pub full_delete: Option<GroupPreference>,
3786
3787    #[serde(rename = "reactions", skip_serializing_if = "Option::is_none")]
3788    pub reactions: Option<GroupPreference>,
3789
3790    #[serde(rename = "voice", skip_serializing_if = "Option::is_none")]
3791    pub voice: Option<RoleGroupPreference>,
3792
3793    #[serde(rename = "files", skip_serializing_if = "Option::is_none")]
3794    pub files: Option<RoleGroupPreference>,
3795
3796    #[serde(rename = "simplexLinks", skip_serializing_if = "Option::is_none")]
3797    pub simplex_links: Option<RoleGroupPreference>,
3798
3799    #[serde(rename = "reports", skip_serializing_if = "Option::is_none")]
3800    pub reports: Option<GroupPreference>,
3801
3802    #[serde(rename = "history", skip_serializing_if = "Option::is_none")]
3803    pub history: Option<GroupPreference>,
3804
3805    #[serde(rename = "sessions", skip_serializing_if = "Option::is_none")]
3806    pub sessions: Option<RoleGroupPreference>,
3807
3808    #[serde(rename = "commands", skip_serializing_if = "Option::is_none")]
3809    pub commands: Option<Vec<ChatBotCommand>>,
3810
3811    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3812    #[cfg_attr(feature = "bon", builder(default))]
3813    pub undocumented: JsonObject,
3814}
3815
3816#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
3817#[cfg_attr(feature = "bon", derive(::bon::Builder))]
3818#[cfg_attr(feature = "bon", builder(on(String, into)))]
3819pub struct GroupProfile {
3820    #[serde(rename = "displayName")]
3821    pub display_name: String,
3822
3823    #[serde(rename = "fullName")]
3824    pub full_name: String,
3825
3826    #[serde(rename = "shortDescr", skip_serializing_if = "Option::is_none")]
3827    pub short_descr: Option<String>,
3828
3829    #[serde(rename = "description", skip_serializing_if = "Option::is_none")]
3830    pub description: Option<String>,
3831
3832    #[serde(rename = "image", skip_serializing_if = "Option::is_none")]
3833    pub image: Option<String>,
3834
3835    #[serde(rename = "groupPreferences", skip_serializing_if = "Option::is_none")]
3836    pub group_preferences: Option<GroupPreferences>,
3837
3838    #[serde(rename = "memberAdmission", skip_serializing_if = "Option::is_none")]
3839    pub member_admission: Option<GroupMemberAdmission>,
3840
3841    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3842    #[cfg_attr(feature = "bon", builder(default))]
3843    pub undocumented: JsonObject,
3844}
3845
3846#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
3847#[cfg_attr(feature = "bon", derive(::bon::Builder))]
3848#[cfg_attr(feature = "bon", builder(on(String, into)))]
3849pub struct GroupShortLinkData {
3850    #[serde(rename = "groupProfile")]
3851    pub group_profile: GroupProfile,
3852
3853    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3854    #[cfg_attr(feature = "bon", builder(default))]
3855    pub undocumented: JsonObject,
3856}
3857
3858#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
3859#[cfg_attr(feature = "bon", derive(::bon::Builder))]
3860#[cfg_attr(feature = "bon", builder(on(String, into)))]
3861pub struct GroupSummary {
3862    #[serde(
3863        rename = "currentMembers",
3864        deserialize_with = "deserialize_number_from_string"
3865    )]
3866    pub current_members: i32,
3867
3868    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3869    #[cfg_attr(feature = "bon", builder(default))]
3870    pub undocumented: JsonObject,
3871}
3872
3873#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
3874#[cfg_attr(feature = "bon", derive(::bon::Builder))]
3875#[cfg_attr(feature = "bon", builder(on(String, into)))]
3876pub struct GroupSupportChat {
3877    #[serde(rename = "chatTs")]
3878    pub chat_ts: UtcTime,
3879
3880    #[serde(rename = "unread", deserialize_with = "deserialize_number_from_string")]
3881    pub unread: i64,
3882
3883    #[serde(
3884        rename = "memberAttention",
3885        deserialize_with = "deserialize_number_from_string"
3886    )]
3887    pub member_attention: i64,
3888
3889    #[serde(
3890        rename = "mentions",
3891        deserialize_with = "deserialize_number_from_string"
3892    )]
3893    pub mentions: i64,
3894
3895    #[serde(
3896        rename = "lastMsgFromMemberTs",
3897        skip_serializing_if = "Option::is_none"
3898    )]
3899    pub last_msg_from_member_ts: Option<UtcTime>,
3900
3901    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3902    #[cfg_attr(feature = "bon", builder(default))]
3903    pub undocumented: JsonObject,
3904}
3905
3906#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
3907#[non_exhaustive]
3908pub enum InlineFileMode {
3909    #[default]
3910    #[serde(rename = "offer")]
3911    Offer,
3912    #[serde(rename = "sent")]
3913    Sent,
3914}
3915
3916#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
3917#[serde(tag = "type")]
3918#[non_exhaustive]
3919pub enum InvitationLinkPlan {
3920    #[serde(rename = "ok")]
3921    Ok {
3922        #[serde(rename = "contactSLinkData_", skip_serializing_if = "Option::is_none")]
3923        contact_s_link_data: Option<ContactShortLinkData>,
3924
3925        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3926        undocumented: JsonObject,
3927    },
3928    #[serde(rename = "ownLink")]
3929    OwnLink,
3930    #[serde(rename = "connecting")]
3931    Connecting {
3932        #[serde(rename = "contact_", skip_serializing_if = "Option::is_none")]
3933        contact: Option<Contact>,
3934
3935        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3936        undocumented: JsonObject,
3937    },
3938    #[serde(rename = "known")]
3939    Known {
3940        #[serde(rename = "contact")]
3941        contact: Contact,
3942
3943        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3944        undocumented: JsonObject,
3945    },
3946    #[serde(untagged)]
3947    Undocumented(JsonObject),
3948}
3949
3950impl InvitationLinkPlan {
3951    pub fn ok(contact_s_link_data: Option<ContactShortLinkData>) -> Self {
3952        Self::Ok {
3953            contact_s_link_data,
3954            undocumented: Default::default(),
3955        }
3956    }
3957
3958    pub fn own_link() -> Self {
3959        Self::OwnLink
3960    }
3961
3962    pub fn connecting(contact: Option<Contact>) -> Self {
3963        Self::Connecting {
3964            contact,
3965            undocumented: Default::default(),
3966        }
3967    }
3968
3969    pub fn known(contact: Contact) -> Self {
3970        Self::Known {
3971            contact,
3972            undocumented: Default::default(),
3973        }
3974    }
3975}
3976
3977#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
3978#[serde(tag = "type")]
3979#[non_exhaustive]
3980pub enum InvitedBy {
3981    #[serde(rename = "contact")]
3982    Contact {
3983        #[serde(
3984            rename = "byContactId",
3985            deserialize_with = "deserialize_number_from_string"
3986        )]
3987        by_contact_id: i64,
3988
3989        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
3990        undocumented: JsonObject,
3991    },
3992    #[serde(rename = "user")]
3993    User,
3994    #[serde(rename = "unknown")]
3995    Unknown,
3996    #[serde(untagged)]
3997    Undocumented(JsonObject),
3998}
3999
4000impl InvitedBy {
4001    pub fn contact(by_contact_id: i64) -> Self {
4002        Self::Contact {
4003            by_contact_id,
4004            undocumented: Default::default(),
4005        }
4006    }
4007
4008    pub fn user() -> Self {
4009        Self::User
4010    }
4011
4012    pub fn unknown() -> Self {
4013        Self::Unknown
4014    }
4015}
4016
4017#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4018#[serde(tag = "type")]
4019#[non_exhaustive]
4020pub enum LinkContent {
4021    #[serde(rename = "page")]
4022    Page,
4023    #[serde(rename = "image")]
4024    Image,
4025    #[serde(rename = "video")]
4026    Video {
4027        #[serde(
4028            rename = "duration",
4029            skip_serializing_if = "Option::is_none",
4030            deserialize_with = "deserialize_option_number_from_string",
4031            default
4032        )]
4033        duration: Option<i32>,
4034
4035        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4036        undocumented: JsonObject,
4037    },
4038    #[serde(rename = "unknown")]
4039    Unknown {
4040        #[serde(rename = "tag")]
4041        tag: String,
4042
4043        #[serde(rename = "json")]
4044        json: JsonObject,
4045
4046        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4047        undocumented: JsonObject,
4048    },
4049    #[serde(untagged)]
4050    Undocumented(JsonObject),
4051}
4052
4053impl LinkContent {
4054    pub fn page() -> Self {
4055        Self::Page
4056    }
4057
4058    pub fn image() -> Self {
4059        Self::Image
4060    }
4061
4062    pub fn video(duration: Option<i32>) -> Self {
4063        Self::Video {
4064            duration,
4065            undocumented: Default::default(),
4066        }
4067    }
4068
4069    pub fn unknown(tag: String, json: JsonObject) -> Self {
4070        Self::Unknown {
4071            tag,
4072            json,
4073            undocumented: Default::default(),
4074        }
4075    }
4076}
4077
4078#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4079#[cfg_attr(feature = "bon", derive(::bon::Builder))]
4080#[cfg_attr(feature = "bon", builder(on(String, into)))]
4081pub struct LinkPreview {
4082    #[serde(rename = "uri")]
4083    pub uri: String,
4084
4085    #[serde(rename = "title")]
4086    pub title: String,
4087
4088    #[serde(rename = "description")]
4089    pub description: String,
4090
4091    #[serde(rename = "image")]
4092    pub image: String,
4093
4094    #[serde(rename = "content", skip_serializing_if = "Option::is_none")]
4095    pub content: Option<LinkContent>,
4096
4097    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4098    #[cfg_attr(feature = "bon", builder(default))]
4099    pub undocumented: JsonObject,
4100}
4101
4102#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4103#[cfg_attr(feature = "bon", derive(::bon::Builder))]
4104#[cfg_attr(feature = "bon", builder(on(String, into)))]
4105pub struct LocalProfile {
4106    #[serde(
4107        rename = "profileId",
4108        deserialize_with = "deserialize_number_from_string"
4109    )]
4110    pub profile_id: i64,
4111
4112    #[serde(rename = "displayName")]
4113    pub display_name: String,
4114
4115    #[serde(rename = "fullName")]
4116    pub full_name: String,
4117
4118    #[serde(rename = "shortDescr", skip_serializing_if = "Option::is_none")]
4119    pub short_descr: Option<String>,
4120
4121    #[serde(rename = "image", skip_serializing_if = "Option::is_none")]
4122    pub image: Option<String>,
4123
4124    #[serde(rename = "contactLink", skip_serializing_if = "Option::is_none")]
4125    pub contact_link: Option<String>,
4126
4127    #[serde(rename = "preferences", skip_serializing_if = "Option::is_none")]
4128    pub preferences: Option<Preferences>,
4129
4130    #[serde(rename = "peerType", skip_serializing_if = "Option::is_none")]
4131    pub peer_type: Option<ChatPeerType>,
4132
4133    #[serde(rename = "localAlias")]
4134    pub local_alias: String,
4135
4136    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4137    #[cfg_attr(feature = "bon", builder(default))]
4138    pub undocumented: JsonObject,
4139}
4140
4141#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
4142#[non_exhaustive]
4143pub enum MemberCriteria {
4144    #[default]
4145    #[serde(rename = "all")]
4146    All,
4147}
4148
4149/// Connection link sent in a message - only short links are allowed.
4150#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4151#[serde(tag = "type")]
4152#[non_exhaustive]
4153pub enum MsgChatLink {
4154    #[serde(rename = "contact")]
4155    Contact {
4156        #[serde(rename = "connLink")]
4157        conn_link: String,
4158
4159        #[serde(rename = "profile")]
4160        profile: Profile,
4161
4162        #[serde(rename = "business")]
4163        business: bool,
4164
4165        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4166        undocumented: JsonObject,
4167    },
4168    #[serde(rename = "invitation")]
4169    Invitation {
4170        #[serde(rename = "invLink")]
4171        inv_link: String,
4172
4173        #[serde(rename = "profile")]
4174        profile: Profile,
4175
4176        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4177        undocumented: JsonObject,
4178    },
4179    #[serde(rename = "group")]
4180    Group {
4181        #[serde(rename = "connLink")]
4182        conn_link: String,
4183
4184        #[serde(rename = "groupProfile")]
4185        group_profile: GroupProfile,
4186
4187        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4188        undocumented: JsonObject,
4189    },
4190    #[serde(untagged)]
4191    Undocumented(JsonObject),
4192}
4193
4194impl MsgChatLink {
4195    pub fn contact(conn_link: String, profile: Profile, business: bool) -> Self {
4196        Self::Contact {
4197            conn_link,
4198            profile,
4199            business,
4200            undocumented: Default::default(),
4201        }
4202    }
4203
4204    pub fn invitation(inv_link: String, profile: Profile) -> Self {
4205        Self::Invitation {
4206            inv_link,
4207            profile,
4208            undocumented: Default::default(),
4209        }
4210    }
4211
4212    pub fn group(conn_link: String, group_profile: GroupProfile) -> Self {
4213        Self::Group {
4214            conn_link,
4215            group_profile,
4216            undocumented: Default::default(),
4217        }
4218    }
4219}
4220
4221#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4222#[serde(tag = "type")]
4223#[non_exhaustive]
4224pub enum MsgContent {
4225    #[serde(rename = "text")]
4226    Text {
4227        #[serde(rename = "text")]
4228        text: String,
4229
4230        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4231        undocumented: JsonObject,
4232    },
4233    #[serde(rename = "link")]
4234    Link {
4235        #[serde(rename = "text")]
4236        text: String,
4237
4238        #[serde(rename = "preview")]
4239        preview: LinkPreview,
4240
4241        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4242        undocumented: JsonObject,
4243    },
4244    #[serde(rename = "image")]
4245    Image {
4246        #[serde(rename = "text")]
4247        text: String,
4248
4249        #[serde(rename = "image")]
4250        image: String,
4251
4252        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4253        undocumented: JsonObject,
4254    },
4255    #[serde(rename = "video")]
4256    Video {
4257        #[serde(rename = "text")]
4258        text: String,
4259
4260        #[serde(rename = "image")]
4261        image: String,
4262
4263        #[serde(
4264            rename = "duration",
4265            deserialize_with = "deserialize_number_from_string"
4266        )]
4267        duration: i32,
4268
4269        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4270        undocumented: JsonObject,
4271    },
4272    #[serde(rename = "voice")]
4273    Voice {
4274        #[serde(rename = "text")]
4275        text: String,
4276
4277        #[serde(
4278            rename = "duration",
4279            deserialize_with = "deserialize_number_from_string"
4280        )]
4281        duration: i32,
4282
4283        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4284        undocumented: JsonObject,
4285    },
4286    #[serde(rename = "file")]
4287    File {
4288        #[serde(rename = "text")]
4289        text: String,
4290
4291        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4292        undocumented: JsonObject,
4293    },
4294    #[serde(rename = "report")]
4295    Report {
4296        #[serde(rename = "text")]
4297        text: String,
4298
4299        #[serde(rename = "reason")]
4300        reason: ReportReason,
4301
4302        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4303        undocumented: JsonObject,
4304    },
4305    #[serde(rename = "chat")]
4306    Chat {
4307        #[serde(rename = "text")]
4308        text: String,
4309
4310        #[serde(rename = "chatLink")]
4311        chat_link: MsgChatLink,
4312
4313        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4314        undocumented: JsonObject,
4315    },
4316    #[serde(rename = "unknown")]
4317    Unknown {
4318        #[serde(rename = "tag")]
4319        tag: String,
4320
4321        #[serde(rename = "text")]
4322        text: String,
4323
4324        #[serde(rename = "json")]
4325        json: JsonObject,
4326
4327        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4328        undocumented: JsonObject,
4329    },
4330    #[serde(untagged)]
4331    Undocumented(JsonObject),
4332}
4333
4334impl MsgContent {
4335    pub fn text(text: String) -> Self {
4336        Self::Text {
4337            text,
4338            undocumented: Default::default(),
4339        }
4340    }
4341
4342    pub fn link(text: String, preview: LinkPreview) -> Self {
4343        Self::Link {
4344            text,
4345            preview,
4346            undocumented: Default::default(),
4347        }
4348    }
4349
4350    pub fn image(text: String, image: String) -> Self {
4351        Self::Image {
4352            text,
4353            image,
4354            undocumented: Default::default(),
4355        }
4356    }
4357
4358    pub fn video(text: String, image: String, duration: i32) -> Self {
4359        Self::Video {
4360            text,
4361            image,
4362            duration,
4363            undocumented: Default::default(),
4364        }
4365    }
4366
4367    pub fn voice(text: String, duration: i32) -> Self {
4368        Self::Voice {
4369            text,
4370            duration,
4371            undocumented: Default::default(),
4372        }
4373    }
4374
4375    pub fn file(text: String) -> Self {
4376        Self::File {
4377            text,
4378            undocumented: Default::default(),
4379        }
4380    }
4381
4382    pub fn report(text: String, reason: ReportReason) -> Self {
4383        Self::Report {
4384            text,
4385            reason,
4386            undocumented: Default::default(),
4387        }
4388    }
4389
4390    pub fn chat(text: String, chat_link: MsgChatLink) -> Self {
4391        Self::Chat {
4392            text,
4393            chat_link,
4394            undocumented: Default::default(),
4395        }
4396    }
4397
4398    pub fn unknown(tag: String, text: String, json: JsonObject) -> Self {
4399        Self::Unknown {
4400            tag,
4401            text,
4402            json,
4403            undocumented: Default::default(),
4404        }
4405    }
4406}
4407
4408#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
4409#[non_exhaustive]
4410pub enum MsgDirection {
4411    #[default]
4412    #[serde(rename = "rcv")]
4413    Rcv,
4414    #[serde(rename = "snd")]
4415    Snd,
4416}
4417
4418#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
4419#[non_exhaustive]
4420pub enum MsgFilter {
4421    #[default]
4422    #[serde(rename = "none")]
4423    None,
4424    #[serde(rename = "all")]
4425    All,
4426    #[serde(rename = "mentions")]
4427    Mentions,
4428}
4429
4430#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4431#[serde(tag = "type")]
4432#[non_exhaustive]
4433pub enum MsgReaction {
4434    #[serde(rename = "emoji")]
4435    Emoji {
4436        #[serde(rename = "emoji")]
4437        emoji: String,
4438
4439        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4440        undocumented: JsonObject,
4441    },
4442    #[serde(rename = "unknown")]
4443    Unknown {
4444        #[serde(rename = "tag")]
4445        tag: String,
4446
4447        #[serde(rename = "json")]
4448        json: JsonObject,
4449
4450        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4451        undocumented: JsonObject,
4452    },
4453    #[serde(untagged)]
4454    Undocumented(JsonObject),
4455}
4456
4457impl MsgReaction {
4458    pub fn emoji(emoji: String) -> Self {
4459        Self::Emoji {
4460            emoji,
4461            undocumented: Default::default(),
4462        }
4463    }
4464
4465    pub fn unknown(tag: String, json: JsonObject) -> Self {
4466        Self::Unknown {
4467            tag,
4468            json,
4469            undocumented: Default::default(),
4470        }
4471    }
4472}
4473
4474#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
4475#[non_exhaustive]
4476pub enum MsgReceiptStatus {
4477    #[default]
4478    #[serde(rename = "ok")]
4479    Ok,
4480    #[serde(rename = "badMsgHash")]
4481    BadMsgHash,
4482}
4483
4484#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4485#[cfg_attr(feature = "bon", derive(::bon::Builder))]
4486#[cfg_attr(feature = "bon", builder(on(String, into)))]
4487pub struct NewUser {
4488    #[serde(rename = "profile", skip_serializing_if = "Option::is_none")]
4489    pub profile: Option<Profile>,
4490
4491    #[serde(rename = "pastTimestamp")]
4492    pub past_timestamp: bool,
4493
4494    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4495    #[cfg_attr(feature = "bon", builder(default))]
4496    pub undocumented: JsonObject,
4497}
4498
4499#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4500#[cfg_attr(feature = "bon", derive(::bon::Builder))]
4501#[cfg_attr(feature = "bon", builder(on(String, into)))]
4502pub struct NoteFolder {
4503    #[serde(
4504        rename = "noteFolderId",
4505        deserialize_with = "deserialize_number_from_string"
4506    )]
4507    pub note_folder_id: i64,
4508
4509    #[serde(rename = "userId", deserialize_with = "deserialize_number_from_string")]
4510    pub user_id: i64,
4511
4512    #[serde(rename = "createdAt")]
4513    pub created_at: UtcTime,
4514
4515    #[serde(rename = "updatedAt")]
4516    pub updated_at: UtcTime,
4517
4518    #[serde(rename = "chatTs")]
4519    pub chat_ts: UtcTime,
4520
4521    #[serde(rename = "favorite")]
4522    pub favorite: bool,
4523
4524    #[serde(rename = "unread")]
4525    pub unread: bool,
4526
4527    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4528    #[cfg_attr(feature = "bon", builder(default))]
4529    pub undocumented: JsonObject,
4530}
4531
4532#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4533#[cfg_attr(feature = "bon", derive(::bon::Builder))]
4534#[cfg_attr(feature = "bon", builder(on(String, into)))]
4535pub struct PendingContactConnection {
4536    #[serde(
4537        rename = "pccConnId",
4538        deserialize_with = "deserialize_number_from_string"
4539    )]
4540    pub pcc_conn_id: i64,
4541
4542    #[serde(rename = "pccAgentConnId")]
4543    pub pcc_agent_conn_id: String,
4544
4545    #[serde(rename = "pccConnStatus")]
4546    pub pcc_conn_status: ConnStatus,
4547
4548    #[serde(rename = "viaContactUri")]
4549    pub via_contact_uri: bool,
4550
4551    #[serde(
4552        rename = "viaUserContactLink",
4553        skip_serializing_if = "Option::is_none",
4554        deserialize_with = "deserialize_option_number_from_string",
4555        default
4556    )]
4557    pub via_user_contact_link: Option<i64>,
4558
4559    #[serde(rename = "groupLinkId", skip_serializing_if = "Option::is_none")]
4560    pub group_link_id: Option<String>,
4561
4562    #[serde(
4563        rename = "customUserProfileId",
4564        skip_serializing_if = "Option::is_none",
4565        deserialize_with = "deserialize_option_number_from_string",
4566        default
4567    )]
4568    pub custom_user_profile_id: Option<i64>,
4569
4570    #[serde(rename = "connLinkInv", skip_serializing_if = "Option::is_none")]
4571    pub conn_link_inv: Option<CreatedConnLink>,
4572
4573    #[serde(rename = "localAlias")]
4574    pub local_alias: String,
4575
4576    #[serde(rename = "createdAt")]
4577    pub created_at: UtcTime,
4578
4579    #[serde(rename = "updatedAt")]
4580    pub updated_at: UtcTime,
4581
4582    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4583    #[cfg_attr(feature = "bon", builder(default))]
4584    pub undocumented: JsonObject,
4585}
4586
4587#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4588#[cfg_attr(feature = "bon", derive(::bon::Builder))]
4589#[cfg_attr(feature = "bon", builder(on(String, into)))]
4590pub struct PrefEnabled {
4591    #[serde(rename = "forUser")]
4592    pub for_user: bool,
4593
4594    #[serde(rename = "forContact")]
4595    pub for_contact: bool,
4596
4597    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4598    #[cfg_attr(feature = "bon", builder(default))]
4599    pub undocumented: JsonObject,
4600}
4601
4602#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4603#[cfg_attr(feature = "bon", derive(::bon::Builder))]
4604#[cfg_attr(feature = "bon", builder(on(String, into)))]
4605pub struct Preferences {
4606    #[serde(rename = "timedMessages", skip_serializing_if = "Option::is_none")]
4607    pub timed_messages: Option<TimedMessagesPreference>,
4608
4609    #[serde(rename = "fullDelete", skip_serializing_if = "Option::is_none")]
4610    pub full_delete: Option<SimplePreference>,
4611
4612    #[serde(rename = "reactions", skip_serializing_if = "Option::is_none")]
4613    pub reactions: Option<SimplePreference>,
4614
4615    #[serde(rename = "voice", skip_serializing_if = "Option::is_none")]
4616    pub voice: Option<SimplePreference>,
4617
4618    #[serde(rename = "files", skip_serializing_if = "Option::is_none")]
4619    pub files: Option<SimplePreference>,
4620
4621    #[serde(rename = "calls", skip_serializing_if = "Option::is_none")]
4622    pub calls: Option<SimplePreference>,
4623
4624    #[serde(rename = "sessions", skip_serializing_if = "Option::is_none")]
4625    pub sessions: Option<SimplePreference>,
4626
4627    #[serde(rename = "commands", skip_serializing_if = "Option::is_none")]
4628    pub commands: Option<Vec<ChatBotCommand>>,
4629
4630    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4631    #[cfg_attr(feature = "bon", builder(default))]
4632    pub undocumented: JsonObject,
4633}
4634
4635#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4636#[cfg_attr(feature = "bon", derive(::bon::Builder))]
4637#[cfg_attr(feature = "bon", builder(on(String, into)))]
4638pub struct PreparedContact {
4639    #[serde(rename = "connLinkToConnect")]
4640    pub conn_link_to_connect: CreatedConnLink,
4641
4642    #[serde(rename = "uiConnLinkType")]
4643    pub ui_conn_link_type: ConnectionMode,
4644
4645    #[serde(rename = "welcomeSharedMsgId", skip_serializing_if = "Option::is_none")]
4646    pub welcome_shared_msg_id: Option<String>,
4647
4648    #[serde(rename = "requestSharedMsgId", skip_serializing_if = "Option::is_none")]
4649    pub request_shared_msg_id: Option<String>,
4650
4651    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4652    #[cfg_attr(feature = "bon", builder(default))]
4653    pub undocumented: JsonObject,
4654}
4655
4656#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4657#[cfg_attr(feature = "bon", derive(::bon::Builder))]
4658#[cfg_attr(feature = "bon", builder(on(String, into)))]
4659pub struct PreparedGroup {
4660    #[serde(rename = "connLinkToConnect")]
4661    pub conn_link_to_connect: CreatedConnLink,
4662
4663    #[serde(rename = "connLinkPreparedConnection")]
4664    pub conn_link_prepared_connection: bool,
4665
4666    #[serde(rename = "connLinkStartedConnection")]
4667    pub conn_link_started_connection: bool,
4668
4669    #[serde(rename = "welcomeSharedMsgId", skip_serializing_if = "Option::is_none")]
4670    pub welcome_shared_msg_id: Option<String>,
4671
4672    #[serde(rename = "requestSharedMsgId", skip_serializing_if = "Option::is_none")]
4673    pub request_shared_msg_id: Option<String>,
4674
4675    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4676    #[cfg_attr(feature = "bon", builder(default))]
4677    pub undocumented: JsonObject,
4678}
4679
4680#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4681#[cfg_attr(feature = "bon", derive(::bon::Builder))]
4682#[cfg_attr(feature = "bon", builder(on(String, into)))]
4683pub struct Profile {
4684    #[serde(rename = "displayName")]
4685    pub display_name: String,
4686
4687    #[serde(rename = "fullName")]
4688    pub full_name: String,
4689
4690    #[serde(rename = "shortDescr", skip_serializing_if = "Option::is_none")]
4691    pub short_descr: Option<String>,
4692
4693    #[serde(rename = "image", skip_serializing_if = "Option::is_none")]
4694    pub image: Option<String>,
4695
4696    #[serde(rename = "contactLink", skip_serializing_if = "Option::is_none")]
4697    pub contact_link: Option<String>,
4698
4699    #[serde(rename = "preferences", skip_serializing_if = "Option::is_none")]
4700    pub preferences: Option<Preferences>,
4701
4702    #[serde(rename = "peerType", skip_serializing_if = "Option::is_none")]
4703    pub peer_type: Option<ChatPeerType>,
4704
4705    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4706    #[cfg_attr(feature = "bon", builder(default))]
4707    pub undocumented: JsonObject,
4708}
4709
4710#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
4711#[non_exhaustive]
4712pub enum RatchetSyncState {
4713    #[default]
4714    #[serde(rename = "ok")]
4715    Ok,
4716    #[serde(rename = "allowed")]
4717    Allowed,
4718    #[serde(rename = "required")]
4719    Required,
4720    #[serde(rename = "started")]
4721    Started,
4722    #[serde(rename = "agreed")]
4723    Agreed,
4724}
4725
4726#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4727#[serde(tag = "type")]
4728#[non_exhaustive]
4729pub enum RcvConnEvent {
4730    #[serde(rename = "switchQueue")]
4731    SwitchQueue {
4732        #[serde(rename = "phase")]
4733        phase: SwitchPhase,
4734
4735        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4736        undocumented: JsonObject,
4737    },
4738    #[serde(rename = "ratchetSync")]
4739    RatchetSync {
4740        #[serde(rename = "syncStatus")]
4741        sync_status: RatchetSyncState,
4742
4743        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4744        undocumented: JsonObject,
4745    },
4746    #[serde(rename = "verificationCodeReset")]
4747    VerificationCodeReset,
4748    #[serde(rename = "pqEnabled")]
4749    PqEnabled {
4750        #[serde(rename = "enabled")]
4751        enabled: bool,
4752
4753        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4754        undocumented: JsonObject,
4755    },
4756    #[serde(untagged)]
4757    Undocumented(JsonObject),
4758}
4759
4760impl RcvConnEvent {
4761    pub fn switch_queue(phase: SwitchPhase) -> Self {
4762        Self::SwitchQueue {
4763            phase,
4764            undocumented: Default::default(),
4765        }
4766    }
4767
4768    pub fn ratchet_sync(sync_status: RatchetSyncState) -> Self {
4769        Self::RatchetSync {
4770            sync_status,
4771            undocumented: Default::default(),
4772        }
4773    }
4774
4775    pub fn verification_code_reset() -> Self {
4776        Self::VerificationCodeReset
4777    }
4778
4779    pub fn pq_enabled(enabled: bool) -> Self {
4780        Self::PqEnabled {
4781            enabled,
4782            undocumented: Default::default(),
4783        }
4784    }
4785}
4786
4787#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4788#[serde(tag = "type")]
4789#[non_exhaustive]
4790pub enum RcvDirectEvent {
4791    #[serde(rename = "contactDeleted")]
4792    ContactDeleted,
4793    #[serde(rename = "profileUpdated")]
4794    ProfileUpdated {
4795        #[serde(rename = "fromProfile")]
4796        from_profile: Profile,
4797
4798        #[serde(rename = "toProfile")]
4799        to_profile: Profile,
4800
4801        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4802        undocumented: JsonObject,
4803    },
4804    #[serde(rename = "groupInvLinkReceived")]
4805    GroupInvLinkReceived {
4806        #[serde(rename = "groupProfile")]
4807        group_profile: GroupProfile,
4808
4809        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4810        undocumented: JsonObject,
4811    },
4812    #[serde(untagged)]
4813    Undocumented(JsonObject),
4814}
4815
4816impl RcvDirectEvent {
4817    pub fn contact_deleted() -> Self {
4818        Self::ContactDeleted
4819    }
4820
4821    pub fn profile_updated(from_profile: Profile, to_profile: Profile) -> Self {
4822        Self::ProfileUpdated {
4823            from_profile,
4824            to_profile,
4825            undocumented: Default::default(),
4826        }
4827    }
4828
4829    pub fn group_inv_link_received(group_profile: GroupProfile) -> Self {
4830        Self::GroupInvLinkReceived {
4831            group_profile,
4832            undocumented: Default::default(),
4833        }
4834    }
4835}
4836
4837#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4838#[cfg_attr(feature = "bon", derive(::bon::Builder))]
4839#[cfg_attr(feature = "bon", builder(on(String, into)))]
4840pub struct RcvFileDescr {
4841    #[serde(
4842        rename = "fileDescrId",
4843        deserialize_with = "deserialize_number_from_string"
4844    )]
4845    pub file_descr_id: i64,
4846
4847    #[serde(rename = "fileDescrText")]
4848    pub file_descr_text: String,
4849
4850    #[serde(
4851        rename = "fileDescrPartNo",
4852        deserialize_with = "deserialize_number_from_string"
4853    )]
4854    pub file_descr_part_no: i32,
4855
4856    #[serde(rename = "fileDescrComplete")]
4857    pub file_descr_complete: bool,
4858
4859    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4860    #[cfg_attr(feature = "bon", builder(default))]
4861    pub undocumented: JsonObject,
4862}
4863
4864#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4865#[cfg_attr(feature = "bon", derive(::bon::Builder))]
4866#[cfg_attr(feature = "bon", builder(on(String, into)))]
4867pub struct RcvFileInfo {
4868    #[serde(rename = "filePath")]
4869    pub file_path: String,
4870
4871    #[serde(
4872        rename = "connId",
4873        skip_serializing_if = "Option::is_none",
4874        deserialize_with = "deserialize_option_number_from_string",
4875        default
4876    )]
4877    pub conn_id: Option<i64>,
4878
4879    #[serde(rename = "agentConnId", skip_serializing_if = "Option::is_none")]
4880    pub agent_conn_id: Option<String>,
4881
4882    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4883    #[cfg_attr(feature = "bon", builder(default))]
4884    pub undocumented: JsonObject,
4885}
4886
4887#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4888#[serde(tag = "type")]
4889#[non_exhaustive]
4890pub enum RcvFileStatus {
4891    #[serde(rename = "new")]
4892    New,
4893    #[serde(rename = "accepted")]
4894    Accepted {
4895        #[serde(rename = "fileInfo")]
4896        file_info: RcvFileInfo,
4897
4898        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4899        undocumented: JsonObject,
4900    },
4901    #[serde(rename = "connected")]
4902    Connected {
4903        #[serde(rename = "fileInfo")]
4904        file_info: RcvFileInfo,
4905
4906        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4907        undocumented: JsonObject,
4908    },
4909    #[serde(rename = "complete")]
4910    Complete {
4911        #[serde(rename = "fileInfo")]
4912        file_info: RcvFileInfo,
4913
4914        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4915        undocumented: JsonObject,
4916    },
4917    #[serde(rename = "cancelled")]
4918    Cancelled {
4919        #[serde(rename = "fileInfo_", skip_serializing_if = "Option::is_none")]
4920        file_info: Option<RcvFileInfo>,
4921
4922        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
4923        undocumented: JsonObject,
4924    },
4925    #[serde(untagged)]
4926    Undocumented(JsonObject),
4927}
4928
4929impl RcvFileStatus {
4930    pub fn new() -> Self {
4931        Self::New
4932    }
4933
4934    pub fn accepted(file_info: RcvFileInfo) -> Self {
4935        Self::Accepted {
4936            file_info,
4937            undocumented: Default::default(),
4938        }
4939    }
4940
4941    pub fn connected(file_info: RcvFileInfo) -> Self {
4942        Self::Connected {
4943            file_info,
4944            undocumented: Default::default(),
4945        }
4946    }
4947
4948    pub fn complete(file_info: RcvFileInfo) -> Self {
4949        Self::Complete {
4950            file_info,
4951            undocumented: Default::default(),
4952        }
4953    }
4954
4955    pub fn cancelled(file_info: Option<RcvFileInfo>) -> Self {
4956        Self::Cancelled {
4957            file_info,
4958            undocumented: Default::default(),
4959        }
4960    }
4961}
4962
4963#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4964#[cfg_attr(feature = "bon", derive(::bon::Builder))]
4965#[cfg_attr(feature = "bon", builder(on(String, into)))]
4966pub struct RcvFileTransfer {
4967    #[serde(rename = "fileId", deserialize_with = "deserialize_number_from_string")]
4968    pub file_id: i64,
4969
4970    #[serde(rename = "xftpRcvFile", skip_serializing_if = "Option::is_none")]
4971    pub xftp_rcv_file: Option<XFTPRcvFile>,
4972
4973    #[serde(rename = "fileInvitation")]
4974    pub file_invitation: FileInvitation,
4975
4976    #[serde(rename = "fileStatus")]
4977    pub file_status: RcvFileStatus,
4978
4979    #[serde(rename = "rcvFileInline", skip_serializing_if = "Option::is_none")]
4980    pub rcv_file_inline: Option<InlineFileMode>,
4981
4982    #[serde(rename = "senderDisplayName")]
4983    pub sender_display_name: String,
4984
4985    #[serde(
4986        rename = "chunkSize",
4987        deserialize_with = "deserialize_number_from_string"
4988    )]
4989    pub chunk_size: i64,
4990
4991    #[serde(rename = "cancelled")]
4992    pub cancelled: bool,
4993
4994    #[serde(
4995        rename = "grpMemberId",
4996        skip_serializing_if = "Option::is_none",
4997        deserialize_with = "deserialize_option_number_from_string",
4998        default
4999    )]
5000    pub grp_member_id: Option<i64>,
5001
5002    #[serde(rename = "cryptoArgs", skip_serializing_if = "Option::is_none")]
5003    pub crypto_args: Option<CryptoFileArgs>,
5004
5005    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5006    #[cfg_attr(feature = "bon", builder(default))]
5007    pub undocumented: JsonObject,
5008}
5009
5010#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5011#[serde(tag = "type")]
5012#[non_exhaustive]
5013pub enum RcvGroupEvent {
5014    #[serde(rename = "memberAdded")]
5015    MemberAdded {
5016        #[serde(
5017            rename = "groupMemberId",
5018            deserialize_with = "deserialize_number_from_string"
5019        )]
5020        group_member_id: i64,
5021
5022        #[serde(rename = "profile")]
5023        profile: Profile,
5024
5025        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5026        undocumented: JsonObject,
5027    },
5028    #[serde(rename = "memberConnected")]
5029    MemberConnected,
5030    #[serde(rename = "memberAccepted")]
5031    MemberAccepted {
5032        #[serde(
5033            rename = "groupMemberId",
5034            deserialize_with = "deserialize_number_from_string"
5035        )]
5036        group_member_id: i64,
5037
5038        #[serde(rename = "profile")]
5039        profile: Profile,
5040
5041        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5042        undocumented: JsonObject,
5043    },
5044    #[serde(rename = "userAccepted")]
5045    UserAccepted,
5046    #[serde(rename = "memberLeft")]
5047    MemberLeft,
5048    #[serde(rename = "memberRole")]
5049    MemberRole {
5050        #[serde(
5051            rename = "groupMemberId",
5052            deserialize_with = "deserialize_number_from_string"
5053        )]
5054        group_member_id: i64,
5055
5056        #[serde(rename = "profile")]
5057        profile: Profile,
5058
5059        #[serde(rename = "role")]
5060        role: GroupMemberRole,
5061
5062        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5063        undocumented: JsonObject,
5064    },
5065    #[serde(rename = "memberBlocked")]
5066    MemberBlocked {
5067        #[serde(
5068            rename = "groupMemberId",
5069            deserialize_with = "deserialize_number_from_string"
5070        )]
5071        group_member_id: i64,
5072
5073        #[serde(rename = "profile")]
5074        profile: Profile,
5075
5076        #[serde(rename = "blocked")]
5077        blocked: bool,
5078
5079        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5080        undocumented: JsonObject,
5081    },
5082    #[serde(rename = "userRole")]
5083    UserRole {
5084        #[serde(rename = "role")]
5085        role: GroupMemberRole,
5086
5087        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5088        undocumented: JsonObject,
5089    },
5090    #[serde(rename = "memberDeleted")]
5091    MemberDeleted {
5092        #[serde(
5093            rename = "groupMemberId",
5094            deserialize_with = "deserialize_number_from_string"
5095        )]
5096        group_member_id: i64,
5097
5098        #[serde(rename = "profile")]
5099        profile: Profile,
5100
5101        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5102        undocumented: JsonObject,
5103    },
5104    #[serde(rename = "userDeleted")]
5105    UserDeleted,
5106    #[serde(rename = "groupDeleted")]
5107    GroupDeleted,
5108    #[serde(rename = "groupUpdated")]
5109    GroupUpdated {
5110        #[serde(rename = "groupProfile")]
5111        group_profile: GroupProfile,
5112
5113        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5114        undocumented: JsonObject,
5115    },
5116    #[serde(rename = "invitedViaGroupLink")]
5117    InvitedViaGroupLink,
5118    #[serde(rename = "memberCreatedContact")]
5119    MemberCreatedContact,
5120    #[serde(rename = "memberProfileUpdated")]
5121    MemberProfileUpdated {
5122        #[serde(rename = "fromProfile")]
5123        from_profile: Profile,
5124
5125        #[serde(rename = "toProfile")]
5126        to_profile: Profile,
5127
5128        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5129        undocumented: JsonObject,
5130    },
5131    #[serde(rename = "newMemberPendingReview")]
5132    NewMemberPendingReview,
5133    #[serde(untagged)]
5134    Undocumented(JsonObject),
5135}
5136
5137impl RcvGroupEvent {
5138    pub fn member_added(group_member_id: i64, profile: Profile) -> Self {
5139        Self::MemberAdded {
5140            group_member_id,
5141            profile,
5142            undocumented: Default::default(),
5143        }
5144    }
5145
5146    pub fn member_connected() -> Self {
5147        Self::MemberConnected
5148    }
5149
5150    pub fn member_accepted(group_member_id: i64, profile: Profile) -> Self {
5151        Self::MemberAccepted {
5152            group_member_id,
5153            profile,
5154            undocumented: Default::default(),
5155        }
5156    }
5157
5158    pub fn user_accepted() -> Self {
5159        Self::UserAccepted
5160    }
5161
5162    pub fn member_left() -> Self {
5163        Self::MemberLeft
5164    }
5165
5166    pub fn member_role(group_member_id: i64, profile: Profile, role: GroupMemberRole) -> Self {
5167        Self::MemberRole {
5168            group_member_id,
5169            profile,
5170            role,
5171            undocumented: Default::default(),
5172        }
5173    }
5174
5175    pub fn member_blocked(group_member_id: i64, profile: Profile, blocked: bool) -> Self {
5176        Self::MemberBlocked {
5177            group_member_id,
5178            profile,
5179            blocked,
5180            undocumented: Default::default(),
5181        }
5182    }
5183
5184    pub fn user_role(role: GroupMemberRole) -> Self {
5185        Self::UserRole {
5186            role,
5187            undocumented: Default::default(),
5188        }
5189    }
5190
5191    pub fn member_deleted(group_member_id: i64, profile: Profile) -> Self {
5192        Self::MemberDeleted {
5193            group_member_id,
5194            profile,
5195            undocumented: Default::default(),
5196        }
5197    }
5198
5199    pub fn user_deleted() -> Self {
5200        Self::UserDeleted
5201    }
5202
5203    pub fn group_deleted() -> Self {
5204        Self::GroupDeleted
5205    }
5206
5207    pub fn group_updated(group_profile: GroupProfile) -> Self {
5208        Self::GroupUpdated {
5209            group_profile,
5210            undocumented: Default::default(),
5211        }
5212    }
5213
5214    pub fn invited_via_group_link() -> Self {
5215        Self::InvitedViaGroupLink
5216    }
5217
5218    pub fn member_created_contact() -> Self {
5219        Self::MemberCreatedContact
5220    }
5221
5222    pub fn member_profile_updated(from_profile: Profile, to_profile: Profile) -> Self {
5223        Self::MemberProfileUpdated {
5224            from_profile,
5225            to_profile,
5226            undocumented: Default::default(),
5227        }
5228    }
5229
5230    pub fn new_member_pending_review() -> Self {
5231        Self::NewMemberPendingReview
5232    }
5233}
5234
5235#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
5236#[non_exhaustive]
5237pub enum ReportReason {
5238    #[default]
5239    #[serde(rename = "spam")]
5240    Spam,
5241    #[serde(rename = "content")]
5242    Content,
5243    #[serde(rename = "community")]
5244    Community,
5245    #[serde(rename = "profile")]
5246    Profile,
5247    #[serde(rename = "other")]
5248    Other,
5249}
5250
5251#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5252#[cfg_attr(feature = "bon", derive(::bon::Builder))]
5253#[cfg_attr(feature = "bon", builder(on(String, into)))]
5254pub struct RoleGroupPreference {
5255    #[serde(rename = "enable")]
5256    pub enable: GroupFeatureEnabled,
5257
5258    #[serde(rename = "role", skip_serializing_if = "Option::is_none")]
5259    pub role: Option<GroupMemberRole>,
5260
5261    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5262    #[cfg_attr(feature = "bon", builder(default))]
5263    pub undocumented: JsonObject,
5264}
5265
5266#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5267#[cfg_attr(feature = "bon", derive(::bon::Builder))]
5268#[cfg_attr(feature = "bon", builder(on(String, into)))]
5269pub struct SecurityCode {
5270    #[serde(rename = "securityCode")]
5271    pub security_code: String,
5272
5273    #[serde(rename = "verifiedAt")]
5274    pub verified_at: UtcTime,
5275
5276    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5277    #[cfg_attr(feature = "bon", builder(default))]
5278    pub undocumented: JsonObject,
5279}
5280
5281#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5282#[cfg_attr(feature = "bon", derive(::bon::Builder))]
5283#[cfg_attr(feature = "bon", builder(on(String, into)))]
5284pub struct SimplePreference {
5285    #[serde(rename = "allow")]
5286    pub allow: FeatureAllowed,
5287
5288    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5289    #[cfg_attr(feature = "bon", builder(default))]
5290    pub undocumented: JsonObject,
5291}
5292
5293#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
5294#[non_exhaustive]
5295pub enum SimplexLinkType {
5296    #[default]
5297    #[serde(rename = "contact")]
5298    Contact,
5299    #[serde(rename = "invitation")]
5300    Invitation,
5301    #[serde(rename = "group")]
5302    Group,
5303    #[serde(rename = "channel")]
5304    Channel,
5305    #[serde(rename = "relay")]
5306    Relay,
5307}
5308
5309#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
5310#[non_exhaustive]
5311pub enum SndCIStatusProgress {
5312    #[default]
5313    #[serde(rename = "partial")]
5314    Partial,
5315    #[serde(rename = "complete")]
5316    Complete,
5317}
5318
5319#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5320#[serde(tag = "type")]
5321#[non_exhaustive]
5322pub enum SndConnEvent {
5323    #[serde(rename = "switchQueue")]
5324    SwitchQueue {
5325        #[serde(rename = "phase")]
5326        phase: SwitchPhase,
5327
5328        #[serde(rename = "member", skip_serializing_if = "Option::is_none")]
5329        member: Option<GroupMemberRef>,
5330
5331        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5332        undocumented: JsonObject,
5333    },
5334    #[serde(rename = "ratchetSync")]
5335    RatchetSync {
5336        #[serde(rename = "syncStatus")]
5337        sync_status: RatchetSyncState,
5338
5339        #[serde(rename = "member", skip_serializing_if = "Option::is_none")]
5340        member: Option<GroupMemberRef>,
5341
5342        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5343        undocumented: JsonObject,
5344    },
5345    #[serde(rename = "pqEnabled")]
5346    PqEnabled {
5347        #[serde(rename = "enabled")]
5348        enabled: bool,
5349
5350        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5351        undocumented: JsonObject,
5352    },
5353    #[serde(untagged)]
5354    Undocumented(JsonObject),
5355}
5356
5357impl SndConnEvent {
5358    pub fn switch_queue(phase: SwitchPhase, member: Option<GroupMemberRef>) -> Self {
5359        Self::SwitchQueue {
5360            phase,
5361            member,
5362            undocumented: Default::default(),
5363        }
5364    }
5365
5366    pub fn ratchet_sync(sync_status: RatchetSyncState, member: Option<GroupMemberRef>) -> Self {
5367        Self::RatchetSync {
5368            sync_status,
5369            member,
5370            undocumented: Default::default(),
5371        }
5372    }
5373
5374    pub fn pq_enabled(enabled: bool) -> Self {
5375        Self::PqEnabled {
5376            enabled,
5377            undocumented: Default::default(),
5378        }
5379    }
5380}
5381
5382#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5383#[cfg_attr(feature = "bon", derive(::bon::Builder))]
5384#[cfg_attr(feature = "bon", builder(on(String, into)))]
5385pub struct SndFileTransfer {
5386    #[serde(rename = "fileId", deserialize_with = "deserialize_number_from_string")]
5387    pub file_id: i64,
5388
5389    #[serde(rename = "fileName")]
5390    pub file_name: String,
5391
5392    #[serde(rename = "filePath")]
5393    pub file_path: String,
5394
5395    #[serde(
5396        rename = "fileSize",
5397        deserialize_with = "deserialize_number_from_string"
5398    )]
5399    pub file_size: i64,
5400
5401    #[serde(
5402        rename = "chunkSize",
5403        deserialize_with = "deserialize_number_from_string"
5404    )]
5405    pub chunk_size: i64,
5406
5407    #[serde(rename = "recipientDisplayName")]
5408    pub recipient_display_name: String,
5409
5410    #[serde(rename = "connId", deserialize_with = "deserialize_number_from_string")]
5411    pub conn_id: i64,
5412
5413    #[serde(rename = "agentConnId")]
5414    pub agent_conn_id: String,
5415
5416    #[serde(
5417        rename = "groupMemberId",
5418        skip_serializing_if = "Option::is_none",
5419        deserialize_with = "deserialize_option_number_from_string",
5420        default
5421    )]
5422    pub group_member_id: Option<i64>,
5423
5424    #[serde(rename = "fileStatus")]
5425    pub file_status: FileStatus,
5426
5427    #[serde(
5428        rename = "fileDescrId",
5429        skip_serializing_if = "Option::is_none",
5430        deserialize_with = "deserialize_option_number_from_string",
5431        default
5432    )]
5433    pub file_descr_id: Option<i64>,
5434
5435    #[serde(rename = "fileInline", skip_serializing_if = "Option::is_none")]
5436    pub file_inline: Option<InlineFileMode>,
5437
5438    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5439    #[cfg_attr(feature = "bon", builder(default))]
5440    pub undocumented: JsonObject,
5441}
5442
5443#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5444#[serde(tag = "type")]
5445#[non_exhaustive]
5446pub enum SndGroupEvent {
5447    #[serde(rename = "memberRole")]
5448    MemberRole {
5449        #[serde(
5450            rename = "groupMemberId",
5451            deserialize_with = "deserialize_number_from_string"
5452        )]
5453        group_member_id: i64,
5454
5455        #[serde(rename = "profile")]
5456        profile: Profile,
5457
5458        #[serde(rename = "role")]
5459        role: GroupMemberRole,
5460
5461        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5462        undocumented: JsonObject,
5463    },
5464    #[serde(rename = "memberBlocked")]
5465    MemberBlocked {
5466        #[serde(
5467            rename = "groupMemberId",
5468            deserialize_with = "deserialize_number_from_string"
5469        )]
5470        group_member_id: i64,
5471
5472        #[serde(rename = "profile")]
5473        profile: Profile,
5474
5475        #[serde(rename = "blocked")]
5476        blocked: bool,
5477
5478        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5479        undocumented: JsonObject,
5480    },
5481    #[serde(rename = "userRole")]
5482    UserRole {
5483        #[serde(rename = "role")]
5484        role: GroupMemberRole,
5485
5486        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5487        undocumented: JsonObject,
5488    },
5489    #[serde(rename = "memberDeleted")]
5490    MemberDeleted {
5491        #[serde(
5492            rename = "groupMemberId",
5493            deserialize_with = "deserialize_number_from_string"
5494        )]
5495        group_member_id: i64,
5496
5497        #[serde(rename = "profile")]
5498        profile: Profile,
5499
5500        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5501        undocumented: JsonObject,
5502    },
5503    #[serde(rename = "userLeft")]
5504    UserLeft,
5505    #[serde(rename = "groupUpdated")]
5506    GroupUpdated {
5507        #[serde(rename = "groupProfile")]
5508        group_profile: GroupProfile,
5509
5510        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5511        undocumented: JsonObject,
5512    },
5513    #[serde(rename = "memberAccepted")]
5514    MemberAccepted {
5515        #[serde(
5516            rename = "groupMemberId",
5517            deserialize_with = "deserialize_number_from_string"
5518        )]
5519        group_member_id: i64,
5520
5521        #[serde(rename = "profile")]
5522        profile: Profile,
5523
5524        #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5525        undocumented: JsonObject,
5526    },
5527    #[serde(rename = "userPendingReview")]
5528    UserPendingReview,
5529    #[serde(untagged)]
5530    Undocumented(JsonObject),
5531}
5532
5533impl SndGroupEvent {
5534    pub fn member_role(group_member_id: i64, profile: Profile, role: GroupMemberRole) -> Self {
5535        Self::MemberRole {
5536            group_member_id,
5537            profile,
5538            role,
5539            undocumented: Default::default(),
5540        }
5541    }
5542
5543    pub fn member_blocked(group_member_id: i64, profile: Profile, blocked: bool) -> Self {
5544        Self::MemberBlocked {
5545            group_member_id,
5546            profile,
5547            blocked,
5548            undocumented: Default::default(),
5549        }
5550    }
5551
5552    pub fn user_role(role: GroupMemberRole) -> Self {
5553        Self::UserRole {
5554            role,
5555            undocumented: Default::default(),
5556        }
5557    }
5558
5559    pub fn member_deleted(group_member_id: i64, profile: Profile) -> Self {
5560        Self::MemberDeleted {
5561            group_member_id,
5562            profile,
5563            undocumented: Default::default(),
5564        }
5565    }
5566
5567    pub fn user_left() -> Self {
5568        Self::UserLeft
5569    }
5570
5571    pub fn group_updated(group_profile: GroupProfile) -> Self {
5572        Self::GroupUpdated {
5573            group_profile,
5574            undocumented: Default::default(),
5575        }
5576    }
5577
5578    pub fn member_accepted(group_member_id: i64, profile: Profile) -> Self {
5579        Self::MemberAccepted {
5580            group_member_id,
5581            profile,
5582            undocumented: Default::default(),
5583        }
5584    }
5585
5586    pub fn user_pending_review() -> Self {
5587        Self::UserPendingReview
5588    }
5589}
5590
5591#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
5592#[non_exhaustive]
5593pub enum SwitchPhase {
5594    #[default]
5595    #[serde(rename = "started")]
5596    Started,
5597    #[serde(rename = "confirmed")]
5598    Confirmed,
5599    #[serde(rename = "secured")]
5600    Secured,
5601    #[serde(rename = "completed")]
5602    Completed,
5603}
5604
5605#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5606#[cfg_attr(feature = "bon", derive(::bon::Builder))]
5607#[cfg_attr(feature = "bon", builder(on(String, into)))]
5608pub struct TimedMessagesGroupPreference {
5609    #[serde(rename = "enable")]
5610    pub enable: GroupFeatureEnabled,
5611
5612    #[serde(
5613        rename = "ttl",
5614        skip_serializing_if = "Option::is_none",
5615        deserialize_with = "deserialize_option_number_from_string",
5616        default
5617    )]
5618    pub ttl: Option<i32>,
5619
5620    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5621    #[cfg_attr(feature = "bon", builder(default))]
5622    pub undocumented: JsonObject,
5623}
5624
5625#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5626#[cfg_attr(feature = "bon", derive(::bon::Builder))]
5627#[cfg_attr(feature = "bon", builder(on(String, into)))]
5628pub struct TimedMessagesPreference {
5629    #[serde(rename = "allow")]
5630    pub allow: FeatureAllowed,
5631
5632    #[serde(
5633        rename = "ttl",
5634        skip_serializing_if = "Option::is_none",
5635        deserialize_with = "deserialize_option_number_from_string",
5636        default
5637    )]
5638    pub ttl: Option<i32>,
5639
5640    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5641    #[cfg_attr(feature = "bon", builder(default))]
5642    pub undocumented: JsonObject,
5643}
5644
5645#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
5646#[non_exhaustive]
5647pub enum UIColorMode {
5648    #[default]
5649    #[serde(rename = "light")]
5650    Light,
5651    #[serde(rename = "dark")]
5652    Dark,
5653}
5654
5655#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5656#[cfg_attr(feature = "bon", derive(::bon::Builder))]
5657#[cfg_attr(feature = "bon", builder(on(String, into)))]
5658pub struct UIColors {
5659    #[serde(rename = "accent", skip_serializing_if = "Option::is_none")]
5660    pub accent: Option<String>,
5661
5662    #[serde(rename = "accentVariant", skip_serializing_if = "Option::is_none")]
5663    pub accent_variant: Option<String>,
5664
5665    #[serde(rename = "secondary", skip_serializing_if = "Option::is_none")]
5666    pub secondary: Option<String>,
5667
5668    #[serde(rename = "secondaryVariant", skip_serializing_if = "Option::is_none")]
5669    pub secondary_variant: Option<String>,
5670
5671    #[serde(rename = "background", skip_serializing_if = "Option::is_none")]
5672    pub background: Option<String>,
5673
5674    #[serde(rename = "menus", skip_serializing_if = "Option::is_none")]
5675    pub menus: Option<String>,
5676
5677    #[serde(rename = "title", skip_serializing_if = "Option::is_none")]
5678    pub title: Option<String>,
5679
5680    #[serde(rename = "accentVariant2", skip_serializing_if = "Option::is_none")]
5681    pub accent_variant_2: Option<String>,
5682
5683    #[serde(rename = "sentMessage", skip_serializing_if = "Option::is_none")]
5684    pub sent_message: Option<String>,
5685
5686    #[serde(rename = "sentReply", skip_serializing_if = "Option::is_none")]
5687    pub sent_reply: Option<String>,
5688
5689    #[serde(rename = "receivedMessage", skip_serializing_if = "Option::is_none")]
5690    pub received_message: Option<String>,
5691
5692    #[serde(rename = "receivedReply", skip_serializing_if = "Option::is_none")]
5693    pub received_reply: Option<String>,
5694
5695    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5696    #[cfg_attr(feature = "bon", builder(default))]
5697    pub undocumented: JsonObject,
5698}
5699
5700#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5701#[cfg_attr(feature = "bon", derive(::bon::Builder))]
5702#[cfg_attr(feature = "bon", builder(on(String, into)))]
5703pub struct UIThemeEntityOverride {
5704    #[serde(rename = "mode")]
5705    pub mode: UIColorMode,
5706
5707    #[serde(rename = "wallpaper", skip_serializing_if = "Option::is_none")]
5708    pub wallpaper: Option<ChatWallpaper>,
5709
5710    #[serde(rename = "colors")]
5711    pub colors: UIColors,
5712
5713    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5714    #[cfg_attr(feature = "bon", builder(default))]
5715    pub undocumented: JsonObject,
5716}
5717
5718#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5719#[cfg_attr(feature = "bon", derive(::bon::Builder))]
5720#[cfg_attr(feature = "bon", builder(on(String, into)))]
5721pub struct UIThemeEntityOverrides {
5722    #[serde(rename = "light", skip_serializing_if = "Option::is_none")]
5723    pub light: Option<UIThemeEntityOverride>,
5724
5725    #[serde(rename = "dark", skip_serializing_if = "Option::is_none")]
5726    pub dark: Option<UIThemeEntityOverride>,
5727
5728    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5729    #[cfg_attr(feature = "bon", builder(default))]
5730    pub undocumented: JsonObject,
5731}
5732
5733#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5734#[cfg_attr(feature = "bon", derive(::bon::Builder))]
5735#[cfg_attr(feature = "bon", builder(on(String, into)))]
5736pub struct UpdatedMessage {
5737    #[serde(rename = "msgContent")]
5738    pub msg_content: MsgContent,
5739
5740    #[serde(rename = "mentions")]
5741    pub mentions: BTreeMap<String, i64>,
5742
5743    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5744    #[cfg_attr(feature = "bon", builder(default))]
5745    pub undocumented: JsonObject,
5746}
5747
5748#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5749#[cfg_attr(feature = "bon", derive(::bon::Builder))]
5750#[cfg_attr(feature = "bon", builder(on(String, into)))]
5751pub struct User {
5752    #[serde(rename = "userId", deserialize_with = "deserialize_number_from_string")]
5753    pub user_id: i64,
5754
5755    #[serde(
5756        rename = "agentUserId",
5757        deserialize_with = "deserialize_number_from_string"
5758    )]
5759    pub agent_user_id: i64,
5760
5761    #[serde(
5762        rename = "userContactId",
5763        deserialize_with = "deserialize_number_from_string"
5764    )]
5765    pub user_contact_id: i64,
5766
5767    #[serde(rename = "localDisplayName")]
5768    pub local_display_name: String,
5769
5770    #[serde(rename = "profile")]
5771    pub profile: LocalProfile,
5772
5773    #[serde(rename = "fullPreferences")]
5774    pub full_preferences: FullPreferences,
5775
5776    #[serde(rename = "activeUser")]
5777    pub active_user: bool,
5778
5779    #[serde(
5780        rename = "activeOrder",
5781        deserialize_with = "deserialize_number_from_string"
5782    )]
5783    pub active_order: i64,
5784
5785    #[serde(rename = "viewPwdHash", skip_serializing_if = "Option::is_none")]
5786    pub view_pwd_hash: Option<UserPwdHash>,
5787
5788    #[serde(rename = "showNtfs")]
5789    pub show_ntfs: bool,
5790
5791    #[serde(rename = "sendRcptsContacts")]
5792    pub send_rcpts_contacts: bool,
5793
5794    #[serde(rename = "sendRcptsSmallGroups")]
5795    pub send_rcpts_small_groups: bool,
5796
5797    #[serde(rename = "autoAcceptMemberContacts")]
5798    pub auto_accept_member_contacts: bool,
5799
5800    #[serde(
5801        rename = "userMemberProfileUpdatedAt",
5802        skip_serializing_if = "Option::is_none"
5803    )]
5804    pub user_member_profile_updated_at: Option<UtcTime>,
5805
5806    #[serde(rename = "uiThemes", skip_serializing_if = "Option::is_none")]
5807    pub ui_themes: Option<UIThemeEntityOverrides>,
5808
5809    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5810    #[cfg_attr(feature = "bon", builder(default))]
5811    pub undocumented: JsonObject,
5812}
5813
5814#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5815#[cfg_attr(feature = "bon", derive(::bon::Builder))]
5816#[cfg_attr(feature = "bon", builder(on(String, into)))]
5817pub struct UserContact {
5818    #[serde(
5819        rename = "userContactLinkId",
5820        deserialize_with = "deserialize_number_from_string"
5821    )]
5822    pub user_contact_link_id: i64,
5823
5824    #[serde(rename = "connReqContact")]
5825    pub conn_req_contact: String,
5826
5827    #[serde(
5828        rename = "groupId",
5829        skip_serializing_if = "Option::is_none",
5830        deserialize_with = "deserialize_option_number_from_string",
5831        default
5832    )]
5833    pub group_id: Option<i64>,
5834
5835    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5836    #[cfg_attr(feature = "bon", builder(default))]
5837    pub undocumented: JsonObject,
5838}
5839
5840#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5841#[cfg_attr(feature = "bon", derive(::bon::Builder))]
5842#[cfg_attr(feature = "bon", builder(on(String, into)))]
5843pub struct UserContactLink {
5844    #[serde(
5845        rename = "userContactLinkId",
5846        deserialize_with = "deserialize_number_from_string"
5847    )]
5848    pub user_contact_link_id: i64,
5849
5850    #[serde(rename = "connLinkContact")]
5851    pub conn_link_contact: CreatedConnLink,
5852
5853    #[serde(rename = "shortLinkDataSet")]
5854    pub short_link_data_set: bool,
5855
5856    #[serde(rename = "shortLinkLargeDataSet")]
5857    pub short_link_large_data_set: bool,
5858
5859    #[serde(rename = "addressSettings")]
5860    pub address_settings: AddressSettings,
5861
5862    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5863    #[cfg_attr(feature = "bon", builder(default))]
5864    pub undocumented: JsonObject,
5865}
5866
5867#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5868#[cfg_attr(feature = "bon", derive(::bon::Builder))]
5869#[cfg_attr(feature = "bon", builder(on(String, into)))]
5870pub struct UserContactRequest {
5871    #[serde(
5872        rename = "contactRequestId",
5873        deserialize_with = "deserialize_number_from_string"
5874    )]
5875    pub contact_request_id: i64,
5876
5877    #[serde(rename = "agentInvitationId")]
5878    pub agent_invitation_id: String,
5879
5880    #[serde(
5881        rename = "contactId_",
5882        skip_serializing_if = "Option::is_none",
5883        deserialize_with = "deserialize_option_number_from_string",
5884        default
5885    )]
5886    pub contact_id: Option<i64>,
5887
5888    #[serde(
5889        rename = "businessGroupId_",
5890        skip_serializing_if = "Option::is_none",
5891        deserialize_with = "deserialize_option_number_from_string",
5892        default
5893    )]
5894    pub business_group_id: Option<i64>,
5895
5896    #[serde(
5897        rename = "userContactLinkId_",
5898        skip_serializing_if = "Option::is_none",
5899        deserialize_with = "deserialize_option_number_from_string",
5900        default
5901    )]
5902    pub user_contact_link_id: Option<i64>,
5903
5904    #[serde(rename = "cReqChatVRange")]
5905    pub c_req_chat_v_range: VersionRange,
5906
5907    #[serde(rename = "localDisplayName")]
5908    pub local_display_name: String,
5909
5910    #[serde(
5911        rename = "profileId",
5912        deserialize_with = "deserialize_number_from_string"
5913    )]
5914    pub profile_id: i64,
5915
5916    #[serde(rename = "profile")]
5917    pub profile: Profile,
5918
5919    #[serde(rename = "createdAt")]
5920    pub created_at: UtcTime,
5921
5922    #[serde(rename = "updatedAt")]
5923    pub updated_at: UtcTime,
5924
5925    #[serde(rename = "xContactId", skip_serializing_if = "Option::is_none")]
5926    pub x_contact_id: Option<String>,
5927
5928    #[serde(rename = "pqSupport")]
5929    pub pq_support: bool,
5930
5931    #[serde(rename = "welcomeSharedMsgId", skip_serializing_if = "Option::is_none")]
5932    pub welcome_shared_msg_id: Option<String>,
5933
5934    #[serde(rename = "requestSharedMsgId", skip_serializing_if = "Option::is_none")]
5935    pub request_shared_msg_id: Option<String>,
5936
5937    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5938    #[cfg_attr(feature = "bon", builder(default))]
5939    pub undocumented: JsonObject,
5940}
5941
5942#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5943#[cfg_attr(feature = "bon", derive(::bon::Builder))]
5944#[cfg_attr(feature = "bon", builder(on(String, into)))]
5945pub struct UserInfo {
5946    #[serde(rename = "user")]
5947    pub user: User,
5948
5949    #[serde(
5950        rename = "unreadCount",
5951        deserialize_with = "deserialize_number_from_string"
5952    )]
5953    pub unread_count: i32,
5954
5955    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5956    #[cfg_attr(feature = "bon", builder(default))]
5957    pub undocumented: JsonObject,
5958}
5959
5960#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5961#[cfg_attr(feature = "bon", derive(::bon::Builder))]
5962#[cfg_attr(feature = "bon", builder(on(String, into)))]
5963pub struct UserProfileUpdateSummary {
5964    #[serde(
5965        rename = "updateSuccesses",
5966        deserialize_with = "deserialize_number_from_string"
5967    )]
5968    pub update_successes: i32,
5969
5970    #[serde(
5971        rename = "updateFailures",
5972        deserialize_with = "deserialize_number_from_string"
5973    )]
5974    pub update_failures: i32,
5975
5976    #[serde(rename = "changedContacts")]
5977    pub changed_contacts: Vec<Contact>,
5978
5979    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5980    #[cfg_attr(feature = "bon", builder(default))]
5981    pub undocumented: JsonObject,
5982}
5983
5984#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5985#[cfg_attr(feature = "bon", derive(::bon::Builder))]
5986#[cfg_attr(feature = "bon", builder(on(String, into)))]
5987pub struct UserPwdHash {
5988    #[serde(rename = "hash")]
5989    pub hash: String,
5990
5991    #[serde(rename = "salt")]
5992    pub salt: String,
5993
5994    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
5995    #[cfg_attr(feature = "bon", builder(default))]
5996    pub undocumented: JsonObject,
5997}
5998
5999#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
6000#[cfg_attr(feature = "bon", derive(::bon::Builder))]
6001#[cfg_attr(feature = "bon", builder(on(String, into)))]
6002pub struct VersionRange {
6003    #[serde(
6004        rename = "minVersion",
6005        deserialize_with = "deserialize_number_from_string"
6006    )]
6007    pub min_version: i32,
6008
6009    #[serde(
6010        rename = "maxVersion",
6011        deserialize_with = "deserialize_number_from_string"
6012    )]
6013    pub max_version: i32,
6014
6015    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
6016    #[cfg_attr(feature = "bon", builder(default))]
6017    pub undocumented: JsonObject,
6018}
6019
6020#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
6021#[cfg_attr(feature = "bon", derive(::bon::Builder))]
6022#[cfg_attr(feature = "bon", builder(on(String, into)))]
6023pub struct XFTPRcvFile {
6024    #[serde(rename = "rcvFileDescription")]
6025    pub rcv_file_description: RcvFileDescr,
6026
6027    #[serde(rename = "agentRcvFileId", skip_serializing_if = "Option::is_none")]
6028    pub agent_rcv_file_id: Option<String>,
6029
6030    #[serde(rename = "agentRcvFileDeleted")]
6031    pub agent_rcv_file_deleted: bool,
6032
6033    #[serde(rename = "userApprovedRelays")]
6034    pub user_approved_relays: bool,
6035
6036    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
6037    #[cfg_attr(feature = "bon", builder(default))]
6038    pub undocumented: JsonObject,
6039}
6040
6041#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
6042#[cfg_attr(feature = "bon", derive(::bon::Builder))]
6043#[cfg_attr(feature = "bon", builder(on(String, into)))]
6044pub struct XFTPSndFile {
6045    #[serde(rename = "agentSndFileId")]
6046    pub agent_snd_file_id: String,
6047
6048    #[serde(
6049        rename = "privateSndFileDescr",
6050        skip_serializing_if = "Option::is_none"
6051    )]
6052    pub private_snd_file_descr: Option<String>,
6053
6054    #[serde(rename = "agentSndFileDeleted")]
6055    pub agent_snd_file_deleted: bool,
6056
6057    #[serde(rename = "cryptoArgs", skip_serializing_if = "Option::is_none")]
6058    pub crypto_args: Option<CryptoFileArgs>,
6059
6060    #[serde(flatten, skip_serializing_if = "JsonObject::is_null")]
6061    #[cfg_attr(feature = "bon", builder(default))]
6062    pub undocumented: JsonObject,
6063}