rewrite (settings): Add event dispatch on update.

This commit is contained in:
2023-03-08 11:59:31 +02:00
parent b5ba4c698b
commit ab70c3178e
3 changed files with 20 additions and 0 deletions

View File

@@ -3,6 +3,7 @@ this_package = 'modules'
active = [ active = [
'.sysadmin', '.sysadmin',
'.config', '.config',
'.user_config',
'.economy', '.economy',
'.reminders', '.reminders',
'.shop', '.shop',

View File

@@ -11,6 +11,7 @@ from discord.ui.text_input import TextInput
from utils.lib import tabulate, recover_context from utils.lib import tabulate, recover_context
from utils.ui import FastModal from utils.ui import FastModal
from meta.config import conf from meta.config import conf
from meta.context import ctx_bot
from babel.translator import ctx_translator, LazyStr from babel.translator import ctx_translator, LazyStr
from .base import BaseSetting, ParentID, SettingData, SettingValue 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! # 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]]] = {} _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): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
@@ -207,9 +212,21 @@ class InteractiveSetting(BaseSetting[ParentID, SettingData, SettingValue]):
async def write(self, **kwargs) -> None: async def write(self, **kwargs) -> None:
await super().write(**kwargs) await super().write(**kwargs)
self.dispatch_update()
for listener in self._listeners_.values(): for listener in self._listeners_.values():
asyncio.create_task(listener(self.data)) 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): def get_listener(self, key):
return self._listeners_.get(key, None) return self._listeners_.get(key, None)

View File

@@ -313,3 +313,5 @@ class Confirm(LeoUI):
) )
self._is_followup = False self._is_followup = False
return await self._result return await self._result
# TODO: Selector MicroUI for displaying options (<= 25)