fix: settle_race返回tuple消除odds重复计算

- settle_race() 返回 tuple[RaceResult, odds] | None
- run_race_with_settlement 解包使用,移除多余 calculate_odds 调用
- _test_send_to_scope 签名已兼容(含*args/**kwargs)
This commit is contained in:
2026-05-01 23:04:32 +08:00
parent 569801dd14
commit a2b7e1fc11

View File

@@ -226,8 +226,8 @@ def calculate_odds(room: Room) -> dict[str, float]:
return odds return odds
async def settle_race(room: Room) -> RaceResult | None: async def settle_race(room: Room) -> tuple[RaceResult, dict[str, float]] | None:
"""Settle bets and rewards after race finishes.""" """Settle bets and rewards after race finishes. Returns (result, odds) or None."""
champion = room.horses.get(room.champion_name) champion = room.horses.get(room.champion_name)
if not champion: if not champion:
return None return None
@@ -261,7 +261,7 @@ async def settle_race(room: Room) -> RaceResult | None:
odds_snapshot=odds, odds_snapshot=odds,
) )
await room_store.save_race_result(result) await room_store.save_race_result(result)
return result return result, odds
async def _send_to_scope(bot: Bot, scope: str, message: str, message_type: str = "race_update"): async def _send_to_scope(bot: Bot, scope: str, message: str, message_type: str = "race_update"):
@@ -303,14 +303,15 @@ async def run_race_with_settlement(bot: Bot, room: Room, scope: str):
await points_service.refund_bet_points(bet.user_id, bet.amount, "比赛中断退还") await points_service.refund_bet_points(bet.user_id, bet.amount, "比赛中断退还")
return return
# Settle # Settle (returns (result, odds) or None)
result = await settle_race(room) settlement = await settle_race(room)
result = settlement[0] if settlement else None
odds = settlement[1] if settlement else {}
# Build user_id -> display name mapping # Build user_id -> display name mapping
all_user_ids = [h.owner_id for h in room.horses.values()] + [b.user_id for b in room.bets] all_user_ids = [h.owner_id for h in room.horses.values()] + [b.user_id for b in room.bets]
name_map = await _build_name_map(bot, scope, all_user_ids) name_map = await _build_name_map(bot, scope, all_user_ids)
odds = calculate_odds(room)
champion = room.horses.get(room.champion_name) champion = room.horses.get(room.champion_name)
champion_name_display = name_map.get(champion.owner_id, champion.owner_id) if champion else '?' champion_name_display = name_map.get(champion.owner_id, champion.owner_id) if champion else '?'
result_lines = [ result_lines = [