Added the option to !opt-in/opt-out [onlinebot only]

Fixed command & event threading
Events are now threaded by event_type (i.e. all buddy_logon events get ran in the same one)
Added default preferences
Fixed recipe loading for multiple installs (i.e. on different machines)
This commit is contained in:
2021-08-27 13:58:47 +02:00
parent d0c8c1744c
commit c04f76c0db
24 changed files with 258 additions and 122 deletions
+19 -13
View File
@@ -72,7 +72,7 @@ class EventService:
"""
if len(inspect.signature(handler).parameters) != 2:
raise Exception(
"Incorrect number of arguments for handler '%s.%s()'" % (handler.__module__, handler.__name__))
f"Incorrect number of arguments for handler '{handler.__module__}.{handler.__name__}()'")
event_base_type, event_sub_type = self.get_event_type_parts(event_type)
module = module.lower()
@@ -80,12 +80,12 @@ class EventService:
is_hidden = 1 if is_hidden else 0
is_enabled = 1 if is_enabled else 0
if event_base_type not in self.event_types:
self.logger.error("Could not register handler '%s' for event type '%s': event type does not exist" % (
handler_name, event_type))
self.logger.error(
f"Could not register handler '{handler_name}' for event type '{event_type}': event type does not exist")
return
if not description:
self.logger.warning("No description for event_type '%s' and handler '%s'" % (event_type, handler_name))
self.logger.warning(f"No description for event_type '{event_type}' and handler '{handler_name}'")
row = self.db.query_single("SELECT 1 FROM event_config WHERE event_type = ? AND handler = ?",
[event_base_type, handler_name])
@@ -117,28 +117,34 @@ class EventService:
event_base_type, event_sub_type = self.get_event_type_parts(event_type)
if event_base_type not in self.event_types:
self.logger.error("Could not fire event type '%s': event type does not exist" % event_type)
self.logger.error(f"Could not fire event type '{event_type}': event type does not exist")
return
data = self.get_handlers(event_base_type, event_sub_type)
for row in data:
if event_type != "connect":
t = Thread(target=self.call_handler, args=(row.handler, event_type, event_data), daemon=True)
t.run()
else:
self.call_handler(row.handler, event_type, event_data)
# We dont want to spawn a new Thread for each event handler, but only per event type.
def i():
for row in data:
if event_type != "connect":
self.call_handler(row.handler, event_type, event_data)
else:
self.call_handler(row.handler, event_type, event_data)
if event_type != "connect":
Thread(target=i, daemon=True).start()
else:
i()
def call_handler(self, handler_method, event_type, event_data):
handler = self.handlers.get(handler_method, None)
if not handler:
self.logger.error(
"Could not find handler callback for event type '%s' and handler '%s'" % (event_type, handler_method))
f"Could not find handler callback for event type '{event_type}' and handler '{handler_method}'")
return
try:
handler(event_type, event_data)
except Exception as e:
self.logger.error("error processing event '%s'" % event_type, e)
self.logger.error(f"error processing event '{event_type}'", e)
def get_event_type_parts(self, event_type):
parts = event_type.lower().split(":", 1)