mirror of
https://github.com/Mrs4s/MiraiGo.git
synced 2025-05-04 11:07:40 +08:00
191 lines
4.7 KiB
Go
191 lines
4.7 KiB
Go
package client
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
"strconv"
|
||
"strings"
|
||
|
||
"github.com/Mrs4s/MiraiGo/utils"
|
||
|
||
"github.com/Mrs4s/MiraiGo/client/pb/notify"
|
||
)
|
||
|
||
type (
|
||
// GroupPokeNotifyEvent 群内戳一戳提示事件
|
||
GroupPokeNotifyEvent struct {
|
||
GroupCode int64
|
||
Sender int64
|
||
Receiver int64
|
||
}
|
||
|
||
// GroupRedBagLuckyKingNotifyEvent 群内抢红包运气王提示事件
|
||
GroupRedBagLuckyKingNotifyEvent struct {
|
||
GroupCode int64
|
||
Sender int64
|
||
LuckyKing int64
|
||
}
|
||
|
||
// MemberHonorChangedNotifyEvent 群成员荣誉变更提示事件
|
||
MemberHonorChangedNotifyEvent struct {
|
||
GroupCode int64
|
||
Honor HonorType
|
||
Uin int64
|
||
Nick string
|
||
}
|
||
|
||
// MemberSpecialTitleUpdatedEvent 群成员头衔更新事件
|
||
MemberSpecialTitleUpdatedEvent struct {
|
||
GroupCode int64
|
||
Uin int64
|
||
NewTitle string
|
||
}
|
||
|
||
// FriendPokeNotifyEvent 好友戳一戳提示事件
|
||
FriendPokeNotifyEvent struct {
|
||
Sender int64
|
||
Receiver int64
|
||
}
|
||
)
|
||
|
||
// grayTipProcessor 提取出来专门用于处理群内 notify tips
|
||
func (c *QQClient) grayTipProcessor(groupCode int64, tipInfo *notify.GeneralGrayTipInfo) {
|
||
if tipInfo.BusiType == 12 && tipInfo.BusiId == 1061 {
|
||
sender := int64(0)
|
||
receiver := c.Uin
|
||
for _, templ := range tipInfo.MsgTemplParam {
|
||
if templ.Name == "uin_str1" {
|
||
sender, _ = strconv.ParseInt(templ.Value, 10, 64)
|
||
}
|
||
if templ.Name == "uin_str2" {
|
||
receiver, _ = strconv.ParseInt(templ.Value, 10, 64)
|
||
}
|
||
}
|
||
if sender != 0 {
|
||
c.dispatchGroupNotifyEvent(&GroupPokeNotifyEvent{
|
||
GroupCode: groupCode,
|
||
Sender: sender,
|
||
Receiver: receiver,
|
||
})
|
||
}
|
||
}
|
||
switch tipInfo.TemplId {
|
||
case 1052, 1053, 1054, 1067: // 群荣誉
|
||
var nick string
|
||
var uin int64
|
||
for _, templ := range tipInfo.MsgTemplParam {
|
||
if templ.Name == "nick" {
|
||
nick = templ.Value
|
||
}
|
||
if templ.Name == "uin" {
|
||
uin, _ = strconv.ParseInt(templ.Value, 10, 64)
|
||
}
|
||
}
|
||
c.dispatchGroupNotifyEvent(&MemberHonorChangedNotifyEvent{
|
||
GroupCode: groupCode,
|
||
Honor: func() HonorType {
|
||
switch tipInfo.TemplId {
|
||
case 1052:
|
||
return Performer
|
||
case 1053, 1054:
|
||
return Talkative
|
||
case 1067:
|
||
return Emotion
|
||
default:
|
||
return 0
|
||
}
|
||
}(),
|
||
Uin: uin,
|
||
Nick: nick,
|
||
})
|
||
}
|
||
}
|
||
|
||
// msgGrayTipProcessor 用于处理群内 aio notify tips
|
||
func (c *QQClient) msgGrayTipProcessor(groupCode int64, tipInfo *notify.AIOGrayTipsInfo) {
|
||
if len(tipInfo.Content) == 0 {
|
||
return
|
||
}
|
||
type tipCommand struct {
|
||
Command int `json:"cmd"`
|
||
Data string `json:"data"`
|
||
Text string `json:"text"`
|
||
}
|
||
content := utils.B2S(tipInfo.Content)
|
||
var tipCmds []*tipCommand
|
||
start := -1
|
||
for i := 0; i < len(content); i++ {
|
||
if content[i] == '<' && len(content) > i+1 && content[i+1] == '{' {
|
||
start = i + 1
|
||
}
|
||
if content[i] == '>' && content[i-1] == '}' && start != -1 {
|
||
tip := &tipCommand{}
|
||
if err := json.Unmarshal(utils.S2B(content[start:i]), tip); err == nil {
|
||
tipCmds = append(tipCmds, tip)
|
||
}
|
||
start = -1
|
||
}
|
||
}
|
||
// 好像只能这么判断
|
||
switch {
|
||
case strings.Contains(content, "头衔"):
|
||
event := &MemberSpecialTitleUpdatedEvent{GroupCode: groupCode}
|
||
for _, cmd := range tipCmds {
|
||
if cmd.Command == 5 {
|
||
event.Uin, _ = strconv.ParseInt(cmd.Data, 10, 64)
|
||
}
|
||
if cmd.Command == 1 {
|
||
event.NewTitle = cmd.Text
|
||
}
|
||
}
|
||
if event.Uin == 0 {
|
||
c.Error("process special title updated tips error: missing cmd")
|
||
return
|
||
}
|
||
if mem := c.FindGroup(groupCode).FindMember(event.Uin); mem != nil {
|
||
mem.SpecialTitle = event.NewTitle
|
||
}
|
||
c.dispatchMemberSpecialTitleUpdateEvent(event)
|
||
}
|
||
}
|
||
|
||
func (e *GroupPokeNotifyEvent) From() int64 {
|
||
return e.GroupCode
|
||
}
|
||
|
||
func (e *GroupPokeNotifyEvent) Content() string {
|
||
return fmt.Sprintf("%d戳了戳%d", e.Sender, e.Receiver)
|
||
}
|
||
|
||
func (e *FriendPokeNotifyEvent) From() int64 {
|
||
return e.Sender
|
||
}
|
||
|
||
func (e *FriendPokeNotifyEvent) Content() string {
|
||
return fmt.Sprintf("%d戳了戳%d", e.Sender, e.Receiver)
|
||
}
|
||
|
||
func (e *GroupRedBagLuckyKingNotifyEvent) From() int64 {
|
||
return e.GroupCode
|
||
}
|
||
|
||
func (e *GroupRedBagLuckyKingNotifyEvent) Content() string {
|
||
return fmt.Sprintf("%d发的红包被领完, %d是运气王", e.Sender, e.LuckyKing)
|
||
}
|
||
|
||
func (e *MemberHonorChangedNotifyEvent) From() int64 {
|
||
return e.GroupCode
|
||
}
|
||
|
||
func (e *MemberHonorChangedNotifyEvent) Content() string {
|
||
switch e.Honor {
|
||
case Talkative:
|
||
return fmt.Sprintf("昨日 %s(%d) 在群 %d 内发言最积极, 获得 龙王 标识。", e.Nick, e.Uin, e.GroupCode)
|
||
case Performer:
|
||
return fmt.Sprintf("%s(%d) 在群 %d 里连续发消息超过7天, 获得 群聊之火 标识。", e.Nick, e.Uin, e.GroupCode)
|
||
case Emotion:
|
||
return fmt.Sprintf("%s(%d) 在群聊 %d 中连续发表情包超过3天,且累计数量超过20条,获得 快乐源泉 标识。", e.Nick, e.Uin, e.GroupCode)
|
||
}
|
||
return "ERROR"
|
||
}
|