mirror of
https://github.com/Mrs4s/MiraiGo.git
synced 2025-05-04 19:17:38 +08:00
feat: channel info support
This commit is contained in:
parent
ddf1e5e371
commit
5e371689e6
101
client/channel.go
Normal file
101
client/channel.go
Normal file
@ -0,0 +1,101 @@
|
||||
package client
|
||||
|
||||
import (
|
||||
"github.com/Mrs4s/MiraiGo/client/pb/channel"
|
||||
"github.com/Mrs4s/MiraiGo/internal/packets"
|
||||
"github.com/Mrs4s/MiraiGo/utils"
|
||||
"github.com/pkg/errors"
|
||||
"google.golang.org/protobuf/proto"
|
||||
)
|
||||
|
||||
// ChannelSelfInfo 频道模块内自身的信息
|
||||
type ChannelSelfInfo struct {
|
||||
TinyId uint64
|
||||
ChannelCount uint32
|
||||
// Guilds 由服务器推送的频道列表
|
||||
Guilds []*GuildInfo
|
||||
}
|
||||
|
||||
// GuildInfo 频道信息
|
||||
type GuildInfo struct {
|
||||
GuildId uint64
|
||||
GuildCode uint64
|
||||
GuildName string
|
||||
Channels []*ChannelInfo
|
||||
}
|
||||
|
||||
// ChannelInfo 子频道信息
|
||||
type ChannelInfo struct {
|
||||
ChannelId uint64
|
||||
ChannelName string
|
||||
Time uint64
|
||||
EventTime uint32
|
||||
NotifyType uint32
|
||||
ChannelType uint32
|
||||
AtAllSeq uint64
|
||||
}
|
||||
|
||||
func init() {
|
||||
decoders["trpc.group_pro.synclogic.SyncLogic.PushFirstView"] = decodeChannelPushFirstView
|
||||
}
|
||||
|
||||
func (c *QQClient) syncChannelFirstView() {
|
||||
rsp, err := c.sendAndWaitDynamic(c.buildSyncChannelFirstViewPacket())
|
||||
if err != nil {
|
||||
c.Error("sync channel error: %v", err)
|
||||
return
|
||||
}
|
||||
firstViewRsp := new(channel.FirstViewRsp)
|
||||
if err = proto.Unmarshal(rsp, firstViewRsp); err != nil {
|
||||
return
|
||||
}
|
||||
c.ChannelSelf.TinyId = firstViewRsp.GetSelfTinyid()
|
||||
c.ChannelSelf.ChannelCount = firstViewRsp.GetGuildCount()
|
||||
}
|
||||
|
||||
func (c *QQClient) buildSyncChannelFirstViewPacket() (uint16, []byte) {
|
||||
seq := c.nextSeq()
|
||||
req := &channel.FirstViewReq{
|
||||
LastMsgTime: proto.Uint64(0),
|
||||
Seq: proto.Uint32(0),
|
||||
DirectMessageFlag: proto.Uint32(1),
|
||||
}
|
||||
payload, _ := proto.Marshal(req)
|
||||
packet := packets.BuildUniPacket(c.Uin, seq, "trpc.group_pro.synclogic.SyncLogic.SyncFirstView", 1, c.OutGoingPacketSessionId, []byte{}, c.sigInfo.d2Key, payload)
|
||||
return seq, packet
|
||||
}
|
||||
|
||||
func decodeChannelPushFirstView(c *QQClient, _ *incomingPacketInfo, payload []byte) (interface{}, error) {
|
||||
firstViewMsg := new(channel.FirstViewMsg)
|
||||
if err := proto.Unmarshal(payload, firstViewMsg); err != nil {
|
||||
return nil, errors.Wrap(err, "failed to unmarshal protobuf message")
|
||||
}
|
||||
if len(firstViewMsg.GuildNodes) > 0 {
|
||||
c.ChannelSelf.Guilds = []*GuildInfo{}
|
||||
for _, guild := range firstViewMsg.GuildNodes {
|
||||
info := &GuildInfo{
|
||||
GuildId: guild.GetGuildId(),
|
||||
GuildCode: guild.GetGuildCode(),
|
||||
GuildName: utils.B2S(guild.GuildName),
|
||||
}
|
||||
for _, node := range guild.ChannelNodes {
|
||||
meta := new(channel.ChannelMsgMeta)
|
||||
_ = proto.Unmarshal(node.Meta, meta)
|
||||
info.Channels = append(info.Channels, &ChannelInfo{
|
||||
ChannelId: node.GetChannelId(),
|
||||
ChannelName: utils.B2S(node.ChannelName),
|
||||
Time: node.GetTime(),
|
||||
EventTime: node.GetEventTime(),
|
||||
NotifyType: node.GetNotifyType(),
|
||||
ChannelType: node.GetChannelType(),
|
||||
AtAllSeq: meta.GetAtAllSeq(),
|
||||
})
|
||||
}
|
||||
c.ChannelSelf.Guilds = append(c.ChannelSelf.Guilds, info)
|
||||
}
|
||||
}
|
||||
if len(firstViewMsg.ChannelMsgs) > 0 { // sync msg
|
||||
|
||||
}
|
||||
return nil, nil
|
||||
}
|
@ -44,6 +44,7 @@ type QQClient struct {
|
||||
OnlineClients []*OtherClientInfo
|
||||
Online bool
|
||||
QiDian *QiDianAccountInfo
|
||||
ChannelSelf *ChannelSelfInfo
|
||||
|
||||
// protocol public field
|
||||
SequenceId int32
|
||||
@ -199,6 +200,7 @@ func NewClientMd5(uin int64, passwordMd5 [16]byte) *QQClient {
|
||||
RandomKey: make([]byte, 16),
|
||||
OutGoingPacketSessionId: []byte{0x02, 0xB0, 0x5B, 0x8B},
|
||||
TCP: &utils.TCPListener{},
|
||||
ChannelSelf: &ChannelSelfInfo{},
|
||||
sigInfo: &loginSigInfo{},
|
||||
requestPacketRequestID: 1921334513,
|
||||
groupSeq: int32(rand.Intn(20000)),
|
||||
@ -451,6 +453,7 @@ func (c *QQClient) init(tokenLogin bool) error {
|
||||
}
|
||||
seq, pkt := c.buildGetMessageRequestPacket(msg.SyncFlag_START, time.Now().Unix())
|
||||
_, _ = c.sendAndWait(seq, pkt, requestParams{"used_reg_proxy": true, "init": true})
|
||||
c.syncChannelFirstView()
|
||||
return nil
|
||||
}
|
||||
|
||||
|
1753
client/pb/channel/common.pb.go
Normal file
1753
client/pb/channel/common.pb.go
Normal file
File diff suppressed because it is too large
Load Diff
135
client/pb/channel/common.proto
Normal file
135
client/pb/channel/common.proto
Normal file
@ -0,0 +1,135 @@
|
||||
syntax = "proto2";
|
||||
|
||||
package channel;
|
||||
|
||||
option go_package = "pb/channel;channel";
|
||||
|
||||
import "pb/msg/msg.proto";
|
||||
|
||||
message ChannelContentHead {
|
||||
optional uint64 type = 1;
|
||||
optional uint64 subType = 2;
|
||||
optional uint64 random = 3;
|
||||
optional uint64 seq = 4;
|
||||
optional uint64 cntSeq = 5;
|
||||
optional uint64 time = 6;
|
||||
optional bytes meta = 7;
|
||||
}
|
||||
|
||||
message DirectMessageMember {
|
||||
optional uint64 uin = 1;
|
||||
optional uint64 tinyid = 2;
|
||||
optional uint64 sourceGuildId = 3;
|
||||
optional bytes sourceGuildName = 4;
|
||||
optional bytes nickName = 5;
|
||||
optional bytes memberName = 6;
|
||||
optional uint32 notifyType = 7;
|
||||
}
|
||||
|
||||
message ChannelEvent {
|
||||
optional uint64 type = 1;
|
||||
optional uint64 version = 2;
|
||||
optional ChannelMsgOpInfo opInfo = 3;
|
||||
}
|
||||
|
||||
message ChannelExtInfo {
|
||||
optional bytes fromNick = 1;
|
||||
optional bytes guildName = 2;
|
||||
optional bytes channelName = 3;
|
||||
optional uint32 visibility = 4;
|
||||
optional uint32 notifyType = 5;
|
||||
optional uint32 offlineFlag = 6;
|
||||
optional uint32 nameType = 7;
|
||||
optional bytes memberName = 8;
|
||||
optional uint32 timestamp = 9;
|
||||
optional uint64 eventVersion = 10;
|
||||
repeated ChannelEvent events = 11;
|
||||
optional ChannelRole fromRoleInfo = 12;
|
||||
optional ChannelFreqLimitInfo freqLimitInfo = 13;
|
||||
repeated DirectMessageMember directMessageMember = 14;
|
||||
}
|
||||
|
||||
message ChannelFreqLimitInfo {
|
||||
optional uint32 isLimited = 1;
|
||||
optional uint32 leftCount = 2;
|
||||
optional uint64 limitTimestamp = 3;
|
||||
}
|
||||
|
||||
message ChannelInfo {
|
||||
optional uint64 id = 1;
|
||||
optional bytes name = 2;
|
||||
optional uint32 color = 3;
|
||||
optional uint32 hoist = 4;
|
||||
}
|
||||
|
||||
message ChannelLoginSig {
|
||||
optional uint32 type = 1;
|
||||
optional bytes sig = 2;
|
||||
optional uint32 appid = 3;
|
||||
}
|
||||
|
||||
message ChannelMeta {
|
||||
optional uint64 fromUin = 1;
|
||||
optional ChannelLoginSig loginSig = 2;
|
||||
}
|
||||
|
||||
message ChannelMsgContent {
|
||||
optional ChannelMsgHead head = 1;
|
||||
optional ChannelMsgCtrlHead ctrlHead = 2;
|
||||
optional msg.MessageBody body = 3;
|
||||
optional ChannelExtInfo extInfo = 4;
|
||||
}
|
||||
|
||||
message ChannelMsgCtrlHead {
|
||||
repeated uint64 includeUin = 1;
|
||||
repeated uint64 excludeUin = 2;
|
||||
repeated uint64 featureid = 3;
|
||||
optional uint32 offlineFlag = 4;
|
||||
optional uint32 visibility = 5;
|
||||
optional uint64 ctrlFlag = 6;
|
||||
repeated ChannelEvent events = 7;
|
||||
optional uint64 level = 8;
|
||||
repeated PersonalLevel personalLevels = 9;
|
||||
optional uint64 guildSyncSeq = 10;
|
||||
optional uint32 memberNum = 11;
|
||||
optional uint32 channelType = 12;
|
||||
optional uint32 privateType = 13;
|
||||
}
|
||||
|
||||
message ChannelMsgHead {
|
||||
optional ChannelRoutingHead routingHead = 1;
|
||||
optional ChannelContentHead contentHead = 2;
|
||||
}
|
||||
|
||||
message ChannelMsgMeta {
|
||||
optional uint64 atAllSeq = 1;
|
||||
}
|
||||
|
||||
message ChannelMsgOpInfo {
|
||||
optional uint64 operatorTinyid = 1;
|
||||
optional uint64 operatorRole = 2;
|
||||
optional uint64 reason = 3;
|
||||
optional uint64 timestamp = 4;
|
||||
optional uint64 atType = 5;
|
||||
}
|
||||
|
||||
message PersonalLevel {
|
||||
optional uint64 toUin = 1;
|
||||
optional uint64 level = 2;
|
||||
}
|
||||
|
||||
message ChannelRole {
|
||||
optional uint64 id = 1;
|
||||
optional bytes info = 2;
|
||||
optional uint32 flag = 3;
|
||||
}
|
||||
|
||||
message ChannelRoutingHead {
|
||||
optional uint64 guildId = 1;
|
||||
optional uint64 channelId = 2;
|
||||
optional uint64 fromUin = 3;
|
||||
optional uint64 fromTinyid = 4;
|
||||
optional uint64 guildCode = 5;
|
||||
optional uint64 fromAppid = 6;
|
||||
optional uint32 directMessageFlag = 7;
|
||||
}
|
1735
client/pb/channel/synclogic.pb.go
Normal file
1735
client/pb/channel/synclogic.pb.go
Normal file
File diff suppressed because it is too large
Load Diff
134
client/pb/channel/synclogic.proto
Normal file
134
client/pb/channel/synclogic.proto
Normal file
@ -0,0 +1,134 @@
|
||||
syntax = "proto2";
|
||||
|
||||
package channel;
|
||||
|
||||
option go_package = "pb/channel;channel";
|
||||
|
||||
import "pb/channel/common.proto";
|
||||
|
||||
message ChannelMsg {
|
||||
optional uint64 guildId = 1;
|
||||
optional uint64 channelId = 2;
|
||||
optional uint32 result = 3;
|
||||
optional uint64 rspBeginSeq = 4;
|
||||
optional uint64 rspEndSeq = 5;
|
||||
repeated ChannelMsgContent msgs = 6;
|
||||
}
|
||||
|
||||
message ChannelMsgReq {
|
||||
optional ChannelParam channelParam = 1;
|
||||
optional uint32 withVersionFlag = 2;
|
||||
optional uint32 directMessageFlag = 3;
|
||||
}
|
||||
|
||||
message ChannelMsgRsp {
|
||||
optional uint32 result = 1;
|
||||
optional bytes errMsg = 2;
|
||||
optional ChannelMsg channelMsg = 3;
|
||||
optional uint32 withVersionFlag = 4;
|
||||
optional uint64 getMsgTime = 5;
|
||||
}
|
||||
|
||||
message ChannelNode {
|
||||
optional uint64 channelId = 1;
|
||||
optional uint64 seq = 2;
|
||||
optional uint64 cntSeq = 3;
|
||||
optional uint64 time = 4;
|
||||
optional uint64 memberReadMsgSeq = 5;
|
||||
optional uint64 memberReadCntSeq = 6;
|
||||
optional uint32 notifyType = 7;
|
||||
optional bytes channelName = 8;
|
||||
optional uint32 channelType = 9;
|
||||
optional bytes meta = 10;
|
||||
optional bytes readMsgMeta = 11;
|
||||
optional uint32 eventTime = 12;
|
||||
}
|
||||
|
||||
message ChannelParam {
|
||||
optional uint64 guildId = 1;
|
||||
optional uint64 channelId = 2;
|
||||
optional uint64 beginSeq = 3;
|
||||
optional uint64 endSeq = 4;
|
||||
optional uint64 time = 5;
|
||||
repeated uint64 version = 6;
|
||||
repeated MsgCond seqs = 7;
|
||||
}
|
||||
|
||||
message DirectMessageSource {
|
||||
optional uint64 tinyId = 1;
|
||||
optional uint64 guildId = 2;
|
||||
optional bytes guildName = 3;
|
||||
optional bytes memberName = 4;
|
||||
optional bytes nickName = 5;
|
||||
}
|
||||
|
||||
message FirstViewMsg {
|
||||
optional uint32 pushFlag = 1;
|
||||
optional uint32 seq = 2;
|
||||
repeated GuildNode guildNodes = 3;
|
||||
repeated ChannelMsg channelMsgs = 4;
|
||||
optional uint64 getMsgTime = 5;
|
||||
repeated GuildNode directMessageGuildNodes = 6;
|
||||
}
|
||||
|
||||
message FirstViewReq {
|
||||
optional uint64 lastMsgTime = 1;
|
||||
optional uint32 udcFlag = 2;
|
||||
optional uint32 seq = 3;
|
||||
optional uint32 directMessageFlag = 4;
|
||||
}
|
||||
|
||||
message FirstViewRsp {
|
||||
optional uint32 result = 1;
|
||||
optional bytes errMsg = 2;
|
||||
optional uint32 seq = 3;
|
||||
optional uint32 udcFlag = 4;
|
||||
optional uint32 guildCount = 5;
|
||||
optional uint64 selfTinyid = 6;
|
||||
optional uint32 directMessageSwitch = 7;
|
||||
optional uint32 directMessageGuildCount = 8;
|
||||
}
|
||||
|
||||
message GuildNode {
|
||||
optional uint64 guildId = 1;
|
||||
optional uint64 guildCode = 2;
|
||||
repeated ChannelNode channelNodes = 3;
|
||||
optional bytes guildName = 4;
|
||||
optional DirectMessageSource peerSource = 5;
|
||||
}
|
||||
|
||||
message MsgCond {
|
||||
optional uint64 seq = 1;
|
||||
optional uint64 eventVersion = 2;
|
||||
}
|
||||
|
||||
message MultiChannelMsg {
|
||||
optional uint32 pushFlag = 1;
|
||||
optional uint32 seq = 2;
|
||||
repeated ChannelMsg channelMsgs = 3;
|
||||
optional uint64 getMsgTime = 4;
|
||||
}
|
||||
|
||||
message MultiChannelMsgReq {
|
||||
repeated ChannelParam channelParams = 1;
|
||||
optional uint32 seq = 2;
|
||||
optional uint32 directMessageFlag = 3;
|
||||
}
|
||||
|
||||
message MultiChannelMsgRsp {
|
||||
optional uint32 result = 1;
|
||||
optional bytes errMsg = 2;
|
||||
optional uint32 seq = 3;
|
||||
}
|
||||
|
||||
message ReqBody {
|
||||
optional ChannelParam channelParam = 1;
|
||||
optional uint32 directMessageFlag = 2;
|
||||
}
|
||||
|
||||
message RspBody {
|
||||
optional uint32 result = 1;
|
||||
optional bytes errMsg = 2;
|
||||
optional ChannelMsg channelMsg = 3;
|
||||
}
|
||||
|
@ -1,6 +1,8 @@
|
||||
syntax = "proto2";
|
||||
|
||||
option go_package = "./;msg";
|
||||
package msg;
|
||||
|
||||
option go_package = "github.com/Mrs4s/MiraiGo/client/pb/msg;msg";
|
||||
|
||||
message GetMessageRequest {
|
||||
optional SyncFlag syncFlag = 1;
|
||||
|
Loading…
x
Reference in New Issue
Block a user