1
0
mirror of https://github.com/Mrs4s/MiraiGo.git synced 2025-05-04 19:17:38 +08:00
MiraiGo/client/system_msg.go

256 lines
7.2 KiB
Go

package client
import (
"github.com/Mrs4s/MiraiGo/client/internal/network"
"github.com/Mrs4s/MiraiGo/client/pb/structmsg"
"github.com/Mrs4s/MiraiGo/internal/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_id"`
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_id"`
GroupName string `json:"group_name"`
ActionUinNick string `json:"action_uin_nick"`
ActionUin int64 `json:"action_uin"`
Checked bool `json:"checked"`
Actor int64 `json:"actor"`
Suspicious bool `json:"suspicious"`
client *QQClient
}
)
func (c *QQClient) GetGroupSystemMessages() (*GroupSystemMessages, error) {
i, err := c.sendAndWait(c.buildSystemMsgNewGroupPacket(false))
if err != nil {
return nil, err
}
msg := i.(*GroupSystemMessages)
i, err = c.sendAndWait(c.buildSystemMsgNewGroupPacket(true))
if err != nil {
return nil, err
}
msg.InvitedRequests = append(msg.InvitedRequests, i.(*GroupSystemMessages).InvitedRequests...)
msg.JoinRequests = append(msg.JoinRequests, i.(*GroupSystemMessages).JoinRequests...)
return msg, 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(suspicious bool) (uint16, []byte) {
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,
ReqMsgType: func() int32 {
if suspicious {
return 2
}
return 1
}(),
}
payload, _ := proto.Marshal(req)
return c.uniPacket("ProfileService.Pb.ReqSystemMsgNew.Group", payload)
}
// ProfileService.Pb.ReqSystemMsgAction.Group
func (c *QQClient) buildSystemMsgGroupActionPacket(reqID, requester, group int64, msgType int32, isInvite, accept, block bool, reason string) (uint16, []byte) {
subSrcId := int32(31)
groupMsgType := int32(1)
if isInvite {
subSrcId = 10016
groupMsgType = 2
}
infoType := int32(12)
if accept {
infoType = 11
}
req := &structmsg.ReqSystemMsgAction{
MsgType: msgType,
MsgSeq: reqID,
ReqUin: requester,
SubType: 1,
SrcId: 3,
SubSrcId: subSrcId,
GroupMsgType: groupMsgType,
ActionInfo: &structmsg.SystemMsgActionInfo{
Type: infoType,
GroupCode: group,
Blacklist: block,
Msg: reason,
Sig: EmptyBytes,
},
Language: 1000,
}
payload, _ := proto.Marshal(req)
return c.uniPacket("ProfileService.Pb.ReqSystemMsgAction.Group", payload)
}
// ProfileService.Pb.ReqSystemMsgAction.Friend
func (c *QQClient) buildSystemMsgFriendActionPacket(reqID, requester int64, accept bool) (uint16, []byte) {
infoType := int32(3)
if accept {
infoType = 2
}
req := &structmsg.ReqSystemMsgAction{
MsgType: 1,
MsgSeq: reqID,
ReqUin: requester,
SubType: 1,
SrcId: 6,
SubSrcId: 7,
ActionInfo: &structmsg.SystemMsgActionInfo{
Type: infoType,
Blacklist: false,
AddFrdSNInfo: &structmsg.AddFrdSNInfo{},
},
}
payload, _ := proto.Marshal(req)
return c.uniPacket("ProfileService.Pb.ReqSystemMsgAction.Friend", payload)
}
// ProfileService.Pb.ReqSystemMsgNew.Group
func decodeSystemMsgGroupPacket(c *QQClient, _ *network.IncomingPacketInfo, payload []byte) (interface{}, error) {
rsp := structmsg.RspSystemMsgNew{}
if err := proto.Unmarshal(payload, &rsp); err != nil {
return nil, err
}
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,
Suspicious: len(st.Msg.WarningTips) > 0,
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,
})
case 22: // 群员邀请其他人
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,
Suspicious: len(st.Msg.WarningTips) > 0,
client: c,
ActionUin: st.Msg.ActionUin,
ActionUinNick: st.Msg.ActionUinQqNick,
})
default:
c.Debug("unknown group system message type: %v", st.Msg.GroupMsgType)
}
case 3: // ?
case 5: // 自身状态变更(管理员/加群退群)
default:
c.Debug("unknown group system msg: %v", st.Msg.SubType)
}
}
return ret, nil
}