112 lines
3.0 KiB
Go
112 lines
3.0 KiB
Go
package repository
|
||
|
||
import (
|
||
"context"
|
||
"strings"
|
||
"time"
|
||
|
||
"github.com/sjzar/chatlog/internal/model"
|
||
"github.com/sjzar/chatlog/pkg/util"
|
||
|
||
"github.com/rs/zerolog/log"
|
||
)
|
||
|
||
// GetMessages 实现 Repository 接口的 GetMessages 方法
|
||
func (r *Repository) GetMessages(ctx context.Context, startTime, endTime time.Time, talker string, sender string, keyword string, limit, offset int) ([]*model.Message, error) {
|
||
|
||
talker, sender = r.parseTalkerAndSender(ctx, talker, sender)
|
||
messages, err := r.ds.GetMessages(ctx, startTime, endTime, talker, sender, keyword, limit, offset)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
// 补充消息信息
|
||
if err := r.EnrichMessages(ctx, messages); err != nil {
|
||
log.Debug().Msgf("EnrichMessages failed: %v", err)
|
||
}
|
||
|
||
return messages, nil
|
||
}
|
||
|
||
// EnrichMessages 补充消息的额外信息
|
||
func (r *Repository) EnrichMessages(ctx context.Context, messages []*model.Message) error {
|
||
for _, msg := range messages {
|
||
r.enrichMessage(msg)
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// enrichMessage 补充单条消息的额外信息
|
||
func (r *Repository) enrichMessage(msg *model.Message) {
|
||
// 处理群聊消息
|
||
if msg.IsChatRoom {
|
||
// 补充群聊名称
|
||
if chatRoom, ok := r.chatRoomCache[msg.Talker]; ok {
|
||
msg.TalkerName = chatRoom.DisplayName()
|
||
|
||
// 补充发送者在群里的显示名称
|
||
if displayName, ok := chatRoom.User2DisplayName[msg.Sender]; ok {
|
||
msg.SenderName = displayName
|
||
}
|
||
}
|
||
}
|
||
|
||
// 如果不是自己发送的消息且还没有显示名称,尝试补充发送者信息
|
||
if msg.SenderName == "" && !msg.IsSelf {
|
||
contact := r.getFullContact(msg.Sender)
|
||
if contact != nil {
|
||
msg.SenderName = contact.DisplayName()
|
||
}
|
||
}
|
||
}
|
||
|
||
func (r *Repository) parseTalkerAndSender(ctx context.Context, talker, sender string) (string, string) {
|
||
displayName2User := make(map[string]string)
|
||
users := make(map[string]bool)
|
||
|
||
talkers := util.Str2List(talker, ",")
|
||
if len(talkers) > 0 {
|
||
for i := 0; i < len(talkers); i++ {
|
||
if contact, _ := r.GetContact(ctx, talkers[i]); contact != nil {
|
||
talkers[i] = contact.UserName
|
||
} else if chatRoom, _ := r.GetChatRoom(ctx, talker); chatRoom != nil {
|
||
talkers[i] = chatRoom.Name
|
||
}
|
||
}
|
||
// 获取群聊的用户列表
|
||
for i := 0; i < len(talkers); i++ {
|
||
if chatRoom, _ := r.GetChatRoom(ctx, talkers[i]); chatRoom != nil {
|
||
for user, displayName := range chatRoom.User2DisplayName {
|
||
displayName2User[displayName] = user
|
||
}
|
||
for _, user := range chatRoom.Users {
|
||
users[user.UserName] = true
|
||
}
|
||
}
|
||
}
|
||
talker = strings.Join(talkers, ",")
|
||
}
|
||
|
||
senders := util.Str2List(sender, ",")
|
||
if len(senders) > 0 {
|
||
for i := 0; i < len(senders); i++ {
|
||
if user, ok := displayName2User[senders[i]]; ok {
|
||
senders[i] = user
|
||
} else {
|
||
// FIXME 大量群聊用户名称重复,无法直接通过 GetContact 获取 ID,后续再优化
|
||
for user := range users {
|
||
if contact := r.getFullContact(user); contact != nil {
|
||
if contact.DisplayName() == senders[i] {
|
||
senders[i] = user
|
||
break
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
sender = strings.Join(senders, ",")
|
||
}
|
||
|
||
return talker, sender
|
||
}
|