1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
use bytes::{Buf, Bytes};
use jcers::Jce;
use crate::command::friendlist::*;
use crate::structs::{FriendInfo, GroupInfo, GroupMemberInfo, GroupMemberPermission};
use crate::{jce, RQError, RQResult};
impl super::super::super::Engine {
pub fn decode_friend_group_list_response(
&self,
mut payload: Bytes,
) -> RQResult<FriendListResponse> {
let mut request: jce::RequestPacket =
jcers::from_buf(&mut payload).map_err(RQError::from)?;
let mut data: jce::RequestDataVersion3 =
jcers::from_buf(&mut request.s_buffer).map_err(RQError::from)?;
let mut fl_resp = data.map.remove("FLRESP").ok_or_else(|| {
RQError::Decode("decode_friend_group_list_response FLRESP not found".into())
})?;
fl_resp.advance(1);
let resp: jce::FriendListResponse = jcers::from_buf(&mut fl_resp).map_err(RQError::from)?;
Ok(FriendListResponse {
total_count: resp.total_friend_count,
online_friend_count: resp.online_friend_count,
friends: resp
.friend_info_list
.into_iter()
.map(|f| FriendInfo {
uin: f.friend_uin,
nick: f.nick,
remark: f.remark,
face_id: f.face_id,
group_id: f.group_id,
})
.collect(),
friend_groups: resp
.group_info_list
.into_iter()
.map(|g| {
(
g.group_id,
FriendGroupInfo {
group_id: g.group_id,
group_name: g.group_name,
friend_count: g.friend_count,
online_friend_count: g.online_friend_count,
seq_id: g.seq_id,
},
)
})
.collect(),
})
}
pub fn decode_group_list_response(&self, mut payload: Bytes) -> RQResult<GroupListResponse> {
let mut request: jce::RequestPacket =
jcers::from_buf(&mut payload).map_err(RQError::from)?;
let mut data: jce::RequestDataVersion3 =
jcers::from_buf(&mut request.s_buffer).map_err(RQError::from)?;
let mut fl_resp = data.map.remove("GetTroopListRespV2").ok_or_else(|| {
RQError::Decode("decode_group_list_response GetTroopListRespV2 not found".into())
})?;
fl_resp.advance(1);
let mut r = Jce::new(&mut fl_resp);
let vec_cookie: Bytes = r.get_by_tag(4).map_err(RQError::from)?;
let groups: Vec<jce::TroopNumber> = r.get_by_tag(5).map_err(RQError::from)?;
let l = groups
.into_iter()
.map(|g| GroupInfo {
uin: g.group_uin,
code: g.group_code,
name: g.group_name,
memo: g.group_memo,
owner_uin: g.group_owner_uin,
member_count: g.member_num as u16,
max_member_count: g.max_group_member_num as u16,
shut_up_timestamp: g.shut_up_timestamp,
my_shut_up_timestamp: g.my_shut_up_timestamp,
..Default::default()
})
.collect();
Ok(GroupListResponse {
groups: l,
vec_cookie,
})
}
pub fn decode_group_member_list_response(
&self,
mut payload: Bytes,
group_owner_uin: i64,
) -> RQResult<GroupMemberListResponse> {
let mut request: jce::RequestPacket =
jcers::from_buf(&mut payload).map_err(RQError::from)?;
let mut data: jce::RequestDataVersion3 =
jcers::from_buf(&mut request.s_buffer).map_err(RQError::from)?;
let mut fl_resp = data.map.remove("GTMLRESP").ok_or_else(|| {
RQError::Decode("decode_group_member_list_response GTMLRESP not found".into())
})?;
fl_resp.advance(1);
let mut r = Jce::new(&mut fl_resp);
let members: Vec<jce::TroopMemberInfo> = r.get_by_tag(3).map_err(RQError::from)?;
let next_uin = r.get_by_tag(4).map_err(RQError::from)?;
let mut l: Vec<GroupMemberInfo> = Vec::new();
for m in members {
l.push(GroupMemberInfo {
uin: m.member_uin,
gender: m.gender,
nickname: m.nick,
card_name: m.name,
level: m.member_level as u16,
join_time: m.join_time,
last_speak_time: m.last_speak_time,
special_title: m.special_title,
special_title_expire_time: m.special_title_expire_time,
shut_up_timestamp: m.shut_up_timestap,
permission: if group_owner_uin == m.member_uin {
GroupMemberPermission::Owner
} else {
match m.flag {
1 => GroupMemberPermission::Administrator,
_ => GroupMemberPermission::Member,
}
},
..Default::default()
})
}
Ok(GroupMemberListResponse { next_uin, list: l })
}
pub fn decode_remove_friend(&self, mut payload: Bytes) -> RQResult<jce::DelFriendResp> {
let mut req: jce::RequestPacket = jcers::from_buf(&mut payload)?;
let mut data: jce::RequestDataVersion3 = jcers::from_buf(&mut req.s_buffer)?;
let mut r = data
.map
.remove("DFRESP")
.ok_or_else(|| RQError::Decode("decode_remove_friend `DFRESP` not found".into()))?;
jcers::from_buf(&mut r).map_err(RQError::Jce)
}
}