From 5be0ad9461774e914eb98f9d643474f46a296f4a Mon Sep 17 00:00:00 2001 From: Mrs4s <1844812067@qq.com> Date: Sun, 25 Oct 2020 21:59:55 +0800 Subject: [PATCH 01/12] fix typo. --- client/system_msg.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/system_msg.go b/client/system_msg.go index 21801bf9..5cd04f98 100644 --- a/client/system_msg.go +++ b/client/system_msg.go @@ -16,7 +16,7 @@ type ( RequestId int64 `json:"request_id"` InvitorUin int64 `json:"invitor_uin"` InvitorNick string `json:"invitor_nick"` - GroupCode int64 `json:"group_code"` + GroupCode int64 `json:"group_id"` GroupName string `json:"group_name"` Checked bool `json:"checked"` @@ -30,7 +30,7 @@ type ( Message string `json:"message"` RequesterUin int64 `json:"requester_uin"` RequesterNick string `json:"requester_nick"` - GroupCode int64 `json:"group_code"` + GroupCode int64 `json:"group_id"` GroupName string `json:"group_name"` Checked bool `json:"checked"` From 8ece3a9dd80376b927400f50e97f7f40fe9ccf06 Mon Sep 17 00:00:00 2001 From: Mrs4s <1844812067@qq.com> Date: Mon, 26 Oct 2020 07:40:14 +0800 Subject: [PATCH 02/12] fix Mrs4s/go-cqhttp#375. --- client/system_msg.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/client/system_msg.go b/client/system_msg.go index 5cd04f98..2e18a6c3 100644 --- a/client/system_msg.go +++ b/client/system_msg.go @@ -125,9 +125,6 @@ func decodeSystemMsgGroupPacket(c *QQClient, _ uint16, payload []byte) (interfac if err := proto.Unmarshal(payload, &rsp); err != nil { return nil, err } - if len(rsp.Groupmsgs) == 0 { - return nil, nil - } ret := &GroupSystemMessages{} for _, st := range rsp.Groupmsgs { if st.Msg == nil { From d9e1c14a8098d7547d779c9a02592726e9d922a1 Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Wed, 28 Oct 2020 19:23:25 +0800 Subject: [PATCH 03/12] feature: group file system. --- client/builders.go | 22 - client/client.go | 11 +- client/decoders.go | 15 - client/group_file.go | 257 +++++ client/pb/oidb/oidb0x6d8.pb.go | 1771 ++++++++++++++++++++++++++++++++ client/pb/oidb/oidb0x6d8.proto | 137 +++ client/pb/oidb/oidb0xd79.pb.go | 72 +- go.mod | 2 +- go.sum | 2 + 9 files changed, 2205 insertions(+), 84 deletions(-) create mode 100644 client/group_file.go create mode 100644 client/pb/oidb/oidb0x6d8.pb.go create mode 100644 client/pb/oidb/oidb0x6d8.proto diff --git a/client/builders.go b/client/builders.go index 608caeeb..b26b9b89 100644 --- a/client/builders.go +++ b/client/builders.go @@ -1113,28 +1113,6 @@ func (c *QQClient) buildQuitGroupPacket(groupCode int64) (uint16, []byte) { return seq, packet } -// OidbSvc.0x6d6_2 -func (c *QQClient) buildGroupFileDownloadReqPacket(groupCode int64, fileId string, busId int32) (uint16, []byte) { - seq := c.nextSeq() - body := &oidb.D6D6ReqBody{ - DownloadFileReq: &oidb.DownloadFileReqBody{ - GroupCode: groupCode, - AppId: 3, - BusId: busId, - FileId: fileId, - }, - } - b, _ := proto.Marshal(body) - req := &oidb.OIDBSSOPkg{ - Command: 1750, - ServiceType: 2, - Bodybuffer: b, - } - payload, _ := proto.Marshal(req) - packet := packets.BuildUniPacket(c.Uin, seq, "OidbSvc.0x6d6_2", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload) - return seq, packet -} - // OidbSvc.0xe07_0 func (c *QQClient) buildImageOcrRequestPacket(url, md5 string, size, weight, height int32) (uint16, []byte) { seq := c.nextSeq() diff --git a/client/client.go b/client/client.go index edfcf76b..100073e1 100644 --- a/client/client.go +++ b/client/client.go @@ -152,6 +152,7 @@ func NewClientMd5(uin int64, passwordMd5 [16]byte) *QQClient { "MultiMsg.ApplyUp": decodeMultiApplyUpResponse, "MultiMsg.ApplyDown": decodeMultiApplyDownResponse, "OidbSvc.0x6d6_2": decodeOIDB6d6Response, + "OidbSvc.0x6d8_1": decodeOIDB6d81Response, "OidbSvc.0x88d_0": decodeGroupInfoResponse, "OidbSvc.0xe07_0": decodeImageOcrResponse, "OidbSvc.0xd79": decodeWordSegmentation, @@ -370,16 +371,6 @@ func (c *QQClient) GetShortVideoUrl(uuid, md5 []byte) string { return i.(string) } -func (c *QQClient) GetGroupFileUrl(groupCode int64, fileId string, busId int32) string { - i, err := c.sendAndWait(c.buildGroupFileDownloadReqPacket(groupCode, fileId, busId)) - if err != nil { - return "" - } - url := i.(string) - url += "?fname=" + hex.EncodeToString([]byte(fileId)) - return url -} - func (c *QQClient) GetGroupInfo(groupCode int64) (*GroupInfo, error) { i, err := c.sendAndWait(c.buildGroupInfoRequestPacket(groupCode)) if err != nil { diff --git a/client/decoders.go b/client/decoders.go index cb222d11..18a1d051 100644 --- a/client/decoders.go +++ b/client/decoders.go @@ -992,21 +992,6 @@ func decodeWordSegmentation(_ *QQClient, _ uint16, payload []byte) (interface{}, return nil, errors.New("no word receive") } -// OidbSvc.0x6d6_2 -func decodeOIDB6d6Response(_ *QQClient, _ uint16, payload []byte) (interface{}, error) { - pkg := oidb.OIDBSSOPkg{} - rsp := oidb.D6D6RspBody{} - if err := proto.Unmarshal(payload, &pkg); err != nil { - return nil, err - } - if err := proto.Unmarshal(pkg.Bodybuffer, &rsp); err != nil { - return nil, err - } - ip := rsp.DownloadFileRsp.DownloadIp - url := hex.EncodeToString(rsp.DownloadFileRsp.DownloadUrl) - return fmt.Sprintf("http://%s/ftn_handler/%s/", ip, url), nil -} - // OidbSvc.0xe07_0 func decodeImageOcrResponse(_ *QQClient, _ uint16, payload []byte) (interface{}, error) { pkg := oidb.OIDBSSOPkg{} diff --git a/client/group_file.go b/client/group_file.go new file mode 100644 index 00000000..2b722880 --- /dev/null +++ b/client/group_file.go @@ -0,0 +1,257 @@ +package client + +import ( + "encoding/hex" + "errors" + "fmt" + "github.com/Mrs4s/MiraiGo/client/pb/oidb" + "github.com/Mrs4s/MiraiGo/protocol/packets" + "github.com/golang/protobuf/proto" +) + +type ( + GroupFileSystem struct { + FileCount uint32 `json:"file_count"` + LimitCount uint32 `json:"limit_count"` + UsedSpace uint64 `json:"used_space"` + TotalSpace uint64 `json:"total_space"` + GroupCode int64 `json:"group_id"` + + client *QQClient + } + + GroupFile struct { + GroupCode int64 `json:"group_id"` + FileId string `json:"file_id"` + FileName string `json:"file_name"` + BusId int32 `json:"busid"` + FileSize int64 `json:"file_size"` + UploadTime int64 `json:"upload_time"` + DeadTime int64 `json:"dead_time"` + ModifyTime int64 `json:"modify_time"` + DownloadTimes int64 `json:"download_times"` + Uploader int64 `json:"uploader"` + UploaderName string `json:"uploader_name"` + } + + GroupFolder struct { + GroupCode int64 `json:"group_id"` + FolderId string `json:"folder_id"` + FolderName string `json:"folder_name"` + CreateTime int64 `json:"create_time"` + Creator int64 `json:"creator"` + CreatorName string `json:"creator_name"` + TotalFileCount uint32 `json:"total_file_count"` + } +) + +func (c *QQClient) GetGroupFileSystem(groupCode int64) (fs *GroupFileSystem, err error) { + defer func() { + if pan := recover(); pan != nil { + c.Error("get group fs error: %v", pan) + err = errors.New("fs error") + } + }() + g := c.FindGroup(groupCode) + if g == nil { + return nil, errors.New("group not found") + } + rsp, e := c.sendAndWait(c.buildGroupFileCountRequestPacket(groupCode)) + if e != nil { + return nil, e + } + fs = &GroupFileSystem{ + FileCount: rsp.(*oidb.D6D8RspBody).FileCountRsp.GetAllFileCount(), + LimitCount: rsp.(*oidb.D6D8RspBody).FileCountRsp.GetLimitCount(), + GroupCode: groupCode, + client: c, + } + rsp, err = c.sendAndWait(c.buildGroupFileSpaceRequestPacket(groupCode)) + if err != nil { + return nil, err + } + fs.TotalSpace = rsp.(*oidb.D6D8RspBody).GroupSpaceRsp.GetTotalSpace() + fs.UsedSpace = rsp.(*oidb.D6D8RspBody).GroupSpaceRsp.GetUsedSpace() + return fs, nil +} + +func (c *QQClient) GetGroupFileUrl(groupCode int64, fileId string, busId int32) string { + i, err := c.sendAndWait(c.buildGroupFileDownloadReqPacket(groupCode, fileId, busId)) + if err != nil { + return "" + } + url := i.(string) + url += "?fname=" + hex.EncodeToString([]byte(fileId)) + return url +} + +func (fs *GroupFileSystem) Root() ([]*GroupFile, []*GroupFolder, error) { + return fs.GetFilesByFolder("/") +} + +func (fs *GroupFileSystem) GetFilesByFolder(folderId string) ([]*GroupFile, []*GroupFolder, error) { + var startIndex uint32 = 0 + var files []*GroupFile + var folders []*GroupFolder + for { + i, err := fs.client.sendAndWait(fs.client.buildGroupFileListRequestPacket(fs.GroupCode, folderId, startIndex)) + if err != nil { + return nil, nil, err + } + rsp := i.(*oidb.D6D8RspBody) + if rsp.FileListInfoRsp == nil { + break + } + for _, item := range rsp.FileListInfoRsp.ItemList { + if item.FileInfo != nil { + files = append(files, &GroupFile{ + GroupCode: fs.GroupCode, + FileId: item.FileInfo.GetFileId(), + FileName: item.FileInfo.GetFileName(), + BusId: int32(item.FileInfo.GetBusId()), + FileSize: int64(item.FileInfo.GetFileSize()), + UploadTime: int64(item.FileInfo.GetUploadTime()), + DeadTime: int64(item.FileInfo.GetDeadTime()), + ModifyTime: int64(item.FileInfo.GetModifyTime()), + DownloadTimes: int64(item.FileInfo.GetDownloadTimes()), + Uploader: int64(item.FileInfo.GetUploaderUin()), + UploaderName: item.FileInfo.GetUploaderName(), + }) + } + if item.FolderInfo != nil { + folders = append(folders, &GroupFolder{ + GroupCode: fs.GroupCode, + FolderId: item.FolderInfo.GetFolderId(), + FolderName: item.FolderInfo.GetFolderName(), + CreateTime: int64(item.FolderInfo.GetCreateTime()), + Creator: int64(item.FolderInfo.GetCreateUin()), + CreatorName: item.FolderInfo.GetCreatorName(), + TotalFileCount: item.FolderInfo.GetTotalFileCount(), + }) + } + } + if rsp.FileListInfoRsp.GetIsEnd() { + break + } + startIndex = rsp.FileListInfoRsp.GetNextIndex() + } + return files, folders, nil +} + +func (fs *GroupFileSystem) GetDownloadUrl(file *GroupFile) string { + return fs.client.GetGroupFileUrl(file.GroupCode, file.FileId, file.BusId) +} + +// OidbSvc.0x6d8_1 +func (c *QQClient) buildGroupFileListRequestPacket(groupCode int64, folderId string, startIndex uint32) (uint16, []byte) { + seq := c.nextSeq() + body := &oidb.D6D8ReqBody{FileListInfoReq: &oidb.GetFileListReqBody{ + GroupCode: proto.Uint64(uint64(groupCode)), + AppId: proto.Uint32(3), + FolderId: &folderId, + FileCount: proto.Uint32(20), + AllFileCount: proto.Uint32(0), + ReqFrom: proto.Uint32(3), + SortBy: proto.Uint32(1), + FilterCode: proto.Uint32(0), + Uin: proto.Uint64(0), + StartIndex: &startIndex, + Context: EmptyBytes, + }} + b, _ := proto.Marshal(body) + req := &oidb.OIDBSSOPkg{ + Command: 1752, + ServiceType: 1, + Bodybuffer: b, + ClientVersion: "android 8.4.8", + } + payload, _ := proto.Marshal(req) + packet := packets.BuildUniPacket(c.Uin, seq, "OidbSvc.0x6d8_1", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload) + return seq, packet +} + +func (c *QQClient) buildGroupFileCountRequestPacket(groupCode int64) (uint16, []byte) { + seq := c.nextSeq() + body := &oidb.D6D8ReqBody{GroupFileCountReq: &oidb.GetFileCountReqBody{ + GroupCode: proto.Uint64(uint64(groupCode)), + AppId: proto.Uint32(3), + BusId: proto.Uint32(0), + }} + b, _ := proto.Marshal(body) + req := &oidb.OIDBSSOPkg{ + Command: 1752, + ServiceType: 2, + Bodybuffer: b, + ClientVersion: "android 8.4.8", + } + payload, _ := proto.Marshal(req) + packet := packets.BuildUniPacket(c.Uin, seq, "OidbSvc.0x6d8_1", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload) + return seq, packet +} + +func (c *QQClient) buildGroupFileSpaceRequestPacket(groupCode int64) (uint16, []byte) { + seq := c.nextSeq() + body := &oidb.D6D8ReqBody{GroupSpaceReq: &oidb.GetSpaceReqBody{ + GroupCode: proto.Uint64(uint64(groupCode)), + AppId: proto.Uint32(3), + }} + b, _ := proto.Marshal(body) + req := &oidb.OIDBSSOPkg{ + Command: 1752, + ServiceType: 3, + Bodybuffer: b, + ClientVersion: "android 8.4.8", + } + payload, _ := proto.Marshal(req) + packet := packets.BuildUniPacket(c.Uin, seq, "OidbSvc.0x6d8_1", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload) + return seq, packet +} + +// OidbSvc.0x6d6_2 +func (c *QQClient) buildGroupFileDownloadReqPacket(groupCode int64, fileId string, busId int32) (uint16, []byte) { + seq := c.nextSeq() + body := &oidb.D6D6ReqBody{ + DownloadFileReq: &oidb.DownloadFileReqBody{ + GroupCode: groupCode, + AppId: 3, + BusId: busId, + FileId: fileId, + }, + } + b, _ := proto.Marshal(body) + req := &oidb.OIDBSSOPkg{ + Command: 1750, + ServiceType: 2, + Bodybuffer: b, + } + payload, _ := proto.Marshal(req) + packet := packets.BuildUniPacket(c.Uin, seq, "OidbSvc.0x6d6_2", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload) + return seq, packet +} + +func decodeOIDB6d81Response(c *QQClient, _ uint16, payload []byte) (interface{}, error) { + pkg := oidb.OIDBSSOPkg{} + rsp := oidb.D6D8RspBody{} + if err := proto.Unmarshal(payload, &pkg); err != nil { + return nil, err + } + if err := proto.Unmarshal(pkg.Bodybuffer, &rsp); err != nil { + return nil, err + } + return &rsp, nil +} + +// OidbSvc.0x6d6_2 +func decodeOIDB6d6Response(_ *QQClient, _ uint16, payload []byte) (interface{}, error) { + pkg := oidb.OIDBSSOPkg{} + rsp := oidb.D6D6RspBody{} + if err := proto.Unmarshal(payload, &pkg); err != nil { + return nil, err + } + if err := proto.Unmarshal(pkg.Bodybuffer, &rsp); err != nil { + return nil, err + } + ip := rsp.DownloadFileRsp.DownloadIp + url := hex.EncodeToString(rsp.DownloadFileRsp.DownloadUrl) + return fmt.Sprintf("http://%s/ftn_handler/%s/", ip, url), nil +} diff --git a/client/pb/oidb/oidb0x6d8.pb.go b/client/pb/oidb/oidb0x6d8.pb.go new file mode 100644 index 00000000..cdecb2ec --- /dev/null +++ b/client/pb/oidb/oidb0x6d8.pb.go @@ -0,0 +1,1771 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.11.4 +// source: oidb0x6d8.proto + +package oidb + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type D6D8ReqBody struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FileInfoReq *GetFileInfoReqBody `protobuf:"bytes,1,opt,name=fileInfoReq" json:"fileInfoReq,omitempty"` + FileListInfoReq *GetFileListReqBody `protobuf:"bytes,2,opt,name=fileListInfoReq" json:"fileListInfoReq,omitempty"` + GroupFileCountReq *GetFileCountReqBody `protobuf:"bytes,3,opt,name=groupFileCountReq" json:"groupFileCountReq,omitempty"` + GroupSpaceReq *GetSpaceReqBody `protobuf:"bytes,4,opt,name=groupSpaceReq" json:"groupSpaceReq,omitempty"` +} + +func (x *D6D8ReqBody) Reset() { + *x = D6D8ReqBody{} + if protoimpl.UnsafeEnabled { + mi := &file_oidb0x6d8_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *D6D8ReqBody) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*D6D8ReqBody) ProtoMessage() {} + +func (x *D6D8ReqBody) ProtoReflect() protoreflect.Message { + mi := &file_oidb0x6d8_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use D6D8ReqBody.ProtoReflect.Descriptor instead. +func (*D6D8ReqBody) Descriptor() ([]byte, []int) { + return file_oidb0x6d8_proto_rawDescGZIP(), []int{0} +} + +func (x *D6D8ReqBody) GetFileInfoReq() *GetFileInfoReqBody { + if x != nil { + return x.FileInfoReq + } + return nil +} + +func (x *D6D8ReqBody) GetFileListInfoReq() *GetFileListReqBody { + if x != nil { + return x.FileListInfoReq + } + return nil +} + +func (x *D6D8ReqBody) GetGroupFileCountReq() *GetFileCountReqBody { + if x != nil { + return x.GroupFileCountReq + } + return nil +} + +func (x *D6D8ReqBody) GetGroupSpaceReq() *GetSpaceReqBody { + if x != nil { + return x.GroupSpaceReq + } + return nil +} + +type D6D8RspBody struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FileInfoRsp *GetFileInfoRspBody `protobuf:"bytes,1,opt,name=fileInfoRsp" json:"fileInfoRsp,omitempty"` + FileListInfoRsp *GetFileListRspBody `protobuf:"bytes,2,opt,name=fileListInfoRsp" json:"fileListInfoRsp,omitempty"` + FileCountRsp *GetFileCountRspBody `protobuf:"bytes,3,opt,name=fileCountRsp" json:"fileCountRsp,omitempty"` + GroupSpaceRsp *GetSpaceRspBody `protobuf:"bytes,4,opt,name=groupSpaceRsp" json:"groupSpaceRsp,omitempty"` +} + +func (x *D6D8RspBody) Reset() { + *x = D6D8RspBody{} + if protoimpl.UnsafeEnabled { + mi := &file_oidb0x6d8_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *D6D8RspBody) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*D6D8RspBody) ProtoMessage() {} + +func (x *D6D8RspBody) ProtoReflect() protoreflect.Message { + mi := &file_oidb0x6d8_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use D6D8RspBody.ProtoReflect.Descriptor instead. +func (*D6D8RspBody) Descriptor() ([]byte, []int) { + return file_oidb0x6d8_proto_rawDescGZIP(), []int{1} +} + +func (x *D6D8RspBody) GetFileInfoRsp() *GetFileInfoRspBody { + if x != nil { + return x.FileInfoRsp + } + return nil +} + +func (x *D6D8RspBody) GetFileListInfoRsp() *GetFileListRspBody { + if x != nil { + return x.FileListInfoRsp + } + return nil +} + +func (x *D6D8RspBody) GetFileCountRsp() *GetFileCountRspBody { + if x != nil { + return x.FileCountRsp + } + return nil +} + +func (x *D6D8RspBody) GetGroupSpaceRsp() *GetSpaceRspBody { + if x != nil { + return x.GroupSpaceRsp + } + return nil +} + +type GetFileInfoReqBody struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GroupCode *uint64 `protobuf:"varint,1,opt,name=groupCode" json:"groupCode,omitempty"` + AppId *uint32 `protobuf:"varint,2,opt,name=appId" json:"appId,omitempty"` + BusId *uint32 `protobuf:"varint,3,opt,name=busId" json:"busId,omitempty"` + FileId *string `protobuf:"bytes,4,opt,name=fileId" json:"fileId,omitempty"` + FieldFlag *uint32 `protobuf:"varint,5,opt,name=fieldFlag" json:"fieldFlag,omitempty"` +} + +func (x *GetFileInfoReqBody) Reset() { + *x = GetFileInfoReqBody{} + if protoimpl.UnsafeEnabled { + mi := &file_oidb0x6d8_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFileInfoReqBody) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFileInfoReqBody) ProtoMessage() {} + +func (x *GetFileInfoReqBody) ProtoReflect() protoreflect.Message { + mi := &file_oidb0x6d8_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFileInfoReqBody.ProtoReflect.Descriptor instead. +func (*GetFileInfoReqBody) Descriptor() ([]byte, []int) { + return file_oidb0x6d8_proto_rawDescGZIP(), []int{2} +} + +func (x *GetFileInfoReqBody) GetGroupCode() uint64 { + if x != nil && x.GroupCode != nil { + return *x.GroupCode + } + return 0 +} + +func (x *GetFileInfoReqBody) GetAppId() uint32 { + if x != nil && x.AppId != nil { + return *x.AppId + } + return 0 +} + +func (x *GetFileInfoReqBody) GetBusId() uint32 { + if x != nil && x.BusId != nil { + return *x.BusId + } + return 0 +} + +func (x *GetFileInfoReqBody) GetFileId() string { + if x != nil && x.FileId != nil { + return *x.FileId + } + return "" +} + +func (x *GetFileInfoReqBody) GetFieldFlag() uint32 { + if x != nil && x.FieldFlag != nil { + return *x.FieldFlag + } + return 0 +} + +type GetFileInfoRspBody struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RetCode *int32 `protobuf:"varint,1,opt,name=retCode" json:"retCode,omitempty"` + RetMsg *string `protobuf:"bytes,2,opt,name=retMsg" json:"retMsg,omitempty"` + ClientWording *string `protobuf:"bytes,3,opt,name=clientWording" json:"clientWording,omitempty"` + FileInfo *GroupFileInfo `protobuf:"bytes,4,opt,name=fileInfo" json:"fileInfo,omitempty"` +} + +func (x *GetFileInfoRspBody) Reset() { + *x = GetFileInfoRspBody{} + if protoimpl.UnsafeEnabled { + mi := &file_oidb0x6d8_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFileInfoRspBody) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFileInfoRspBody) ProtoMessage() {} + +func (x *GetFileInfoRspBody) ProtoReflect() protoreflect.Message { + mi := &file_oidb0x6d8_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFileInfoRspBody.ProtoReflect.Descriptor instead. +func (*GetFileInfoRspBody) Descriptor() ([]byte, []int) { + return file_oidb0x6d8_proto_rawDescGZIP(), []int{3} +} + +func (x *GetFileInfoRspBody) GetRetCode() int32 { + if x != nil && x.RetCode != nil { + return *x.RetCode + } + return 0 +} + +func (x *GetFileInfoRspBody) GetRetMsg() string { + if x != nil && x.RetMsg != nil { + return *x.RetMsg + } + return "" +} + +func (x *GetFileInfoRspBody) GetClientWording() string { + if x != nil && x.ClientWording != nil { + return *x.ClientWording + } + return "" +} + +func (x *GetFileInfoRspBody) GetFileInfo() *GroupFileInfo { + if x != nil { + return x.FileInfo + } + return nil +} + +type GetFileListRspBody struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RetCode *int32 `protobuf:"varint,1,opt,name=retCode" json:"retCode,omitempty"` + RetMsg *string `protobuf:"bytes,2,opt,name=retMsg" json:"retMsg,omitempty"` + ClientWording *string `protobuf:"bytes,3,opt,name=clientWording" json:"clientWording,omitempty"` + IsEnd *bool `protobuf:"varint,4,opt,name=isEnd" json:"isEnd,omitempty"` + ItemList []*GetFileListRspBody_Item `protobuf:"bytes,5,rep,name=itemList" json:"itemList,omitempty"` + MaxTimestamp *FileTimeStamp `protobuf:"bytes,6,opt,name=maxTimestamp" json:"maxTimestamp,omitempty"` + AllFileCount *uint32 `protobuf:"varint,7,opt,name=allFileCount" json:"allFileCount,omitempty"` + FilterCode *uint32 `protobuf:"varint,8,opt,name=filterCode" json:"filterCode,omitempty"` + SafeCheckFlag *bool `protobuf:"varint,11,opt,name=safeCheckFlag" json:"safeCheckFlag,omitempty"` + SafeCheckRes *uint32 `protobuf:"varint,12,opt,name=safeCheckRes" json:"safeCheckRes,omitempty"` + NextIndex *uint32 `protobuf:"varint,13,opt,name=nextIndex" json:"nextIndex,omitempty"` + Context []byte `protobuf:"bytes,14,opt,name=context" json:"context,omitempty"` + Role *uint32 `protobuf:"varint,15,opt,name=role" json:"role,omitempty"` + OpenFlag *uint32 `protobuf:"varint,16,opt,name=openFlag" json:"openFlag,omitempty"` +} + +func (x *GetFileListRspBody) Reset() { + *x = GetFileListRspBody{} + if protoimpl.UnsafeEnabled { + mi := &file_oidb0x6d8_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFileListRspBody) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFileListRspBody) ProtoMessage() {} + +func (x *GetFileListRspBody) ProtoReflect() protoreflect.Message { + mi := &file_oidb0x6d8_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFileListRspBody.ProtoReflect.Descriptor instead. +func (*GetFileListRspBody) Descriptor() ([]byte, []int) { + return file_oidb0x6d8_proto_rawDescGZIP(), []int{4} +} + +func (x *GetFileListRspBody) GetRetCode() int32 { + if x != nil && x.RetCode != nil { + return *x.RetCode + } + return 0 +} + +func (x *GetFileListRspBody) GetRetMsg() string { + if x != nil && x.RetMsg != nil { + return *x.RetMsg + } + return "" +} + +func (x *GetFileListRspBody) GetClientWording() string { + if x != nil && x.ClientWording != nil { + return *x.ClientWording + } + return "" +} + +func (x *GetFileListRspBody) GetIsEnd() bool { + if x != nil && x.IsEnd != nil { + return *x.IsEnd + } + return false +} + +func (x *GetFileListRspBody) GetItemList() []*GetFileListRspBody_Item { + if x != nil { + return x.ItemList + } + return nil +} + +func (x *GetFileListRspBody) GetMaxTimestamp() *FileTimeStamp { + if x != nil { + return x.MaxTimestamp + } + return nil +} + +func (x *GetFileListRspBody) GetAllFileCount() uint32 { + if x != nil && x.AllFileCount != nil { + return *x.AllFileCount + } + return 0 +} + +func (x *GetFileListRspBody) GetFilterCode() uint32 { + if x != nil && x.FilterCode != nil { + return *x.FilterCode + } + return 0 +} + +func (x *GetFileListRspBody) GetSafeCheckFlag() bool { + if x != nil && x.SafeCheckFlag != nil { + return *x.SafeCheckFlag + } + return false +} + +func (x *GetFileListRspBody) GetSafeCheckRes() uint32 { + if x != nil && x.SafeCheckRes != nil { + return *x.SafeCheckRes + } + return 0 +} + +func (x *GetFileListRspBody) GetNextIndex() uint32 { + if x != nil && x.NextIndex != nil { + return *x.NextIndex + } + return 0 +} + +func (x *GetFileListRspBody) GetContext() []byte { + if x != nil { + return x.Context + } + return nil +} + +func (x *GetFileListRspBody) GetRole() uint32 { + if x != nil && x.Role != nil { + return *x.Role + } + return 0 +} + +func (x *GetFileListRspBody) GetOpenFlag() uint32 { + if x != nil && x.OpenFlag != nil { + return *x.OpenFlag + } + return 0 +} + +type GroupFileInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FileId *string `protobuf:"bytes,1,opt,name=fileId" json:"fileId,omitempty"` + FileName *string `protobuf:"bytes,2,opt,name=fileName" json:"fileName,omitempty"` + FileSize *uint64 `protobuf:"varint,3,opt,name=fileSize" json:"fileSize,omitempty"` + BusId *uint32 `protobuf:"varint,4,opt,name=busId" json:"busId,omitempty"` + UploadedSize *uint64 `protobuf:"varint,5,opt,name=uploadedSize" json:"uploadedSize,omitempty"` + UploadTime *uint32 `protobuf:"varint,6,opt,name=uploadTime" json:"uploadTime,omitempty"` + DeadTime *uint32 `protobuf:"varint,7,opt,name=deadTime" json:"deadTime,omitempty"` + ModifyTime *uint32 `protobuf:"varint,8,opt,name=modifyTime" json:"modifyTime,omitempty"` + DownloadTimes *uint32 `protobuf:"varint,9,opt,name=downloadTimes" json:"downloadTimes,omitempty"` + Sha []byte `protobuf:"bytes,10,opt,name=sha" json:"sha,omitempty"` + Sha3 []byte `protobuf:"bytes,11,opt,name=sha3" json:"sha3,omitempty"` + Md5 []byte `protobuf:"bytes,12,opt,name=md5" json:"md5,omitempty"` + LocalPath *string `protobuf:"bytes,13,opt,name=localPath" json:"localPath,omitempty"` + UploaderName *string `protobuf:"bytes,14,opt,name=uploaderName" json:"uploaderName,omitempty"` + UploaderUin *uint64 `protobuf:"varint,15,opt,name=uploaderUin" json:"uploaderUin,omitempty"` + ParentFolderId *string `protobuf:"bytes,16,opt,name=parentFolderId" json:"parentFolderId,omitempty"` +} + +func (x *GroupFileInfo) Reset() { + *x = GroupFileInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_oidb0x6d8_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GroupFileInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GroupFileInfo) ProtoMessage() {} + +func (x *GroupFileInfo) ProtoReflect() protoreflect.Message { + mi := &file_oidb0x6d8_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GroupFileInfo.ProtoReflect.Descriptor instead. +func (*GroupFileInfo) Descriptor() ([]byte, []int) { + return file_oidb0x6d8_proto_rawDescGZIP(), []int{5} +} + +func (x *GroupFileInfo) GetFileId() string { + if x != nil && x.FileId != nil { + return *x.FileId + } + return "" +} + +func (x *GroupFileInfo) GetFileName() string { + if x != nil && x.FileName != nil { + return *x.FileName + } + return "" +} + +func (x *GroupFileInfo) GetFileSize() uint64 { + if x != nil && x.FileSize != nil { + return *x.FileSize + } + return 0 +} + +func (x *GroupFileInfo) GetBusId() uint32 { + if x != nil && x.BusId != nil { + return *x.BusId + } + return 0 +} + +func (x *GroupFileInfo) GetUploadedSize() uint64 { + if x != nil && x.UploadedSize != nil { + return *x.UploadedSize + } + return 0 +} + +func (x *GroupFileInfo) GetUploadTime() uint32 { + if x != nil && x.UploadTime != nil { + return *x.UploadTime + } + return 0 +} + +func (x *GroupFileInfo) GetDeadTime() uint32 { + if x != nil && x.DeadTime != nil { + return *x.DeadTime + } + return 0 +} + +func (x *GroupFileInfo) GetModifyTime() uint32 { + if x != nil && x.ModifyTime != nil { + return *x.ModifyTime + } + return 0 +} + +func (x *GroupFileInfo) GetDownloadTimes() uint32 { + if x != nil && x.DownloadTimes != nil { + return *x.DownloadTimes + } + return 0 +} + +func (x *GroupFileInfo) GetSha() []byte { + if x != nil { + return x.Sha + } + return nil +} + +func (x *GroupFileInfo) GetSha3() []byte { + if x != nil { + return x.Sha3 + } + return nil +} + +func (x *GroupFileInfo) GetMd5() []byte { + if x != nil { + return x.Md5 + } + return nil +} + +func (x *GroupFileInfo) GetLocalPath() string { + if x != nil && x.LocalPath != nil { + return *x.LocalPath + } + return "" +} + +func (x *GroupFileInfo) GetUploaderName() string { + if x != nil && x.UploaderName != nil { + return *x.UploaderName + } + return "" +} + +func (x *GroupFileInfo) GetUploaderUin() uint64 { + if x != nil && x.UploaderUin != nil { + return *x.UploaderUin + } + return 0 +} + +func (x *GroupFileInfo) GetParentFolderId() string { + if x != nil && x.ParentFolderId != nil { + return *x.ParentFolderId + } + return "" +} + +type GroupFolderInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FolderId *string `protobuf:"bytes,1,opt,name=folderId" json:"folderId,omitempty"` + ParentFolderId *string `protobuf:"bytes,2,opt,name=parentFolderId" json:"parentFolderId,omitempty"` + FolderName *string `protobuf:"bytes,3,opt,name=folderName" json:"folderName,omitempty"` + CreateTime *uint32 `protobuf:"varint,4,opt,name=createTime" json:"createTime,omitempty"` + ModifyTime *uint32 `protobuf:"varint,5,opt,name=modifyTime" json:"modifyTime,omitempty"` + CreateUin *uint64 `protobuf:"varint,6,opt,name=createUin" json:"createUin,omitempty"` + CreatorName *string `protobuf:"bytes,7,opt,name=creatorName" json:"creatorName,omitempty"` + TotalFileCount *uint32 `protobuf:"varint,8,opt,name=totalFileCount" json:"totalFileCount,omitempty"` +} + +func (x *GroupFolderInfo) Reset() { + *x = GroupFolderInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_oidb0x6d8_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GroupFolderInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GroupFolderInfo) ProtoMessage() {} + +func (x *GroupFolderInfo) ProtoReflect() protoreflect.Message { + mi := &file_oidb0x6d8_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GroupFolderInfo.ProtoReflect.Descriptor instead. +func (*GroupFolderInfo) Descriptor() ([]byte, []int) { + return file_oidb0x6d8_proto_rawDescGZIP(), []int{6} +} + +func (x *GroupFolderInfo) GetFolderId() string { + if x != nil && x.FolderId != nil { + return *x.FolderId + } + return "" +} + +func (x *GroupFolderInfo) GetParentFolderId() string { + if x != nil && x.ParentFolderId != nil { + return *x.ParentFolderId + } + return "" +} + +func (x *GroupFolderInfo) GetFolderName() string { + if x != nil && x.FolderName != nil { + return *x.FolderName + } + return "" +} + +func (x *GroupFolderInfo) GetCreateTime() uint32 { + if x != nil && x.CreateTime != nil { + return *x.CreateTime + } + return 0 +} + +func (x *GroupFolderInfo) GetModifyTime() uint32 { + if x != nil && x.ModifyTime != nil { + return *x.ModifyTime + } + return 0 +} + +func (x *GroupFolderInfo) GetCreateUin() uint64 { + if x != nil && x.CreateUin != nil { + return *x.CreateUin + } + return 0 +} + +func (x *GroupFolderInfo) GetCreatorName() string { + if x != nil && x.CreatorName != nil { + return *x.CreatorName + } + return "" +} + +func (x *GroupFolderInfo) GetTotalFileCount() uint32 { + if x != nil && x.TotalFileCount != nil { + return *x.TotalFileCount + } + return 0 +} + +type GetFileListReqBody struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GroupCode *uint64 `protobuf:"varint,1,opt,name=groupCode" json:"groupCode,omitempty"` + AppId *uint32 `protobuf:"varint,2,opt,name=appId" json:"appId,omitempty"` + FolderId *string `protobuf:"bytes,3,opt,name=folderId" json:"folderId,omitempty"` + StartTimestamp *FileTimeStamp `protobuf:"bytes,4,opt,name=startTimestamp" json:"startTimestamp,omitempty"` + FileCount *uint32 `protobuf:"varint,5,opt,name=fileCount" json:"fileCount,omitempty"` + MaxTimestamp *FileTimeStamp `protobuf:"bytes,6,opt,name=maxTimestamp" json:"maxTimestamp,omitempty"` + AllFileCount *uint32 `protobuf:"varint,7,opt,name=allFileCount" json:"allFileCount,omitempty"` + ReqFrom *uint32 `protobuf:"varint,8,opt,name=reqFrom" json:"reqFrom,omitempty"` + SortBy *uint32 `protobuf:"varint,9,opt,name=sortBy" json:"sortBy,omitempty"` + FilterCode *uint32 `protobuf:"varint,10,opt,name=filterCode" json:"filterCode,omitempty"` + Uin *uint64 `protobuf:"varint,11,opt,name=uin" json:"uin,omitempty"` + FieldFlag *uint32 `protobuf:"varint,12,opt,name=fieldFlag" json:"fieldFlag,omitempty"` + StartIndex *uint32 `protobuf:"varint,13,opt,name=startIndex" json:"startIndex,omitempty"` + Context []byte `protobuf:"bytes,14,opt,name=context" json:"context,omitempty"` + ClientVersion *uint32 `protobuf:"varint,15,opt,name=clientVersion" json:"clientVersion,omitempty"` +} + +func (x *GetFileListReqBody) Reset() { + *x = GetFileListReqBody{} + if protoimpl.UnsafeEnabled { + mi := &file_oidb0x6d8_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFileListReqBody) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFileListReqBody) ProtoMessage() {} + +func (x *GetFileListReqBody) ProtoReflect() protoreflect.Message { + mi := &file_oidb0x6d8_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFileListReqBody.ProtoReflect.Descriptor instead. +func (*GetFileListReqBody) Descriptor() ([]byte, []int) { + return file_oidb0x6d8_proto_rawDescGZIP(), []int{7} +} + +func (x *GetFileListReqBody) GetGroupCode() uint64 { + if x != nil && x.GroupCode != nil { + return *x.GroupCode + } + return 0 +} + +func (x *GetFileListReqBody) GetAppId() uint32 { + if x != nil && x.AppId != nil { + return *x.AppId + } + return 0 +} + +func (x *GetFileListReqBody) GetFolderId() string { + if x != nil && x.FolderId != nil { + return *x.FolderId + } + return "" +} + +func (x *GetFileListReqBody) GetStartTimestamp() *FileTimeStamp { + if x != nil { + return x.StartTimestamp + } + return nil +} + +func (x *GetFileListReqBody) GetFileCount() uint32 { + if x != nil && x.FileCount != nil { + return *x.FileCount + } + return 0 +} + +func (x *GetFileListReqBody) GetMaxTimestamp() *FileTimeStamp { + if x != nil { + return x.MaxTimestamp + } + return nil +} + +func (x *GetFileListReqBody) GetAllFileCount() uint32 { + if x != nil && x.AllFileCount != nil { + return *x.AllFileCount + } + return 0 +} + +func (x *GetFileListReqBody) GetReqFrom() uint32 { + if x != nil && x.ReqFrom != nil { + return *x.ReqFrom + } + return 0 +} + +func (x *GetFileListReqBody) GetSortBy() uint32 { + if x != nil && x.SortBy != nil { + return *x.SortBy + } + return 0 +} + +func (x *GetFileListReqBody) GetFilterCode() uint32 { + if x != nil && x.FilterCode != nil { + return *x.FilterCode + } + return 0 +} + +func (x *GetFileListReqBody) GetUin() uint64 { + if x != nil && x.Uin != nil { + return *x.Uin + } + return 0 +} + +func (x *GetFileListReqBody) GetFieldFlag() uint32 { + if x != nil && x.FieldFlag != nil { + return *x.FieldFlag + } + return 0 +} + +func (x *GetFileListReqBody) GetStartIndex() uint32 { + if x != nil && x.StartIndex != nil { + return *x.StartIndex + } + return 0 +} + +func (x *GetFileListReqBody) GetContext() []byte { + if x != nil { + return x.Context + } + return nil +} + +func (x *GetFileListReqBody) GetClientVersion() uint32 { + if x != nil && x.ClientVersion != nil { + return *x.ClientVersion + } + return 0 +} + +type GetFileCountReqBody struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GroupCode *uint64 `protobuf:"varint,1,opt,name=groupCode" json:"groupCode,omitempty"` + AppId *uint32 `protobuf:"varint,2,opt,name=appId" json:"appId,omitempty"` + BusId *uint32 `protobuf:"varint,3,opt,name=busId" json:"busId,omitempty"` +} + +func (x *GetFileCountReqBody) Reset() { + *x = GetFileCountReqBody{} + if protoimpl.UnsafeEnabled { + mi := &file_oidb0x6d8_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFileCountReqBody) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFileCountReqBody) ProtoMessage() {} + +func (x *GetFileCountReqBody) ProtoReflect() protoreflect.Message { + mi := &file_oidb0x6d8_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFileCountReqBody.ProtoReflect.Descriptor instead. +func (*GetFileCountReqBody) Descriptor() ([]byte, []int) { + return file_oidb0x6d8_proto_rawDescGZIP(), []int{8} +} + +func (x *GetFileCountReqBody) GetGroupCode() uint64 { + if x != nil && x.GroupCode != nil { + return *x.GroupCode + } + return 0 +} + +func (x *GetFileCountReqBody) GetAppId() uint32 { + if x != nil && x.AppId != nil { + return *x.AppId + } + return 0 +} + +func (x *GetFileCountReqBody) GetBusId() uint32 { + if x != nil && x.BusId != nil { + return *x.BusId + } + return 0 +} + +type GetSpaceReqBody struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GroupCode *uint64 `protobuf:"varint,1,opt,name=groupCode" json:"groupCode,omitempty"` + AppId *uint32 `protobuf:"varint,2,opt,name=appId" json:"appId,omitempty"` +} + +func (x *GetSpaceReqBody) Reset() { + *x = GetSpaceReqBody{} + if protoimpl.UnsafeEnabled { + mi := &file_oidb0x6d8_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSpaceReqBody) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSpaceReqBody) ProtoMessage() {} + +func (x *GetSpaceReqBody) ProtoReflect() protoreflect.Message { + mi := &file_oidb0x6d8_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSpaceReqBody.ProtoReflect.Descriptor instead. +func (*GetSpaceReqBody) Descriptor() ([]byte, []int) { + return file_oidb0x6d8_proto_rawDescGZIP(), []int{9} +} + +func (x *GetSpaceReqBody) GetGroupCode() uint64 { + if x != nil && x.GroupCode != nil { + return *x.GroupCode + } + return 0 +} + +func (x *GetSpaceReqBody) GetAppId() uint32 { + if x != nil && x.AppId != nil { + return *x.AppId + } + return 0 +} + +type GetFileCountRspBody struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RetCode *int32 `protobuf:"varint,1,opt,name=retCode" json:"retCode,omitempty"` + RetMsg *string `protobuf:"bytes,2,opt,name=retMsg" json:"retMsg,omitempty"` + ClientWording *string `protobuf:"bytes,3,opt,name=clientWording" json:"clientWording,omitempty"` + AllFileCount *uint32 `protobuf:"varint,4,opt,name=allFileCount" json:"allFileCount,omitempty"` + FileTooMany *bool `protobuf:"varint,5,opt,name=fileTooMany" json:"fileTooMany,omitempty"` + LimitCount *uint32 `protobuf:"varint,6,opt,name=limitCount" json:"limitCount,omitempty"` + IsFull *bool `protobuf:"varint,7,opt,name=isFull" json:"isFull,omitempty"` +} + +func (x *GetFileCountRspBody) Reset() { + *x = GetFileCountRspBody{} + if protoimpl.UnsafeEnabled { + mi := &file_oidb0x6d8_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFileCountRspBody) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFileCountRspBody) ProtoMessage() {} + +func (x *GetFileCountRspBody) ProtoReflect() protoreflect.Message { + mi := &file_oidb0x6d8_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFileCountRspBody.ProtoReflect.Descriptor instead. +func (*GetFileCountRspBody) Descriptor() ([]byte, []int) { + return file_oidb0x6d8_proto_rawDescGZIP(), []int{10} +} + +func (x *GetFileCountRspBody) GetRetCode() int32 { + if x != nil && x.RetCode != nil { + return *x.RetCode + } + return 0 +} + +func (x *GetFileCountRspBody) GetRetMsg() string { + if x != nil && x.RetMsg != nil { + return *x.RetMsg + } + return "" +} + +func (x *GetFileCountRspBody) GetClientWording() string { + if x != nil && x.ClientWording != nil { + return *x.ClientWording + } + return "" +} + +func (x *GetFileCountRspBody) GetAllFileCount() uint32 { + if x != nil && x.AllFileCount != nil { + return *x.AllFileCount + } + return 0 +} + +func (x *GetFileCountRspBody) GetFileTooMany() bool { + if x != nil && x.FileTooMany != nil { + return *x.FileTooMany + } + return false +} + +func (x *GetFileCountRspBody) GetLimitCount() uint32 { + if x != nil && x.LimitCount != nil { + return *x.LimitCount + } + return 0 +} + +func (x *GetFileCountRspBody) GetIsFull() bool { + if x != nil && x.IsFull != nil { + return *x.IsFull + } + return false +} + +type GetSpaceRspBody struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RetCode *int32 `protobuf:"varint,1,opt,name=retCode" json:"retCode,omitempty"` + RetMsg *string `protobuf:"bytes,2,opt,name=retMsg" json:"retMsg,omitempty"` + ClientWording *string `protobuf:"bytes,3,opt,name=clientWording" json:"clientWording,omitempty"` + TotalSpace *uint64 `protobuf:"varint,4,opt,name=totalSpace" json:"totalSpace,omitempty"` + UsedSpace *uint64 `protobuf:"varint,5,opt,name=usedSpace" json:"usedSpace,omitempty"` +} + +func (x *GetSpaceRspBody) Reset() { + *x = GetSpaceRspBody{} + if protoimpl.UnsafeEnabled { + mi := &file_oidb0x6d8_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSpaceRspBody) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSpaceRspBody) ProtoMessage() {} + +func (x *GetSpaceRspBody) ProtoReflect() protoreflect.Message { + mi := &file_oidb0x6d8_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSpaceRspBody.ProtoReflect.Descriptor instead. +func (*GetSpaceRspBody) Descriptor() ([]byte, []int) { + return file_oidb0x6d8_proto_rawDescGZIP(), []int{11} +} + +func (x *GetSpaceRspBody) GetRetCode() int32 { + if x != nil && x.RetCode != nil { + return *x.RetCode + } + return 0 +} + +func (x *GetSpaceRspBody) GetRetMsg() string { + if x != nil && x.RetMsg != nil { + return *x.RetMsg + } + return "" +} + +func (x *GetSpaceRspBody) GetClientWording() string { + if x != nil && x.ClientWording != nil { + return *x.ClientWording + } + return "" +} + +func (x *GetSpaceRspBody) GetTotalSpace() uint64 { + if x != nil && x.TotalSpace != nil { + return *x.TotalSpace + } + return 0 +} + +func (x *GetSpaceRspBody) GetUsedSpace() uint64 { + if x != nil && x.UsedSpace != nil { + return *x.UsedSpace + } + return 0 +} + +type FileTimeStamp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UploadTime *uint32 `protobuf:"varint,1,opt,name=uploadTime" json:"uploadTime,omitempty"` + FileId *string `protobuf:"bytes,2,opt,name=fileId" json:"fileId,omitempty"` +} + +func (x *FileTimeStamp) Reset() { + *x = FileTimeStamp{} + if protoimpl.UnsafeEnabled { + mi := &file_oidb0x6d8_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FileTimeStamp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FileTimeStamp) ProtoMessage() {} + +func (x *FileTimeStamp) ProtoReflect() protoreflect.Message { + mi := &file_oidb0x6d8_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FileTimeStamp.ProtoReflect.Descriptor instead. +func (*FileTimeStamp) Descriptor() ([]byte, []int) { + return file_oidb0x6d8_proto_rawDescGZIP(), []int{12} +} + +func (x *FileTimeStamp) GetUploadTime() uint32 { + if x != nil && x.UploadTime != nil { + return *x.UploadTime + } + return 0 +} + +func (x *FileTimeStamp) GetFileId() string { + if x != nil && x.FileId != nil { + return *x.FileId + } + return "" +} + +type GetFileListRspBody_Item struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type *uint32 `protobuf:"varint,1,opt,name=type" json:"type,omitempty"` + FolderInfo *GroupFolderInfo `protobuf:"bytes,2,opt,name=folderInfo" json:"folderInfo,omitempty"` + FileInfo *GroupFileInfo `protobuf:"bytes,3,opt,name=fileInfo" json:"fileInfo,omitempty"` +} + +func (x *GetFileListRspBody_Item) Reset() { + *x = GetFileListRspBody_Item{} + if protoimpl.UnsafeEnabled { + mi := &file_oidb0x6d8_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFileListRspBody_Item) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFileListRspBody_Item) ProtoMessage() {} + +func (x *GetFileListRspBody_Item) ProtoReflect() protoreflect.Message { + mi := &file_oidb0x6d8_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFileListRspBody_Item.ProtoReflect.Descriptor instead. +func (*GetFileListRspBody_Item) Descriptor() ([]byte, []int) { + return file_oidb0x6d8_proto_rawDescGZIP(), []int{4, 0} +} + +func (x *GetFileListRspBody_Item) GetType() uint32 { + if x != nil && x.Type != nil { + return *x.Type + } + return 0 +} + +func (x *GetFileListRspBody_Item) GetFolderInfo() *GroupFolderInfo { + if x != nil { + return x.FolderInfo + } + return nil +} + +func (x *GetFileListRspBody_Item) GetFileInfo() *GroupFileInfo { + if x != nil { + return x.FileInfo + } + return nil +} + +var File_oidb0x6d8_proto protoreflect.FileDescriptor + +var file_oidb0x6d8_proto_rawDesc = []byte{ + 0x0a, 0x0f, 0x6f, 0x69, 0x64, 0x62, 0x30, 0x78, 0x36, 0x64, 0x38, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0xff, 0x01, 0x0a, 0x0b, 0x44, 0x36, 0x44, 0x38, 0x52, 0x65, 0x71, 0x42, 0x6f, 0x64, + 0x79, 0x12, 0x35, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x0b, 0x66, 0x69, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x12, 0x3d, 0x0a, 0x0f, 0x66, 0x69, 0x6c, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x0f, 0x66, 0x69, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x12, 0x42, 0x0a, 0x11, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x11, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x46, + 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x12, 0x36, 0x0a, 0x0d, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x42, 0x6f, 0x64, 0x79, 0x52, 0x0d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x22, 0xf5, 0x01, 0x0a, 0x0b, 0x44, 0x36, 0x44, 0x38, 0x52, 0x73, 0x70, 0x42, + 0x6f, 0x64, 0x79, 0x12, 0x35, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x73, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, + 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x73, 0x70, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x0b, 0x66, + 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x73, 0x70, 0x12, 0x3d, 0x0a, 0x0f, 0x66, 0x69, + 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x73, 0x70, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x73, 0x70, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x0f, 0x66, 0x69, 0x6c, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x73, 0x70, 0x12, 0x38, 0x0a, 0x0c, 0x66, 0x69, 0x6c, + 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x73, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x73, + 0x70, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x0c, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x52, 0x73, 0x70, 0x12, 0x36, 0x0a, 0x0d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x73, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x47, 0x65, 0x74, + 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x73, 0x70, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x0d, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x73, 0x70, 0x22, 0x94, 0x01, 0x0a, 0x12, + 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x42, 0x6f, + 0x64, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x64, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x75, 0x73, 0x49, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, 0x75, 0x73, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, + 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, + 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x46, 0x6c, 0x61, + 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x46, 0x6c, + 0x61, 0x67, 0x22, 0x98, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x73, 0x70, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x74, + 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x72, 0x65, 0x74, 0x43, + 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x4d, 0x73, 0x67, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x74, 0x4d, 0x73, 0x67, 0x12, 0x24, 0x0a, 0x0d, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x64, 0x69, 0x6e, + 0x67, 0x12, 0x2a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xdc, 0x04, + 0x0a, 0x12, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x73, 0x70, + 0x42, 0x6f, 0x64, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x72, 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x72, 0x65, 0x74, 0x4d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x72, 0x65, 0x74, 0x4d, 0x73, 0x67, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x57, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x73, 0x45, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x45, + 0x6e, 0x64, 0x12, 0x34, 0x0a, 0x08, 0x69, 0x74, 0x65, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x73, 0x70, 0x42, 0x6f, 0x64, 0x79, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x08, + 0x69, 0x74, 0x65, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, + 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, + 0x6d, 0x61, 0x78, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, + 0x61, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, + 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x66, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x46, 0x6c, 0x61, + 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x61, 0x66, 0x65, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x61, 0x66, 0x65, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x73, 0x61, + 0x66, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x65, + 0x78, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, + 0x65, 0x78, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x6e, 0x46, 0x6c, + 0x61, 0x67, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x6e, 0x46, 0x6c, + 0x61, 0x67, 0x1a, 0x78, 0x0a, 0x04, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x30, + 0x0a, 0x0a, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x2a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xdf, 0x03, 0x0a, + 0x0d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, + 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x62, 0x75, 0x73, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x62, + 0x75, 0x73, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, + 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x75, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x75, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x61, 0x64, + 0x54, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x64, 0x65, 0x61, 0x64, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x54, 0x69, + 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x64, 0x6f, 0x77, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, + 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, 0x12, 0x0a, 0x04, + 0x73, 0x68, 0x61, 0x33, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x73, 0x68, 0x61, 0x33, + 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x64, 0x35, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6d, + 0x64, 0x35, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x22, 0x0a, 0x0c, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, + 0x55, 0x69, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x75, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x65, 0x72, 0x55, 0x69, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x64, 0x22, 0x9d, + 0x02, 0x0a, 0x0f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x26, + 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x46, 0x6f, + 0x6c, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x6f, 0x6c, 0x64, + 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x54, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x54, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x6f, 0x64, 0x69, + 0x66, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x55, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x55, 0x69, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x46, + 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xf4, + 0x03, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, + 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43, + 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x6f, 0x6c, + 0x64, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x6f, 0x6c, + 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x46, 0x69, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, + 0x09, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x0c, 0x6d, + 0x61, 0x78, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0e, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, + 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x72, 0x65, 0x71, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x6f, 0x72, 0x74, 0x42, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x73, + 0x6f, 0x72, 0x74, 0x42, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, + 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x6e, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x03, 0x75, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x46, 0x6c, 0x61, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, + 0x24, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x1c, 0x0a, 0x09, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x70, + 0x70, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x62, 0x75, 0x73, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x62, 0x75, 0x73, 0x49, 0x64, 0x22, 0x45, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0xeb, 0x01, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x73, + 0x70, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x72, 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x4d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x72, 0x65, 0x74, 0x4d, 0x73, 0x67, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x57, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x22, 0x0a, + 0x0c, 0x61, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x54, 0x6f, 0x6f, 0x4d, 0x61, 0x6e, 0x79, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x54, 0x6f, 0x6f, 0x4d, + 0x61, 0x6e, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x22, 0xa7, 0x01, 0x0a, 0x0f, + 0x47, 0x65, 0x74, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x73, 0x70, 0x42, 0x6f, 0x64, 0x79, 0x12, + 0x18, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x07, 0x72, 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x74, + 0x4d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x74, 0x4d, 0x73, + 0x67, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x64, 0x69, + 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x57, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x53, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x53, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x64, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x75, 0x73, 0x65, 0x64, + 0x53, 0x70, 0x61, 0x63, 0x65, 0x22, 0x47, 0x0a, 0x0d, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x54, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x75, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x42, 0x08, + 0x5a, 0x06, 0x2e, 0x3b, 0x6f, 0x69, 0x64, 0x62, +} + +var ( + file_oidb0x6d8_proto_rawDescOnce sync.Once + file_oidb0x6d8_proto_rawDescData = file_oidb0x6d8_proto_rawDesc +) + +func file_oidb0x6d8_proto_rawDescGZIP() []byte { + file_oidb0x6d8_proto_rawDescOnce.Do(func() { + file_oidb0x6d8_proto_rawDescData = protoimpl.X.CompressGZIP(file_oidb0x6d8_proto_rawDescData) + }) + return file_oidb0x6d8_proto_rawDescData +} + +var file_oidb0x6d8_proto_msgTypes = make([]protoimpl.MessageInfo, 14) +var file_oidb0x6d8_proto_goTypes = []interface{}{ + (*D6D8ReqBody)(nil), // 0: D6D8ReqBody + (*D6D8RspBody)(nil), // 1: D6D8RspBody + (*GetFileInfoReqBody)(nil), // 2: GetFileInfoReqBody + (*GetFileInfoRspBody)(nil), // 3: GetFileInfoRspBody + (*GetFileListRspBody)(nil), // 4: GetFileListRspBody + (*GroupFileInfo)(nil), // 5: GroupFileInfo + (*GroupFolderInfo)(nil), // 6: GroupFolderInfo + (*GetFileListReqBody)(nil), // 7: GetFileListReqBody + (*GetFileCountReqBody)(nil), // 8: GetFileCountReqBody + (*GetSpaceReqBody)(nil), // 9: GetSpaceReqBody + (*GetFileCountRspBody)(nil), // 10: GetFileCountRspBody + (*GetSpaceRspBody)(nil), // 11: GetSpaceRspBody + (*FileTimeStamp)(nil), // 12: FileTimeStamp + (*GetFileListRspBody_Item)(nil), // 13: GetFileListRspBody.Item +} +var file_oidb0x6d8_proto_depIdxs = []int32{ + 2, // 0: D6D8ReqBody.fileInfoReq:type_name -> GetFileInfoReqBody + 7, // 1: D6D8ReqBody.fileListInfoReq:type_name -> GetFileListReqBody + 8, // 2: D6D8ReqBody.groupFileCountReq:type_name -> GetFileCountReqBody + 9, // 3: D6D8ReqBody.groupSpaceReq:type_name -> GetSpaceReqBody + 3, // 4: D6D8RspBody.fileInfoRsp:type_name -> GetFileInfoRspBody + 4, // 5: D6D8RspBody.fileListInfoRsp:type_name -> GetFileListRspBody + 10, // 6: D6D8RspBody.fileCountRsp:type_name -> GetFileCountRspBody + 11, // 7: D6D8RspBody.groupSpaceRsp:type_name -> GetSpaceRspBody + 5, // 8: GetFileInfoRspBody.fileInfo:type_name -> GroupFileInfo + 13, // 9: GetFileListRspBody.itemList:type_name -> GetFileListRspBody.Item + 12, // 10: GetFileListRspBody.maxTimestamp:type_name -> FileTimeStamp + 12, // 11: GetFileListReqBody.startTimestamp:type_name -> FileTimeStamp + 12, // 12: GetFileListReqBody.maxTimestamp:type_name -> FileTimeStamp + 6, // 13: GetFileListRspBody.Item.folderInfo:type_name -> GroupFolderInfo + 5, // 14: GetFileListRspBody.Item.fileInfo:type_name -> GroupFileInfo + 15, // [15:15] is the sub-list for method output_type + 15, // [15:15] is the sub-list for method input_type + 15, // [15:15] is the sub-list for extension type_name + 15, // [15:15] is the sub-list for extension extendee + 0, // [0:15] is the sub-list for field type_name +} + +func init() { file_oidb0x6d8_proto_init() } +func file_oidb0x6d8_proto_init() { + if File_oidb0x6d8_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_oidb0x6d8_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*D6D8ReqBody); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oidb0x6d8_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*D6D8RspBody); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oidb0x6d8_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetFileInfoReqBody); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oidb0x6d8_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetFileInfoRspBody); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oidb0x6d8_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetFileListRspBody); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oidb0x6d8_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GroupFileInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oidb0x6d8_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GroupFolderInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oidb0x6d8_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetFileListReqBody); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oidb0x6d8_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetFileCountReqBody); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oidb0x6d8_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSpaceReqBody); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oidb0x6d8_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetFileCountRspBody); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oidb0x6d8_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSpaceRspBody); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oidb0x6d8_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FileTimeStamp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oidb0x6d8_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetFileListRspBody_Item); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_oidb0x6d8_proto_rawDesc, + NumEnums: 0, + NumMessages: 14, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_oidb0x6d8_proto_goTypes, + DependencyIndexes: file_oidb0x6d8_proto_depIdxs, + MessageInfos: file_oidb0x6d8_proto_msgTypes, + }.Build() + File_oidb0x6d8_proto = out.File + file_oidb0x6d8_proto_rawDesc = nil + file_oidb0x6d8_proto_goTypes = nil + file_oidb0x6d8_proto_depIdxs = nil +} diff --git a/client/pb/oidb/oidb0x6d8.proto b/client/pb/oidb/oidb0x6d8.proto new file mode 100644 index 00000000..3c2fbe44 --- /dev/null +++ b/client/pb/oidb/oidb0x6d8.proto @@ -0,0 +1,137 @@ +syntax = "proto2"; + +option go_package = ".;oidb"; + +message D6D8ReqBody { + optional GetFileInfoReqBody fileInfoReq = 1; + optional GetFileListReqBody fileListInfoReq = 2; + optional GetFileCountReqBody groupFileCountReq = 3; + optional GetSpaceReqBody groupSpaceReq = 4; +} + +message D6D8RspBody { + optional GetFileInfoRspBody fileInfoRsp = 1; + optional GetFileListRspBody fileListInfoRsp = 2; + optional GetFileCountRspBody fileCountRsp = 3; + optional GetSpaceRspBody groupSpaceRsp = 4; +} + +message GetFileInfoReqBody { + optional uint64 groupCode = 1; + optional uint32 appId = 2; + optional uint32 busId = 3; + optional string fileId = 4; + optional uint32 fieldFlag = 5; +} + +message GetFileInfoRspBody { + optional int32 retCode = 1; + optional string retMsg = 2; + optional string clientWording = 3; + optional GroupFileInfo fileInfo = 4; +} + +message GetFileListRspBody { + optional int32 retCode = 1; + optional string retMsg = 2; + optional string clientWording = 3; + optional bool isEnd = 4; + message Item { + optional uint32 type = 1; + optional GroupFolderInfo folderInfo = 2; + optional GroupFileInfo fileInfo = 3; + } + repeated Item itemList = 5; + optional FileTimeStamp maxTimestamp = 6; + optional uint32 allFileCount = 7; + optional uint32 filterCode = 8; + optional bool safeCheckFlag = 11; + optional uint32 safeCheckRes = 12; + optional uint32 nextIndex = 13; + optional bytes context = 14; + optional uint32 role = 15; + optional uint32 openFlag = 16; +} + +message GroupFileInfo {/* renamed from FileInfo */ + optional string fileId = 1; + optional string fileName = 2; + optional uint64 fileSize = 3; + optional uint32 busId = 4; + optional uint64 uploadedSize = 5; + optional uint32 uploadTime = 6; + optional uint32 deadTime = 7; + optional uint32 modifyTime = 8; + optional uint32 downloadTimes = 9; + optional bytes sha = 10; + optional bytes sha3 = 11; + optional bytes md5 = 12; + optional string localPath = 13; + optional string uploaderName = 14; + optional uint64 uploaderUin = 15; + optional string parentFolderId = 16; +} + +message GroupFolderInfo {/* renamed from FolderInfo */ + optional string folderId = 1; + optional string parentFolderId = 2; + optional string folderName = 3; + optional uint32 createTime = 4; + optional uint32 modifyTime = 5; + optional uint64 createUin = 6; + optional string creatorName = 7; + optional uint32 totalFileCount = 8; +} + + +message GetFileListReqBody { + optional uint64 groupCode = 1; + optional uint32 appId = 2; + optional string folderId = 3; + optional FileTimeStamp startTimestamp = 4; + optional uint32 fileCount = 5; + optional FileTimeStamp maxTimestamp = 6; + optional uint32 allFileCount = 7; + optional uint32 reqFrom = 8; + optional uint32 sortBy = 9; + optional uint32 filterCode = 10; + optional uint64 uin = 11; + optional uint32 fieldFlag = 12; + optional uint32 startIndex = 13; + optional bytes context = 14; + optional uint32 clientVersion = 15; +} + +message GetFileCountReqBody { + optional uint64 groupCode = 1; + optional uint32 appId = 2; + optional uint32 busId = 3; +} + +message GetSpaceReqBody { + optional uint64 groupCode = 1; + optional uint32 appId = 2; +} + +message GetFileCountRspBody { + optional int32 retCode = 1; + optional string retMsg = 2; + optional string clientWording = 3; + optional uint32 allFileCount = 4; + optional bool fileTooMany = 5; + optional uint32 limitCount = 6; + optional bool isFull = 7; +} + +message GetSpaceRspBody { + optional int32 retCode = 1; + optional string retMsg = 2; + optional string clientWording = 3; + optional uint64 totalSpace = 4; + optional uint64 usedSpace = 5; +} + +message FileTimeStamp { + optional uint32 uploadTime = 1; + optional string fileId = 2; +} \ No newline at end of file diff --git a/client/pb/oidb/oidb0xd79.pb.go b/client/pb/oidb/oidb0xd79.pb.go index 4c6dab9c..67ab09cb 100644 --- a/client/pb/oidb/oidb0xd79.pb.go +++ b/client/pb/oidb/oidb0xd79.pb.go @@ -2,7 +2,7 @@ // versions: // protoc-gen-go v1.25.0 // protoc v3.11.4 -// source: oidb0xd79.proto +// source: oidb0xD79.proto package oidb @@ -42,7 +42,7 @@ type D79ReqBody struct { func (x *D79ReqBody) Reset() { *x = D79ReqBody{} if protoimpl.UnsafeEnabled { - mi := &file_oidb0xd79_proto_msgTypes[0] + mi := &file_oidb0xD79_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -55,7 +55,7 @@ func (x *D79ReqBody) String() string { func (*D79ReqBody) ProtoMessage() {} func (x *D79ReqBody) ProtoReflect() protoreflect.Message { - mi := &file_oidb0xd79_proto_msgTypes[0] + mi := &file_oidb0xD79_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -68,7 +68,7 @@ func (x *D79ReqBody) ProtoReflect() protoreflect.Message { // Deprecated: Use D79ReqBody.ProtoReflect.Descriptor instead. func (*D79ReqBody) Descriptor() ([]byte, []int) { - return file_oidb0xd79_proto_rawDescGZIP(), []int{0} + return file_oidb0xD79_proto_rawDescGZIP(), []int{0} } func (x *D79ReqBody) GetSeq() uint64 { @@ -135,7 +135,7 @@ type D79RspBody struct { func (x *D79RspBody) Reset() { *x = D79RspBody{} if protoimpl.UnsafeEnabled { - mi := &file_oidb0xd79_proto_msgTypes[1] + mi := &file_oidb0xD79_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -148,7 +148,7 @@ func (x *D79RspBody) String() string { func (*D79RspBody) ProtoMessage() {} func (x *D79RspBody) ProtoReflect() protoreflect.Message { - mi := &file_oidb0xd79_proto_msgTypes[1] + mi := &file_oidb0xD79_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -161,7 +161,7 @@ func (x *D79RspBody) ProtoReflect() protoreflect.Message { // Deprecated: Use D79RspBody.ProtoReflect.Descriptor instead. func (*D79RspBody) Descriptor() ([]byte, []int) { - return file_oidb0xd79_proto_rawDescGZIP(), []int{1} + return file_oidb0xD79_proto_rawDescGZIP(), []int{1} } func (x *D79RspBody) GetRet() uint32 { @@ -210,7 +210,7 @@ type D79Content struct { func (x *D79Content) Reset() { *x = D79Content{} if protoimpl.UnsafeEnabled { - mi := &file_oidb0xd79_proto_msgTypes[2] + mi := &file_oidb0xD79_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -223,7 +223,7 @@ func (x *D79Content) String() string { func (*D79Content) ProtoMessage() {} func (x *D79Content) ProtoReflect() protoreflect.Message { - mi := &file_oidb0xd79_proto_msgTypes[2] + mi := &file_oidb0xD79_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -236,7 +236,7 @@ func (x *D79Content) ProtoReflect() protoreflect.Message { // Deprecated: Use D79Content.ProtoReflect.Descriptor instead. func (*D79Content) Descriptor() ([]byte, []int) { - return file_oidb0xd79_proto_rawDescGZIP(), []int{2} + return file_oidb0xD79_proto_rawDescGZIP(), []int{2} } func (x *D79Content) GetSliceContent() [][]byte { @@ -246,10 +246,10 @@ func (x *D79Content) GetSliceContent() [][]byte { return nil } -var File_oidb0xd79_proto protoreflect.FileDescriptor +var File_oidb0xD79_proto protoreflect.FileDescriptor -var file_oidb0xd79_proto_rawDesc = []byte{ - 0x0a, 0x0f, 0x6f, 0x69, 0x64, 0x62, 0x30, 0x78, 0x64, 0x37, 0x39, 0x2e, 0x70, 0x72, 0x6f, 0x74, +var file_oidb0xD79_proto_rawDesc = []byte{ + 0x0a, 0x0f, 0x6f, 0x69, 0x64, 0x62, 0x30, 0x78, 0x44, 0x37, 0x39, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbb, 0x01, 0x0a, 0x0a, 0x44, 0x37, 0x39, 0x52, 0x65, 0x71, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x73, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, @@ -279,24 +279,24 @@ var file_oidb0xd79_proto_rawDesc = []byte{ } var ( - file_oidb0xd79_proto_rawDescOnce sync.Once - file_oidb0xd79_proto_rawDescData = file_oidb0xd79_proto_rawDesc + file_oidb0xD79_proto_rawDescOnce sync.Once + file_oidb0xD79_proto_rawDescData = file_oidb0xD79_proto_rawDesc ) -func file_oidb0xd79_proto_rawDescGZIP() []byte { - file_oidb0xd79_proto_rawDescOnce.Do(func() { - file_oidb0xd79_proto_rawDescData = protoimpl.X.CompressGZIP(file_oidb0xd79_proto_rawDescData) +func file_oidb0xD79_proto_rawDescGZIP() []byte { + file_oidb0xD79_proto_rawDescOnce.Do(func() { + file_oidb0xD79_proto_rawDescData = protoimpl.X.CompressGZIP(file_oidb0xD79_proto_rawDescData) }) - return file_oidb0xd79_proto_rawDescData + return file_oidb0xD79_proto_rawDescData } -var file_oidb0xd79_proto_msgTypes = make([]protoimpl.MessageInfo, 3) -var file_oidb0xd79_proto_goTypes = []interface{}{ +var file_oidb0xD79_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_oidb0xD79_proto_goTypes = []interface{}{ (*D79ReqBody)(nil), // 0: D79ReqBody (*D79RspBody)(nil), // 1: D79RspBody (*D79Content)(nil), // 2: D79Content } -var file_oidb0xd79_proto_depIdxs = []int32{ +var file_oidb0xD79_proto_depIdxs = []int32{ 2, // 0: D79RspBody.content:type_name -> D79Content 1, // [1:1] is the sub-list for method output_type 1, // [1:1] is the sub-list for method input_type @@ -305,13 +305,13 @@ var file_oidb0xd79_proto_depIdxs = []int32{ 0, // [0:1] is the sub-list for field type_name } -func init() { file_oidb0xd79_proto_init() } -func file_oidb0xd79_proto_init() { - if File_oidb0xd79_proto != nil { +func init() { file_oidb0xD79_proto_init() } +func file_oidb0xD79_proto_init() { + if File_oidb0xD79_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_oidb0xd79_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_oidb0xD79_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*D79ReqBody); i { case 0: return &v.state @@ -323,7 +323,7 @@ func file_oidb0xd79_proto_init() { return nil } } - file_oidb0xd79_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_oidb0xD79_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*D79RspBody); i { case 0: return &v.state @@ -335,7 +335,7 @@ func file_oidb0xd79_proto_init() { return nil } } - file_oidb0xd79_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_oidb0xD79_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*D79Content); i { case 0: return &v.state @@ -352,18 +352,18 @@ func file_oidb0xd79_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_oidb0xd79_proto_rawDesc, + RawDescriptor: file_oidb0xD79_proto_rawDesc, NumEnums: 0, NumMessages: 3, NumExtensions: 0, NumServices: 0, }, - GoTypes: file_oidb0xd79_proto_goTypes, - DependencyIndexes: file_oidb0xd79_proto_depIdxs, - MessageInfos: file_oidb0xd79_proto_msgTypes, + GoTypes: file_oidb0xD79_proto_goTypes, + DependencyIndexes: file_oidb0xD79_proto_depIdxs, + MessageInfos: file_oidb0xD79_proto_msgTypes, }.Build() - File_oidb0xd79_proto = out.File - file_oidb0xd79_proto_rawDesc = nil - file_oidb0xd79_proto_goTypes = nil - file_oidb0xd79_proto_depIdxs = nil + File_oidb0xD79_proto = out.File + file_oidb0xD79_proto_rawDesc = nil + file_oidb0xD79_proto_goTypes = nil + file_oidb0xD79_proto_depIdxs = nil } diff --git a/go.mod b/go.mod index 9887a232..202f4723 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/Mrs4s/MiraiGo go 1.14 require ( - github.com/golang/protobuf v1.4.2 + github.com/golang/protobuf v1.4.3 github.com/tidwall/gjson v1.6.1 google.golang.org/protobuf v1.25.0 ) diff --git a/go.sum b/go.sum index 31ae4621..4768d625 100644 --- a/go.sum +++ b/go.sum @@ -17,6 +17,8 @@ github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0 github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= From 056792577cd84c27329645d39af8255d31b77314 Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Thu, 29 Oct 2020 07:30:41 +0800 Subject: [PATCH 04/12] fix build. --- client/decoders.go | 1 - 1 file changed, 1 deletion(-) diff --git a/client/decoders.go b/client/decoders.go index 18a1d051..43c64907 100644 --- a/client/decoders.go +++ b/client/decoders.go @@ -1,7 +1,6 @@ package client import ( - "encoding/hex" "errors" "fmt" "github.com/Mrs4s/MiraiGo/client/pb/notify" From 84519e0a17ab50068e18875b8201ee1ccaba24bd Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Fri, 30 Oct 2020 09:26:40 +0800 Subject: [PATCH 05/12] fix net loop. --- client/client.go | 1 + 1 file changed, 1 insertion(+) diff --git a/client/client.go b/client/client.go index 100073e1..41816eca 100644 --- a/client/client.go +++ b/client/client.go @@ -209,6 +209,7 @@ func (c *QQClient) Login() (*LoginResponse, error) { seq, packet := c.buildLoginPacket() rsp, err := c.sendAndWait(seq, packet) if err != nil { + c.Disconnect() return nil, err } l := rsp.(LoginResponse) From a45bbd636478a82b483f5e6678a8b60353d6444a Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Wed, 4 Nov 2020 01:46:31 +0800 Subject: [PATCH 06/12] fix GetGroupInfo() panic. --- binary/jce/structs.go | 14 ++++ binary/jce/writer.go | 27 ++++++-- client/builders.go | 48 -------------- client/client.go | 9 +-- client/decoders.go | 27 -------- client/group_info.go | 148 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 184 insertions(+), 89 deletions(-) create mode 100644 client/group_info.go diff --git a/binary/jce/structs.go b/binary/jce/structs.go index 273e3d48..43a345ed 100644 --- a/binary/jce/structs.go +++ b/binary/jce/structs.go @@ -362,6 +362,14 @@ type ( ReqNearbyGodInfo byte `jceId:"20"` ReqExtendCard byte `jceId:"22"` } + + SummaryCardReqSearch struct { + IJceStruct + Keyword string `jceId:"0"` + CountryCode string `jceId:"1"` + Version int32 `jceId:"2"` + ReqServices [][]byte `jceId:"3"` // busi + } ) func (pkt *RequestPacket) ToBytes() []byte { @@ -433,6 +441,12 @@ func (pkt *SummaryCardReq) ToBytes() []byte { return w.Bytes() } +func (pkt *SummaryCardReqSearch) ToBytes() []byte { + w := NewJceWriter() + w.WriteJceStructRaw(pkt) + return w.Bytes() +} + func (pkt *FriendInfo) ReadFrom(r *JceReader) { pkt.FriendUin = r.ReadInt64(0) pkt.GroupId = r.ReadByte(1) diff --git a/binary/jce/writer.go b/binary/jce/writer.go index 9ba3f703..94f9647c 100644 --- a/binary/jce/writer.go +++ b/binary/jce/writer.go @@ -112,6 +112,23 @@ func (w *JceWriter) WriteInt64Slice(l []int64, tag int) { } } +func (w *JceWriter) WriteSlice(i interface{}, tag int) { + va := reflect.ValueOf(i) + if va.Kind() != reflect.Slice { + return + } + w.writeHead(9, tag) + if va.Len() == 0 { + w.WriteInt32(0, 0) + return + } + w.WriteInt32(int32(va.Len()), 0) + for i := 0; i < va.Len(); i++ { + v := va.Index(i) + w.WriteObject(v.Interface(), 0) + } +} + func (w *JceWriter) WriteJceStructSlice(l []IJceStruct, tag int) { w.writeHead(9, tag) if len(l) == 0 { @@ -149,6 +166,10 @@ func (w *JceWriter) WriteObject(i interface{}, tag int) { w.WriteMap(i, tag) return } + if t.Kind() == reflect.Slice { + w.WriteSlice(i, tag) + return + } switch o := i.(type) { case byte: w.WriteByte(o, tag) @@ -166,14 +187,8 @@ func (w *JceWriter) WriteObject(i interface{}, tag int) { w.WriteFloat64(o, tag) case string: w.WriteString(o, tag) - case []byte: - w.WriteBytes(o, tag) - case []int64: - w.WriteInt64Slice(o, tag) case IJceStruct: w.WriteJceStruct(o, tag) - case []IJceStruct: - w.WriteJceStructSlice(o, tag) } } diff --git a/client/builders.go b/client/builders.go index b26b9b89..46d6b317 100644 --- a/client/builders.go +++ b/client/builders.go @@ -1041,54 +1041,6 @@ func (c *QQClient) buildGroupAdminSetPacket(groupCode, member int64, flag bool) return seq, packet } -// OidbSvc.0x88d_0 -func (c *QQClient) buildGroupInfoRequestPacket(groupCode int64) (uint16, []byte) { - seq := c.nextSeq() - body := &oidb.D88DReqBody{ - AppId: proto.Uint32(c.version.AppId), - ReqGroupInfo: []*oidb.ReqGroupInfo{ - { - GroupCode: proto.Uint64(uint64(groupCode)), - Stgroupinfo: &oidb.D88DGroupInfo{ - GroupOwner: proto.Uint64(0), - GroupUin: proto.Uint64(0), - GroupCreateTime: proto.Uint32(0), - GroupFlag: proto.Uint32(0), - GroupMemberMaxNum: proto.Uint32(0), - GroupMemberNum: proto.Uint32(0), - GroupOption: proto.Uint32(0), - GroupLevel: proto.Uint32(0), - GroupFace: proto.Uint32(0), - GroupName: EmptyBytes, - GroupMemo: EmptyBytes, - GroupFingerMemo: EmptyBytes, - GroupLastMsgTime: proto.Uint32(0), - GroupQuestion: EmptyBytes, - GroupAnswer: EmptyBytes, - GroupGrade: proto.Uint32(0), - ActiveMemberNum: proto.Uint32(0), - HeadPortraitSeq: proto.Uint32(0), - MsgHeadPortrait: &oidb.D88DGroupHeadPortrait{}, - StGroupExInfo: &oidb.D88DGroupExInfoOnly{}, - GroupSecLevel: proto.Uint32(0), - CmduinPrivilege: proto.Uint32(0), - NoFingerOpenFlag: proto.Uint32(0), - NoCodeFingerOpenFlag: proto.Uint32(0), - }, - }, - }, - PcClientVersion: proto.Uint32(0), - } - b, _ := proto.Marshal(body) - req := &oidb.OIDBSSOPkg{ - Command: 2189, - Bodybuffer: b, - } - payload, _ := proto.Marshal(req) - packet := packets.BuildUniPacket(c.Uin, seq, "OidbSvc.0x88d_0", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload) - return seq, packet -} - // ProfileService.GroupMngReq func (c *QQClient) buildQuitGroupPacket(groupCode int64) (uint16, []byte) { seq := c.nextSeq() diff --git a/client/client.go b/client/client.go index 41816eca..ad72ba72 100644 --- a/client/client.go +++ b/client/client.go @@ -158,6 +158,7 @@ func NewClientMd5(uin int64, passwordMd5 [16]byte) *QQClient { "OidbSvc.0xd79": decodeWordSegmentation, "OidbSvc.0x990": decodeTranslateResponse, "SummaryCard.ReqSummaryCard": decodeSummaryCardResponse, + "SummaryCard.ReqSearch": decodeGroupSearchResponse, "PttCenterSvr.ShortVideoDownReq": decodePttShortVideoDownResponse, "LightAppSvc.mini_app_info.GetAppInfoById": decodeAppInfoResponse, "OfflineFilleHandleSvr.pb_ftn_CMD_REQ_APPLY_DOWNLOAD-1200": decodeOfflineFileDownloadResponse, @@ -372,14 +373,6 @@ func (c *QQClient) GetShortVideoUrl(uuid, md5 []byte) string { return i.(string) } -func (c *QQClient) GetGroupInfo(groupCode int64) (*GroupInfo, error) { - i, err := c.sendAndWait(c.buildGroupInfoRequestPacket(groupCode)) - if err != nil { - return nil, err - } - return i.(*GroupInfo), nil -} - func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage, f ...bool) *message.GroupMessage { useFram := false if len(f) > 0 { diff --git a/client/decoders.go b/client/decoders.go index 43c64907..fea6fcdc 100644 --- a/client/decoders.go +++ b/client/decoders.go @@ -517,33 +517,6 @@ func decodeGroupListResponse(c *QQClient, _ uint16, payload []byte) (interface{} return l, nil } -// OidbSvc.0x88d_0 -func decodeGroupInfoResponse(c *QQClient, _ uint16, payload []byte) (interface{}, error) { - pkg := oidb.OIDBSSOPkg{} - rsp := oidb.D88DRspBody{} - if err := proto.Unmarshal(payload, &pkg); err != nil { - return nil, err - } - if err := proto.Unmarshal(pkg.Bodybuffer, &rsp); err != nil { - return nil, err - } - if len(rsp.RspGroupInfo) == 0 { - return nil, errors.New(string(rsp.StrErrorInfo)) - } - info := rsp.RspGroupInfo[0] - return &GroupInfo{ - Uin: int64(*info.GroupInfo.GroupUin), - Code: int64(*info.GroupCode), - Name: string(info.GroupInfo.GroupName), - Memo: string(info.GroupInfo.GroupMemo), - OwnerUin: int64(*info.GroupInfo.GroupOwner), - MemberCount: uint16(*info.GroupInfo.GroupMemberNum), - MaxMemberCount: uint16(*info.GroupInfo.GroupMemberMaxNum), - Members: []*GroupMemberInfo{}, - client: c, - }, nil -} - // friendlist.GetTroopMemberListReq func decodeGroupMemberListResponse(_ *QQClient, _ uint16, payload []byte) (interface{}, error) { request := &jce.RequestPacket{} diff --git a/client/group_info.go b/client/group_info.go new file mode 100644 index 00000000..a1011f1a --- /dev/null +++ b/client/group_info.go @@ -0,0 +1,148 @@ +package client + +import ( + "encoding/hex" + "errors" + "github.com/Mrs4s/MiraiGo/binary" + "github.com/Mrs4s/MiraiGo/binary/jce" + "github.com/Mrs4s/MiraiGo/client/pb/oidb" + "github.com/Mrs4s/MiraiGo/protocol/packets" + "google.golang.org/protobuf/proto" +) + +func (c *QQClient) GetGroupInfo(groupCode int64) (*GroupInfo, error) { + i, err := c.sendAndWait(c.buildGroupInfoRequestPacket(groupCode)) + if err != nil { + return nil, err + } + return i.(*GroupInfo), nil +} + +// OidbSvc.0x88d_0 +func (c *QQClient) buildGroupInfoRequestPacket(groupCode int64) (uint16, []byte) { + seq := c.nextSeq() + body := &oidb.D88DReqBody{ + AppId: proto.Uint32(c.version.AppId), + ReqGroupInfo: []*oidb.ReqGroupInfo{ + { + GroupCode: proto.Uint64(uint64(groupCode)), + Stgroupinfo: &oidb.D88DGroupInfo{ + GroupOwner: proto.Uint64(0), + GroupUin: proto.Uint64(0), + GroupCreateTime: proto.Uint32(0), + GroupFlag: proto.Uint32(0), + GroupMemberMaxNum: proto.Uint32(0), + GroupMemberNum: proto.Uint32(0), + GroupOption: proto.Uint32(0), + GroupLevel: proto.Uint32(0), + GroupFace: proto.Uint32(0), + GroupName: EmptyBytes, + GroupMemo: EmptyBytes, + GroupFingerMemo: EmptyBytes, + GroupLastMsgTime: proto.Uint32(0), + GroupQuestion: EmptyBytes, + GroupAnswer: EmptyBytes, + GroupGrade: proto.Uint32(0), + ActiveMemberNum: proto.Uint32(0), + HeadPortraitSeq: proto.Uint32(0), + MsgHeadPortrait: &oidb.D88DGroupHeadPortrait{}, + StGroupExInfo: &oidb.D88DGroupExInfoOnly{}, + GroupSecLevel: proto.Uint32(0), + CmduinPrivilege: proto.Uint32(0), + NoFingerOpenFlag: proto.Uint32(0), + NoCodeFingerOpenFlag: proto.Uint32(0), + }, + }, + }, + PcClientVersion: proto.Uint32(0), + } + b, _ := proto.Marshal(body) + req := &oidb.OIDBSSOPkg{ + Command: 2189, + Bodybuffer: b, + } + payload, _ := proto.Marshal(req) + packet := packets.BuildUniPacket(c.Uin, seq, "OidbSvc.0x88d_0", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload) + return seq, packet +} + +// SummaryCard.ReqSearch +func (c *QQClient) buildGroupSearchPacket(keyword string) (uint16, []byte) { + seq := c.nextSeq() + s, _ := hex.DecodeString(`280000001e00000030080110ffffffff0f2881e8922660026a0a382e342e382e3438313070ca2508001004220935393737393631323232093539373739363132325212090000000000000000110000000000000000600029`) + req := &jce.SummaryCardReqSearch{ + Keyword: keyword, + CountryCode: "+86", + Version: 3, + ReqServices: [][]byte{s}, + } + head := jce.NewJceWriter() + head.WriteInt32(2, 0) + buf := &jce.RequestDataVersion3{Map: map[string][]byte{ + "ReqHead": packRequestDataV3(head.Bytes()), + "ReqSearch": packRequestDataV3(req.ToBytes()), + }} + pkt := &jce.RequestPacket{ + IVersion: 3, + SServantName: "SummaryCardServantObj", + SFuncName: "ReqSearch", + SBuffer: buf.ToBytes(), + Context: make(map[string]string), + Status: make(map[string]string), + } + packet := packets.BuildUniPacket(c.Uin, seq, "SummaryCard.ReqSearch", 1, c.OutGoingPacketSessionId, []byte{}, c.sigInfo.d2Key, pkt.ToBytes()) + return seq, packet +} + +// SummaryCard.ReqSearch +func decodeGroupSearchResponse(c *QQClient, _ uint16, payload []byte) (interface{}, error) { + request := &jce.RequestPacket{} + request.ReadFrom(jce.NewJceReader(payload)) + data := &jce.RequestDataVersion2{} + data.ReadFrom(jce.NewJceReader(request.SBuffer)) + if len(data.Map["RespHead"]["SummaryCard.RespHead"]) > 20 { + return nil, errors.New("not found") + } + rsp := data.Map["RespSearch"]["SummaryCard.RespSearch"][1:] + r := jce.NewJceReader(rsp) + rspService := r.ReadAny(2).([]interface{})[0].([]byte) + sr := binary.NewReader(rspService) + sr.ReadByte() + ld1 := sr.ReadInt32() + ld2 := sr.ReadInt32() + if ld1 > 0 && ld2+9 < int32(len(rspService)) { + sr.ReadBytes(int(ld1)) // busi comm + //searchPb := sr.ReadBytes(int(ld2)) //TODO: search pb decode + } + return nil, nil +} + +// OidbSvc.0x88d_0 +func decodeGroupInfoResponse(c *QQClient, _ uint16, payload []byte) (interface{}, error) { + pkg := oidb.OIDBSSOPkg{} + rsp := oidb.D88DRspBody{} + if err := proto.Unmarshal(payload, &pkg); err != nil { + return nil, err + } + if err := proto.Unmarshal(pkg.Bodybuffer, &rsp); err != nil { + return nil, err + } + if len(rsp.RspGroupInfo) == 0 { + return nil, errors.New(string(rsp.StrErrorInfo)) + } + info := rsp.RspGroupInfo[0] + if info.GroupInfo == nil { + return nil, errors.New("group info not found") + } + return &GroupInfo{ + Uin: int64(*info.GroupInfo.GroupUin), + Code: int64(*info.GroupCode), + Name: string(info.GroupInfo.GroupName), + Memo: string(info.GroupInfo.GroupMemo), + OwnerUin: int64(*info.GroupInfo.GroupOwner), + MemberCount: uint16(*info.GroupInfo.GroupMemberNum), + MaxMemberCount: uint16(*info.GroupInfo.GroupMemberMaxNum), + Members: []*GroupMemberInfo{}, + client: c, + }, nil +} From 2566bea1f884b605428bbec19da6344caa030b71 Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Wed, 4 Nov 2020 01:51:36 +0800 Subject: [PATCH 07/12] clear code. --- client/group_info.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/client/group_info.go b/client/group_info.go index a1011f1a..bd790921 100644 --- a/client/group_info.go +++ b/client/group_info.go @@ -1,7 +1,6 @@ package client import ( - "encoding/hex" "errors" "github.com/Mrs4s/MiraiGo/binary" "github.com/Mrs4s/MiraiGo/binary/jce" @@ -69,12 +68,11 @@ func (c *QQClient) buildGroupInfoRequestPacket(groupCode int64) (uint16, []byte) // SummaryCard.ReqSearch func (c *QQClient) buildGroupSearchPacket(keyword string) (uint16, []byte) { seq := c.nextSeq() - s, _ := hex.DecodeString(`280000001e00000030080110ffffffff0f2881e8922660026a0a382e342e382e3438313070ca2508001004220935393737393631323232093539373739363132325212090000000000000000110000000000000000600029`) req := &jce.SummaryCardReqSearch{ Keyword: keyword, CountryCode: "+86", Version: 3, - ReqServices: [][]byte{s}, + ReqServices: [][]byte{}, } head := jce.NewJceWriter() head.WriteInt32(2, 0) From 7cc6f1c9268c9f56a1bc4dec4f5409d49fdd5fc7 Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Wed, 4 Nov 2020 12:01:38 +0800 Subject: [PATCH 08/12] add SvcResp. --- binary/jce/structs.go | 44 +++++++++++++++++++++++++++++++++++++++++++ client/builders.go | 2 +- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/binary/jce/structs.go b/binary/jce/structs.go index 43a345ed..db98d38d 100644 --- a/binary/jce/structs.go +++ b/binary/jce/structs.go @@ -73,6 +73,29 @@ type ( SetMute byte `jceId:"36"` } + SvcRespRegister struct { + Uin int64 `jceId:"0"` + Bid int64 `jceId:"1"` + ReplyCode byte `jceId:"2"` + Result string `jceId:"3"` + ServerTime int64 `jceId:"4"` + LogQQ byte `jceId:"5"` + NeedKik byte `jceId:"6"` + UpdateFlag byte `jceId:"7"` + Timestamp int64 `jceId:"8"` + CrashFlag byte `jceId:"9"` + ClientIp string `jceId:"10"` + ClientPort int32 `jceId:"11"` + HelloInterval int32 `jceId:"12"` + LargeSeq int32 `jceId:"13"` + LargeSeqUpdate byte `jceId:"14"` + D769RspBody []byte `jceId:"15"` + Status int32 `jceId:"16"` + ExtOnlineStatus int64 `jceId:"17"` + ClientBatteryGetInterval int64 `jceId:"18"` + ClientAutoStatusInterval int64 `jceId:"19"` + } + PushMessageInfo struct { FromUin int64 `jceId:"0"` MsgTime int64 `jceId:"1"` @@ -429,6 +452,27 @@ func (pkt *SvcReqRegister) ToBytes() []byte { return w.Bytes() } +func (pkt *SvcRespRegister) ReadFrom(r *JceReader) { + pkt.Uin = r.ReadInt64(0) + pkt.Bid = r.ReadInt64(1) + pkt.ReplyCode = r.ReadByte(2) + pkt.Result = r.ReadString(3) + pkt.ServerTime = r.ReadInt64(4) + pkt.LogQQ = r.ReadByte(5) + pkt.NeedKik = r.ReadByte(6) + pkt.UpdateFlag = r.ReadByte(7) + pkt.Timestamp = r.ReadInt64(8) + pkt.CrashFlag = r.ReadByte(9) + pkt.ClientIp = r.ReadString(10) + pkt.ClientPort = r.ReadInt32(11) + pkt.HelloInterval = r.ReadInt32(12) + pkt.LargeSeq = r.ReadInt32(13) + pkt.LargeSeqUpdate = r.ReadByte(14) + pkt.D769RspBody = r.ReadAny(15).([]byte) + pkt.Status = r.ReadInt32(16) + pkt.ExtOnlineStatus = r.ReadInt64(17) +} + func (pkt *FriendListRequest) ToBytes() []byte { w := NewJceWriter() w.WriteJceStructRaw(pkt) diff --git a/client/builders.go b/client/builders.go index 46d6b317..fd5e19c7 100644 --- a/client/builders.go +++ b/client/builders.go @@ -244,7 +244,7 @@ func (c *QQClient) buildClientRegisterPacket() (uint16, []byte) { ChannelNo: "", CPID: 0, VendorName: "MIUI", - VendorOSName: "ONEPLUS A5000_23_17", + VendorOSName: string(SystemDeviceInfo.Product), B769: []byte{0x0A, 0x04, 0x08, 0x2E, 0x10, 0x00, 0x0A, 0x05, 0x08, 0x9B, 0x02, 0x10, 0x00}, SetMute: 0, } From 1ffb13176806419d4760b953474169f69623ec5d Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Wed, 4 Nov 2020 14:01:31 +0800 Subject: [PATCH 09/12] feature: reg rsp check. --- client/client.go | 15 ++++++++++----- client/decoders.go | 5 +++++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/client/client.go b/client/client.go index ad72ba72..af4d72fd 100644 --- a/client/client.go +++ b/client/client.go @@ -248,7 +248,7 @@ func (c *QQClient) SubmitSMS(code string) (*LoginResponse, error) { func (c *QQClient) init() { c.Online = true - c.registerClient() + _ = c.registerClient() c.groupSysMsgCache, _ = c.GetGroupSystemMessages() if !c.heartbeatEnabled { c.startHeartbeat() @@ -949,9 +949,9 @@ func (c *QQClient) SendGroupGift(groupCode, uin uint64, gift message.GroupGift) _ = c.send(packet) } -func (c *QQClient) registerClient() { - _, packet := c.buildClientRegisterPacket() - _ = c.send(packet) +func (c *QQClient) registerClient() error { + _, err := c.sendAndWait(c.buildClientRegisterPacket()) + return err } func (c *QQClient) nextSeq() uint16 { @@ -1034,7 +1034,12 @@ func (c *QQClient) netLoop() { break } reader = binary.NewNetworkReader(c.Conn) - c.registerClient() + if c.registerClient() != nil { + c.Disconnect() + c.lastLostMsg = "register client failed." + c.Error("reconnect failed: register client failed.") + break + } } if l <= 0 { retry++ diff --git a/client/decoders.go b/client/decoders.go index fea6fcdc..525375c4 100644 --- a/client/decoders.go +++ b/client/decoders.go @@ -170,6 +170,11 @@ func decodeClientRegisterResponse(_ *QQClient, _ uint16, payload []byte) (interf request.ReadFrom(jce.NewJceReader(payload)) data := &jce.RequestDataVersion2{} data.ReadFrom(jce.NewJceReader(request.SBuffer)) + svcRsp := &jce.SvcRespRegister{} + svcRsp.ReadFrom(jce.NewJceReader(data.Map["SvcRespRegister"]["QQService.SvcRespRegister"][1:])) + if svcRsp.Result != "" || svcRsp.Status != 11 { + return nil, errors.New("reg failed") + } return nil, nil } From 61dd50e46458bdd9508959d40d0cbcdeaeb7307d Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Wed, 4 Nov 2020 14:49:00 +0800 Subject: [PATCH 10/12] fix session expired. --- client/client.go | 5 ++++- protocol/packets/global.go | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/client/client.go b/client/client.go index af4d72fd..1c4c1674 100644 --- a/client/client.go +++ b/client/client.go @@ -1053,8 +1053,11 @@ func (c *QQClient) netLoop() { pkt, err := packets.ParseIncomingPacket(data, c.sigInfo.d2Key) if err != nil { c.Error("parse incoming packet error: %v", err) + if err == packets.ErrSessionExpired { + break + } errCount++ - if errCount > 5 { + if errCount > 2 { break } //log.Println("parse incoming packet error: " + err.Error()) diff --git a/protocol/packets/global.go b/protocol/packets/global.go index 37c55011..cccdc0fb 100644 --- a/protocol/packets/global.go +++ b/protocol/packets/global.go @@ -10,6 +10,7 @@ import ( var ErrUnknownFlag = errors.New("unknown flag") var ErrInvalidPayload = errors.New("invalid payload") var ErrDecryptFailed = errors.New("decrypt failed") +var ErrSessionExpired = errors.New("session expired") type ISendingPacket interface { CommandId() uint16 @@ -125,6 +126,9 @@ func parseSsoFrame(payload []byte, flag2 byte) (*IncomingPacket, error) { seqId := reader.ReadInt32() retCode := reader.ReadInt32() if retCode != 0 { + if retCode == -10008 { + return nil, ErrSessionExpired + } return nil, errors.New("return code unsuccessful: " + strconv.FormatInt(int64(retCode), 10)) } reader.ReadBytes(int(reader.ReadInt32()) - 4) // extra data From ca72d542ca7265e55d7a6974912b9922ca7587cd Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Thu, 5 Nov 2020 20:03:58 +0800 Subject: [PATCH 11/12] fix group file download error. --- client/group_file.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/group_file.go b/client/group_file.go index 2b722880..68155f58 100644 --- a/client/group_file.go +++ b/client/group_file.go @@ -251,6 +251,9 @@ func decodeOIDB6d6Response(_ *QQClient, _ uint16, payload []byte) (interface{}, if err := proto.Unmarshal(pkg.Bodybuffer, &rsp); err != nil { return nil, err } + if rsp.DownloadFileRsp.DownloadUrl == nil { + return nil, errors.New(rsp.DownloadFileRsp.ClientWording) + } ip := rsp.DownloadFileRsp.DownloadIp url := hex.EncodeToString(rsp.DownloadFileRsp.DownloadUrl) return fmt.Sprintf("http://%s/ftn_handler/%s/", ip, url), nil From 3c7b0b8c8e942e40c86e65824672a8004cf5875f Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Mon, 9 Nov 2020 15:26:24 +0800 Subject: [PATCH 12/12] fix light app decode bug. --- message/message.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/message/message.go b/message/message.go index 7d71b1d2..00392a9a 100644 --- a/message/message.go +++ b/message/message.go @@ -366,16 +366,16 @@ func ParseMessageElems(elems []*msg.Elem) []IMessageElement { } } if elem.LightApp != nil && len(elem.LightApp.Data) > 1 { - var content string + var content []byte if elem.LightApp.Data[0] == 0 { - content = string(elem.LightApp.Data[1:]) + content = elem.LightApp.Data[1:] } if elem.LightApp.Data[0] == 1 { - content = string(binary.ZlibUncompress(elem.LightApp.Data[1:])) + content = binary.ZlibUncompress(elem.LightApp.Data[1:]) } - if content != "" { + if len(content) > 0 && len(content) < 1024*1024*1024 { // 解析出错 or 非法内容 // TODO: 解析具体的APP - return append(res, &LightAppElement{Content: content}) + return append(res, &LightAppElement{Content: string(content)}) } } if elem.VideoFile != nil {