AI 예측 - 생성 시점을 킥오프 22시간 전으로 변경(선발투수 예고 이후), 잡 매시간 실행 - 경기 시작 후 생성 금지(사후 예측 방지), 경기 단위 커밋으로 중단 시 진행분 보존 일정·라이브 UI - 야구 일정에 순위 탭 추가 (KBO 단일 순위표 · MLB 6개 디비전, /api/standings 신설) - 경기중 카드에 현재 이닝·실시간 스코어 표시 (30s 폴링, 서버 15s 캐시) - MLB 선발 누락 수정: statsapi 날짜 파라미터 미국 날짜 기준 보정(-1일) - 라이브 대기타석 스크롤바 다크 테마 처리 운영 견고성 - 우천취소: 경기 삭제 → cancelled 상태 보존 (투표·예측 기록 유지, 정산/투표/AI 제외) - 더블헤더: 시작시각순 seq로 1·2차전 분리 등록 (match_id _2, 정산·라이브·프리뷰 매핑) - 축구 데이터 수집을 wc 리그로 한정 (야구 팀을 축구 API에 검색하던 쿼터 낭비 수정) 점수제 - 야구 판정 완화: 근접=득실차 ±1, 부분=한 팀 득점 ±1 (등급·배점은 리그 공통 유지) - 채점 판정을 _grade_of() 단일 함수로 통합, 종료된 야구 경기 재채점 - 배점 안내 모달 야구 문구 분리, docs/SCORING.md 갱신 기타 - 야구 전용 댓글 닉네임 풀 (종목별 세션 캐시 분리) - 리더보드 리그별 조회 연동 (?league=)
49 lines
1.7 KiB
Python
49 lines
1.7 KiB
Python
"""채점 서비스 — 결과 입력 시 해당 경기 유저 픽 전수 채점 + 유저별 누적.
|
|
|
|
관리자 setResult 와 워커가 공용으로 사용. scoring.grade_prediction 적용
|
|
(scoring.json 배점) 후 services.points 로 user_points 누적 갱신.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
|
|
from sqlalchemy import select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from ..domain import now_utc
|
|
from ..models import Match, UserPrediction
|
|
from ..scoring import grade_prediction, outcome_of
|
|
from .points import accumulate_user_points
|
|
|
|
log = logging.getLogger("triplepick.grading")
|
|
|
|
|
|
async def apply_result(db: AsyncSession, match: Match, score_a: int, score_b: int) -> int:
|
|
"""결과 기록 + 해당 경기 픽 전수 채점 + 유저별 포인트 누적. 채점된 픽 수 반환."""
|
|
match.result_score_a = score_a
|
|
match.result_score_b = score_b
|
|
match.result_outcome = outcome_of(score_a, score_b)
|
|
match.status = "finished"
|
|
match.finished_at = now_utc()
|
|
|
|
picks = (
|
|
await db.execute(
|
|
select(UserPrediction).where(UserPrediction.match_id == match.match_id)
|
|
)
|
|
).scalars().all()
|
|
|
|
baseball = match.league in ("kbo", "mlb")
|
|
for p in picks:
|
|
key, value = grade_prediction(
|
|
p.score_a, p.score_b, score_a, score_b, baseball=baseball
|
|
)
|
|
p.points = value
|
|
p.scored_at = now_utc()
|
|
|
|
# 채점된 픽의 유저(이메일)별 누적 포인트 갱신 — 같은 트랜잭션
|
|
await accumulate_user_points(db, {p.email for p in picks})
|
|
|
|
await db.commit()
|
|
log.info("graded %d picks for %s (%d-%d)", len(picks), match.match_id, score_a, score_b)
|
|
return len(picks)
|