package logic import ( "context" "fmt" "git.cialloo.com/CiallooWeb/ServerStatistics/app/internal/svc" "git.cialloo.com/CiallooWeb/ServerStatistics/app/internal/types" "github.com/zeromicro/go-zero/core/logx" ) type TotalKillCountLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } // Get total kill count within a specified time range func NewTotalKillCountLogic(ctx context.Context, svcCtx *svc.ServiceContext) *TotalKillCountLogic { return &TotalKillCountLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *TotalKillCountLogic) TotalKillCount(req *types.TotalKillCountReq) (resp *types.TotalKillCountResp, err error) { query := ` SELECT COUNT(*) FROM steam_union.event_player_death_log WHERE event_player_death_time >= TO_TIMESTAMP($1 / 1000.0) AND event_player_death_time <= TO_TIMESTAMP($2 / 1000.0) AND attacker_steamid64 > 1 ` args := []interface{}{req.TimeRangeStart, req.TimeRangeEnd} argIndex := 3 // Add headshot filter if requested if req.HeadshotOnly { query += ` AND headshot = true` } // Add weapon filter if provided if len(req.WeaponFilter) > 0 { query += fmt.Sprintf(` AND weapon = ANY($%d)`, argIndex) args = append(args, req.WeaponFilter) argIndex++ } // Add player filter if provided if len(req.PlayerFilter) > 0 { // Convert []string to []int64 for steamid64 steamIDs := make([]int64, len(req.PlayerFilter)) for i, id := range req.PlayerFilter { fmt.Sscanf(id, "%d", &steamIDs[i]) } query += fmt.Sprintf(` AND attacker_steamid64 = ANY($%d)`, argIndex) args = append(args, steamIDs) } var count int64 err = l.svcCtx.DB.QueryRowContext(l.ctx, query, args...).Scan(&count) if err != nil { l.Errorf("Failed to query total kill count: %v", err) return nil, err } return &types.TotalKillCountResp{ TotalKillCount: count, }, nil }