talk_loco_client/client/
booking.rs

1use futures_lite::{AsyncRead, AsyncWrite};
2use futures_loco_protocol::{loco_protocol::command::Method, LocoClient};
3use serde::{Deserialize, Serialize};
4
5use crate::RequestResult;
6
7use super::request_simple;
8
9#[derive(Debug)]
10pub struct BookingClient<T>(LocoClient<T>);
11
12impl<T> BookingClient<T> {
13    pub const fn new(client: LocoClient<T>) -> Self {
14        Self(client)
15    }
16
17    pub fn into_inner(self) -> LocoClient<T> {
18        self.0
19    }
20}
21
22impl<T: AsyncRead + AsyncWrite + Unpin> BookingClient<T> {
23    pub async fn get_conf(&mut self, req: &GetConfReq<'_>) -> RequestResult<GetConfRes> {
24        request_simple(&mut self.0, Method::new("GETCONF").unwrap(), req).await
25    }
26}
27
28/// Request checkin server information
29#[derive(Debug, Clone, Serialize)]
30pub struct GetConfReq<'a> {
31    /// Network MCCMNC
32    #[serde(rename = "MCCMNC")]
33    pub mccmnc: &'a str,
34
35    /// Current OS (win32, android, mac, etc.)
36    pub os: &'a str,
37
38    /// Device model (mobile only) leave it empty if it's not mobile device.
39    pub model: &'a str,
40}
41
42/// Answer checkin server information
43#[derive(Debug, Clone, Deserialize)]
44pub struct GetConfRes {
45    /// Unknown
46    pub revision: i32,
47
48    /// Cellular (3g) config
49    #[serde(rename = "3g")]
50    pub cellular: ConnectionData,
51
52    /// WiFi, wired config
53    pub wifi: ConnectionData,
54
55    /// Contains Checkin host
56    pub ticket: HostData,
57
58    /// voice / video talk configuration(?)
59    pub trailer: Trailer,
60
61    /// voice / video talk high resolution configuration(?)
62    #[serde(rename = "trailer.h")]
63    pub trailer_high: TrailerHigh,
64}
65
66/// ConnectionData includes ports, connection configuartion
67#[derive(Debug, Clone, Serialize, Deserialize)]
68pub struct ConnectionData {
69    /// Keep interval(?) when background
70    #[serde(rename = "bgKeepItv")]
71    pub background_keep_interval: i32,
72
73    /// Reconnect interval when background
74    #[serde(rename = "bgReconnItv")]
75    pub background_reconnect_interval: i32,
76
77    /// Ping interval when background
78    #[serde(rename = "bgPingItv")]
79    pub background_interval: i32,
80
81    /// Ping interval
82    #[serde(rename = "fgPingItv")]
83    pub ping_interval: i32,
84
85    /// Request timeout
86    #[serde(rename = "reqTimeout")]
87    pub request_timeout: i32,
88
89    /// Encrypt type, but crate loco_protocol only supports 2 and server seems to use 2 only.
90    #[serde(rename = "encType")]
91    pub encrypt_type: i32,
92
93    /// Connection timeout
94    #[serde(rename = "connTimeout")]
95    pub connection_timeout: i32,
96
97    /// Header timeout
98    #[serde(rename = "recvHeaderTimeout")]
99    pub receive_header_timeout: i32,
100
101    /// IN segment timeout
102    #[serde(rename = "inSegTimeout")]
103    pub in_seg_timeout: i32,
104
105    /// OUT segment timeout
106    #[serde(rename = "outSegTimeout")]
107    pub out_seg_timeout: i32,
108
109    /// TCP buffer size
110    #[serde(rename = "blockSendBufSize")]
111    pub block_send_buffer_size: i32,
112
113    /// Port list
114    pub ports: Vec<i32>,
115}
116
117/// HostData includes host list
118#[derive(Debug, Clone, Serialize, Deserialize)]
119pub struct HostData {
120    /// Unknown
121    pub ssl: Vec<String>,
122
123    /// Unknown
124    pub v2sl: Vec<String>,
125
126    /// Usable host list
127    pub lsl: Vec<String>,
128
129    /// Usable host list (ipv6)
130    pub lsl6: Vec<String>,
131}
132
133/// Additional config
134#[derive(Debug, Clone, Serialize, Deserialize)]
135pub struct Trailer {
136    #[serde(rename = "tokenExpireTime")]
137    pub token_expire_time: i32,
138
139    pub resolution: i32,
140
141    #[serde(rename = "resolutionHD")]
142    pub resolution_hd: i32,
143
144    #[serde(rename = "compRatio")]
145    pub compress_ratio: i8,
146
147    #[serde(rename = "compRatioHD")]
148    pub compress_ratio_hd: i8,
149
150    #[serde(rename = "downMode")]
151    pub down_mode: i8,
152
153    /// Concurrent file download limit
154    #[serde(rename = "concurrentDownLimit")]
155    pub concurrent_down_limit: i16,
156
157    /// Concurrent file upload limit
158    #[serde(rename = "concurrentUpLimit")]
159    pub concurrent_up_limit: i16,
160
161    #[serde(rename = "maxRelaySize")]
162    pub max_relay_size: i32,
163
164    #[serde(rename = "downCheckSize")]
165    pub down_check_size: i32,
166
167    /// Maximium attachment upload size
168    #[serde(rename = "upMaxSize")]
169    pub up_max_size: i32,
170
171    #[serde(rename = "videoUpMaxSize")]
172    pub video_up_max_size: i32,
173
174    #[serde(rename = "vCodec")]
175    pub video_codec: i8,
176
177    #[serde(rename = "vFps")]
178    pub video_fps: i16,
179
180    #[serde(rename = "aCodec")]
181    pub audio_codec: i8,
182
183    /// Period that server store uploaded files
184    #[serde(rename = "contentExpireTime")]
185    pub content_expire_time: i32,
186
187    #[serde(rename = "vResolution")]
188    pub video_resolution: i32,
189
190    #[serde(rename = "vBitrate")]
191    pub video_bitrate: i32,
192
193    #[serde(rename = "aFrequency")]
194    pub audio_frequency: i32,
195}
196
197/// High speed trailer configuration
198#[derive(Debug, Clone, Serialize, Deserialize)]
199pub struct TrailerHigh {
200    #[serde(rename = "vResolution")]
201    pub video_resolution: i32,
202
203    #[serde(rename = "vBitrate")]
204    pub video_bitrate: i32,
205
206    #[serde(rename = "aFrequency")]
207    pub audio_frequency: i32,
208}