118 lines
3.5 KiB
Go
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{})
|
|
}
|