File size: 2,789 Bytes
ad8032f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# RockPaperScissor/game_cache/memory_cache.py
from typing import Dict, Any, Optional
from dataclasses import dataclass
from datetime import datetime

@dataclass
class GameData:
    session_id: str
    player_move: str
    ai_move: str
    result: str
    ai_type: str
    ai_state: Dict[str, Any]
    created_at: datetime = datetime.now()

class GameSessionCache:
    def __init__(self):
        self._sessions: Dict[str, Dict[str, Any]] = {}
        self._max_cache_size = 1000  # Maximum number of sessions to cache
        
    def update_session(self, session_id: str, game_data: Dict[str, Any]) -> None:
        """Update session data in cache"""
        if session_id not in self._sessions:
            self._sessions[session_id] = {
                'total_rounds': 0,
                'player_wins': 0,
                'ai_wins': 0,
                'draws': 0,
                'rounds': [],
                'last_updated': datetime.now()
            }
            
        session = self._sessions[session_id]
        
        # Update session stats
        session['total_rounds'] += 1
        if game_data['result'] == 'player_win':
            session['player_wins'] += 1
        elif game_data['result'] == 'ai_win':
            session['ai_wins'] += 1
        else:
            session['draws'] += 1
            
        # Add round data
        session['rounds'].append({
            'round_number': session['total_rounds'],
            'player_move': game_data['player_move'],
            'ai_move': game_data['ai_move'],
            'result': game_data['result'],
            'ai_type': game_data.get('ai_type', 'random'),
            'ai_state': game_data.get('ai_state', {}),
            'created_at': datetime.now()
        })
        
        # Update last updated timestamp
        session['last_updated'] = datetime.now()
        
        # Enforce cache size limit
        if len(self._sessions) > self._max_cache_size:
            self._remove_oldest_session()
            
    def get_session(self, session_id: str) -> Optional[Dict[str, Any]]:
        """Get session data from cache"""
        return self._sessions.get(session_id)
        
    def _remove_oldest_session(self) -> None:
        """Remove the oldest session from cache"""
        if not self._sessions:
            return
            
        oldest_session = min(
            self._sessions.items(),
            key=lambda x: x[1]['last_updated']
        )
        del self._sessions[oldest_session[0]]
        
    def clear(self) -> None:
        """Clear all cached data"""
        self._sessions.clear()

    def remove_session(self, session_id: str) -> None:
        """Remove a specific session from cache"""
        if session_id in self._sessions:
            del self._sessions[session_id]