123 lines
3.0 KiB
Python
123 lines
3.0 KiB
Python
import time
|
|
import asyncio
|
|
import re
|
|
|
|
from loguru import logger
|
|
|
|
|
|
class BaseEvent:
|
|
|
|
def to_dict(self) -> dict:
|
|
return vars(self)
|
|
|
|
|
|
class ServerStartEvent(BaseEvent):
|
|
|
|
def __init__(self) -> None:
|
|
self.time = int(time.time())
|
|
self.type: str = 'ServerStart'
|
|
self.start_use_time: float
|
|
|
|
|
|
class ServerStopEvent(BaseEvent):
|
|
|
|
def __init__(self) -> None:
|
|
self.time = int(time.time())
|
|
self.type: str = 'ServerStop'
|
|
|
|
|
|
class PlayerJoinEvent(BaseEvent):
|
|
|
|
def __init__(self) -> None:
|
|
self.time = int(time.time())
|
|
self.type: str = 'PlayerJoin'
|
|
self.player: str
|
|
|
|
|
|
class PlayerQuitEvent(BaseEvent):
|
|
|
|
def __init__(self) -> None:
|
|
self.time = int(time.time())
|
|
self.type: str = 'PlayerQuit'
|
|
self.player: str
|
|
|
|
|
|
class PlayerChatEvent(BaseEvent):
|
|
|
|
def __init__(self) -> None:
|
|
self.time = int(time.time())
|
|
self.type: str = 'PlayerChat'
|
|
self.player: str
|
|
self.message: str
|
|
|
|
|
|
class PlayerAdvancementEvent(BaseEvent):
|
|
|
|
def __init__(self) -> None:
|
|
self.time = int(time.time())
|
|
self.type: str = 'PlayerAdvancement'
|
|
self.player: str
|
|
self.advancement: str
|
|
|
|
|
|
class Event:
|
|
|
|
def __init__(self, config: dict) -> None:
|
|
logger.level('EVENT', no=20, color='<cyan>')
|
|
|
|
self.event_queue = asyncio.Queue()
|
|
|
|
def line_to_event(self, line: str) -> None:
|
|
res = re.findall(
|
|
"]: Done \((.*?)s\)! For help, type \"help\"", line)
|
|
if res:
|
|
event = ServerStartEvent()
|
|
event.start_use_time = float(res[0])
|
|
self._save_event(event)
|
|
return
|
|
|
|
if line.find('PRISM CLOSE SINGAL') != -1:
|
|
event = ServerStopEvent()
|
|
self._save_event(event)
|
|
return
|
|
|
|
res = re.findall("]: (.*?) joined the game", line)
|
|
if res:
|
|
event = PlayerJoinEvent()
|
|
event.player = res[0]
|
|
self._save_event(event)
|
|
return
|
|
|
|
res = re.findall("]: (.*?) left the game", line)
|
|
if res:
|
|
event = PlayerQuitEvent()
|
|
event.player = res[0]
|
|
self._save_event(event)
|
|
return
|
|
|
|
res = re.findall("]: <(.*?)> ", line)
|
|
if res:
|
|
event = PlayerChatEvent()
|
|
event.player = res[0]
|
|
res = re.findall("<[\s\S]*> (.*?)$", line)
|
|
event.message = res[0]
|
|
self._save_event(event)
|
|
return
|
|
|
|
res = re.findall("]: (.*?) has[\s\S]*\[[\s\S]*]", line)
|
|
if res:
|
|
event = PlayerAdvancementEvent()
|
|
event.player = res[0]
|
|
res = re.findall("has[\s\S]*\[(.*?)]", line)
|
|
event.advancement = res[0]
|
|
self._save_event(event)
|
|
return
|
|
|
|
def _save_event(self, event) -> None:
|
|
logger.log('EVENT', f'Event: {event.to_dict()}')
|
|
self.event_queue.put_nowait(event)
|
|
|
|
async def get_event(self):
|
|
res = await self.event_queue.get()
|
|
return res
|