132 lines
3.2 KiB
Python
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'),
|
|
)
|