73 lines
2.0 KiB
Go
73 lines
2.0 KiB
Go
package tasks
|
||
|
||
import (
|
||
"context"
|
||
"gitee.ltd/lxh/wechat-robot/internal/docker"
|
||
"gitee.ltd/lxh/wechat-robot/internal/model"
|
||
"gitee.ltd/lxh/wechat-robot/internal/types"
|
||
"strings"
|
||
"time"
|
||
)
|
||
|
||
// syncMessage
|
||
// @description: 同步指定机器人的消息
|
||
// @param containerHost 机器人接口地址
|
||
// @param robotWxId 机器人微信Id
|
||
// @param robotId 机器人数据Id
|
||
func syncMessage(containerHost, robotWxId string, robotId uint) {
|
||
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
||
defer cancel()
|
||
|
||
messages, isOffline, err := docker.GetWechatMessages(ctx, containerHost, robotWxId)
|
||
if err != nil {
|
||
// 处理错误
|
||
return
|
||
}
|
||
db := model.GetDB()
|
||
if isOffline {
|
||
// 删除定时任务
|
||
DeleteJob(robotId)
|
||
// 修改机器人状态
|
||
db.Model(&model.Robot{}).Where("id = ?", robotId).Update("status", "offline")
|
||
return
|
||
}
|
||
|
||
if len(messages) == 0 {
|
||
// 没有消息,直接返回
|
||
return
|
||
}
|
||
|
||
// 处理消息
|
||
var msg []model.Message
|
||
for _, message := range messages {
|
||
var m model.Message
|
||
m.RobotId = robotId
|
||
m.MsgId = message.NewMsgId
|
||
m.CreateTime = message.CreateTime
|
||
m.CreateAt = time.Unix(int64(message.CreateTime), 0)
|
||
m.Type = message.MsgType
|
||
m.Content = message.Content.String
|
||
m.DisplayFullContent = message.PushContent
|
||
m.FromUser = message.FromUserName.String
|
||
m.ToUser = message.ToWxid.String
|
||
|
||
// 如果是群聊消息,单独处理一下
|
||
// Sys类型的消息正文不包含微信 Id,所以不需要处理
|
||
if strings.HasSuffix(message.FromUserName.String, "@chatroom") && message.MsgType != types.MsgTypeSys {
|
||
// 群消息,处理一下消息和发信人
|
||
groupUser := strings.Split(m.Content, "\n")[0]
|
||
groupUser = strings.ReplaceAll(groupUser, ":", "")
|
||
// 如果两个id一致,说明是系统发的
|
||
if m.FromUser != groupUser {
|
||
m.GroupUser = groupUser
|
||
}
|
||
// 用户的操作单独提出来处理一下
|
||
m.Content = strings.Join(strings.Split(m.Content, "\n")[1:], "\n")
|
||
}
|
||
|
||
msg = append(msg, m)
|
||
}
|
||
// 保存入库
|
||
db.Save(&msg)
|
||
}
|