forked from Murgeye/teamspeak3-python-bot
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathevent_handler.py
124 lines (112 loc) · 4.3 KB
/
event_handler.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# standard imports
import logging
import threading
# third-party imports
from ts3API.Events import (
TextMessageEvent,
ChannelEditedEvent,
ChannelDescriptionEditedEvent,
ClientEnteredEvent,
ClientLeftEvent,
ClientMovedEvent,
ClientMovedSelfEvent,
ServerEditedEvent,
)
class EventHandler:
"""
EventHandler class responsible for delegating events to registered listeners.
"""
# configure logger
class_name = __qualname__
logger = logging.getLogger(class_name)
logger.propagate = 0
logger.setLevel(logging.INFO)
file_handler = logging.FileHandler(f"logs/{class_name.lower()}.log", mode="a+")
formatter = logging.Formatter("%(asctime)s: %(levelname)s: %(message)s")
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.info("Configured %s logger", str(class_name))
logger.propagate = 0
def __init__(self, ts3conn, command_handler):
self.ts3conn = ts3conn
self.command_handler = command_handler
self.observers = {}
self.add_observer(self.command_handler.inform, TextMessageEvent)
def on_event(self, _sender, **kw):
"""
Called upon a new event. Logs the event and informs all listeners.
"""
# parsed_event = Events.EventParser.parse_event(event=event)
parsed_event = kw["event"]
if isinstance(parsed_event, TextMessageEvent):
logging.debug(type(parsed_event))
elif isinstance(parsed_event, ChannelEditedEvent):
logging.debug(type(parsed_event))
elif isinstance(parsed_event, ChannelDescriptionEditedEvent):
logging.debug(type(parsed_event))
elif isinstance(parsed_event, ClientEnteredEvent):
logging.debug(type(parsed_event))
elif isinstance(parsed_event, ClientLeftEvent):
logging.debug(type(parsed_event))
elif isinstance(parsed_event, ClientMovedEvent):
logging.debug(type(parsed_event))
elif isinstance(parsed_event, ClientMovedSelfEvent):
logging.debug(type(parsed_event))
elif isinstance(parsed_event, ServerEditedEvent):
logging.debug("Event of type %s", str(type(parsed_event)))
logging.debug(parsed_event.changed_properties)
# Inform all observers
self.inform_all(parsed_event)
def get_obs_for_event(self, evt):
"""
Get all observers for an event.
:param evt: Event to get observers for.
:return: List of observers.
:rtype: list[function]
"""
obs = set()
for event_type in type(evt).mro():
obs.update(self.observers.get(event_type, set()))
return obs
def add_observer(self, obs, evt_type):
"""
Add an observer for an event type.
:param obs: Function to call upon a new event of type evt_type.
:param evt_type: Event type to observe.
:type evt_type: TS3Event
"""
obs_set = self.observers.get(evt_type, set())
obs_set.add(obs)
self.observers[evt_type] = obs_set
def remove_observer(self, obs, evt_type):
"""
Remove an observer for an event type.
:param obs: Observer to remove.
:param evt_type: Event type to remove the observer from.
"""
self.observers.get(evt_type, set()).discard(obs)
def remove_observer_from_all(self, obs):
"""
Removes an observer from all event_types.
:param obs: Observer to remove.
"""
for evt_type in self.observers:
self.remove_observer(obs, evt_type)
# We really want to catch all exception here, to prevent one observer from crashing the bot
# noinspection PyBroadException
def inform_all(self, evt):
"""
Inform all observers registered to the event type of an event.
:param evt: Event to inform observers of.
"""
for observer in self.get_obs_for_event(evt):
try:
threading.Thread(target=observer(evt)).start()
except BaseException:
EventHandler.logger.exception(
"Exception while informing %s of Event of type "
"%s\nOriginal data: %s",
str(observer),
str(type(evt)),
str(evt.data),
)