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 RecentJoinPlayerLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } // Get recent players who joined within a specified time range func NewRecentJoinPlayerLogic(ctx context.Context, svcCtx *svc.ServiceContext) *RecentJoinPlayerLogic { return &RecentJoinPlayerLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *RecentJoinPlayerLogic) RecentJoinPlayer(req *types.RecentJoinPlayerReq) (resp *types.RecentJoinPlayerResp, err error) { query := ` SELECT c.steamid64, EXTRACT(EPOCH FROM c.log_time)::BIGINT * 1000 as join_time, c.player_name as username, COALESCE(s.playtime, 0) as playtime FROM steam_union.connection_log c LEFT JOIN steam_union.steam_user s ON c.steamid64 = s.steamid64 WHERE c.connection_type = 1 AND c.log_time >= TO_TIMESTAMP($1 / 1000.0) AND c.log_time <= TO_TIMESTAMP($2 / 1000.0) AND c.steamid64 > 1 ORDER BY c.log_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 join players: %v", err) return nil, err } defer rows.Close() var players []types.RecentJoinPlayerRespPlayer for rows.Next() { var player types.RecentJoinPlayerRespPlayer if err := rows.Scan(&player.SteamID64, &player.JoinTime, &player.UserName, &player.PlayTime); err != nil { l.Errorf("Failed to scan join player: %v", err) continue } players = append(players, player) } return &types.RecentJoinPlayerResp{ Players: players, }, nil }