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:
parent
c518dfcf15
commit
b7b13c64b4
@ -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",
|
||||
|
@ -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
@ -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
1
go.mod
@ -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
12
go.sum
@ -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=
|
||||
|
1395
internal/protobuf/data/oidb/oidb0x88d/oidb0x88d.go
Normal file
1395
internal/protobuf/data/oidb/oidb0x88d/oidb0x88d.go
Normal file
File diff suppressed because it is too large
Load Diff
21
internal/protobuf/proto/wrappers.go
Normal file
21
internal/protobuf/proto/wrappers.go
Normal 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 }
|
Loading…
x
Reference in New Issue
Block a user