""" Typed event definitions for Entropia Universe. """ from dataclasses import dataclass from datetime import datetime from typing import Optional, Dict, Any @dataclass class GameEvent: """Base game event.""" timestamp: datetime type: str data: Dict[str, Any] @dataclass class LootEvent(GameEvent): """Loot received event.""" item: str quantity: int value: float @classmethod def from_data(cls, data: Dict[str, Any]) -> 'LootEvent': return cls( timestamp=datetime.now(), type='loot', data=data, item=data.get('item', 'Unknown'), quantity=data.get('quantity', 1), value=data.get('value', 0.0), ) @dataclass class SkillEvent(GameEvent): """Skill gain event.""" skill: str gain: float new_value: Optional[float] = None @classmethod def from_data(cls, data: Dict[str, Any]) -> 'SkillEvent': return cls( timestamp=datetime.now(), type='skill', data=data, skill=data.get('skill', 'Unknown'), gain=data.get('gain', 0.0), new_value=data.get('new_value'), ) @dataclass class GlobalEvent(GameEvent): """Global/HoF event.""" player: str mob: str item: str value: float is_hof: bool @classmethod def from_data(cls, data: Dict[str, Any]) -> 'GlobalEvent': return cls( timestamp=datetime.now(), type='global', data=data, player=data.get('player', 'Unknown'), mob=data.get('mob', 'Unknown'), item=data.get('item', 'Unknown'), value=data.get('value', 0.0), is_hof=data.get('is_hof', False), ) @dataclass class ChatEvent(GameEvent): """Chat message event.""" channel: str player: str message: str @classmethod def from_data(cls, data: Dict[str, Any]) -> 'ChatEvent': return cls( timestamp=datetime.now(), type='chat', data=data, channel=data.get('channel', 'Unknown'), player=data.get('player', 'Unknown'), message=data.get('message', ''), ) @dataclass class DamageEvent(GameEvent): """Damage dealt/received event.""" damage: float target: Optional[str] = None is_critical: bool = False @classmethod def from_data(cls, data: Dict[str, Any], dealt: bool = True) -> 'DamageEvent': return cls( timestamp=datetime.now(), type='damage_dealt' if dealt else 'damage_received', data=data, damage=data.get('damage', 0.0), target=data.get('target'), is_critical=data.get('is_critical', False), ) @dataclass class KillEvent(GameEvent): """Creature killed event.""" creature: str experience: Optional[float] = None @classmethod def from_data(cls, data: Dict[str, Any]) -> 'KillEvent': return cls( timestamp=datetime.now(), type='kill', data=data, creature=data.get('creature', 'Unknown'), experience=data.get('experience'), )