package logic import ( "context" "git.cialloo.com/CiallooWeb/ServerStatistics/app/internal/svc" "git.cialloo.com/CiallooWeb/ServerStatistics/app/internal/types" "github.com/zeromicro/go-zero/core/logx" ) type RecentChatMessageLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } // Get recent chat messages within a specified time range func NewRecentChatMessageLogic(ctx context.Context, svcCtx *svc.ServiceContext) *RecentChatMessageLogic { return &RecentChatMessageLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *RecentChatMessageLogic) RecentChatMessage(req *types.RecentChatMessageReq) (resp *types.RecentChatMessageResp, err error) { query := ` SELECT steamid64, player_name, message, EXTRACT(EPOCH FROM message_time)::BIGINT * 1000 as timestamp, server_name, mapname, server_ip, server_port FROM steam_union.chat_log WHERE message_time >= TO_TIMESTAMP($1 / 1000.0) AND message_time <= TO_TIMESTAMP($2 / 1000.0) ORDER BY message_time DESC LIMIT $3 ` rows, err := l.svcCtx.DB.QueryContext(l.ctx, query, req.TimeRangeStart, req.TimeRangeEnd, req.Limit) if err != nil { l.Errorf("Failed to query recent chat messages: %v", err) return nil, err } defer rows.Close() var messages []types.RecentChatMessageRespMessage for rows.Next() { var msg types.RecentChatMessageRespMessage if err := rows.Scan(&msg.SteamID64, &msg.UserName, &msg.Message, &msg.TimeStamp, &msg.ServerName, &msg.MapName, &msg.ServerIP, &msg.ServerPort); err != nil { l.Errorf("Failed to scan chat message: %v", err) continue } messages = append(messages, msg) } return &types.RecentChatMessageResp{ Messages: messages, }, nil }