package tasks import ( "gitee.ltd/lxh/wechat-robot/internal/model" "gitee.ltd/lxh/wechat-robot/internal/types" messageHandler "gitee.ltd/lxh/wechat-robot/pkg/message" "gitee.ltd/wechat-client/xybot" "strings" "time" ) // syncMessage // @description: 同步指定机器人的消息 // @param containerHost 机器人接口地址 // @param robotWxId 机器人微信Id // @param robotId 机器人数据Id func syncMessage(client *xybot.Client, robotId uint) { // 获取数据库连接 db := model.GetDB() // 获取新消息 messages, err := client.Message.Sync() if err != nil { // 手动处理一下是否离线了 isOffline := strings.Contains(err.Error(), "用户可能退出") || strings.Contains(err.Error(), "数据[DecryptData]失败") if isOffline { // 删除定时任务 DeleteJob(robotId) // 修改机器人状态 db.Model(&model.Robot{}).Where("id = ?", robotId).Update("status", "offline") } return } if len(messages) == 0 { // 没有消息,直接返回 return } //log.Debugf("当前同步机器人Id: %d,消息数量: %d,客户端信息: %+v", robotId, len(messages), client) // 处理消息 //var msg []model.Message for _, message := range messages { //log.Debugf("当前同步机器人Id: %d,消息内容: %s", robotId, message.Content.String) var m model.Message m.RobotId = robotId m.MsgId = message.NewMsgId m.ClientMsgId = message.MsgId m.CreateTime = message.CreateTime m.CreateAt = time.Unix(int64(message.CreateTime), 0) m.Type = types.MessageType(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") && m.Type != 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(&m) // 异步处理消息 go messageHandler.Handler(&m, client) } // 保存入库 //db.Save(&msg) }