mirror of
https://github.com/Mrs4s/MiraiGo.git
synced 2025-05-04 19:17:38 +08:00
feature get group messages & clear code.
This commit is contained in:
parent
e705f96efd
commit
6c18a70565
@ -550,46 +550,6 @@ func (c *QQClient) buildDeleteOnlinePushPacket(uin int64, seq uint16, delMsg []j
|
|||||||
return packets.BuildUniPacket(c.Uin, seq, "OnlinePush.RespPush", 1, c.OutGoingPacketSessionId, []byte{}, c.sigInfo.d2Key, pkt.ToBytes())
|
return packets.BuildUniPacket(c.Uin, seq, "OnlinePush.RespPush", 1, c.OutGoingPacketSessionId, []byte{}, c.sigInfo.d2Key, pkt.ToBytes())
|
||||||
}
|
}
|
||||||
|
|
||||||
// MessageSvc.PbSendMsg
|
|
||||||
func (c *QQClient) buildGroupSendingPacket(groupCode int64, r, pkgNum, pkgIndex, pkgDiv int32, forward bool, m []message.IMessageElement) (uint16, []byte) {
|
|
||||||
seq := c.nextSeq()
|
|
||||||
var ptt *message.GroupVoiceElement
|
|
||||||
if len(m) > 0 {
|
|
||||||
if p, ok := m[0].(*message.GroupVoiceElement); ok {
|
|
||||||
ptt = p
|
|
||||||
m = []message.IMessageElement{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
req := &msg.SendMessageRequest{
|
|
||||||
RoutingHead: &msg.RoutingHead{Grp: &msg.Grp{GroupCode: &groupCode}},
|
|
||||||
ContentHead: &msg.ContentHead{PkgNum: &pkgNum, PkgIndex: &pkgIndex, DivSeq: &pkgDiv},
|
|
||||||
MsgBody: &msg.MessageBody{
|
|
||||||
RichText: &msg.RichText{
|
|
||||||
Elems: message.ToProtoElems(m, true),
|
|
||||||
Ptt: func() *msg.Ptt {
|
|
||||||
if ptt != nil {
|
|
||||||
return ptt.Ptt
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
MsgSeq: proto.Int32(c.nextGroupSeq()),
|
|
||||||
MsgRand: &r,
|
|
||||||
SyncCookie: EmptyBytes,
|
|
||||||
MsgVia: proto.Int32(1),
|
|
||||||
MsgCtrl: func() *msg.MsgCtrl {
|
|
||||||
if forward {
|
|
||||||
return &msg.MsgCtrl{MsgFlag: proto.Int32(4)}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}(),
|
|
||||||
}
|
|
||||||
payload, _ := proto.Marshal(req)
|
|
||||||
packet := packets.BuildUniPacket(c.Uin, seq, "MessageSvc.PbSendMsg", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload)
|
|
||||||
return seq, packet
|
|
||||||
}
|
|
||||||
|
|
||||||
// MessageSvc.PbSendMsg
|
// MessageSvc.PbSendMsg
|
||||||
func (c *QQClient) buildFriendSendingPacket(target int64, msgSeq, r, pkgNum, pkgIndex, pkgDiv int32, time int64, m []message.IMessageElement) (uint16, []byte) {
|
func (c *QQClient) buildFriendSendingPacket(target int64, msgSeq, r, pkgNum, pkgIndex, pkgDiv int32, time int64, m []message.IMessageElement) (uint16, []byte) {
|
||||||
seq := c.nextSeq()
|
seq := c.nextSeq()
|
||||||
|
247
client/client.go
247
client/client.go
@ -8,7 +8,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"image"
|
"image"
|
||||||
"io"
|
"io"
|
||||||
"math"
|
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
@ -21,12 +20,8 @@ import (
|
|||||||
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
|
|
||||||
"github.com/Mrs4s/MiraiGo/binary"
|
"github.com/Mrs4s/MiraiGo/binary"
|
||||||
"github.com/Mrs4s/MiraiGo/client/pb/longmsg"
|
|
||||||
"github.com/Mrs4s/MiraiGo/client/pb/msg"
|
"github.com/Mrs4s/MiraiGo/client/pb/msg"
|
||||||
"github.com/Mrs4s/MiraiGo/client/pb/multimsg"
|
|
||||||
"github.com/Mrs4s/MiraiGo/message"
|
"github.com/Mrs4s/MiraiGo/message"
|
||||||
"github.com/Mrs4s/MiraiGo/protocol/packets"
|
"github.com/Mrs4s/MiraiGo/protocol/packets"
|
||||||
"github.com/Mrs4s/MiraiGo/utils"
|
"github.com/Mrs4s/MiraiGo/utils"
|
||||||
@ -51,7 +46,6 @@ type QQClient struct {
|
|||||||
Conn net.Conn
|
Conn net.Conn
|
||||||
ConnectTime time.Time
|
ConnectTime time.Time
|
||||||
|
|
||||||
decoders map[string]func(*QQClient, uint16, []byte) (interface{}, error)
|
|
||||||
handlers sync.Map
|
handlers sync.Map
|
||||||
servers []*net.TCPAddr
|
servers []*net.TCPAddr
|
||||||
currServerIndex int
|
currServerIndex int
|
||||||
@ -114,6 +108,39 @@ type loginSigInfo struct {
|
|||||||
pt4TokenMap map[string][]byte
|
pt4TokenMap map[string][]byte
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var decoders = map[string]func(*QQClient, uint16, []byte) (interface{}, error){
|
||||||
|
"wtlogin.login": decodeLoginResponse,
|
||||||
|
"wtlogin.exchange_emp": decodeExchangeEmpResponse,
|
||||||
|
"StatSvc.register": decodeClientRegisterResponse,
|
||||||
|
"StatSvc.ReqMSFOffline": decodeMSFOfflinePacket,
|
||||||
|
"StatSvc.GetDevLoginInfo": decodeDevListResponse,
|
||||||
|
"MessageSvc.PushNotify": decodeSvcNotify,
|
||||||
|
"OnlinePush.ReqPush": decodeOnlinePushReqPacket,
|
||||||
|
"OnlinePush.PbPushTransMsg": decodeOnlinePushTransPacket,
|
||||||
|
"ConfigPushSvc.PushReq": decodePushReqPacket,
|
||||||
|
"MessageSvc.PbGetMsg": decodeMessageSvcPacket,
|
||||||
|
"MessageSvc.PushForceOffline": decodeForceOfflinePacket,
|
||||||
|
"PbMessageSvc.PbMsgWithDraw": decodeMsgWithDrawResponse,
|
||||||
|
"friendlist.getFriendGroupList": decodeFriendGroupListResponse,
|
||||||
|
"friendlist.GetTroopListReqV2": decodeGroupListResponse,
|
||||||
|
"friendlist.GetTroopMemberListReq": decodeGroupMemberListResponse,
|
||||||
|
"group_member_card.get_group_member_card_info": decodeGroupMemberInfoResponse,
|
||||||
|
"ImgStore.GroupPicUp": decodeGroupImageStoreResponse,
|
||||||
|
"PttStore.GroupPttUp": decodeGroupPttStoreResponse,
|
||||||
|
"LongConn.OffPicUp": decodeOffPicUpResponse,
|
||||||
|
"ProfileService.Pb.ReqSystemMsgNew.Group": decodeSystemMsgGroupPacket,
|
||||||
|
"ProfileService.Pb.ReqSystemMsgNew.Friend": decodeSystemMsgFriendPacket,
|
||||||
|
"MultiMsg.ApplyUp": decodeMultiApplyUpResponse,
|
||||||
|
"MultiMsg.ApplyDown": decodeMultiApplyDownResponse,
|
||||||
|
"OidbSvc.0xe07_0": decodeImageOcrResponse,
|
||||||
|
"OidbSvc.0xd79": decodeWordSegmentation,
|
||||||
|
"OidbSvc.0x990": decodeTranslateResponse,
|
||||||
|
"SummaryCard.ReqSummaryCard": decodeSummaryCardResponse,
|
||||||
|
"PttCenterSvr.ShortVideoDownReq": decodePttShortVideoDownResponse,
|
||||||
|
"LightAppSvc.mini_app_info.GetAppInfoById": decodeAppInfoResponse,
|
||||||
|
"PttCenterSvr.pb_pttCenter_CMD_REQ_APPLY_UPLOAD-500": decodePrivatePttStoreResponse,
|
||||||
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
rand.Seed(time.Now().UTC().UnixNano())
|
rand.Seed(time.Now().UTC().UnixNano())
|
||||||
}
|
}
|
||||||
@ -130,59 +157,19 @@ func NewClientMd5(uin int64, passwordMd5 [16]byte) *QQClient {
|
|||||||
SequenceId: 0x3635,
|
SequenceId: 0x3635,
|
||||||
RandomKey: make([]byte, 16),
|
RandomKey: make([]byte, 16),
|
||||||
OutGoingPacketSessionId: []byte{0x02, 0xB0, 0x5B, 0x8B},
|
OutGoingPacketSessionId: []byte{0x02, 0xB0, 0x5B, 0x8B},
|
||||||
decoders: map[string]func(*QQClient, uint16, []byte) (interface{}, error){
|
sigInfo: &loginSigInfo{},
|
||||||
"wtlogin.login": decodeLoginResponse,
|
requestPacketRequestId: 1921334513,
|
||||||
"wtlogin.exchange_emp": decodeExchangeEmpResponse,
|
groupSeq: int32(rand.Intn(20000)),
|
||||||
"StatSvc.register": decodeClientRegisterResponse,
|
friendSeq: 22911,
|
||||||
"StatSvc.ReqMSFOffline": decodeMSFOfflinePacket,
|
highwayApplyUpSeq: 77918,
|
||||||
"StatSvc.GetDevLoginInfo": decodeDevListResponse,
|
ksid: []byte(fmt.Sprintf("|%s|A8.2.7.27f6ea96", SystemDeviceInfo.IMEI)),
|
||||||
"MessageSvc.PushNotify": decodeSvcNotify,
|
eventHandlers: &eventHandlers{},
|
||||||
"OnlinePush.PbPushGroupMsg": decodeGroupMessagePacket,
|
msgSvcCache: utils.NewCache(time.Second * 15),
|
||||||
"OnlinePush.ReqPush": decodeOnlinePushReqPacket,
|
transCache: utils.NewCache(time.Second * 15),
|
||||||
"OnlinePush.PbPushTransMsg": decodeOnlinePushTransPacket,
|
onlinePushCache: utils.NewCache(time.Second * 15),
|
||||||
"ConfigPushSvc.PushReq": decodePushReqPacket,
|
version: genVersionInfo(SystemDeviceInfo.Protocol),
|
||||||
"MessageSvc.PbGetMsg": decodeMessageSvcPacket,
|
servers: []*net.TCPAddr{},
|
||||||
"MessageSvc.PbSendMsg": decodeMsgSendResponse,
|
stat: &Statistics{},
|
||||||
"MessageSvc.PushForceOffline": decodeForceOfflinePacket,
|
|
||||||
"PbMessageSvc.PbMsgWithDraw": decodeMsgWithDrawResponse,
|
|
||||||
"friendlist.getFriendGroupList": decodeFriendGroupListResponse,
|
|
||||||
"friendlist.GetTroopListReqV2": decodeGroupListResponse,
|
|
||||||
"friendlist.GetTroopMemberListReq": decodeGroupMemberListResponse,
|
|
||||||
"group_member_card.get_group_member_card_info": decodeGroupMemberInfoResponse,
|
|
||||||
"ImgStore.GroupPicUp": decodeGroupImageStoreResponse,
|
|
||||||
"PttStore.GroupPttUp": decodeGroupPttStoreResponse,
|
|
||||||
"LongConn.OffPicUp": decodeOffPicUpResponse,
|
|
||||||
"ProfileService.Pb.ReqSystemMsgNew.Group": decodeSystemMsgGroupPacket,
|
|
||||||
"ProfileService.Pb.ReqSystemMsgNew.Friend": decodeSystemMsgFriendPacket,
|
|
||||||
"MultiMsg.ApplyUp": decodeMultiApplyUpResponse,
|
|
||||||
"MultiMsg.ApplyDown": decodeMultiApplyDownResponse,
|
|
||||||
"OidbSvc.0x6d6_2": decodeOIDB6d62Response,
|
|
||||||
"OidbSvc.0x6d6_3": decodeOIDB6d63Response,
|
|
||||||
"OidbSvc.0x6d8_1": decodeOIDB6d81Response,
|
|
||||||
"OidbSvc.0x88d_0": decodeGroupInfoResponse,
|
|
||||||
"OidbSvc.0xe07_0": decodeImageOcrResponse,
|
|
||||||
"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,
|
|
||||||
"PttCenterSvr.pb_pttCenter_CMD_REQ_APPLY_UPLOAD-500": decodePrivatePttStoreResponse,
|
|
||||||
},
|
|
||||||
sigInfo: &loginSigInfo{},
|
|
||||||
requestPacketRequestId: 1921334513,
|
|
||||||
groupSeq: int32(rand.Intn(20000)),
|
|
||||||
friendSeq: 22911,
|
|
||||||
highwayApplyUpSeq: 77918,
|
|
||||||
ksid: []byte(fmt.Sprintf("|%s|A8.2.7.27f6ea96", SystemDeviceInfo.IMEI)),
|
|
||||||
eventHandlers: &eventHandlers{},
|
|
||||||
msgSvcCache: utils.NewCache(time.Second * 15),
|
|
||||||
transCache: utils.NewCache(time.Second * 15),
|
|
||||||
onlinePushCache: utils.NewCache(time.Second * 15),
|
|
||||||
version: genVersionInfo(SystemDeviceInfo.Protocol),
|
|
||||||
servers: []*net.TCPAddr{},
|
|
||||||
stat: &Statistics{},
|
|
||||||
}
|
}
|
||||||
sso, err := getSSOAddress()
|
sso, err := getSSOAddress()
|
||||||
if err == nil && len(sso) > 0 {
|
if err == nil && len(sso) > 0 {
|
||||||
@ -425,84 +412,6 @@ func (c *QQClient) GetShortVideoUrl(uuid, md5 []byte) string {
|
|||||||
return i.(string)
|
return i.(string)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage, f ...bool) *message.GroupMessage {
|
|
||||||
useFram := false
|
|
||||||
if len(f) > 0 {
|
|
||||||
useFram = f[0]
|
|
||||||
}
|
|
||||||
imgCount := m.Count(func(e message.IMessageElement) bool { return e.Type() == message.Image })
|
|
||||||
if useFram {
|
|
||||||
if m.Any(func(e message.IMessageElement) bool { return e.Type() == message.Reply }) {
|
|
||||||
useFram = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
msgLen := message.EstimateLength(m.Elements, 703)
|
|
||||||
if msgLen > 5000 || imgCount > 50 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if (msgLen > 200 || imgCount > 1) && !useFram {
|
|
||||||
ret := c.sendGroupLongOrForwardMessage(groupCode, true, &message.ForwardMessage{Nodes: []*message.ForwardNode{
|
|
||||||
{
|
|
||||||
SenderId: c.Uin,
|
|
||||||
SenderName: c.Nickname,
|
|
||||||
Time: int32(time.Now().Unix()),
|
|
||||||
Message: m.Elements,
|
|
||||||
},
|
|
||||||
}})
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
return c.sendGroupMessage(groupCode, false, m)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *QQClient) sendGroupMessage(groupCode int64, forward bool, m *message.SendingMessage) *message.GroupMessage {
|
|
||||||
eid := utils.RandomString(6)
|
|
||||||
mr := int32(rand.Uint32())
|
|
||||||
ch := make(chan int32)
|
|
||||||
c.onGroupMessageReceipt(eid, func(c *QQClient, e *groupMessageReceiptEvent) {
|
|
||||||
if e.Rand == mr {
|
|
||||||
ch <- e.Seq
|
|
||||||
}
|
|
||||||
})
|
|
||||||
defer c.onGroupMessageReceipt(eid)
|
|
||||||
imgCount := m.Count(func(e message.IMessageElement) bool { return e.Type() == message.Image })
|
|
||||||
msgLen := message.EstimateLength(m.Elements, 703)
|
|
||||||
if (msgLen > 200 || imgCount > 1) && !forward && !m.Any(func(e message.IMessageElement) bool {
|
|
||||||
_, ok := e.(*message.GroupVoiceElement)
|
|
||||||
_, ok2 := e.(*message.ServiceElement)
|
|
||||||
return ok || ok2
|
|
||||||
}) {
|
|
||||||
div := int32(rand.Uint32())
|
|
||||||
fragmented := m.ToFragmented()
|
|
||||||
for i, elems := range fragmented {
|
|
||||||
_, pkt := c.buildGroupSendingPacket(groupCode, mr, int32(len(fragmented)), int32(i), div, forward, elems)
|
|
||||||
_ = c.send(pkt)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
_, pkt := c.buildGroupSendingPacket(groupCode, mr, 1, 0, 0, forward, m.Elements)
|
|
||||||
_ = c.send(pkt)
|
|
||||||
}
|
|
||||||
var mid int32
|
|
||||||
ret := &message.GroupMessage{
|
|
||||||
Id: -1,
|
|
||||||
InternalId: mr,
|
|
||||||
GroupCode: groupCode,
|
|
||||||
Sender: &message.Sender{
|
|
||||||
Uin: c.Uin,
|
|
||||||
Nickname: c.Nickname,
|
|
||||||
IsFriend: true,
|
|
||||||
},
|
|
||||||
Time: int32(time.Now().Unix()),
|
|
||||||
Elements: m.Elements,
|
|
||||||
}
|
|
||||||
select {
|
|
||||||
case mid = <-ch:
|
|
||||||
case <-time.After(time.Second * 5):
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
ret.Id = mid
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *QQClient) SendPrivateMessage(target int64, m *message.SendingMessage) *message.PrivateMessage {
|
func (c *QQClient) SendPrivateMessage(target int64, m *message.SendingMessage) *message.PrivateMessage {
|
||||||
mr := int32(rand.Uint32())
|
mr := int32(rand.Uint32())
|
||||||
seq := c.nextFriendSeq()
|
seq := c.nextFriendSeq()
|
||||||
@ -595,68 +504,6 @@ func (c *QQClient) GetForwardMessage(resId string) *message.ForwardMessage {
|
|||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *QQClient) SendGroupForwardMessage(groupCode int64, m *message.ForwardMessage) *message.GroupMessage {
|
|
||||||
return c.sendGroupLongOrForwardMessage(groupCode, false, m)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *QQClient) sendGroupLongOrForwardMessage(groupCode int64, isLong bool, m *message.ForwardMessage) *message.GroupMessage {
|
|
||||||
if len(m.Nodes) >= 200 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
ts := time.Now().Unix()
|
|
||||||
seq := c.nextGroupSeq()
|
|
||||||
data, hash := m.CalculateValidationData(seq, rand.Int31(), groupCode)
|
|
||||||
i, err := c.sendAndWait(c.buildMultiApplyUpPacket(data, hash, func() int32 {
|
|
||||||
if isLong {
|
|
||||||
return 1
|
|
||||||
} else {
|
|
||||||
return 2
|
|
||||||
}
|
|
||||||
}(), utils.ToGroupUin(groupCode)))
|
|
||||||
if err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
rsp := i.(*multimsg.MultiMsgApplyUpRsp)
|
|
||||||
body, _ := proto.Marshal(&longmsg.LongReqBody{
|
|
||||||
Subcmd: 1,
|
|
||||||
TermType: 5,
|
|
||||||
PlatformType: 9,
|
|
||||||
MsgUpReq: []*longmsg.LongMsgUpReq{
|
|
||||||
{
|
|
||||||
MsgType: 3,
|
|
||||||
DstUin: utils.ToGroupUin(groupCode),
|
|
||||||
MsgContent: data,
|
|
||||||
StoreType: 2,
|
|
||||||
MsgUkey: rsp.MsgUkey,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
for i, ip := range rsp.Uint32UpIp {
|
|
||||||
err := c.highwayUpload(uint32(ip), int(rsp.Uint32UpPort[i]), rsp.MsgSig, body, 27)
|
|
||||||
if err == nil {
|
|
||||||
if !isLong {
|
|
||||||
var pv string
|
|
||||||
for i := 0; i < int(math.Min(4, float64(len(m.Nodes)))); i++ {
|
|
||||||
pv += fmt.Sprintf(`<title size="26" color="#777777">%s: %s</title>`, m.Nodes[i].SenderName, message.ToReadableString(m.Nodes[i].Message))
|
|
||||||
}
|
|
||||||
return c.sendGroupMessage(groupCode, true, genForwardTemplate(rsp.MsgResid, pv, "群聊的聊天记录", "[聊天记录]", "聊天记录", fmt.Sprintf("查看 %d 条转发消息", len(m.Nodes)), ts))
|
|
||||||
}
|
|
||||||
bri := func() string {
|
|
||||||
var r string
|
|
||||||
for _, n := range m.Nodes {
|
|
||||||
r += message.ToReadableString(n.Message)
|
|
||||||
if len(r) >= 27 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return r
|
|
||||||
}()
|
|
||||||
return c.sendGroupMessage(groupCode, false, genLongTemplate(rsp.MsgResid, bri, ts))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *QQClient) sendGroupPoke(groupCode, target int64) {
|
func (c *QQClient) sendGroupPoke(groupCode, target int64) {
|
||||||
_, _ = c.sendAndWait(c.buildGroupPokePacket(groupCode, target))
|
_, _ = c.sendAndWait(c.buildGroupPokePacket(groupCode, target))
|
||||||
}
|
}
|
||||||
@ -1163,7 +1010,7 @@ func (c *QQClient) netLoop() {
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
if decoder, ok := c.decoders[pkt.CommandName]; ok {
|
if decoder, ok := decoders[pkt.CommandName]; ok {
|
||||||
// found predefined decoder
|
// found predefined decoder
|
||||||
rsp, err := decoder(c, pkt.SequenceId, payload)
|
rsp, err := decoder(c, pkt.SequenceId, payload)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -378,53 +378,6 @@ func decodeMessageSvcPacket(c *QQClient, _ uint16, payload []byte) (interface{},
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// OnlinePush.PbPushGroupMsg
|
|
||||||
func decodeGroupMessagePacket(c *QQClient, _ uint16, payload []byte) (interface{}, error) {
|
|
||||||
pkt := msg.PushMessagePacket{}
|
|
||||||
err := proto.Unmarshal(payload, &pkt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrap(err, "failed to unmarshal protobuf message")
|
|
||||||
}
|
|
||||||
if pkt.Message.Head.GetFromUin() == c.Uin {
|
|
||||||
c.dispatchGroupMessageReceiptEvent(&groupMessageReceiptEvent{
|
|
||||||
Rand: pkt.Message.Body.RichText.Attr.GetRandom(),
|
|
||||||
Seq: pkt.Message.Head.GetMsgSeq(),
|
|
||||||
Msg: c.parseGroupMessage(pkt.Message),
|
|
||||||
})
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
if pkt.Message.Content != nil && pkt.Message.Content.GetPkgNum() > 1 {
|
|
||||||
var builder *groupMessageBuilder // TODO: 支持多SEQ
|
|
||||||
i, ok := c.groupMsgBuilders.Load(pkt.Message.Content.DivSeq)
|
|
||||||
if !ok {
|
|
||||||
builder = &groupMessageBuilder{}
|
|
||||||
c.groupMsgBuilders.Store(pkt.Message.Content.DivSeq, builder)
|
|
||||||
} else {
|
|
||||||
builder = i.(*groupMessageBuilder)
|
|
||||||
}
|
|
||||||
builder.MessageSlices = append(builder.MessageSlices, pkt.Message)
|
|
||||||
if int32(len(builder.MessageSlices)) >= pkt.Message.Content.GetPkgNum() {
|
|
||||||
c.groupMsgBuilders.Delete(pkt.Message.Content.DivSeq)
|
|
||||||
c.dispatchGroupMessage(c.parseGroupMessage(builder.build()))
|
|
||||||
}
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
c.dispatchGroupMessage(c.parseGroupMessage(pkt.Message))
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MessageSvc.PbSendMsg
|
|
||||||
func decodeMsgSendResponse(c *QQClient, _ uint16, payload []byte) (interface{}, error) {
|
|
||||||
rsp := msg.SendMessageResponse{}
|
|
||||||
if err := proto.Unmarshal(payload, &rsp); err != nil {
|
|
||||||
return nil, errors.Wrap(err, "failed to unmarshal protobuf message")
|
|
||||||
}
|
|
||||||
if rsp.GetResult() != 0 {
|
|
||||||
c.Error("send msg error: %v %v", rsp.GetResult(), rsp.GetErrMsg())
|
|
||||||
}
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MessageSvc.PushNotify
|
// MessageSvc.PushNotify
|
||||||
func decodeSvcNotify(c *QQClient, _ uint16, _ []byte) (interface{}, error) {
|
func decodeSvcNotify(c *QQClient, _ uint16, _ []byte) (interface{}, error) {
|
||||||
_, err := c.sendAndWait(c.buildGetMessageRequestPacket(msg.SyncFlag_START, time.Now().Unix()))
|
_, err := c.sendAndWait(c.buildGetMessageRequestPacket(msg.SyncFlag_START, time.Now().Unix()))
|
||||||
|
@ -47,6 +47,12 @@ type (
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
decoders["OidbSvc.0x6d8_1"] = decodeOIDB6d81Response
|
||||||
|
decoders["OidbSvc.0x6d6_2"] = decodeOIDB6d62Response
|
||||||
|
decoders["OidbSvc.0x6d6_3"] = decodeOIDB6d63Response
|
||||||
|
}
|
||||||
|
|
||||||
func (c *QQClient) GetGroupFileSystem(groupCode int64) (fs *GroupFileSystem, err error) {
|
func (c *QQClient) GetGroupFileSystem(groupCode int64) (fs *GroupFileSystem, err error) {
|
||||||
defer func() {
|
defer func() {
|
||||||
if pan := recover(); pan != nil {
|
if pan := recover(); pan != nil {
|
||||||
|
@ -9,6 +9,11 @@ import (
|
|||||||
"google.golang.org/protobuf/proto"
|
"google.golang.org/protobuf/proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
decoders["SummaryCard.ReqSearch"] = decodeGroupSearchResponse
|
||||||
|
decoders["OidbSvc.0x88d_0"] = decodeGroupInfoResponse
|
||||||
|
}
|
||||||
|
|
||||||
func (c *QQClient) GetGroupInfo(groupCode int64) (*GroupInfo, error) {
|
func (c *QQClient) GetGroupInfo(groupCode int64) (*GroupInfo, error) {
|
||||||
i, err := c.sendAndWait(c.buildGroupInfoRequestPacket(groupCode))
|
i, err := c.sendAndWait(c.buildGroupInfoRequestPacket(groupCode))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
291
client/group_msg.go
Normal file
291
client/group_msg.go
Normal file
@ -0,0 +1,291 @@
|
|||||||
|
package client
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/Mrs4s/MiraiGo/client/pb/longmsg"
|
||||||
|
"github.com/Mrs4s/MiraiGo/client/pb/msg"
|
||||||
|
"github.com/Mrs4s/MiraiGo/client/pb/multimsg"
|
||||||
|
"github.com/Mrs4s/MiraiGo/message"
|
||||||
|
"github.com/Mrs4s/MiraiGo/protocol/packets"
|
||||||
|
"github.com/Mrs4s/MiraiGo/utils"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"google.golang.org/protobuf/proto"
|
||||||
|
"math"
|
||||||
|
"math/rand"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
decoders["OnlinePush.PbPushGroupMsg"] = decodeGroupMessagePacket
|
||||||
|
decoders["MessageSvc.PbSendMsg"] = decodeMsgSendResponse
|
||||||
|
decoders["MessageSvc.PbGetGroupMsg"] = decodeGetGroupMsgResponse
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendGroupMessage 发送群消息
|
||||||
|
func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage, f ...bool) *message.GroupMessage {
|
||||||
|
useFram := false
|
||||||
|
if len(f) > 0 {
|
||||||
|
useFram = f[0]
|
||||||
|
}
|
||||||
|
imgCount := m.Count(func(e message.IMessageElement) bool { return e.Type() == message.Image })
|
||||||
|
if useFram {
|
||||||
|
if m.Any(func(e message.IMessageElement) bool { return e.Type() == message.Reply }) {
|
||||||
|
useFram = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
msgLen := message.EstimateLength(m.Elements, 703)
|
||||||
|
if msgLen > 5000 || imgCount > 50 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if (msgLen > 200 || imgCount > 1) && !useFram {
|
||||||
|
ret := c.sendGroupLongOrForwardMessage(groupCode, true, &message.ForwardMessage{Nodes: []*message.ForwardNode{
|
||||||
|
{
|
||||||
|
SenderId: c.Uin,
|
||||||
|
SenderName: c.Nickname,
|
||||||
|
Time: int32(time.Now().Unix()),
|
||||||
|
Message: m.Elements,
|
||||||
|
},
|
||||||
|
}})
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
return c.sendGroupMessage(groupCode, false, m)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendGroupForwardMessage 发送群合并转发消息
|
||||||
|
func (c *QQClient) SendGroupForwardMessage(groupCode int64, m *message.ForwardMessage) *message.GroupMessage {
|
||||||
|
return c.sendGroupLongOrForwardMessage(groupCode, false, m)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetGroupMessages 从服务器获取历史信息
|
||||||
|
func (c *QQClient) GetGroupMessages(groupCode, beginSeq, endSeq int64) ([]*message.GroupMessage, error) {
|
||||||
|
i, err := c.sendAndWait(c.buildGetGroupMsgRequest(groupCode, beginSeq, endSeq))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return i.([]*message.GroupMessage), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *QQClient) sendGroupMessage(groupCode int64, forward bool, m *message.SendingMessage) *message.GroupMessage {
|
||||||
|
eid := utils.RandomString(6)
|
||||||
|
mr := int32(rand.Uint32())
|
||||||
|
ch := make(chan int32)
|
||||||
|
c.onGroupMessageReceipt(eid, func(c *QQClient, e *groupMessageReceiptEvent) {
|
||||||
|
if e.Rand == mr {
|
||||||
|
ch <- e.Seq
|
||||||
|
}
|
||||||
|
})
|
||||||
|
defer c.onGroupMessageReceipt(eid)
|
||||||
|
imgCount := m.Count(func(e message.IMessageElement) bool { return e.Type() == message.Image })
|
||||||
|
msgLen := message.EstimateLength(m.Elements, 703)
|
||||||
|
if (msgLen > 200 || imgCount > 1) && !forward && !m.Any(func(e message.IMessageElement) bool {
|
||||||
|
_, ok := e.(*message.GroupVoiceElement)
|
||||||
|
_, ok2 := e.(*message.ServiceElement)
|
||||||
|
return ok || ok2
|
||||||
|
}) {
|
||||||
|
div := int32(rand.Uint32())
|
||||||
|
fragmented := m.ToFragmented()
|
||||||
|
for i, elems := range fragmented {
|
||||||
|
_, pkt := c.buildGroupSendingPacket(groupCode, mr, int32(len(fragmented)), int32(i), div, forward, elems)
|
||||||
|
_ = c.send(pkt)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_, pkt := c.buildGroupSendingPacket(groupCode, mr, 1, 0, 0, forward, m.Elements)
|
||||||
|
_ = c.send(pkt)
|
||||||
|
}
|
||||||
|
var mid int32
|
||||||
|
ret := &message.GroupMessage{
|
||||||
|
Id: -1,
|
||||||
|
InternalId: mr,
|
||||||
|
GroupCode: groupCode,
|
||||||
|
Sender: &message.Sender{
|
||||||
|
Uin: c.Uin,
|
||||||
|
Nickname: c.Nickname,
|
||||||
|
IsFriend: true,
|
||||||
|
},
|
||||||
|
Time: int32(time.Now().Unix()),
|
||||||
|
Elements: m.Elements,
|
||||||
|
}
|
||||||
|
select {
|
||||||
|
case mid = <-ch:
|
||||||
|
case <-time.After(time.Second * 5):
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
ret.Id = mid
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *QQClient) sendGroupLongOrForwardMessage(groupCode int64, isLong bool, m *message.ForwardMessage) *message.GroupMessage {
|
||||||
|
if len(m.Nodes) >= 200 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
ts := time.Now().Unix()
|
||||||
|
seq := c.nextGroupSeq()
|
||||||
|
data, hash := m.CalculateValidationData(seq, rand.Int31(), groupCode)
|
||||||
|
i, err := c.sendAndWait(c.buildMultiApplyUpPacket(data, hash, func() int32 {
|
||||||
|
if isLong {
|
||||||
|
return 1
|
||||||
|
} else {
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
}(), utils.ToGroupUin(groupCode)))
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
rsp := i.(*multimsg.MultiMsgApplyUpRsp)
|
||||||
|
body, _ := proto.Marshal(&longmsg.LongReqBody{
|
||||||
|
Subcmd: 1,
|
||||||
|
TermType: 5,
|
||||||
|
PlatformType: 9,
|
||||||
|
MsgUpReq: []*longmsg.LongMsgUpReq{
|
||||||
|
{
|
||||||
|
MsgType: 3,
|
||||||
|
DstUin: utils.ToGroupUin(groupCode),
|
||||||
|
MsgContent: data,
|
||||||
|
StoreType: 2,
|
||||||
|
MsgUkey: rsp.MsgUkey,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
for i, ip := range rsp.Uint32UpIp {
|
||||||
|
err := c.highwayUpload(uint32(ip), int(rsp.Uint32UpPort[i]), rsp.MsgSig, body, 27)
|
||||||
|
if err == nil {
|
||||||
|
if !isLong {
|
||||||
|
var pv string
|
||||||
|
for i := 0; i < int(math.Min(4, float64(len(m.Nodes)))); i++ {
|
||||||
|
pv += fmt.Sprintf(`<title size="26" color="#777777">%s: %s</title>`, m.Nodes[i].SenderName, message.ToReadableString(m.Nodes[i].Message))
|
||||||
|
}
|
||||||
|
return c.sendGroupMessage(groupCode, true, genForwardTemplate(rsp.MsgResid, pv, "群聊的聊天记录", "[聊天记录]", "聊天记录", fmt.Sprintf("查看 %d 条转发消息", len(m.Nodes)), ts))
|
||||||
|
}
|
||||||
|
bri := func() string {
|
||||||
|
var r string
|
||||||
|
for _, n := range m.Nodes {
|
||||||
|
r += message.ToReadableString(n.Message)
|
||||||
|
if len(r) >= 27 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}()
|
||||||
|
return c.sendGroupMessage(groupCode, false, genLongTemplate(rsp.MsgResid, bri, ts))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// MessageSvc.PbSendMsg
|
||||||
|
func (c *QQClient) buildGroupSendingPacket(groupCode int64, r, pkgNum, pkgIndex, pkgDiv int32, forward bool, m []message.IMessageElement) (uint16, []byte) {
|
||||||
|
seq := c.nextSeq()
|
||||||
|
var ptt *message.GroupVoiceElement
|
||||||
|
if len(m) > 0 {
|
||||||
|
if p, ok := m[0].(*message.GroupVoiceElement); ok {
|
||||||
|
ptt = p
|
||||||
|
m = []message.IMessageElement{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
req := &msg.SendMessageRequest{
|
||||||
|
RoutingHead: &msg.RoutingHead{Grp: &msg.Grp{GroupCode: &groupCode}},
|
||||||
|
ContentHead: &msg.ContentHead{PkgNum: &pkgNum, PkgIndex: &pkgIndex, DivSeq: &pkgDiv},
|
||||||
|
MsgBody: &msg.MessageBody{
|
||||||
|
RichText: &msg.RichText{
|
||||||
|
Elems: message.ToProtoElems(m, true),
|
||||||
|
Ptt: func() *msg.Ptt {
|
||||||
|
if ptt != nil {
|
||||||
|
return ptt.Ptt
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
MsgSeq: proto.Int32(c.nextGroupSeq()),
|
||||||
|
MsgRand: &r,
|
||||||
|
SyncCookie: EmptyBytes,
|
||||||
|
MsgVia: proto.Int32(1),
|
||||||
|
MsgCtrl: func() *msg.MsgCtrl {
|
||||||
|
if forward {
|
||||||
|
return &msg.MsgCtrl{MsgFlag: proto.Int32(4)}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}(),
|
||||||
|
}
|
||||||
|
payload, _ := proto.Marshal(req)
|
||||||
|
packet := packets.BuildUniPacket(c.Uin, seq, "MessageSvc.PbSendMsg", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload)
|
||||||
|
return seq, packet
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *QQClient) buildGetGroupMsgRequest(groupCode, beginSeq, endSeq int64) (uint16, []byte) {
|
||||||
|
seq := c.nextSeq()
|
||||||
|
req := &msg.GetGroupMsgReq{
|
||||||
|
GroupCode: proto.Uint64(uint64(groupCode)),
|
||||||
|
BeginSeq: proto.Uint64(uint64(beginSeq)),
|
||||||
|
EndSeq: proto.Uint64(uint64(endSeq)),
|
||||||
|
PublicGroup: proto.Bool(false),
|
||||||
|
}
|
||||||
|
payload, _ := proto.Marshal(req)
|
||||||
|
packet := packets.BuildUniPacket(c.Uin, seq, "MessageSvc.PbGetGroupMsg", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload)
|
||||||
|
return seq, packet
|
||||||
|
}
|
||||||
|
|
||||||
|
// OnlinePush.PbPushGroupMsg
|
||||||
|
func decodeGroupMessagePacket(c *QQClient, _ uint16, payload []byte) (interface{}, error) {
|
||||||
|
pkt := msg.PushMessagePacket{}
|
||||||
|
err := proto.Unmarshal(payload, &pkt)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Wrap(err, "failed to unmarshal protobuf message")
|
||||||
|
}
|
||||||
|
if pkt.Message.Head.GetFromUin() == c.Uin {
|
||||||
|
c.dispatchGroupMessageReceiptEvent(&groupMessageReceiptEvent{
|
||||||
|
Rand: pkt.Message.Body.RichText.Attr.GetRandom(),
|
||||||
|
Seq: pkt.Message.Head.GetMsgSeq(),
|
||||||
|
Msg: c.parseGroupMessage(pkt.Message),
|
||||||
|
})
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
if pkt.Message.Content != nil && pkt.Message.Content.GetPkgNum() > 1 {
|
||||||
|
var builder *groupMessageBuilder // TODO: 支持多SEQ
|
||||||
|
i, ok := c.groupMsgBuilders.Load(pkt.Message.Content.DivSeq)
|
||||||
|
if !ok {
|
||||||
|
builder = &groupMessageBuilder{}
|
||||||
|
c.groupMsgBuilders.Store(pkt.Message.Content.DivSeq, builder)
|
||||||
|
} else {
|
||||||
|
builder = i.(*groupMessageBuilder)
|
||||||
|
}
|
||||||
|
builder.MessageSlices = append(builder.MessageSlices, pkt.Message)
|
||||||
|
if int32(len(builder.MessageSlices)) >= pkt.Message.Content.GetPkgNum() {
|
||||||
|
c.groupMsgBuilders.Delete(pkt.Message.Content.DivSeq)
|
||||||
|
c.dispatchGroupMessage(c.parseGroupMessage(builder.build()))
|
||||||
|
}
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
c.dispatchGroupMessage(c.parseGroupMessage(pkt.Message))
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func decodeMsgSendResponse(c *QQClient, _ uint16, payload []byte) (interface{}, error) {
|
||||||
|
rsp := msg.SendMessageResponse{}
|
||||||
|
if err := proto.Unmarshal(payload, &rsp); err != nil {
|
||||||
|
return nil, errors.Wrap(err, "failed to unmarshal protobuf message")
|
||||||
|
}
|
||||||
|
if rsp.GetResult() != 0 {
|
||||||
|
c.Error("send msg error: %v %v", rsp.GetResult(), rsp.GetErrMsg())
|
||||||
|
}
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func decodeGetGroupMsgResponse(c *QQClient, _ uint16, payload []byte) (interface{}, error) {
|
||||||
|
rsp := msg.GetGroupMsgResp{}
|
||||||
|
if err := proto.Unmarshal(payload, &rsp); err != nil {
|
||||||
|
return nil, errors.Wrap(err, "failed to unmarshal protobuf message")
|
||||||
|
}
|
||||||
|
if rsp.GetResult() != 0 {
|
||||||
|
c.Error("get msg error: %v %v", rsp.GetResult(), rsp.GetErrmsg())
|
||||||
|
return nil, errors.Errorf("get msg error: %v msg: %v", rsp.GetResult(), rsp.GetErrmsg())
|
||||||
|
}
|
||||||
|
var ret []*message.GroupMessage
|
||||||
|
for _, m := range rsp.Msg {
|
||||||
|
if m.Head.FromUin == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
ret = append(ret, c.parseGroupMessage(m))
|
||||||
|
}
|
||||||
|
return ret, nil
|
||||||
|
}
|
@ -7,6 +7,10 @@ import (
|
|||||||
"google.golang.org/protobuf/proto"
|
"google.golang.org/protobuf/proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
decoders["OfflineFilleHandleSvr.pb_ftn_CMD_REQ_APPLY_DOWNLOAD-1200"] = decodeOfflineFileDownloadResponse
|
||||||
|
}
|
||||||
|
|
||||||
func (c *QQClient) buildOfflineFileDownloadRequestPacket(uuid []byte) (uint16, []byte) {
|
func (c *QQClient) buildOfflineFileDownloadRequestPacket(uuid []byte) (uint16, []byte) {
|
||||||
seq := c.nextSeq()
|
seq := c.nextSeq()
|
||||||
req := &cmd0x346.C346ReqBody{
|
req := &cmd0x346.C346ReqBody{
|
||||||
|
@ -6547,6 +6547,196 @@ func (x *UinTypeUserDef) GetFileUuid() string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type GetGroupMsgReq struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
GroupCode *uint64 `protobuf:"varint,1,opt,name=groupCode" json:"groupCode,omitempty"`
|
||||||
|
BeginSeq *uint64 `protobuf:"varint,2,opt,name=beginSeq" json:"beginSeq,omitempty"`
|
||||||
|
EndSeq *uint64 `protobuf:"varint,3,opt,name=endSeq" json:"endSeq,omitempty"`
|
||||||
|
Filter *uint32 `protobuf:"varint,4,opt,name=filter" json:"filter,omitempty"`
|
||||||
|
MemberSeq *uint64 `protobuf:"varint,5,opt,name=memberSeq" json:"memberSeq,omitempty"`
|
||||||
|
PublicGroup *bool `protobuf:"varint,6,opt,name=publicGroup" json:"publicGroup,omitempty"`
|
||||||
|
ShieldFlag *uint32 `protobuf:"varint,7,opt,name=shieldFlag" json:"shieldFlag,omitempty"`
|
||||||
|
SaveTrafficFlag *uint32 `protobuf:"varint,8,opt,name=saveTrafficFlag" json:"saveTrafficFlag,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GetGroupMsgReq) Reset() {
|
||||||
|
*x = GetGroupMsgReq{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_msg_proto_msgTypes[65]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GetGroupMsgReq) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*GetGroupMsgReq) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *GetGroupMsgReq) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_msg_proto_msgTypes[65]
|
||||||
|
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 GetGroupMsgReq.ProtoReflect.Descriptor instead.
|
||||||
|
func (*GetGroupMsgReq) Descriptor() ([]byte, []int) {
|
||||||
|
return file_msg_proto_rawDescGZIP(), []int{65}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GetGroupMsgReq) GetGroupCode() uint64 {
|
||||||
|
if x != nil && x.GroupCode != nil {
|
||||||
|
return *x.GroupCode
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GetGroupMsgReq) GetBeginSeq() uint64 {
|
||||||
|
if x != nil && x.BeginSeq != nil {
|
||||||
|
return *x.BeginSeq
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GetGroupMsgReq) GetEndSeq() uint64 {
|
||||||
|
if x != nil && x.EndSeq != nil {
|
||||||
|
return *x.EndSeq
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GetGroupMsgReq) GetFilter() uint32 {
|
||||||
|
if x != nil && x.Filter != nil {
|
||||||
|
return *x.Filter
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GetGroupMsgReq) GetMemberSeq() uint64 {
|
||||||
|
if x != nil && x.MemberSeq != nil {
|
||||||
|
return *x.MemberSeq
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GetGroupMsgReq) GetPublicGroup() bool {
|
||||||
|
if x != nil && x.PublicGroup != nil {
|
||||||
|
return *x.PublicGroup
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GetGroupMsgReq) GetShieldFlag() uint32 {
|
||||||
|
if x != nil && x.ShieldFlag != nil {
|
||||||
|
return *x.ShieldFlag
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GetGroupMsgReq) GetSaveTrafficFlag() uint32 {
|
||||||
|
if x != nil && x.SaveTrafficFlag != nil {
|
||||||
|
return *x.SaveTrafficFlag
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetGroupMsgResp struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
Result *uint32 `protobuf:"varint,1,opt,name=result" json:"result,omitempty"`
|
||||||
|
Errmsg *string `protobuf:"bytes,2,opt,name=errmsg" json:"errmsg,omitempty"`
|
||||||
|
GroupCode *uint64 `protobuf:"varint,3,opt,name=groupCode" json:"groupCode,omitempty"`
|
||||||
|
ReturnBeginSeq *uint64 `protobuf:"varint,4,opt,name=returnBeginSeq" json:"returnBeginSeq,omitempty"`
|
||||||
|
ReturnEndSeq *uint64 `protobuf:"varint,5,opt,name=returnEndSeq" json:"returnEndSeq,omitempty"`
|
||||||
|
Msg []*Message `protobuf:"bytes,6,rep,name=msg" json:"msg,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GetGroupMsgResp) Reset() {
|
||||||
|
*x = GetGroupMsgResp{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_msg_proto_msgTypes[66]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GetGroupMsgResp) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*GetGroupMsgResp) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *GetGroupMsgResp) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_msg_proto_msgTypes[66]
|
||||||
|
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 GetGroupMsgResp.ProtoReflect.Descriptor instead.
|
||||||
|
func (*GetGroupMsgResp) Descriptor() ([]byte, []int) {
|
||||||
|
return file_msg_proto_rawDescGZIP(), []int{66}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GetGroupMsgResp) GetResult() uint32 {
|
||||||
|
if x != nil && x.Result != nil {
|
||||||
|
return *x.Result
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GetGroupMsgResp) GetErrmsg() string {
|
||||||
|
if x != nil && x.Errmsg != nil {
|
||||||
|
return *x.Errmsg
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GetGroupMsgResp) GetGroupCode() uint64 {
|
||||||
|
if x != nil && x.GroupCode != nil {
|
||||||
|
return *x.GroupCode
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GetGroupMsgResp) GetReturnBeginSeq() uint64 {
|
||||||
|
if x != nil && x.ReturnBeginSeq != nil {
|
||||||
|
return *x.ReturnBeginSeq
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GetGroupMsgResp) GetReturnEndSeq() uint64 {
|
||||||
|
if x != nil && x.ReturnEndSeq != nil {
|
||||||
|
return *x.ReturnEndSeq
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GetGroupMsgResp) GetMsg() []*Message {
|
||||||
|
if x != nil {
|
||||||
|
return x.Msg
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
var File_msg_proto protoreflect.FileDescriptor
|
var File_msg_proto protoreflect.FileDescriptor
|
||||||
|
|
||||||
var file_msg_proto_rawDesc = []byte{
|
var file_msg_proto_rawDesc = []byte{
|
||||||
@ -7558,11 +7748,40 @@ var file_msg_proto_rawDesc = []byte{
|
|||||||
0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03,
|
0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03,
|
||||||
0x52, 0x0d, 0x66, 0x72, 0x6f, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12,
|
0x52, 0x0d, 0x66, 0x72, 0x6f, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12,
|
||||||
0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,
|
0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,
|
||||||
0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x2a, 0x2e, 0x0a, 0x08, 0x53,
|
0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x22, 0x84, 0x02, 0x0a, 0x0e,
|
||||||
0x79, 0x6e, 0x63, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x54, 0x41, 0x52, 0x54,
|
0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x12, 0x1c,
|
||||||
0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4d, 0x45, 0x10,
|
0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
|
||||||
0x01, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x54, 0x4f, 0x50, 0x10, 0x02, 0x42, 0x07, 0x5a, 0x05, 0x2e,
|
0x04, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08,
|
||||||
0x3b, 0x6d, 0x73, 0x67,
|
0x62, 0x65, 0x67, 0x69, 0x6e, 0x53, 0x65, 0x71, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08,
|
||||||
|
0x62, 0x65, 0x67, 0x69, 0x6e, 0x53, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x64, 0x53,
|
||||||
|
0x65, 0x71, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x65, 0x6e, 0x64, 0x53, 0x65, 0x71,
|
||||||
|
0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d,
|
||||||
|
0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x62,
|
||||||
|
0x65, 0x72, 0x53, 0x65, 0x71, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x65, 0x6d,
|
||||||
|
0x62, 0x65, 0x72, 0x53, 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63,
|
||||||
|
0x47, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x62,
|
||||||
|
0x6c, 0x69, 0x63, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x68, 0x69, 0x65,
|
||||||
|
0x6c, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x73, 0x68,
|
||||||
|
0x69, 0x65, 0x6c, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x73, 0x61, 0x76, 0x65,
|
||||||
|
0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x46, 0x6c, 0x61, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28,
|
||||||
|
0x0d, 0x52, 0x0f, 0x73, 0x61, 0x76, 0x65, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x46, 0x6c,
|
||||||
|
0x61, 0x67, 0x22, 0xc7, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d,
|
||||||
|
0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,
|
||||||
|
0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16,
|
||||||
|
0x0a, 0x06, 0x65, 0x72, 0x72, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
|
||||||
|
0x65, 0x72, 0x72, 0x6d, 0x73, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43,
|
||||||
|
0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70,
|
||||||
|
0x43, 0x6f, 0x64, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x42, 0x65,
|
||||||
|
0x67, 0x69, 0x6e, 0x53, 0x65, 0x71, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x72, 0x65,
|
||||||
|
0x74, 0x75, 0x72, 0x6e, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x53, 0x65, 0x71, 0x12, 0x22, 0x0a, 0x0c,
|
||||||
|
0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x45, 0x6e, 0x64, 0x53, 0x65, 0x71, 0x18, 0x05, 0x20, 0x01,
|
||||||
|
0x28, 0x04, 0x52, 0x0c, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x45, 0x6e, 0x64, 0x53, 0x65, 0x71,
|
||||||
|
0x12, 0x1a, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e,
|
||||||
|
0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x2a, 0x2e, 0x0a, 0x08,
|
||||||
|
0x53, 0x79, 0x6e, 0x63, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x54, 0x41, 0x52,
|
||||||
|
0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4d, 0x45,
|
||||||
|
0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x54, 0x4f, 0x50, 0x10, 0x02, 0x42, 0x07, 0x5a, 0x05,
|
||||||
|
0x2e, 0x3b, 0x6d, 0x73, 0x67,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -7578,7 +7797,7 @@ func file_msg_proto_rawDescGZIP() []byte {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var file_msg_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
|
var file_msg_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
|
||||||
var file_msg_proto_msgTypes = make([]protoimpl.MessageInfo, 65)
|
var file_msg_proto_msgTypes = make([]protoimpl.MessageInfo, 67)
|
||||||
var file_msg_proto_goTypes = []interface{}{
|
var file_msg_proto_goTypes = []interface{}{
|
||||||
(SyncFlag)(0), // 0: SyncFlag
|
(SyncFlag)(0), // 0: SyncFlag
|
||||||
(*GetMessageRequest)(nil), // 1: GetMessageRequest
|
(*GetMessageRequest)(nil), // 1: GetMessageRequest
|
||||||
@ -7646,6 +7865,8 @@ var file_msg_proto_goTypes = []interface{}{
|
|||||||
(*ResvAttr)(nil), // 63: ResvAttr
|
(*ResvAttr)(nil), // 63: ResvAttr
|
||||||
(*AnimationImageShow)(nil), // 64: AnimationImageShow
|
(*AnimationImageShow)(nil), // 64: AnimationImageShow
|
||||||
(*UinTypeUserDef)(nil), // 65: UinTypeUserDef
|
(*UinTypeUserDef)(nil), // 65: UinTypeUserDef
|
||||||
|
(*GetGroupMsgReq)(nil), // 66: GetGroupMsgReq
|
||||||
|
(*GetGroupMsgResp)(nil), // 67: GetGroupMsgResp
|
||||||
}
|
}
|
||||||
var file_msg_proto_depIdxs = []int32{
|
var file_msg_proto_depIdxs = []int32{
|
||||||
0, // 0: GetMessageRequest.syncFlag:type_name -> SyncFlag
|
0, // 0: GetMessageRequest.syncFlag:type_name -> SyncFlag
|
||||||
@ -7713,11 +7934,12 @@ var file_msg_proto_depIdxs = []int32{
|
|||||||
34, // 62: MsgElemInfo_servtype3.flash_c2c_pic:type_name -> NotOnlineImage
|
34, // 62: MsgElemInfo_servtype3.flash_c2c_pic:type_name -> NotOnlineImage
|
||||||
35, // 63: SubMsgType0x4Body.notOnlineFile:type_name -> NotOnlineFile
|
35, // 63: SubMsgType0x4Body.notOnlineFile:type_name -> NotOnlineFile
|
||||||
64, // 64: ResvAttr.image_show:type_name -> AnimationImageShow
|
64, // 64: ResvAttr.image_show:type_name -> AnimationImageShow
|
||||||
65, // [65:65] is the sub-list for method output_type
|
20, // 65: GetGroupMsgResp.msg:type_name -> Message
|
||||||
65, // [65:65] is the sub-list for method input_type
|
66, // [66:66] is the sub-list for method output_type
|
||||||
65, // [65:65] is the sub-list for extension type_name
|
66, // [66:66] is the sub-list for method input_type
|
||||||
65, // [65:65] is the sub-list for extension extendee
|
66, // [66:66] is the sub-list for extension type_name
|
||||||
0, // [0:65] is the sub-list for field type_name
|
66, // [66:66] is the sub-list for extension extendee
|
||||||
|
0, // [0:66] is the sub-list for field type_name
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() { file_msg_proto_init() }
|
func init() { file_msg_proto_init() }
|
||||||
@ -8506,6 +8728,30 @@ func file_msg_proto_init() {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
file_msg_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*GetGroupMsgReq); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_msg_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*GetGroupMsgResp); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
type x struct{}
|
type x struct{}
|
||||||
out := protoimpl.TypeBuilder{
|
out := protoimpl.TypeBuilder{
|
||||||
@ -8513,7 +8759,7 @@ func file_msg_proto_init() {
|
|||||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||||
RawDescriptor: file_msg_proto_rawDesc,
|
RawDescriptor: file_msg_proto_rawDesc,
|
||||||
NumEnums: 1,
|
NumEnums: 1,
|
||||||
NumMessages: 65,
|
NumMessages: 67,
|
||||||
NumExtensions: 0,
|
NumExtensions: 0,
|
||||||
NumServices: 0,
|
NumServices: 0,
|
||||||
},
|
},
|
||||||
|
@ -749,3 +749,23 @@ message UinTypeUserDef {
|
|||||||
optional int64 fromGroupCode = 2;
|
optional int64 fromGroupCode = 2;
|
||||||
optional string fileUuid = 3;
|
optional string fileUuid = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message GetGroupMsgReq {
|
||||||
|
optional uint64 groupCode = 1;
|
||||||
|
optional uint64 beginSeq = 2;
|
||||||
|
optional uint64 endSeq = 3;
|
||||||
|
optional uint32 filter = 4;
|
||||||
|
optional uint64 memberSeq = 5;
|
||||||
|
optional bool publicGroup = 6;
|
||||||
|
optional uint32 shieldFlag = 7;
|
||||||
|
optional uint32 saveTrafficFlag = 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
message GetGroupMsgResp {
|
||||||
|
optional uint32 result = 1;
|
||||||
|
optional string errmsg = 2;
|
||||||
|
optional uint64 groupCode = 3;
|
||||||
|
optional uint64 returnBeginSeq = 4;
|
||||||
|
optional uint64 returnEndSeq = 5;
|
||||||
|
repeated Message msg = 6;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user