import logging class Module: strings = {"name": "Unknown"} """There is no help for this module""" def config_complete(self): """Will be called when module.config is populated""" async def client_ready(self, client, db): """Will be called after client is ready (after config_loaded)""" async def on_unload(self): """Will be called after unloading / reloading module""" # Called after client_ready, for internal use only. Must not be used by non-core modules async def _client_ready2(self, client, db): pass class LoadError(Exception): def __init__(self, error_message): # skipcq: PYL-W0231 self._error = error_message def __str__(self) -> str: return self._error class ModuleConfig(dict): """Like a dict but contains doc for each key""" def __init__(self, *entries): keys = [] values = [] defaults = [] docstrings = [] for i, entry in enumerate(entries): if i % 3 == 0: keys.append(entry) elif i % 3 == 1: values.append(entry) defaults.append(entry) else: docstrings.append(entry) super().__init__(zip(keys, values)) self._docstrings = dict(zip(keys, docstrings)) self._defaults = dict(zip(keys, defaults)) def getdoc(self, key, message=None): """Get the documentation by key""" ret = self._docstrings[key] if callable(ret): try: ret = ret(message) except TypeError: # Invalid number of params logging.debug("%s using legacy doc trnsl", key) ret = ret() return ret def getdef(self, key): """Get the default value by key""" return self._defaults[key]