From ef65fd67e602723e97769899b3dca93e36223de6 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Tue, 1 Mar 2022 16:45:01 +0800 Subject: [PATCH] client: use unpackOIDBPackage --- client/decoders.go | 9 +++------ client/events.go | 2 +- client/global.go | 6 +++--- client/group_file.go | 45 +++++++++++++++----------------------------- client/group_info.go | 9 +++------ client/group_msg.go | 18 ++++++------------ client/image.go | 9 +++------ client/security.go | 9 +++------ client/translate.go | 9 +++------ 9 files changed, 40 insertions(+), 76 deletions(-) diff --git a/client/decoders.go b/client/decoders.go index 5c180f6e..f1cb8ec2 100644 --- a/client/decoders.go +++ b/client/decoders.go @@ -783,13 +783,10 @@ func decodeMSFOfflinePacket(c *QQClient, _ *network.IncomingPacketInfo, _ []byte // OidbSvc.0xd79 func decodeWordSegmentation(_ *QQClient, _ *network.IncomingPacketInfo, payload []byte) (interface{}, error) { - pkg := oidb.OIDBSSOPkg{} rsp := &oidb.D79RspBody{} - if err := proto.Unmarshal(payload, &pkg); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") - } - if err := proto.Unmarshal(pkg.Bodybuffer, rsp); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") + err := unpackOIDBPackage(payload, &rsp) + if err != nil { + return nil, err } if rsp.Content != nil { return rsp.Content.SliceContent, nil diff --git a/client/events.go b/client/events.go index 3cc55ac7..43a095ab 100644 --- a/client/events.go +++ b/client/events.go @@ -25,8 +25,8 @@ func (handle *EventHandle[T]) Subscribe(handler func(client *QQClient, event T)) func (handle *EventHandle[T]) dispatch(client *QQClient, event T) { eventMu.RLock() - defer eventMu.RUnlock() defer func() { + eventMu.RUnlock() if pan := recover(); pan != nil { fmt.Printf("event error: %v\n%s", pan, debug.Stack()) } diff --git a/client/global.go b/client/global.go index 909adde3..f54dac35 100644 --- a/client/global.go +++ b/client/global.go @@ -356,15 +356,15 @@ func (c *QQClient) packOIDBPackageProto(cmd, serviceType int32, msg proto.Messag return c.packOIDBPackage(cmd, serviceType, b) } -func unpackOIDBPackage(buff []byte, payload proto.Message) error { +func unpackOIDBPackage(payload []byte, rsp proto.Message) error { pkg := new(oidb.OIDBSSOPkg) - if err := proto.Unmarshal(buff, pkg); err != nil { + if err := proto.Unmarshal(payload, pkg); err != nil { return errors.Wrap(err, "failed to unmarshal protobuf message") } if pkg.Result != 0 { return errors.Errorf("oidb result unsuccessful: %v msg: %v", pkg.Result, pkg.ErrorMsg) } - if err := proto.Unmarshal(pkg.Bodybuffer, payload); err != nil { + if err := proto.Unmarshal(pkg.Bodybuffer, rsp); err != nil { return errors.Wrap(err, "failed to unmarshal protobuf message") } return nil diff --git a/client/group_file.go b/client/group_file.go index c2799a15..05a6b217 100644 --- a/client/group_file.go +++ b/client/group_file.go @@ -441,26 +441,20 @@ func (c *QQClient) buildGroupFileDeleteReqPacket(groupCode int64, parentFolderId } func decodeOIDB6d81Response(_ *QQClient, _ *network.IncomingPacketInfo, payload []byte) (interface{}, error) { - pkg := oidb.OIDBSSOPkg{} rsp := oidb.D6D8RspBody{} - if err := proto.Unmarshal(payload, &pkg); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") - } - if err := proto.Unmarshal(pkg.Bodybuffer, &rsp); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") + err := unpackOIDBPackage(payload, &rsp) + if err != nil { + return nil, err } return &rsp, nil } // OidbSvc.0x6d6_2 func decodeOIDB6d62Response(_ *QQClient, _ *network.IncomingPacketInfo, payload []byte) (interface{}, error) { - pkg := oidb.OIDBSSOPkg{} rsp := oidb.D6D6RspBody{} - if err := proto.Unmarshal(payload, &pkg); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") - } - if err := proto.Unmarshal(pkg.Bodybuffer, &rsp); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") + err := unpackOIDBPackage(payload, &rsp) + if err != nil { + return nil, err } if rsp.DownloadFileRsp.DownloadUrl == nil { return nil, errors.New(rsp.DownloadFileRsp.GetClientWording()) @@ -471,13 +465,10 @@ func decodeOIDB6d62Response(_ *QQClient, _ *network.IncomingPacketInfo, payload } func decodeOIDB6d63Response(_ *QQClient, _ *network.IncomingPacketInfo, payload []byte) (interface{}, error) { - pkg := oidb.OIDBSSOPkg{} rsp := oidb.D6D6RspBody{} - if err := proto.Unmarshal(payload, &pkg); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") - } - if err := proto.Unmarshal(pkg.Bodybuffer, &rsp); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") + err := unpackOIDBPackage(payload, &rsp) + if err != nil { + return nil, err } if rsp.DeleteFileRsp == nil { return "", nil @@ -486,25 +477,19 @@ func decodeOIDB6d63Response(_ *QQClient, _ *network.IncomingPacketInfo, payload } func decodeOIDB6d60Response(_ *QQClient, _ *network.IncomingPacketInfo, payload []byte) (interface{}, error) { - pkg := oidb.OIDBSSOPkg{} rsp := oidb.D6D6RspBody{} - if err := proto.Unmarshal(payload, &pkg); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") - } - if err := proto.Unmarshal(pkg.Bodybuffer, &rsp); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") + err := unpackOIDBPackage(payload, &rsp) + if err != nil { + return nil, err } return rsp.UploadFileRsp, nil } func decodeOIDB6d7Response(_ *QQClient, _ *network.IncomingPacketInfo, payload []byte) (interface{}, error) { - pkg := oidb.OIDBSSOPkg{} rsp := oidb.D6D7RspBody{} - if err := proto.Unmarshal(payload, &pkg); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") - } - if err := proto.Unmarshal(pkg.Bodybuffer, &rsp); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") + err := unpackOIDBPackage(payload, &rsp) + if err != nil { + return nil, err } if rsp.CreateFolderRsp != nil && rsp.CreateFolderRsp.GetRetCode() != 0 { return nil, errors.Errorf("create folder error: %v", rsp.CreateFolderRsp.GetRetCode()) diff --git a/client/group_info.go b/client/group_info.go index 712076cf..968d3f00 100644 --- a/client/group_info.go +++ b/client/group_info.go @@ -227,13 +227,10 @@ func decodeGroupSearchResponse(_ *QQClient, _ *network.IncomingPacketInfo, paylo // OidbSvc.0x88d_0 func decodeGroupInfoResponse(c *QQClient, _ *network.IncomingPacketInfo, payload []byte) (interface{}, error) { - pkg := oidb.OIDBSSOPkg{} rsp := oidb.D88DRspBody{} - if err := proto.Unmarshal(payload, &pkg); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") - } - if err := proto.Unmarshal(pkg.Bodybuffer, &rsp); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") + err := unpackOIDBPackage(payload, &rsp) + if err != nil { + return nil, err } if len(rsp.RspGroupInfo) == 0 { return nil, errors.New(string(rsp.StrErrorInfo)) diff --git a/client/group_msg.go b/client/group_msg.go index 45960e09..34f519aa 100644 --- a/client/group_msg.go +++ b/client/group_msg.go @@ -397,13 +397,10 @@ func decodeGetGroupMsgResponse(c *QQClient, info *network.IncomingPacketInfo, pa } func decodeAtAllRemainResponse(_ *QQClient, _ *network.IncomingPacketInfo, payload []byte) (interface{}, error) { - pkg := oidb.OIDBSSOPkg{} rsp := oidb.D8A7RspBody{} - if err := proto.Unmarshal(payload, &pkg); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") - } - if err := proto.Unmarshal(pkg.Bodybuffer, &rsp); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") + err := unpackOIDBPackage(payload, &rsp) + if err != nil { + return nil, err } return &AtAllRemainInfo{ CanAtAll: rsp.GetCanAtAll(), @@ -593,13 +590,10 @@ func (c *QQClient) buildEssenceMsgOperatePacket(groupCode int64, msgSeq, msgRand // OidbSvc.0xeac_1/2 func decodeEssenceMsgResponse(_ *QQClient, _ *network.IncomingPacketInfo, payload []byte) (interface{}, error) { - pkg := oidb.OIDBSSOPkg{} rsp := &oidb.EACRspBody{} - if err := proto.Unmarshal(payload, &pkg); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") - } - if err := proto.Unmarshal(pkg.Bodybuffer, rsp); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") + err := unpackOIDBPackage(payload, &rsp) + if err != nil { + return nil, err } return rsp, nil } diff --git a/client/image.go b/client/image.go index 51b45b76..1fd10409 100644 --- a/client/image.go +++ b/client/image.go @@ -405,13 +405,10 @@ func decodeGroupImageDownloadResponse(_ *QQClient, _ *network.IncomingPacketInfo // OidbSvc.0xe07_0 func decodeImageOcrResponse(_ *QQClient, _ *network.IncomingPacketInfo, payload []byte) (interface{}, error) { - pkg := oidb.OIDBSSOPkg{} rsp := oidb.DE07RspBody{} - if err := proto.Unmarshal(payload, &pkg); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") - } - if err := proto.Unmarshal(pkg.Bodybuffer, &rsp); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") + err := unpackOIDBPackage(payload, &rsp) + if err != nil { + return nil, err } if rsp.Wording != "" { if strings.Contains(rsp.Wording, "服务忙") { diff --git a/client/security.go b/client/security.go index 777a4031..3ac00921 100644 --- a/client/security.go +++ b/client/security.go @@ -49,13 +49,10 @@ func (c *QQClient) buildUrlCheckRequest(url string) (uint16, []byte) { } func decodeUrlCheckResponse(_ *QQClient, _ *network.IncomingPacketInfo, payload []byte) (interface{}, error) { - pkg := &oidb.OIDBSSOPkg{} rsp := &oidb.DBCBRspBody{} - if err := proto.Unmarshal(payload, pkg); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") - } - if err := proto.Unmarshal(pkg.Bodybuffer, rsp); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") + err := unpackOIDBPackage(payload, &rsp) + if err != nil { + return nil, err } if rsp.CheckUrlRsp == nil || len(rsp.CheckUrlRsp.Results) == 0 { return nil, errors.New("response is empty") diff --git a/client/translate.go b/client/translate.go index 946cec49..6049aca6 100644 --- a/client/translate.go +++ b/client/translate.go @@ -42,13 +42,10 @@ func (c *QQClient) Translate(src, dst, text string) (string, error) { // OidbSvc.0x990 func decodeTranslateResponse(_ *QQClient, _ *network.IncomingPacketInfo, payload []byte) (interface{}, error) { - pkg := oidb.OIDBSSOPkg{} rsp := oidb.TranslateRspBody{} - if err := proto.Unmarshal(payload, &pkg); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") - } - if err := proto.Unmarshal(pkg.Bodybuffer, &rsp); err != nil { - return nil, errors.Wrap(err, "failed to unmarshal protobuf message") + err := unpackOIDBPackage(payload, &rsp) + if err != nil { + return nil, err } return rsp.BatchTranslateRsp, nil }