李寻欢 33b53869bd
All checks were successful
BuildImage / build-image (push) Successful in 7m28s
:refactor: 更新依赖路径,将xybot模块更改为wechat-client/xybot
2025-04-30 15:40:19 +08:00

118 lines
3.5 KiB
Go

package tasks
import (
"gitee.ltd/lxh/wechat-robot/internal/model"
"gitee.ltd/wechat-client/xybot"
"gitee.ltd/wechat-client/xybot/friend"
"github.com/gofiber/fiber/v2/log"
"slices"
"strings"
)
// syncContact
// @description: 同步联系人
// @param containerHost 容器接口地址
// @param robotWxId 机器人微信号
// @param robotId 机器人ID
func syncContact(containerHost, robotWxId string, robotId uint) {
robotCli, err := xybot.NewClient(robotWxId, containerHost, false)
if err != nil {
log.Errorf("创建微信客户端失败: %v", err)
}
// 先获取全部id
ids, err := robotCli.Friend.GetContractList(true)
if err != nil {
// 处理错误
log.Errorf("[%s]获取联系人列表失败: %v", robotWxId, err)
return
}
// 将ids拆分成二十个一个的数组之后再获取详情
var contacts = make([]friend.ContactListItem, 0)
chunker := slices.Chunk(ids, 20)
processChunk := func(chunk []string) bool {
// 获取昵称等详细信息
var c = make([]friend.ContactListItem, 0)
c, err = robotCli.Friend.GetContractDetail(chunk)
if err != nil {
// 处理错误
log.Errorf("[%s]获取联系人详情失败: %v", robotWxId, err)
return false
}
contacts = append(contacts, c...)
return true
}
chunker(processChunk)
// 循环联系人信息,打印一下
db := model.GetDB()
nowIds := make([]string, 0)
for _, contact := range contacts {
//log.Infof("[%s]联系人信息: %+v", robotWxId, contact)
if strings.TrimSpace(contact.UserName.String) == "" {
// 微信号为空,跳过
continue
}
nowIds = append(nowIds, contact.UserName.String)
// 判断数据库是否存在当前数据,不存在就新建,存在就更新
var existId uint
db.Model(&model.Contact{}).Where("robot_id = ?", robotId).Where("wechat_id = ?", contact.UserName.String).Pluck("id", &existId)
if existId > 0 {
// 存在,修改
pm := map[string]any{
"alias": contact.Alias,
"nickname": contact.NickName.String,
"avatar": contact.BigHeadImgUrl,
"pyinitial": contact.Pyinitial.String,
"quan_pin": contact.QuanPin.String,
"sex": contact.Sex,
"country": contact.Country,
"province": contact.Province,
"city": contact.City,
"signature": contact.Signature,
"sns_background": contact.SnsUserInfo.SnsBgImgId,
}
if contact.BigHeadImgUrl == "" {
pm["avatar"] = contact.SmallHeadImgUrl
}
err = db.Model(&model.Contact{}).Where("id = ?", existId).Updates(pm).Error
} else {
// 组装联系人信息,然后存入数据库
var c model.Contact
c.RobotID = robotId
c.WechatID = contact.UserName.String
c.Alias = contact.Alias
c.Nickname = contact.NickName.String
c.Avatar = contact.BigHeadImgUrl
if contact.BigHeadImgUrl == "" {
c.Avatar = contact.SmallHeadImgUrl
}
c.Type = "friend"
if strings.HasSuffix(contact.UserName.String, "@chatroom") {
// 群聊
c.Type = "group"
}
c.Pyinitial = contact.Pyinitial.String
c.QuanPin = contact.QuanPin.String
c.Sex = contact.Sex
c.Country = contact.Country
c.Province = contact.Province
c.City = contact.City
c.Signature = contact.Signature
c.SnsBackground = contact.SnsUserInfo.SnsBgImgId
err = db.Create(&c).Error
}
if err != nil {
log.Debugf("[%s]保存联系人失败: %v", robotWxId, err)
}
}
// 清理掉不存在的联系人
db.Model(&model.Contact{}).Where("robot_id = ?", robotId).Where("wechat_id NOT IN ?", nowIds).Delete(&model.Contact{})
}