Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -8,7 +8,7 @@ import sqlite3
|
|
| 8 |
import json
|
| 9 |
import random
|
| 10 |
import time
|
| 11 |
-
from datetime import datetime
|
| 12 |
from typing import Dict, List, Optional, Tuple
|
| 13 |
from dataclasses import dataclass, asdict
|
| 14 |
from enum import Enum
|
|
@@ -252,39 +252,42 @@ class GameDatabase:
|
|
| 252 |
print(f"🎮 Game started in room {room_id}!")
|
| 253 |
|
| 254 |
def cleanup_old_rooms(self):
|
| 255 |
-
"""Remove empty or stale rooms
|
| 256 |
with self.lock, self.get_connection() as conn:
|
| 257 |
-
|
| 258 |
-
|
| 259 |
-
|
| 260 |
-
|
| 261 |
-
|
| 262 |
-
|
| 263 |
-
|
| 264 |
-
|
| 265 |
-
|
| 266 |
-
# Also find empty rooms (no players after 1 hour)
|
| 267 |
-
empty_cutoff = datetime.now().timestamp() - 3600 # 1 hour ago
|
| 268 |
-
empty_rooms = conn.execute("""
|
| 269 |
-
SELECT r.room_id FROM rooms r
|
| 270 |
-
LEFT JOIN players p ON r.room_id = p.room_id
|
| 271 |
-
WHERE r.status = 'waiting'
|
| 272 |
-
AND p.room_id IS NULL
|
| 273 |
-
AND strftime('%s', r.created_at) < ?
|
| 274 |
-
""", (empty_cutoff,)).fetchall()
|
| 275 |
-
|
| 276 |
-
rooms_to_delete = set(
|
| 277 |
-
[r['room_id'] for r in stale_rooms] +
|
| 278 |
-
[r['room_id'] for r in empty_rooms]
|
| 279 |
)
|
| 280 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 281 |
for room_id in rooms_to_delete:
|
| 282 |
-
|
| 283 |
conn.execute("DELETE FROM players WHERE room_id = ?", (room_id,))
|
| 284 |
conn.execute("DELETE FROM spectators WHERE room_id = ?", (room_id,))
|
| 285 |
-
|
| 286 |
-
|
| 287 |
-
|
| 288 |
conn.commit()
|
| 289 |
return len(rooms_to_delete)
|
| 290 |
|
|
|
|
| 8 |
import json
|
| 9 |
import random
|
| 10 |
import time
|
| 11 |
+
from datetime import datetime, timedelta
|
| 12 |
from typing import Dict, List, Optional, Tuple
|
| 13 |
from dataclasses import dataclass, asdict
|
| 14 |
from enum import Enum
|
|
|
|
| 252 |
print(f"🎮 Game started in room {room_id}!")
|
| 253 |
|
| 254 |
def cleanup_old_rooms(self):
|
| 255 |
+
"""Remove empty or stale rooms."""
|
| 256 |
with self.lock, self.get_connection() as conn:
|
| 257 |
+
# Using ISO 8601 format for comparisons
|
| 258 |
+
stale_cutoff = (datetime.now() - timedelta(hours=24)).isoformat()
|
| 259 |
+
empty_cutoff = (datetime.now() - timedelta(hours=1)).isoformat()
|
| 260 |
+
|
| 261 |
+
# Find rooms waiting for more than 24 hours
|
| 262 |
+
stale_rooms_q = conn.execute(
|
| 263 |
+
"SELECT room_id FROM rooms WHERE status = 'waiting' AND created_at < ?",
|
| 264 |
+
(stale_cutoff,)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 265 |
)
|
| 266 |
+
stale_ids = {row['room_id'] for row in stale_rooms_q.fetchall()}
|
| 267 |
+
|
| 268 |
+
# Find rooms waiting for more than 1 hour with no players
|
| 269 |
+
empty_rooms_q = conn.execute(
|
| 270 |
+
"""
|
| 271 |
+
SELECT room_id FROM rooms
|
| 272 |
+
WHERE status = 'waiting'
|
| 273 |
+
AND created_at < ?
|
| 274 |
+
AND room_id NOT IN (SELECT DISTINCT room_id FROM players WHERE room_id IS NOT NULL)
|
| 275 |
+
""",
|
| 276 |
+
(empty_cutoff,)
|
| 277 |
+
)
|
| 278 |
+
empty_ids = {row['room_id'] for row in empty_rooms_q.fetchall()}
|
| 279 |
+
|
| 280 |
+
rooms_to_delete = stale_ids.union(empty_ids)
|
| 281 |
+
|
| 282 |
+
if not rooms_to_delete:
|
| 283 |
+
return 0
|
| 284 |
+
|
| 285 |
for room_id in rooms_to_delete:
|
| 286 |
+
conn.execute("DELETE FROM rooms WHERE room_id = ?", (room_id,))
|
| 287 |
conn.execute("DELETE FROM players WHERE room_id = ?", (room_id,))
|
| 288 |
conn.execute("DELETE FROM spectators WHERE room_id = ?", (room_id,))
|
| 289 |
+
print(f"🧹 Cleaned up stale/empty room: {room_id}")
|
| 290 |
+
|
|
|
|
| 291 |
conn.commit()
|
| 292 |
return len(rooms_to_delete)
|
| 293 |
|