Torchlight3/Torchlight/GameEvents.py
2019-12-30 17:43:48 +01:00

150 lines
2.9 KiB
Python

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import asyncio
import logging
import traceback
class GameEvents():
def __init__(self, master):
self.Logger = logging.getLogger(__class__.__name__)
self.Torchlight = master
self.Callbacks = {}
def __del__(self):
if not len(self.Callbacks) or not self.Torchlight():
return
Obj = {
"method": "unsubscribe",
"module": "gameevents",
"events": self.Callbacks.keys()
}
asyncio.ensure_future(self.Torchlight().Send(Obj))
async def _Register(self, events):
if type(events) is not list:
events = [ events ]
Obj = {
"method": "subscribe",
"module": "gameevents",
"events": events
}
Res = await self.Torchlight().Send(Obj)
Ret = []
for i, ret in enumerate(Res["events"]):
if ret >= 0:
Ret.append(True)
if not events[i] in self.Callbacks:
self.Callbacks[events[i]] = set()
else:
Ret.append(False)
if len(Ret) == 1:
Ret = Ret[0]
return Ret
async def _Unregister(self, events):
if type(events) is not list:
events = [ events ]
Obj = {
"method": "unsubscribe",
"module": "gameevents",
"events": events
}
Res = await self.Torchlight().Send(Obj)
Ret = []
for i, ret in enumerate(Res["events"]):
if ret >= 0:
Ret.append(True)
if events[i] in self.Callbacks:
del self.Callbacks[events[i]]
else:
Ret.append(False)
if len(Ret) == 1:
Ret = Ret[0]
return Ret
def HookEx(self, event, callback):
asyncio.ensure_future(self.Hook(event, callback))
def UnhookEx(self, event, callback):
asyncio.ensure_future(self.Unhook(event, callback))
def ReplayEx(self, events):
asyncio.ensure_future(self.Replay(events))
async def Hook(self, event, callback):
if not event in self.Callbacks:
if not await self._Register(event):
return False
self.Callbacks[event].add(callback)
return True
async def Unhook(self, event, callback):
if not event in self.Callbacks:
return True
if not callback in self.Callbacks[event]:
return True
self.Callbacks[event].discard(callback)
if len(a) == 0:
return await self._Unregister(event)
return True
async def Replay(self, events):
if type(events) is not list:
events = [ events ]
for event in events[:]:
if not event in self.Callbacks:
events.remove(event)
Obj = {
"method": "replay",
"module": "gameevents",
"events": events
}
Res = await self.Torchlight().Send(Obj)
Ret = []
for i, ret in enumerate(Res["events"]):
if ret >= 0:
Ret.append(True)
else:
Ret.append(False)
if len(Ret) == 1:
Ret = Ret[0]
return Ret
def OnPublish(self, obj):
Event = obj["event"]
if not Event["name"] in self.Callbacks:
return False
Callbacks = self.Callbacks[Event["name"]]
for Callback in Callbacks:
try:
Callback(**Event["data"])
except Exception as e:
self.Logger.error(traceback.format_exc())
self.Logger.error(Event)
return True