mirror of
https://github.com/Mrs4s/MiraiGo.git
synced 2025-06-19 05:55:05 +08:00
commit
eb83fd7710
@ -955,6 +955,53 @@ func (c *QQClient) buildGroupAdminSetPacket(groupCode, member int64, flag bool)
|
|||||||
return seq, packet
|
return seq, packet
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OidbSvc.0x88d_7
|
||||||
|
func (c *QQClient) buildGroupInfoRequestPacket(groupCode int64) (uint16, []byte) {
|
||||||
|
seq := c.nextSeq()
|
||||||
|
body := &oidb.D88DReqBody{
|
||||||
|
AppId: proto.Uint32(uint32(SystemDeviceInfo.Protocol)),
|
||||||
|
ReqGroupInfo: []*oidb.ReqGroupInfo{
|
||||||
|
{
|
||||||
|
GroupCode: proto.Uint64(uint64(groupCode)),
|
||||||
|
Stgroupinfo: &oidb.D88DGroupInfo{
|
||||||
|
GroupOwner: 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
|
||||||
|
}
|
||||||
|
|
||||||
// MultiMsg.ApplyUp
|
// MultiMsg.ApplyUp
|
||||||
func (c *QQClient) buildMultiApplyUpPacket(data, hash []byte, buType int32, groupUin int64) (uint16, []byte) {
|
func (c *QQClient) buildMultiApplyUpPacket(data, hash []byte, buType int32, groupUin int64) (uint16, []byte) {
|
||||||
seq := c.nextSeq()
|
seq := c.nextSeq()
|
||||||
|
@ -29,9 +29,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type QQClient struct {
|
type QQClient struct {
|
||||||
Uin int64
|
Uin int64
|
||||||
PasswordMd5 [16]byte
|
PasswordMd5 [16]byte
|
||||||
CustomServer *net.TCPAddr
|
|
||||||
|
|
||||||
Nickname string
|
Nickname string
|
||||||
Age uint16
|
Age uint16
|
||||||
@ -46,9 +45,11 @@ type QQClient struct {
|
|||||||
Conn net.Conn
|
Conn net.Conn
|
||||||
ConnectTime time.Time
|
ConnectTime time.Time
|
||||||
|
|
||||||
decoders map[string]func(*QQClient, uint16, []byte) (interface{}, error)
|
decoders map[string]func(*QQClient, uint16, []byte) (interface{}, error)
|
||||||
handlers sync.Map
|
handlers sync.Map
|
||||||
server *net.TCPAddr
|
servers []*net.TCPAddr
|
||||||
|
currServerIndex int
|
||||||
|
retryTimes int
|
||||||
|
|
||||||
syncCookie []byte
|
syncCookie []byte
|
||||||
pubAccountCookie []byte
|
pubAccountCookie []byte
|
||||||
@ -138,6 +139,7 @@ func NewClientMd5(uin int64, passwordMd5 [16]byte) *QQClient {
|
|||||||
"MultiMsg.ApplyUp": decodeMultiApplyUpResponse,
|
"MultiMsg.ApplyUp": decodeMultiApplyUpResponse,
|
||||||
"MultiMsg.ApplyDown": decodeMultiApplyDownResponse,
|
"MultiMsg.ApplyDown": decodeMultiApplyDownResponse,
|
||||||
"OidbSvc.0x6d6_2": decodeOIDB6d6Response,
|
"OidbSvc.0x6d6_2": decodeOIDB6d6Response,
|
||||||
|
"OidbSvc.0x88d_0": decodeGroupInfoResponse,
|
||||||
"PttCenterSvr.ShortVideoDownReq": decodePttShortVideoDownResponse,
|
"PttCenterSvr.ShortVideoDownReq": decodePttShortVideoDownResponse,
|
||||||
},
|
},
|
||||||
sigInfo: &loginSigInfo{},
|
sigInfo: &loginSigInfo{},
|
||||||
@ -149,6 +151,23 @@ func NewClientMd5(uin int64, passwordMd5 [16]byte) *QQClient {
|
|||||||
eventHandlers: &eventHandlers{},
|
eventHandlers: &eventHandlers{},
|
||||||
msgSvcCache: utils.NewCache(time.Second * 15),
|
msgSvcCache: utils.NewCache(time.Second * 15),
|
||||||
transCache: utils.NewCache(time.Second * 15),
|
transCache: utils.NewCache(time.Second * 15),
|
||||||
|
servers: []*net.TCPAddr{ // default servers
|
||||||
|
{IP: net.IP{42, 81, 169, 46}, Port: 8080},
|
||||||
|
{IP: net.IP{42, 81, 172, 81}, Port: 80},
|
||||||
|
{IP: net.IP{114, 221, 148, 59}, Port: 14000},
|
||||||
|
{IP: net.IP{42, 81, 172, 147}, Port: 443},
|
||||||
|
{IP: net.IP{125, 94, 60, 146}, Port: 80},
|
||||||
|
{IP: net.IP{114, 221, 144, 215}, Port: 80},
|
||||||
|
{IP: net.IP{42, 81, 172, 22}, Port: 80},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
adds, err := net.LookupIP("msfwifi.3g.qq.com") // host servers
|
||||||
|
if err == nil && len(adds) > 0 {
|
||||||
|
addr := &net.TCPAddr{
|
||||||
|
IP: adds[0],
|
||||||
|
Port: 8080,
|
||||||
|
}
|
||||||
|
cli.servers = append([]*net.TCPAddr{addr}, cli.servers...)
|
||||||
}
|
}
|
||||||
rand.Read(cli.RandomKey)
|
rand.Read(cli.RandomKey)
|
||||||
return cli
|
return cli
|
||||||
@ -159,7 +178,6 @@ func (c *QQClient) Login() (*LoginResponse, error) {
|
|||||||
if c.Online {
|
if c.Online {
|
||||||
return nil, ErrAlreadyOnline
|
return nil, ErrAlreadyOnline
|
||||||
}
|
}
|
||||||
c.server = nil
|
|
||||||
err := c.connect()
|
err := c.connect()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -291,6 +309,14 @@ func (c *QQClient) GetGroupFileUrl(groupCode int64, fileId string, busId int32)
|
|||||||
return url
|
return url
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 {
|
func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage, f ...bool) *message.GroupMessage {
|
||||||
useFram := false
|
useFram := false
|
||||||
if len(f) > 0 {
|
if len(f) > 0 {
|
||||||
@ -842,9 +868,6 @@ func (c *QQClient) kickGroupMember(groupCode, memberUin int64, msg string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (g *GroupInfo) removeMember(uin int64) {
|
func (g *GroupInfo) removeMember(uin int64) {
|
||||||
if g.memLock == nil {
|
|
||||||
g.memLock = new(sync.Mutex)
|
|
||||||
}
|
|
||||||
g.memLock.Lock()
|
g.memLock.Lock()
|
||||||
defer g.memLock.Unlock()
|
defer g.memLock.Unlock()
|
||||||
for i, m := range g.Members {
|
for i, m := range g.Members {
|
||||||
@ -855,47 +878,34 @@ func (g *GroupInfo) removeMember(uin int64) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var servers = []*net.TCPAddr{
|
|
||||||
{IP: net.IP{42, 81, 169, 46}, Port: 8080},
|
|
||||||
{IP: net.IP{42, 81, 172, 81}, Port: 80},
|
|
||||||
{IP: net.IP{114, 221, 148, 59}, Port: 14000},
|
|
||||||
{IP: net.IP{42, 81, 172, 147}, Port: 443},
|
|
||||||
{IP: net.IP{125, 94, 60, 146}, Port: 80},
|
|
||||||
{IP: net.IP{114, 221, 144, 215}, Port: 80},
|
|
||||||
{IP: net.IP{42, 81, 172, 22}, Port: 80},
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *QQClient) connect() error {
|
func (c *QQClient) connect() error {
|
||||||
if c.server == nil {
|
c.Info("connect to server: %v", c.servers[c.currServerIndex].String())
|
||||||
if c.CustomServer != nil {
|
conn, err := net.DialTCP("tcp", nil, c.servers[c.currServerIndex])
|
||||||
c.server = c.CustomServer
|
c.currServerIndex++
|
||||||
} else {
|
if c.currServerIndex == len(c.servers) {
|
||||||
addrs, err := net.LookupIP("msfwifi.3g.qq.com")
|
c.currServerIndex = 0
|
||||||
if err == nil && len(addrs) > 0 {
|
|
||||||
c.server = &net.TCPAddr{
|
|
||||||
IP: addrs[rand.Intn(len(addrs))],
|
|
||||||
Port: 8080,
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
c.server = servers[rand.Intn(len(servers))]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
c.Info("connect to server: %v", c.server.String())
|
|
||||||
conn, err := net.DialTCP("tcp", nil, c.server)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if c.CustomServer != nil {
|
c.retryTimes++
|
||||||
c.CustomServer = nil
|
if c.retryTimes > len(c.servers) {
|
||||||
return c.connect()
|
return errors.New("network error")
|
||||||
|
}
|
||||||
|
c.Error("connect server error: %v", err)
|
||||||
|
if err = c.connect(); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
c.retryTimes = 0
|
||||||
c.ConnectTime = time.Now()
|
c.ConnectTime = time.Now()
|
||||||
c.Conn = conn
|
c.Conn = conn
|
||||||
c.onlinePushCache = []int16{}
|
c.onlinePushCache = []int16{}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *QQClient) SetCustomServer(servers []*net.TCPAddr) {
|
||||||
|
c.servers = append(servers, c.servers...)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *QQClient) registerClient() {
|
func (c *QQClient) registerClient() {
|
||||||
_, packet := c.buildClientRegisterPacket()
|
_, packet := c.buildClientRegisterPacket()
|
||||||
_ = c.send(packet)
|
_ = c.send(packet)
|
||||||
@ -975,11 +985,6 @@ func (c *QQClient) netLoop() {
|
|||||||
l, err := reader.ReadInt32()
|
l, err := reader.ReadInt32()
|
||||||
if err == io.EOF || err == io.ErrClosedPipe {
|
if err == io.EOF || err == io.ErrClosedPipe {
|
||||||
c.Error("connection dropped by server: %v", err)
|
c.Error("connection dropped by server: %v", err)
|
||||||
if c.ConnectTime.Sub(time.Now()) < time.Minute && c.CustomServer != nil {
|
|
||||||
c.Error("custom server error.")
|
|
||||||
c.CustomServer = nil
|
|
||||||
c.server = nil
|
|
||||||
}
|
|
||||||
err = c.connect()
|
err = c.connect()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
break
|
break
|
||||||
@ -1055,8 +1060,6 @@ func (c *QQClient) doHeartbeat() {
|
|||||||
sso := packets.BuildSsoPacket(seq, uint32(SystemDeviceInfo.Protocol), "Heartbeat.Alive", SystemDeviceInfo.IMEI, []byte{}, c.OutGoingPacketSessionId, []byte{}, c.ksid)
|
sso := packets.BuildSsoPacket(seq, uint32(SystemDeviceInfo.Protocol), "Heartbeat.Alive", SystemDeviceInfo.IMEI, []byte{}, c.OutGoingPacketSessionId, []byte{}, c.ksid)
|
||||||
packet := packets.BuildLoginPacket(c.Uin, 0, []byte{}, sso, []byte{})
|
packet := packets.BuildLoginPacket(c.Uin, 0, []byte{}, sso, []byte{})
|
||||||
_, _ = c.sendAndWait(seq, packet)
|
_, _ = c.sendAndWait(seq, packet)
|
||||||
_, pkt := c.buildGetMessageRequestPacket(msg.SyncFlag_START, time.Now().Unix())
|
|
||||||
c.send(pkt)
|
|
||||||
time.AfterFunc(30*time.Second, c.doHeartbeat)
|
time.AfterFunc(30*time.Second, c.doHeartbeat)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
@ -137,11 +138,18 @@ func decodePushReqPacket(c *QQClient, _ uint16, payload []byte) (interface{}, er
|
|||||||
servers := []jce.SsoServerInfo{}
|
servers := []jce.SsoServerInfo{}
|
||||||
ssoPkt.ReadSlice(&servers, 1)
|
ssoPkt.ReadSlice(&servers, 1)
|
||||||
if len(servers) > 0 {
|
if len(servers) > 0 {
|
||||||
c.server = &net.TCPAddr{
|
var adds []*net.TCPAddr
|
||||||
IP: net.ParseIP(servers[0].Server),
|
for _, s := range servers {
|
||||||
Port: int(servers[0].Port),
|
if strings.Contains(s.Server, "com") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
c.Debug("got new server addr: %v location: %v", s.Server, s.Location)
|
||||||
|
adds = append(adds, &net.TCPAddr{
|
||||||
|
IP: net.ParseIP(s.Server),
|
||||||
|
Port: int(s.Port),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
c.Debug("got new server addr: %v location: %v", c.server.String(), servers[0].Location)
|
c.SetCustomServer(adds)
|
||||||
for _, e := range c.eventHandlers.serverUpdatedHandlers {
|
for _, e := range c.eventHandlers.serverUpdatedHandlers {
|
||||||
cover(func() {
|
cover(func() {
|
||||||
e(c, &ServerUpdatedEvent{Servers: servers})
|
e(c, &ServerUpdatedEvent{Servers: servers})
|
||||||
@ -381,6 +389,31 @@ func decodeGroupListResponse(c *QQClient, _ uint16, payload []byte) (interface{}
|
|||||||
return l, nil
|
return l, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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: utils.ToGroupUin(int64(*info.GroupCode)),
|
||||||
|
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),
|
||||||
|
client: c,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
func decodeGroupMemberListResponse(_ *QQClient, _ uint16, payload []byte) (interface{}, error) {
|
func decodeGroupMemberListResponse(_ *QQClient, _ uint16, payload []byte) (interface{}, error) {
|
||||||
request := &jce.RequestPacket{}
|
request := &jce.RequestPacket{}
|
||||||
request.ReadFrom(jce.NewJceReader(payload))
|
request.ReadFrom(jce.NewJceReader(payload))
|
||||||
|
@ -58,7 +58,7 @@ type (
|
|||||||
Members []*GroupMemberInfo
|
Members []*GroupMemberInfo
|
||||||
|
|
||||||
client *QQClient
|
client *QQClient
|
||||||
memLock *sync.Mutex
|
memLock sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
GroupMemberInfo struct {
|
GroupMemberInfo struct {
|
||||||
|
1851
client/pb/oidb/oidb0x88d.pb.go
Normal file
1851
client/pb/oidb/oidb0x88d.pb.go
Normal file
File diff suppressed because it is too large
Load Diff
161
client/pb/oidb/oidb0x88d.proto
Normal file
161
client/pb/oidb/oidb0x88d.proto
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
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;
|
||||||
|
};
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user