diff --git a/binary/jce/structs.go b/binary/jce/structs.go index acdf0683..246214fb 100644 --- a/binary/jce/structs.go +++ b/binary/jce/structs.go @@ -529,6 +529,14 @@ type ( Version int32 `jceId:"2"` ReqServices [][]byte `jceId:"3"` // busi } + + DelFriendReq struct { + IJceStruct + Uin int64 `jceId:"0"` + DelUin int64 `jceId:"1"` + DelType byte `jceId:"2"` + Version int32 `jceId:"3"` + } ) func (pkt *RequestPacket) ToBytes() []byte { @@ -838,3 +846,9 @@ func (pkt *SvcReqRegisterNew) ToBytes() []byte { w.WriteJceStructRaw(pkt) return w.Bytes() } + +func (pkt *DelFriendReq) ToBytes() []byte { + w := NewJceWriter() + w.WriteJceStructRaw(pkt) + return w.Bytes() +} diff --git a/client/builders.go b/client/builders.go index c8e9dcf5..666852fe 100644 --- a/client/builders.go +++ b/client/builders.go @@ -651,6 +651,31 @@ func (c *QQClient) buildSummaryCardRequestPacket(target int64) (uint16, []byte) return seq, packet } +// friendlist.delFriend +func (c *QQClient) buildFriendDeletePacket(target int64) (uint16, []byte) { + seq := c.nextSeq() + req := &jce.DelFriendReq{ + Uin: c.Uin, + DelUin: target, + DelType: 2, + Version: 1, + } + buf := &jce.RequestDataVersion3{ + Map: map[string][]byte{"DF": packUniRequestData(req.ToBytes())}, + } + pkt := &jce.RequestPacket{ + IVersion: 3, + IRequestId: c.nextPacketSeq(), + SServantName: "mqq.IMService.FriendListServiceServantObj", + SFuncName: "DelFriendReq", + SBuffer: buf.ToBytes(), + Context: make(map[string]string), + Status: make(map[string]string), + } + packet := packets.BuildUniPacket(c.Uin, seq, "friendlist.delFriend", 1, c.OutGoingPacketSessionId, []byte{}, c.sigInfo.d2Key, pkt.ToBytes()) + return seq, packet +} + // friendlist.GetTroopListReqV2 func (c *QQClient) buildGroupListRequestPacket(vecCookie []byte) (uint16, []byte) { seq := c.nextSeq() @@ -665,10 +690,8 @@ func (c *QQClient) buildGroupListRequestPacket(vecCookie []byte) (uint16, []byte VersionNum: 1, GetLongGroupName: 1, } - b := append([]byte{0x0A}, req.ToBytes()...) - b = append(b, 0x0B) buf := &jce.RequestDataVersion3{ - Map: map[string][]byte{"GetTroopListReqV2Simplify": b}, + Map: map[string][]byte{"GetTroopListReqV2Simplify": packUniRequestData(req.ToBytes())}, } pkt := &jce.RequestPacket{ IVersion: 3, diff --git a/client/client.go b/client/client.go index cb162a3d..90c03ef7 100644 --- a/client/client.go +++ b/client/client.go @@ -141,6 +141,7 @@ var decoders = map[string]func(*QQClient, *incomingPacketInfo, []byte) (interfac "MessageSvc.PushForceOffline": decodeForceOfflinePacket, "PbMessageSvc.PbMsgWithDraw": decodeMsgWithDrawResponse, "friendlist.getFriendGroupList": decodeFriendGroupListResponse, + "friendlist.delFriend": decodeFriendDeleteResponse, "friendlist.GetTroopListReqV2": decodeGroupListResponse, "friendlist.GetTroopMemberListReq": decodeGroupMemberListResponse, "group_member_card.get_group_member_card_info": decodeGroupMemberInfoResponse, @@ -715,6 +716,14 @@ func (c *QQClient) FindFriend(uin int64) *FriendInfo { return nil } +func (c *QQClient) DeleteFriend(uin int64) error { + if c.FindFriend(uin) == nil { + return errors.New("friend not found") + } + _, err := c.sendAndWait(c.buildFriendDeletePacket(uin)) + return errors.Wrap(err, "delete friend error") +} + func (c *QQClient) FindGroupByUin(uin int64) *GroupInfo { for _, g := range c.GroupList { f := g diff --git a/client/decoders.go b/client/decoders.go index 79493046..fecdef5d 100644 --- a/client/decoders.go +++ b/client/decoders.go @@ -481,6 +481,19 @@ func decodeFriendGroupListResponse(_ *QQClient, _ *incomingPacketInfo, payload [ return rsp, nil } +// friendlist.delFriend +func decodeFriendDeleteResponse(_ *QQClient, _ *incomingPacketInfo, payload []byte) (interface{}, error) { + request := &jce.RequestPacket{} + request.ReadFrom(jce.NewJceReader(payload)) + data := &jce.RequestDataVersion3{} + data.ReadFrom(jce.NewJceReader(request.SBuffer)) + r := jce.NewJceReader(data.Map["DFRESP"][1:]) + if ret := r.ReadInt32(2); ret != 0 { + return nil, errors.Errorf("delete friend error: %v", ret) + } + return nil, nil +} + // friendlist.GetTroopListReqV2 func decodeGroupListResponse(c *QQClient, _ *incomingPacketInfo, payload []byte) (interface{}, error) { request := &jce.RequestPacket{}