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) }