1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
use bytes::{Buf, Bytes};
use crate::pb::msg::GetMessageResponse;
use crate::{jce, RQError, RQResult};
use prost::Message;
impl crate::Engine {
pub fn decode_svc_notify(&self, mut payload: Bytes) -> RQResult<jce::RequestPushNotify> {
payload.advance(4);
let mut req: jce::RequestPacket = jcers::from_buf(&mut payload)?;
let mut data: jce::RequestDataVersion2 = jcers::from_buf(&mut req.s_buffer)?;
let mut notify_data = data
.map
.remove("req_PushNotify")
.ok_or_else(|| RQError::Decode("req_PushNotify".into()))?
.remove("PushNotifyPack.RequestPushNotify")
.ok_or_else(|| RQError::Decode("PushNotifyPack.RequestPushNotify".into()))?;
notify_data.advance(1);
let notify: jce::RequestPushNotify = jcers::from_buf(&mut notify_data)?;
Ok(notify)
}
pub fn decode_force_offline(
&self,
mut payload: Bytes,
) -> RQResult<jce::RequestPushForceOffline> {
let mut req: jce::RequestPacket = jcers::from_buf(&mut payload)?;
let mut data: jce::RequestDataVersion2 = jcers::from_buf(&mut req.s_buffer)?;
let mut data = data
.map
.remove("req_PushForceOffline")
.ok_or_else(|| RQError::Decode("req_PushForceOffline".into()))?
.remove("PushNotifyPack.RequestPushForceOffline")
.ok_or_else(|| RQError::Decode("PushNotifyPack.RequestPushForceOffline".into()))?;
data.advance(1);
let offline: jce::RequestPushForceOffline = jcers::from_buf(&mut data)?;
Ok(offline)
}
pub fn decode_message_svc_packet(
&self,
payload: Bytes,
) -> RQResult<super::MessageSyncResponse> {
let resp = GetMessageResponse::decode(&*payload)?;
Ok(super::MessageSyncResponse {
msg_rsp_type: resp.msg_rsp_type.unwrap_or_default(),
sync_flag: resp.sync_flag.unwrap_or(2), sync_cookie: resp.sync_cookie,
pub_account_cookie: resp.pub_account_cookie,
msgs: resp
.uin_pair_msgs
.into_iter()
.flat_map(|x| x.messages)
.collect(),
})
}
}