diff --git a/aiogram/dispatcher/dispatcher.py b/aiogram/dispatcher/dispatcher.py index e7d71741..27756d9b 100644 --- a/aiogram/dispatcher/dispatcher.py +++ b/aiogram/dispatcher/dispatcher.py @@ -31,7 +31,7 @@ class Dispatcher(Router): def __init__( self, storage: Optional[BaseStorage] = None, - fsm_strategy: FSMStrategy = FSMStrategy.USER, + fsm_strategy: FSMStrategy = FSMStrategy.USER_IN_CHAT, isolate_events: bool = True, **kwargs: Any, ) -> None: diff --git a/aiogram/dispatcher/fsm/engine.py b/aiogram/dispatcher/fsm/engine.py deleted file mode 100644 index bb9f83d5..00000000 --- a/aiogram/dispatcher/fsm/engine.py +++ /dev/null @@ -1,6 +0,0 @@ -from enum import Enum, auto - - -class FSMStrategy(Enum): - CHAT = auto() - USER = auto() diff --git a/aiogram/dispatcher/fsm/middleware.py b/aiogram/dispatcher/fsm/middleware.py index 0ae1fef6..894f5a3d 100644 --- a/aiogram/dispatcher/fsm/middleware.py +++ b/aiogram/dispatcher/fsm/middleware.py @@ -3,6 +3,7 @@ from typing import Any, Awaitable, Callable, Dict, Optional from aiogram.dispatcher.fsm.context import FSMContext from aiogram.dispatcher.fsm.engine import FSMStrategy from aiogram.dispatcher.fsm.storage.base import BaseStorage +from aiogram.dispatcher.fsm.strategy import apply_strategy from aiogram.dispatcher.middlewares.base import BaseMiddleware from aiogram.types import Update @@ -11,7 +12,7 @@ class FSMContextMiddleware(BaseMiddleware[Update]): def __init__( self, storage: BaseStorage, - strategy: FSMStrategy = FSMStrategy.USER, + strategy: FSMStrategy = FSMStrategy.USER_IN_CHAT, isolate_events: bool = True, ) -> None: self.storage = storage @@ -41,10 +42,11 @@ class FSMContextMiddleware(BaseMiddleware[Update]): if chat_id is None: chat_id = user_id - if self.strategy == FSMStrategy.CHAT: - user_id = chat_id if chat_id is not None and user_id is not None: + chat_id, user_id = apply_strategy( + chat_id=chat_id, user_id=user_id, strategy=self.strategy + ) return self.get_context(chat_id=chat_id, user_id=user_id) return None diff --git a/aiogram/dispatcher/fsm/strategy.py b/aiogram/dispatcher/fsm/strategy.py new file mode 100644 index 00000000..4f540a4a --- /dev/null +++ b/aiogram/dispatcher/fsm/strategy.py @@ -0,0 +1,16 @@ +from enum import Enum, auto +from typing import Tuple + + +class FSMStrategy(Enum): + USER_IN_CHAT = auto() + CHAT = auto() + GLOBAL_USER = auto() + + +def apply_strategy(chat_id: int, user_id: int, strategy: FSMStrategy) -> Tuple[int, int]: + if strategy == FSMStrategy.CHAT: + return chat_id, chat_id + if strategy == FSMStrategy.GLOBAL_USER: + return user_id, user_id + return chat_id, user_id