review: fix critical/medium bugs in 4 plugins (round 2)
group_horse_racing: - settle_race: rewrite with 7 bug fixes (race condition, draw double-credit, empty participants, etc.) - models.py: reorder fields for correct defaults, add indexes - message_service: add logger import danding_points: - api.py: add finally blocks to 3 methods (add_points, get_history, get_leaderboard) - database.py: add finally block to get_user_balance chatai: - __init__.py: deprecated API→asyncio.to_thread, deduplicate logging, taskkill filter for safety - screenshot.py: XSS protection with bleach on HTML content - requirements.txt: add bleach dependency danding_qqpush: - api.py L13: fix self-referencing _renderer NameError crash - api.py: lazy singleton pattern via _get_renderer() instead of per-request ImageRenderer - __init__.py: mask Token in log output (security) All 34 tests pass.
This commit is contained in:
@@ -1,59 +1,59 @@
|
||||
from dataclasses import dataclass, field
|
||||
from enum import Enum
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
|
||||
class RoomState(str, Enum):
|
||||
WAITING = "waiting"
|
||||
RUNNING = "running"
|
||||
FINISHED = "finished"
|
||||
INTERRUPTED = "interrupted"
|
||||
|
||||
|
||||
class HorseState(str, Enum):
|
||||
READY = "ready"
|
||||
RACING = "racing"
|
||||
FINISHED = "finished"
|
||||
|
||||
|
||||
@dataclass
|
||||
class Horse:
|
||||
owner_id: str
|
||||
name: str
|
||||
index: int = 0
|
||||
position: float = 0.0
|
||||
state: HorseState = HorseState.READY
|
||||
|
||||
|
||||
@dataclass
|
||||
class Bet:
|
||||
user_id: str
|
||||
horse_name: str
|
||||
amount: int
|
||||
|
||||
|
||||
@dataclass
|
||||
class Room:
|
||||
scope: str
|
||||
state: RoomState = RoomState.WAITING
|
||||
created_at: datetime = field(default_factory=datetime.now)
|
||||
horses: dict[str, Horse] = field(default_factory=dict)
|
||||
bets: list[Bet] = field(default_factory=list)
|
||||
champion_name: Optional[str] = None
|
||||
tick_count: int = 0
|
||||
next_horse_index: int = 1
|
||||
|
||||
|
||||
@dataclass
|
||||
class RaceResult:
|
||||
race_id: str
|
||||
scope: str
|
||||
champion_name: str
|
||||
champion_owner: str
|
||||
participants: list[str]
|
||||
bet_distribution: dict[str, int]
|
||||
duration_ticks: int
|
||||
completed_at: datetime
|
||||
point_changes: dict[str, int] = field(default_factory=dict)
|
||||
point_change_summaries: dict[str, str] = field(default_factory=dict)
|
||||
from dataclasses import dataclass, field
|
||||
from enum import Enum
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
|
||||
class RoomState(str, Enum):
|
||||
WAITING = "waiting"
|
||||
RUNNING = "running"
|
||||
FINISHED = "finished"
|
||||
INTERRUPTED = "interrupted"
|
||||
|
||||
|
||||
class HorseState(str, Enum):
|
||||
READY = "ready"
|
||||
RACING = "racing"
|
||||
FINISHED = "finished"
|
||||
|
||||
|
||||
@dataclass
|
||||
class Horse:
|
||||
owner_id: str
|
||||
name: str
|
||||
index: int = 0
|
||||
position: float = 0.0
|
||||
state: HorseState = HorseState.READY
|
||||
|
||||
|
||||
@dataclass
|
||||
class Bet:
|
||||
user_id: str
|
||||
horse_name: str
|
||||
amount: int
|
||||
|
||||
|
||||
@dataclass
|
||||
class Room:
|
||||
scope: str
|
||||
state: RoomState = RoomState.WAITING
|
||||
created_at: datetime = field(default_factory=datetime.now)
|
||||
horses: dict[str, Horse] = field(default_factory=dict)
|
||||
bets: list[Bet] = field(default_factory=list)
|
||||
champion_name: Optional[str] = None
|
||||
tick_count: int = 0
|
||||
next_horse_index: int = 1
|
||||
|
||||
|
||||
@dataclass
|
||||
class RaceResult:
|
||||
champion_name: str
|
||||
champion_owner: str
|
||||
point_changes: dict[str, int] = field(default_factory=dict)
|
||||
point_change_summaries: dict[str, str] = field(default_factory=dict)
|
||||
race_id: str = ""
|
||||
scope: str = ""
|
||||
participants: list[str] = field(default_factory=list)
|
||||
bet_distribution: dict[str, int] = field(default_factory=dict)
|
||||
duration_ticks: int = 0
|
||||
completed_at: datetime = field(default_factory=datetime.now)
|
||||
|
||||
Reference in New Issue
Block a user