1
0
mirror of https://github.com/Mrs4s/MiraiGo.git synced 2025-05-04 19:17:38 +08:00

refactor: use new protobuf impl oidb0x88d

This commit is contained in:
Mrs4s 2021-11-02 03:28:10 +08:00
parent c518dfcf15
commit b7b13c64b4
No known key found for this signature in database
GPG Key ID: 3186E98FA19CE3A7
8 changed files with 1460 additions and 2036 deletions

View File

@ -12,6 +12,7 @@ import (
"strings"
"time"
proto2 "github.com/Mrs4s/MiraiGo/internal/protobuf/proto"
"github.com/pkg/errors"
"google.golang.org/protobuf/proto"
@ -659,6 +660,11 @@ func (c *QQClient) packOIDBPackageProto(cmd, serviceType int32, msg proto.Messag
return c.packOIDBPackage(cmd, serviceType, b)
}
func (c *QQClient) packOIDBPackageProto2(cmd, serviceType int32, msg proto2.Message) []byte {
b, _ := msg.Marshal()
return c.packOIDBPackage(cmd, serviceType, b)
}
func (c *QQClient) Error(msg string, args ...interface{}) {
c.dispatchLogEvent(&LogEvent{
Type: "ERROR",

View File

@ -3,6 +3,9 @@ package client
import (
"encoding/json"
"fmt"
"github.com/Mrs4s/MiraiGo/internal/protobuf/data/oidb/oidb0x88d"
"go.dedis.ch/protobuf"
"google.golang.org/protobuf/proto"
"math/rand"
"net/url"
"sort"
@ -12,7 +15,6 @@ import (
"github.com/Mrs4s/MiraiGo/internal/packets"
"github.com/pkg/errors"
"google.golang.org/protobuf/proto"
"github.com/Mrs4s/MiraiGo/binary"
"github.com/Mrs4s/MiraiGo/binary/jce"
@ -80,12 +82,12 @@ func (c *QQClient) GetGroupInfo(groupCode int64) (*GroupInfo, error) {
// 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{
body := &oidb0x88d.ReqBody{
Appid: proto.Uint32(c.version.AppId),
Stzreqgroupinfo: []*oidb0x88d.ReqGroupInfo{
{
GroupCode: proto.Uint64(uint64(groupCode)),
Stgroupinfo: &oidb.D88DGroupInfo{
Stgroupinfo: &oidb0x88d.GroupInfo{
GroupOwner: proto.Uint64(0),
GroupUin: proto.Uint64(0),
GroupCreateTime: proto.Uint32(0),
@ -105,8 +107,8 @@ func (c *QQClient) buildGroupInfoRequestPacket(groupCode int64) (uint16, []byte)
GroupGrade: proto.Uint32(0),
ActiveMemberNum: proto.Uint32(0),
HeadPortraitSeq: proto.Uint32(0),
MsgHeadPortrait: &oidb.D88DGroupHeadPortrait{},
StGroupExInfo: &oidb.D88DGroupExInfoOnly{},
HeadPortrait: &oidb0x88d.GroupHeadPortrait{},
StGroupExInfo: &oidb0x88d.GroupExInfoOnly{},
GroupSecLevel: proto.Uint32(0),
CmduinPrivilege: proto.Uint32(0),
NoFingerOpenFlag: proto.Uint32(0),
@ -116,12 +118,7 @@ func (c *QQClient) buildGroupInfoRequestPacket(groupCode int64) (uint16, []byte)
},
PcClientVersion: proto.Uint32(0),
}
b, _ := proto.Marshal(body)
req := &oidb.OIDBSSOPkg{
Command: 2189,
Bodybuffer: b,
}
payload, _ := proto.Marshal(req)
payload := c.packOIDBPackageProto2(2189, 0, body)
packet := packets.BuildUniPacket(c.Uin, seq, "OidbSvc.0x88d_0", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload)
return seq, packet
}
@ -230,32 +227,32 @@ func decodeGroupSearchResponse(_ *QQClient, _ *incomingPacketInfo, payload []byt
// OidbSvc.0x88d_0
func decodeGroupInfoResponse(c *QQClient, _ *incomingPacketInfo, payload []byte) (interface{}, error) {
pkg := oidb.OIDBSSOPkg{}
rsp := oidb.D88DRspBody{}
rsp := oidb0x88d.RspBody{}
if err := proto.Unmarshal(payload, &pkg); err != nil {
return nil, errors.Wrap(err, "failed to unmarshal protobuf message")
}
if err := proto.Unmarshal(pkg.Bodybuffer, &rsp); err != nil {
if err := protobuf.Decode(pkg.Bodybuffer, &rsp); err != nil {
return nil, errors.Wrap(err, "failed to unmarshal protobuf message")
}
if len(rsp.RspGroupInfo) == 0 {
return nil, errors.New(string(rsp.StrErrorInfo))
if len(rsp.GetStzrspgroupinfo()) == 0 {
return nil, errors.New(string(rsp.Errorinfo))
}
info := rsp.RspGroupInfo[0]
if info.GroupInfo == nil {
info := rsp.Stzrspgroupinfo[0]
if info.Stgroupinfo == nil {
return nil, errors.New("group info not found")
}
return &GroupInfo{
Uin: int64(*info.GroupInfo.GroupUin),
Uin: int64(*info.Stgroupinfo.GroupUin),
Code: int64(*info.GroupCode),
Name: string(info.GroupInfo.GroupName),
Memo: string(info.GroupInfo.GroupMemo),
GroupCreateTime: *info.GroupInfo.GroupCreateTime,
GroupLevel: *info.GroupInfo.GroupLevel,
OwnerUin: int64(*info.GroupInfo.GroupOwner),
MemberCount: uint16(*info.GroupInfo.GroupMemberNum),
MaxMemberCount: uint16(*info.GroupInfo.GroupMemberMaxNum),
Name: string(info.Stgroupinfo.GroupName),
Memo: string(info.Stgroupinfo.GroupMemo),
GroupCreateTime: *info.Stgroupinfo.GroupCreateTime,
GroupLevel: *info.Stgroupinfo.GroupLevel,
OwnerUin: int64(*info.Stgroupinfo.GroupOwner),
MemberCount: uint16(*info.Stgroupinfo.GroupMemberNum),
MaxMemberCount: uint16(*info.Stgroupinfo.GroupMemberMaxNum),
Members: []*GroupMemberInfo{},
LastMsgSeq: int64(info.GroupInfo.GetGroupCurMsgSeq()),
LastMsgSeq: int64(info.Stgroupinfo.GetGroupCurMsgSeq()),
client: c,
}, nil
}

File diff suppressed because it is too large Load Diff

View File

@ -1,161 +0,0 @@
syntax = "proto2"; // exists flag group info proto2
option go_package = "./;oidb";
message D88DGroupHeadPortraitInfo
{
optional uint32 picId = 1;
}
message D88DGroupHeadPortrait
{
optional uint32 picCount = 1;
repeated D88DGroupHeadPortraitInfo msgInfo = 2;
optional uint32 defaultId = 3;
optional uint32 verifyingPicCnt = 4;
repeated D88DGroupHeadPortraitInfo msgVerifyingPicInfo = 5;
}
message D88DGroupExInfoOnly
{
optional uint32 tribeId = 1;
optional uint32 moneyForAddGroup = 2;
};
message D88DGroupInfo
{
optional uint64 groupOwner = 1;
optional uint32 groupCreateTime = 2;
optional uint32 groupFlag = 3;
optional uint32 groupFlagExt = 4;
optional uint32 groupMemberMaxNum = 5;
optional uint32 groupMemberNum = 6;
optional uint32 groupOption = 7;
optional uint32 groupClassExt = 8;
optional uint32 groupSpecialClass = 9;
optional uint32 groupLevel = 10;
optional uint32 groupFace = 11;
optional uint32 groupDefaultPage = 12;
optional uint32 groupInfoSeq = 13;
optional uint32 groupRoamingTime = 14;
optional bytes groupName = 15;
optional bytes groupMemo = 16;
optional bytes groupFingerMemo = 17;
optional bytes groupClassText = 18;
repeated uint32 groupAllianceCode = 19;
optional uint32 groupExtraAadmNum = 20;
optional uint64 groupUin = 21;
optional uint32 groupCurMsgSeq = 22;
optional uint32 groupLastMsgTime = 23;
optional bytes groupQuestion = 24;
optional bytes groupAnswer = 25;
optional uint32 groupVisitorMaxNum = 26;
optional uint32 groupVisitorCurNum = 27;
optional uint32 levelNameSeq = 28;
optional uint32 groupAdminMaxNum = 29;
optional uint32 groupAioSkinTimestamp = 30;
optional uint32 groupBoardSkinTimestamp = 31;
optional bytes groupAioSkinUrl = 32;
optional bytes groupBoardSkinUrl = 33;
optional uint32 groupCoverSkinTimestamp = 34;
optional bytes groupCoverSkinUrl = 35;
optional uint32 groupGrade = 36;
optional uint32 activeMemberNum = 37;
optional uint32 certificationType = 38;
optional bytes certificationText = 39;
optional bytes groupRichFingerMemo = 40;
repeated D88DTagRecord tagRecord = 41;
optional D88DGroupGeoInfo groupGeoInfo = 42;
optional uint32 headPortraitSeq = 43;
optional D88DGroupHeadPortrait msgHeadPortrait = 44;
optional uint32 shutupTimestamp = 45 ;
optional uint32 shutupTimestampMe = 46 ;
optional uint32 createSourceFlag = 47 ;
optional uint32 cmduinMsgSeq = 48;
optional uint32 cmduinJoinTime = 49;
optional uint32 cmduinUinFlag = 50;
optional uint32 cmduinFlagEx = 51;
optional uint32 cmduinNewMobileFlag = 52;
optional uint32 cmduinReadMsgSeq = 53;
optional uint32 cmduinLastMsgTime = 54;
optional uint32 groupTypeFlag = 55;
optional uint32 appPrivilegeFlag = 56;
optional D88DGroupExInfoOnly stGroupExInfo = 57;
optional uint32 groupSecLevel = 58;
optional uint32 groupSecLevelInfo = 59;
optional uint32 cmduinPrivilege = 60;
optional bytes poidInfo = 61;
optional uint32 cmduinFlagEx2 = 62;
optional uint64 confUin = 63;
optional uint32 confMaxMsgSeq = 64;
optional uint32 confToGroupTime = 65;
optional uint32 passwordRedbagTime = 66;
optional uint64 subscriptionUin = 67;
optional uint32 memberListChangeSeq = 68;
optional uint32 membercardSeq = 69;
optional uint64 rootId = 70;
optional uint64 parentId = 71;
optional uint32 teamSeq = 72;
optional uint64 historyMsgBeginTime = 73;
optional uint64 inviteNoAuthNumLimit = 74;
optional uint32 cmduinHistoryMsgSeq = 75;
optional uint32 cmduinJoinMsgSeq = 76;
optional uint32 groupFlagext3 = 77;
optional uint32 groupOpenAppid = 78;
optional uint32 isConfGroup = 79;
optional uint32 isModifyConfGroupFace = 80;
optional uint32 isModifyConfGroupName = 81;
optional uint32 noFingerOpenFlag = 82;
optional uint32 noCodeFingerOpenFlag = 83;
};
message ReqGroupInfo
{
optional uint64 groupCode = 1;
optional D88DGroupInfo stgroupinfo = 2;
optional uint32 lastGetGroupNameTime = 3;
};
message D88DReqBody
{
optional uint32 appId = 1;
repeated ReqGroupInfo reqGroupInfo = 2;
optional uint32 pcClientVersion = 3;
};
message RspGroupInfo
{
optional uint64 groupCode = 1;
optional uint32 result = 2;
optional D88DGroupInfo groupInfo = 3;
};
message D88DRspBody
{
repeated RspGroupInfo rspGroupInfo = 1;
optional bytes strErrorInfo = 2;
};
message D88DTagRecord
{
optional uint64 fromUin = 1;
optional uint64 groupCode = 2;
optional bytes tagId = 3;
optional uint64 setTime = 4;
optional uint32 goodNum = 5;
optional uint32 badNum = 6;
optional uint32 tagLen = 7;
optional bytes tagValue = 8;
};
message D88DGroupGeoInfo
{
optional uint64 owneruin = 1;
optional uint32 settime = 2;
optional uint32 cityid = 3;
optional int64 longitude = 4;
optional int64 latitude = 5;
optional bytes geocontent = 6;
optional uint64 poiId = 7;
};

1
go.mod
View File

@ -7,6 +7,7 @@ require (
github.com/pkg/errors v0.9.1
github.com/stretchr/testify v1.3.0
github.com/tidwall/gjson v1.11.0
go.dedis.ch/protobuf v1.0.11
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
google.golang.org/protobuf v1.27.1

12
go.sum
View File

@ -18,10 +18,22 @@ github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs=
go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw=
go.dedis.ch/kyber/v3 v3.0.4/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ=
go.dedis.ch/kyber/v3 v3.0.9 h1:i0ZbOQocHUjfFasBiUql5zVeC7u/vahFd96DFA8UOWk=
go.dedis.ch/kyber/v3 v3.0.9/go.mod h1:rhNjUUg6ahf8HEg5HUvVBYoWY4boAafX8tYxX+PS+qg=
go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRLo=
go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4=
go.dedis.ch/protobuf v1.0.11 h1:FTYVIEzY/bfl37lu3pR4lIj+F9Vp1jE8oh91VmxKgLo=
go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4=
golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b h1:Elez2XeF2p9uyVj0yEUDqQ56NFcDtcBNkYP7yv8YbUE=
golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,21 @@
package proto
type Message interface {
Marshal() ([]byte, error)
}
func String(v string) *string { return &v }
func Bool(v bool) *bool { return &v }
func Int32(v int32) *int32 { return &v }
func Int64(v int64) *int64 { return &v }
func Uint32(v uint32) *uint32 { return &v }
func Uint64(v uint64) *uint64 { return &v }
func Float32(v float32) *float32 { return &v }
func Float64(v float64) *float64 { return &v }