import typing
from abc import ABC, abstractmethod
from loguru import logger
from ....types import Chat
from ....mixins import Singleton
[документация]class BaseStorage(ABC):
[документация] @classmethod
def check_address(cls, *,
chat: typing.Union[str, int, None] = None,
user: typing.Union[str, int, None] = None
) -> (typing.Union[str, int], typing.Union[str, int]):
if chat is None and user is None:
raise ValueError('`user` or `chat` parameter is required but no one is provided!')
if user is None:
user = chat
elif chat is None:
chat = user
return chat, user
[документация] @abstractmethod
def get_state(self, *,
chat: typing.Union[str, int, None] = None,
user: typing.Union[str, int, None] = None,
default: typing.Optional[str] = None) -> typing.Optional[str]:
pass
[документация] @abstractmethod
def get_data(self, *,
chat: typing.Union[str, int, None] = None,
user: typing.Union[str, int, None] = None,
default: typing.Optional[str] = None) -> typing.Dict:
pass
[документация] @abstractmethod
def set_state(self, *,
chat: typing.Union[str, int, None] = None,
user: typing.Union[str, int, None] = None,
state: typing.Optional[typing.AnyStr] = None):
pass
[документация] @abstractmethod
def set_data(self, *,
chat: typing.Union[str, int, None] = None,
user: typing.Union[str, int, None] = None,
data: typing.Dict = None):
pass
[документация] @abstractmethod
def update_data(self, *,
chat: typing.Union[str, int, None] = None,
user: typing.Union[str, int, None] = None,
data: typing.Dict = None,
**kwargs):
pass
[документация] def reset_data(self, *,
chat: typing.Union[str, int, None] = None,
user: typing.Union[str, int, None] = None):
self.set_data(chat=chat, user=user, data={})
[документация] def reset_state(self, *,
chat: typing.Union[str, int, None] = None,
user: typing.Union[str, int, None] = None,
with_data: typing.Optional[bool] = True):
chat, user = self.check_address(chat=chat, user=user)
self.set_state(chat=chat, user=user, state=None)
if with_data:
self.set_data(chat=chat, user=user, data={})
[документация] def finish(self, *,
chat: typing.Union[str, int, None] = None,
user: typing.Union[str, int, None] = None,
with_data: bool = False):
self.reset_state(chat=chat, user=user, with_data=with_data)
[документация]class FSMContext(Singleton):
def __init__(self, storage: BaseStorage):
self.storage: BaseStorage = storage
[документация] def get_state(self, default: typing.Optional[str] = None) -> typing.Optional[str]:
return self.storage.get_state(chat=Chat.get_chat_id(), user=Chat.get_user_id(), default=default)
[документация] def get_data(self, default: typing.Optional[str] = None) -> typing.Dict:
return self.storage.get_data(chat=Chat.get_chat_id(), user=Chat.get_user_id(), default=default)
[документация] def update_data(self, data: typing.Dict = None, **kwargs):
self.storage.update_data(chat=Chat.get_chat_id(), user=Chat.get_user_id(), data=data, **kwargs)
[документация] def set_state(self, state: typing.Optional[typing.AnyStr] = None):
self.storage.set_state(chat=Chat.get_chat_id(), user=Chat.get_user_id(), state=state)
[документация] def set_data(self, data: typing.Dict = None):
self.storage.set_data(chat=Chat.get_chat_id(), user=Chat.get_user_id(), data=data)
[документация] def reset_state(self, with_data: typing.Optional[bool] = True):
self.storage.reset_state(chat=Chat.get_chat_id(), user=Chat.get_user_id(), with_data=with_data)
[документация] def reset_data(self):
self.storage.reset_data(chat=Chat.get_chat_id(), user=Chat.get_user_id(), )
[документация] def finish(self, with_data: bool = False):
self.storage.finish(chat=Chat.get_chat_id(), user=Chat.get_user_id(), with_data=with_data)
[документация]class DisabledStorage(BaseStorage):
[документация] def get_state(self, *,
chat: typing.Union[str, int, None] = None,
user: typing.Union[str, int, None] = None,
default: typing.Optional[str] = None) -> typing.Optional[str]:
return None
[документация] def get_data(self, *,
chat: typing.Union[str, int, None] = None,
user: typing.Union[str, int, None] = None,
default: typing.Optional[str] = None) -> typing.Dict:
self._warning()
return {}
[документация] def update_data(self, *,
chat: typing.Union[str, int, None] = None,
user: typing.Union[str, int, None] = None,
data: typing.Dict = None,
**kwargs):
self._warning()
[документация] def set_state(self, *,
chat: typing.Union[str, int, None] = None,
user: typing.Union[str, int, None] = None,
state: typing.Optional[typing.AnyStr] = None):
self._warning()
[документация] def set_data(self, *,
chat: typing.Union[str, int, None] = None,
user: typing.Union[str, int, None] = None,
data: typing.Dict = None):
self._warning()
def _warning(self):
logger.warning('Вы не указали хранилище состояний')