From fc16fefc88d9194b643bbf5bb5a1a74cc6fe836d Mon Sep 17 00:00:00 2001 From: gim_z66 Date: Mon, 25 Aug 2025 17:26:47 +0800 Subject: [PATCH] =?UTF-8?q?fix(session):=20v4=E4=B8=8B=EF=BC=8C=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E6=96=B0=E5=A2=9EsenderName=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 76073d651a02e61e43ff7f4240241b30158909aa) --- internal/model/session.go | 22 ++++---- internal/model/session_v4.go | 12 ++-- internal/wechatdb/datasource/v4/datasource.go | 55 ++++++++++++++++++- 3 files changed, 73 insertions(+), 16 deletions(-) diff --git a/internal/model/session.go b/internal/model/session.go index 4522581..5594674 100644 --- a/internal/model/session.go +++ b/internal/model/session.go @@ -6,11 +6,12 @@ import ( ) type Session struct { - UserName string `json:"userName"` - NOrder int `json:"nOrder"` - NickName string `json:"nickName"` - Content string `json:"content"` - NTime time.Time `json:"nTime"` + UserName string `json:"userName"` + NOrder int `json:"nOrder"` + NickName string `json:"nickName"` + Content string `json:"content"` + NTime time.Time `json:"nTime"` + SenderName string `json:"senderName"` // 群聊最后一条消息的发送者名称, 非群聊时,此值为空或nil, } // CREATE TABLE Session( @@ -63,11 +64,12 @@ type SessionV3 struct { func (s *SessionV3) Wrap() *Session { return &Session{ - UserName: s.StrUsrName, - NOrder: s.NOrder, - NickName: s.StrNickName, - Content: s.StrContent, - NTime: time.Unix(int64(s.NTime), 0), + UserName: s.StrUsrName, + NOrder: s.NOrder, + NickName: s.StrNickName, + Content: s.StrContent, + NTime: time.Unix(int64(s.NTime), 0), + SenderName: s.StrNickName, } } diff --git a/internal/model/session_v4.go b/internal/model/session_v4.go index c4eb5b8..b7e4928 100644 --- a/internal/model/session_v4.go +++ b/internal/model/session_v4.go @@ -28,6 +28,7 @@ type SessionV4 struct { LastTimestamp int `json:"last_timestamp"` LastMsgSender string `json:"last_msg_sender"` LastSenderDisplayName string `json:"last_sender_display_name"` + NickName string `json:"nickname"` // Type int `json:"type"` // UnreadCount int `json:"unread_count"` @@ -45,10 +46,11 @@ type SessionV4 struct { func (s *SessionV4) Wrap() *Session { return &Session{ - UserName: s.Username, - NOrder: s.LastTimestamp, - NickName: s.LastSenderDisplayName, - Content: s.Summary, - NTime: time.Unix(int64(s.LastTimestamp), 0), + UserName: s.Username, + NOrder: s.LastTimestamp, + NickName: s.LastSenderDisplayName, + Content: s.Summary, + NTime: time.Unix(int64(s.LastTimestamp), 0), + SenderName: s.LastSenderDisplayName, } } diff --git a/internal/wechatdb/datasource/v4/datasource.go b/internal/wechatdb/datasource/v4/datasource.go index 5b86b9a..d200bab 100644 --- a/internal/wechatdb/datasource/v4/datasource.go +++ b/internal/wechatdb/datasource/v4/datasource.go @@ -363,6 +363,39 @@ func (ds *DataSource) GetMessages(ctx context.Context, startTime, endTime time.T return filteredMessages, nil } +func (ds *DataSource) findContactsByUserNames(ctx context.Context, usernames []string) (map[string]*model.Contact, error) { + query := fmt.Sprintf( + "SELECT username, local_type, alias, remark, nick_name FROM contact WHERE username in ('%s')", + strings.Join(usernames, "', '"), + ) + db, err := ds.dbm.GetDB(Contact) + if err != nil { + return nil, err + } + rows, err := db.QueryContext(ctx, query) + if err != nil { + return nil, errors.QueryFailed(query, err) + } + defer rows.Close() + + ret := make(map[string]*model.Contact) + for rows.Next() { + var contactV4 model.ContactV4 + err := rows.Scan( + &contactV4.UserName, + &contactV4.LocalType, + &contactV4.Alias, + &contactV4.Remark, + &contactV4.NickName, + ) + if err != nil { + return nil, errors.ScanRowFailed(err) + } + ret[contactV4.UserName] = contactV4.Wrap() + } + return ret, nil +} + // 联系人 func (ds *DataSource) GetContacts(ctx context.Context, key string, limit, offset int) ([]*model.Contact, error) { var query string @@ -578,6 +611,8 @@ func (ds *DataSource) GetSessions(ctx context.Context, key string, limit, offset defer rows.Close() sessions := []*model.Session{} + usernames := make([]string, 0) + for rows.Next() { var sessionV4 model.SessionV4 err := rows.Scan( @@ -591,8 +626,26 @@ func (ds *DataSource) GetSessions(ctx context.Context, key string, limit, offset if err != nil { return nil, errors.ScanRowFailed(err) } + session := sessionV4.Wrap() + sessions = append(sessions, session) + usernames = append(usernames, session.UserName) + } + + // 发现一些v4下last_sender_display_name可能为空, + if len(usernames) > 0 && len(sessions) > 0 { + contact_map, _ := ds.findContactsByUserNames(ctx, usernames) + for _, session := range sessions { + contact := contact_map[session.UserName] + if contact == nil { + continue + } + if contact.Remark != "" { + session.NickName = contact.Remark + } else { + session.NickName = contact.NickName + } + } - sessions = append(sessions, sessionV4.Wrap()) } return sessions, nil