mirror of
https://github.com/Mrs4s/MiraiGo.git
synced 2025-05-08 04:55:56 +08:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
ad67391d5c
@ -769,38 +769,6 @@ func (c *QQClient) buildImageUploadPacket(data, updKey []byte, commandId int32,
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// ProfileService.Pb.ReqSystemMsgNew.Group
|
|
||||||
func (c *QQClient) buildSystemMsgNewGroupPacket() (uint16, []byte) {
|
|
||||||
seq := c.nextSeq()
|
|
||||||
req := &structmsg.ReqSystemMsgNew{
|
|
||||||
MsgNum: 100,
|
|
||||||
Version: 1000,
|
|
||||||
Checktype: 3,
|
|
||||||
Flag: &structmsg.FlagInfo{
|
|
||||||
GrpMsgKickAdmin: 1,
|
|
||||||
GrpMsgHiddenGrp: 1,
|
|
||||||
GrpMsgWordingDown: 1,
|
|
||||||
GrpMsgGetOfficialAccount: 1,
|
|
||||||
GrpMsgGetPayInGroup: 1,
|
|
||||||
FrdMsgDiscuss2ManyChat: 1,
|
|
||||||
GrpMsgNotAllowJoinGrpInviteNotFrd: 1,
|
|
||||||
FrdMsgNeedWaitingMsg: 1,
|
|
||||||
FrdMsgUint32NeedAllUnreadMsg: 1,
|
|
||||||
GrpMsgNeedAutoAdminWording: 1,
|
|
||||||
GrpMsgGetTransferGroupMsgFlag: 1,
|
|
||||||
GrpMsgGetQuitPayGroupMsgFlag: 1,
|
|
||||||
GrpMsgSupportInviteAutoJoin: 1,
|
|
||||||
GrpMsgMaskInviteAutoJoin: 1,
|
|
||||||
GrpMsgGetDisbandedByAdmin: 1,
|
|
||||||
GrpMsgGetC2CInviteJoinGroup: 1,
|
|
||||||
},
|
|
||||||
FriendMsgTypeFlag: 1,
|
|
||||||
}
|
|
||||||
payload, _ := proto.Marshal(req)
|
|
||||||
packet := packets.BuildUniPacket(c.Uin, seq, "ProfileService.Pb.ReqSystemMsgNew.Group", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload)
|
|
||||||
return seq, packet
|
|
||||||
}
|
|
||||||
|
|
||||||
// ProfileService.Pb.ReqSystemMsgNew.Friend
|
// ProfileService.Pb.ReqSystemMsgNew.Friend
|
||||||
func (c *QQClient) buildSystemMsgNewFriendPacket() (uint16, []byte) {
|
func (c *QQClient) buildSystemMsgNewFriendPacket() (uint16, []byte) {
|
||||||
seq := c.nextSeq()
|
seq := c.nextSeq()
|
||||||
|
@ -75,6 +75,7 @@ type QQClient struct {
|
|||||||
msgSvcCache *utils.Cache
|
msgSvcCache *utils.Cache
|
||||||
transCache *utils.Cache
|
transCache *utils.Cache
|
||||||
lastLostMsg string
|
lastLostMsg string
|
||||||
|
groupSysMsgCache *GroupSystemMessages
|
||||||
groupMsgBuilders sync.Map
|
groupMsgBuilders sync.Map
|
||||||
onlinePushCache *utils.Cache
|
onlinePushCache *utils.Cache
|
||||||
requestPacketRequestId int32
|
requestPacketRequestId int32
|
||||||
@ -211,12 +212,7 @@ func (c *QQClient) Login() (*LoginResponse, error) {
|
|||||||
}
|
}
|
||||||
l := rsp.(LoginResponse)
|
l := rsp.(LoginResponse)
|
||||||
if l.Success {
|
if l.Success {
|
||||||
c.Online = true
|
c.init()
|
||||||
c.lastLostMsg = ""
|
|
||||||
c.registerClient()
|
|
||||||
if !c.heartbeatEnabled {
|
|
||||||
c.startHeartbeat()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return &l, nil
|
return &l, nil
|
||||||
}
|
}
|
||||||
@ -230,11 +226,7 @@ func (c *QQClient) SubmitCaptcha(result string, sign []byte) (*LoginResponse, er
|
|||||||
}
|
}
|
||||||
l := rsp.(LoginResponse)
|
l := rsp.(LoginResponse)
|
||||||
if l.Success {
|
if l.Success {
|
||||||
c.Online = true
|
c.init()
|
||||||
c.registerClient()
|
|
||||||
if !c.heartbeatEnabled {
|
|
||||||
c.startHeartbeat()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return &l, nil
|
return &l, nil
|
||||||
}
|
}
|
||||||
@ -246,15 +238,20 @@ func (c *QQClient) SubmitSMS(code string) (*LoginResponse, error) {
|
|||||||
}
|
}
|
||||||
l := rsp.(LoginResponse)
|
l := rsp.(LoginResponse)
|
||||||
if l.Success {
|
if l.Success {
|
||||||
c.Online = true
|
c.init()
|
||||||
c.registerClient()
|
|
||||||
if !c.heartbeatEnabled {
|
|
||||||
c.startHeartbeat()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return &l, nil
|
return &l, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *QQClient) init() {
|
||||||
|
c.Online = true
|
||||||
|
c.registerClient()
|
||||||
|
c.groupSysMsgCache, _ = c.GetGroupSystemMessages()
|
||||||
|
if !c.heartbeatEnabled {
|
||||||
|
c.startHeartbeat()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (c *QQClient) RequestSMS() bool {
|
func (c *QQClient) RequestSMS() bool {
|
||||||
rsp, err := c.sendAndWait(c.buildSMSRequestPacket())
|
rsp, err := c.sendAndWait(c.buildSMSRequestPacket())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -7,7 +7,6 @@ import (
|
|||||||
"github.com/Mrs4s/MiraiGo/client/pb/notify"
|
"github.com/Mrs4s/MiraiGo/client/pb/notify"
|
||||||
"github.com/Mrs4s/MiraiGo/client/pb/pttcenter"
|
"github.com/Mrs4s/MiraiGo/client/pb/pttcenter"
|
||||||
"github.com/Mrs4s/MiraiGo/client/pb/qweb"
|
"github.com/Mrs4s/MiraiGo/client/pb/qweb"
|
||||||
"log"
|
|
||||||
"net"
|
"net"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@ -304,8 +303,7 @@ func decodeMessageSvcPacket(c *QQClient, _ uint16, payload []byte) (interface{},
|
|||||||
}
|
}
|
||||||
groupJoinLock.Unlock()
|
groupJoinLock.Unlock()
|
||||||
case 84, 87:
|
case 84, 87:
|
||||||
_, pkt := c.buildSystemMsgNewGroupPacket()
|
c.exceptAndDispatchGroupSysMsg()
|
||||||
_ = c.send(pkt)
|
|
||||||
case 141: // 临时会话
|
case 141: // 临时会话
|
||||||
if message.Head.C2CTmpMsgHead == nil {
|
if message.Head.C2CTmpMsgHead == nil {
|
||||||
continue
|
continue
|
||||||
@ -934,55 +932,6 @@ func decodeOnlinePushTransPacket(c *QQClient, _ uint16, payload []byte) (interfa
|
|||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ProfileService.Pb.ReqSystemMsgNew.Group
|
|
||||||
func decodeSystemMsgGroupPacket(c *QQClient, _ uint16, payload []byte) (interface{}, error) {
|
|
||||||
rsp := structmsg.RspSystemMsgNew{}
|
|
||||||
if err := proto.Unmarshal(payload, &rsp); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if len(rsp.Groupmsgs) == 0 {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
st := rsp.Groupmsgs[0]
|
|
||||||
if st.Msg != nil {
|
|
||||||
if st.Msg.SubType == 1 {
|
|
||||||
// 处理被邀请入群 或 处理成员入群申请
|
|
||||||
switch st.Msg.GroupMsgType {
|
|
||||||
case 1: // 成员申请
|
|
||||||
c.dispatchJoinGroupRequest(&UserJoinGroupRequest{
|
|
||||||
RequestId: st.MsgSeq,
|
|
||||||
Message: st.Msg.MsgAdditional,
|
|
||||||
RequesterUin: st.ReqUin,
|
|
||||||
RequesterNick: st.Msg.ReqUinNick,
|
|
||||||
GroupCode: st.Msg.GroupCode,
|
|
||||||
GroupName: st.Msg.GroupName,
|
|
||||||
client: c,
|
|
||||||
})
|
|
||||||
case 2: // 被邀请
|
|
||||||
c.dispatchGroupInvitedEvent(&GroupInvitedRequest{
|
|
||||||
RequestId: st.MsgSeq,
|
|
||||||
InvitorUin: st.Msg.ActionUin,
|
|
||||||
InvitorNick: st.Msg.ActionUinNick,
|
|
||||||
GroupCode: st.Msg.GroupCode,
|
|
||||||
GroupName: st.Msg.GroupName,
|
|
||||||
client: c,
|
|
||||||
})
|
|
||||||
default:
|
|
||||||
log.Println("unknown group msg:", st)
|
|
||||||
}
|
|
||||||
} else if st.Msg.SubType == 2 {
|
|
||||||
// 被邀请入群, 自动同意, 不需处理
|
|
||||||
} else if st.Msg.SubType == 3 {
|
|
||||||
// 已被其他管理员处理
|
|
||||||
} else if st.Msg.SubType == 5 {
|
|
||||||
// 成员退群消息
|
|
||||||
} else {
|
|
||||||
log.Println("unknown group msg:", st)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ProfileService.Pb.ReqSystemMsgNew.Friend
|
// ProfileService.Pb.ReqSystemMsgNew.Friend
|
||||||
func decodeSystemMsgFriendPacket(c *QQClient, _ uint16, payload []byte) (interface{}, error) {
|
func decodeSystemMsgFriendPacket(c *QQClient, _ uint16, payload []byte) (interface{}, error) {
|
||||||
rsp := structmsg.RspSystemMsgNew{}
|
rsp := structmsg.RspSystemMsgNew{}
|
||||||
|
@ -151,27 +151,6 @@ type (
|
|||||||
Message string
|
Message string
|
||||||
}
|
}
|
||||||
|
|
||||||
GroupInvitedRequest struct {
|
|
||||||
RequestId int64
|
|
||||||
InvitorUin int64
|
|
||||||
InvitorNick string
|
|
||||||
GroupCode int64
|
|
||||||
GroupName string
|
|
||||||
|
|
||||||
client *QQClient
|
|
||||||
}
|
|
||||||
|
|
||||||
UserJoinGroupRequest struct {
|
|
||||||
RequestId int64
|
|
||||||
Message string
|
|
||||||
RequesterUin int64
|
|
||||||
RequesterNick string
|
|
||||||
GroupCode int64
|
|
||||||
GroupName string
|
|
||||||
|
|
||||||
client *QQClient
|
|
||||||
}
|
|
||||||
|
|
||||||
NewFriendRequest struct {
|
NewFriendRequest struct {
|
||||||
RequestId int64
|
RequestId int64
|
||||||
Message string
|
Message string
|
||||||
|
172
client/system_msg.go
Normal file
172
client/system_msg.go
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
package client
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/Mrs4s/MiraiGo/client/pb/structmsg"
|
||||||
|
"github.com/Mrs4s/MiraiGo/protocol/packets"
|
||||||
|
"google.golang.org/protobuf/proto"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
GroupSystemMessages struct {
|
||||||
|
InvitedRequests []*GroupInvitedRequest `json:"invited_requests"`
|
||||||
|
JoinRequests []*UserJoinGroupRequest `json:"join_requests"`
|
||||||
|
}
|
||||||
|
|
||||||
|
GroupInvitedRequest struct {
|
||||||
|
RequestId int64 `json:"request_id"`
|
||||||
|
InvitorUin int64 `json:"invitor_uin"`
|
||||||
|
InvitorNick string `json:"invitor_nick"`
|
||||||
|
GroupCode int64 `json:"group_code"`
|
||||||
|
GroupName string `json:"group_name"`
|
||||||
|
|
||||||
|
Checked bool `json:"checked"`
|
||||||
|
Actor int64 `json:"actor"`
|
||||||
|
|
||||||
|
client *QQClient
|
||||||
|
}
|
||||||
|
|
||||||
|
UserJoinGroupRequest struct {
|
||||||
|
RequestId int64 `json:"request_id"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
RequesterUin int64 `json:"requester_uin"`
|
||||||
|
RequesterNick string `json:"requester_nick"`
|
||||||
|
GroupCode int64 `json:"group_code"`
|
||||||
|
GroupName string `json:"group_name"`
|
||||||
|
|
||||||
|
Checked bool `json:"checked"`
|
||||||
|
Actor int64 `json:"actor"`
|
||||||
|
|
||||||
|
client *QQClient
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func (c *QQClient) GetGroupSystemMessages() (*GroupSystemMessages, error) {
|
||||||
|
i, err := c.sendAndWait(c.buildSystemMsgNewGroupPacket())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return i.(*GroupSystemMessages), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *QQClient) exceptAndDispatchGroupSysMsg() {
|
||||||
|
if c.groupSysMsgCache == nil {
|
||||||
|
c.Error("warning: groupSysMsgCache is nil")
|
||||||
|
c.groupSysMsgCache, _ = c.GetGroupSystemMessages()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
joinExists := func(req int64) bool {
|
||||||
|
for _, msg := range c.groupSysMsgCache.JoinRequests {
|
||||||
|
if req == msg.RequestId {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
invExists := func(req int64) bool {
|
||||||
|
for _, msg := range c.groupSysMsgCache.InvitedRequests {
|
||||||
|
if req == msg.RequestId {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
msgs, err := c.GetGroupSystemMessages()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for _, msg := range msgs.JoinRequests {
|
||||||
|
if !joinExists(msg.RequestId) {
|
||||||
|
c.dispatchJoinGroupRequest(msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, msg := range msgs.InvitedRequests {
|
||||||
|
if !invExists(msg.RequestId) {
|
||||||
|
c.dispatchGroupInvitedEvent(msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c.groupSysMsgCache = msgs
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProfileService.Pb.ReqSystemMsgNew.Group
|
||||||
|
func (c *QQClient) buildSystemMsgNewGroupPacket() (uint16, []byte) {
|
||||||
|
seq := c.nextSeq()
|
||||||
|
req := &structmsg.ReqSystemMsgNew{
|
||||||
|
MsgNum: 100,
|
||||||
|
Version: 1000,
|
||||||
|
Checktype: 3,
|
||||||
|
Flag: &structmsg.FlagInfo{
|
||||||
|
GrpMsgKickAdmin: 1,
|
||||||
|
GrpMsgHiddenGrp: 1,
|
||||||
|
GrpMsgWordingDown: 1,
|
||||||
|
GrpMsgGetOfficialAccount: 1,
|
||||||
|
GrpMsgGetPayInGroup: 1,
|
||||||
|
FrdMsgDiscuss2ManyChat: 1,
|
||||||
|
GrpMsgNotAllowJoinGrpInviteNotFrd: 1,
|
||||||
|
FrdMsgNeedWaitingMsg: 1,
|
||||||
|
FrdMsgUint32NeedAllUnreadMsg: 1,
|
||||||
|
GrpMsgNeedAutoAdminWording: 1,
|
||||||
|
GrpMsgGetTransferGroupMsgFlag: 1,
|
||||||
|
GrpMsgGetQuitPayGroupMsgFlag: 1,
|
||||||
|
GrpMsgSupportInviteAutoJoin: 1,
|
||||||
|
GrpMsgMaskInviteAutoJoin: 1,
|
||||||
|
GrpMsgGetDisbandedByAdmin: 1,
|
||||||
|
GrpMsgGetC2CInviteJoinGroup: 1,
|
||||||
|
},
|
||||||
|
FriendMsgTypeFlag: 1,
|
||||||
|
}
|
||||||
|
payload, _ := proto.Marshal(req)
|
||||||
|
packet := packets.BuildUniPacket(c.Uin, seq, "ProfileService.Pb.ReqSystemMsgNew.Group", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload)
|
||||||
|
return seq, packet
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProfileService.Pb.ReqSystemMsgNew.Group
|
||||||
|
func decodeSystemMsgGroupPacket(c *QQClient, _ uint16, payload []byte) (interface{}, error) {
|
||||||
|
rsp := structmsg.RspSystemMsgNew{}
|
||||||
|
if err := proto.Unmarshal(payload, &rsp); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if len(rsp.Groupmsgs) == 0 {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
ret := &GroupSystemMessages{}
|
||||||
|
for _, st := range rsp.Groupmsgs {
|
||||||
|
if st.Msg == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
switch st.Msg.SubType {
|
||||||
|
case 1, 2: // 处理被邀请入群 或 处理成员入群申请
|
||||||
|
switch st.Msg.GroupMsgType {
|
||||||
|
case 1: // 成员申请
|
||||||
|
ret.JoinRequests = append(ret.JoinRequests, &UserJoinGroupRequest{
|
||||||
|
RequestId: st.MsgSeq,
|
||||||
|
Message: st.Msg.MsgAdditional,
|
||||||
|
RequesterUin: st.ReqUin,
|
||||||
|
RequesterNick: st.Msg.ReqUinNick,
|
||||||
|
GroupCode: st.Msg.GroupCode,
|
||||||
|
GroupName: st.Msg.GroupName,
|
||||||
|
Checked: st.Msg.SubType == 2,
|
||||||
|
Actor: st.Msg.ActorUin,
|
||||||
|
client: c,
|
||||||
|
})
|
||||||
|
case 2: // 被邀请
|
||||||
|
ret.InvitedRequests = append(ret.InvitedRequests, &GroupInvitedRequest{
|
||||||
|
RequestId: st.MsgSeq,
|
||||||
|
InvitorUin: st.Msg.ActionUin,
|
||||||
|
InvitorNick: st.Msg.ActionUinNick,
|
||||||
|
GroupCode: st.Msg.GroupCode,
|
||||||
|
GroupName: st.Msg.GroupName,
|
||||||
|
Checked: st.Msg.SubType == 2,
|
||||||
|
Actor: st.Msg.ActorUin,
|
||||||
|
client: c,
|
||||||
|
})
|
||||||
|
default:
|
||||||
|
c.Error("unknown group message type: %v", st.Msg.GroupMsgType)
|
||||||
|
}
|
||||||
|
case 3: // ?
|
||||||
|
case 5: // 自身状态变更(管理员/加群退群)
|
||||||
|
default:
|
||||||
|
c.Error("unknown group msg: %v", st.Msg.SubType)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret, nil
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user