EU-Utility/premium/eu_integration/events.py

132 lines
3.2 KiB
Python

"""
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'),
)