From ab70c3178ec39c5a26107d2f13a92a32b42f301b Mon Sep 17 00:00:00 2001 From: Conatum Date: Wed, 8 Mar 2023 11:59:31 +0200 Subject: [PATCH] rewrite (settings): Add event dispatch on update. --- src/modules/__init__.py | 1 + src/settings/ui.py | 17 +++++++++++++++++ src/utils/ui/micros.py | 2 ++ 3 files changed, 20 insertions(+) diff --git a/src/modules/__init__.py b/src/modules/__init__.py index a1ec23ad..6c4ad131 100644 --- a/src/modules/__init__.py +++ b/src/modules/__init__.py @@ -3,6 +3,7 @@ this_package = 'modules' active = [ '.sysadmin', '.config', + '.user_config', '.economy', '.reminders', '.shop', diff --git a/src/settings/ui.py b/src/settings/ui.py index bef5b47b..00db61cb 100644 --- a/src/settings/ui.py +++ b/src/settings/ui.py @@ -11,6 +11,7 @@ from discord.ui.text_input import TextInput from utils.lib import tabulate, recover_context from utils.ui import FastModal from meta.config import conf +from meta.context import ctx_bot from babel.translator import ctx_translator, LazyStr from .base import BaseSetting, ParentID, SettingData, SettingValue @@ -180,6 +181,10 @@ class InteractiveSetting(BaseSetting[ParentID, SettingData, SettingValue]): # The callbacks are called on write, so they may be bypassed by direct use of _writer! _listeners_: Dict[Any, Callable[[Optional[SettingData]], Coroutine[Any, Any, None]]] = {} + # Optional client event to dispatch when theis setting has been written + # Event handlers should be of the form Callable[ParentID, SettingData] + _event: Optional[str] = None + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -207,9 +212,21 @@ class InteractiveSetting(BaseSetting[ParentID, SettingData, SettingValue]): async def write(self, **kwargs) -> None: await super().write(**kwargs) + self.dispatch_update() for listener in self._listeners_.values(): asyncio.create_task(listener(self.data)) + def dispatch_update(self): + """ + Dispatch a client event along `self._event`, if set. + + Override to modify the target event handler arguments. + By default, event handlers should be of the form: + Callable[[ParentID, SettingData], Coroutine[Any, Any, None]] + """ + if self._event is not None and (bot := ctx_bot.get()) is not None: + bot.dispatch(self._event, self.parent_id, self.data) + def get_listener(self, key): return self._listeners_.get(key, None) diff --git a/src/utils/ui/micros.py b/src/utils/ui/micros.py index 7246bffa..1c8c5101 100644 --- a/src/utils/ui/micros.py +++ b/src/utils/ui/micros.py @@ -313,3 +313,5 @@ class Confirm(LeoUI): ) self._is_followup = False return await self._result + +# TODO: Selector MicroUI for displaying options (<= 25)