Version 2.3.4

Signed-off-by: Jeroen Oudshoorn <oudshoorn.jeroen@gmail.com>

Signed-off-by: Jeroen Oudshoorn <oudshoorn.jeroen@gmail.com>
This commit is contained in:
Jeroen Oudshoorn
2023-09-08 20:29:11 +02:00
parent ed36e539ac
commit bdf51bd3e2

View File

@ -1,17 +1,15 @@
import os import os
import glob import glob
import _thread
import threading import threading
import importlib, importlib.util import importlib, importlib.util
import logging import logging
from concurrent.futures import ThreadPoolExecutor
default_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "default") default_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "default")
loaded = {} loaded = {}
database = {} database = {}
locks = {} locks = {}
THREAD_POOL_SIZE = 10
executor = ThreadPoolExecutor(max_workers=THREAD_POOL_SIZE)
class Plugin: class Plugin:
@classmethod @classmethod
@ -30,6 +28,7 @@ class Plugin:
if cb is not None and callable(cb): if cb is not None and callable(cb):
locks["%s::%s" % (plugin_name, attr_name)] = threading.Lock() locks["%s::%s" % (plugin_name, attr_name)] = threading.Lock()
def toggle_plugin(name, enable=True): def toggle_plugin(name, enable=True):
""" """
Load or unload a plugin Load or unload a plugin
@ -68,10 +67,12 @@ def toggle_plugin(name, enable=True):
return False return False
def on(event_name, *args, **kwargs): def on(event_name, *args, **kwargs):
for plugin_name in loaded.keys(): for plugin_name in loaded.keys():
one(plugin_name, event_name, *args, **kwargs) one(plugin_name, event_name, *args, **kwargs)
def locked_cb(lock_name, cb, *args, **kwargs): def locked_cb(lock_name, cb, *args, **kwargs):
global locks global locks
@ -81,6 +82,7 @@ def locked_cb(lock_name, cb, *args, **kwargs):
with locks[lock_name]: with locks[lock_name]:
cb(*args, *kwargs) cb(*args, *kwargs)
def one(plugin_name, event_name, *args, **kwargs): def one(plugin_name, event_name, *args, **kwargs):
global loaded global loaded
@ -92,11 +94,12 @@ def one(plugin_name, event_name, *args, **kwargs):
try: try:
lock_name = "%s::%s" % (plugin_name, cb_name) lock_name = "%s::%s" % (plugin_name, cb_name)
locked_cb_args = (lock_name, callback, *args, *kwargs) locked_cb_args = (lock_name, callback, *args, *kwargs)
executor.submit(locked_cb, *locked_cb_args) _thread.start_new_thread(locked_cb, locked_cb_args)
except Exception as e: except Exception as e:
logging.error("error while running %s.%s : %s" % (plugin_name, cb_name, e)) logging.error("error while running %s.%s : %s" % (plugin_name, cb_name, e))
logging.error(e, exc_info=True) logging.error(e, exc_info=True)
def load_from_file(filename): def load_from_file(filename):
logging.debug("loading %s" % filename) logging.debug("loading %s" % filename)
plugin_name = os.path.basename(filename.replace(".py", "")) plugin_name = os.path.basename(filename.replace(".py", ""))
@ -105,6 +108,7 @@ def load_from_file(filename):
spec.loader.exec_module(instance) spec.loader.exec_module(instance)
return plugin_name, instance return plugin_name, instance
def load_from_path(path, enabled=()): def load_from_path(path, enabled=()):
global loaded, database global loaded, database
logging.debug("loading plugins from %s - enabled: %s" % (path, enabled)) logging.debug("loading plugins from %s - enabled: %s" % (path, enabled))
@ -120,6 +124,7 @@ def load_from_path(path, enabled=()):
return loaded return loaded
def load(config): def load(config):
enabled = [name for name, options in config['main']['plugins'].items() if enabled = [name for name, options in config['main']['plugins'].items() if
'enabled' in options and options['enabled']] 'enabled' in options and options['enabled']]
@ -137,4 +142,4 @@ def load(config):
plugin.options = config['main']['plugins'][name] plugin.options = config['main']['plugins'][name]
on('loaded') on('loaded')
on('config_changed', config) on('config_changed', config)