diff --git a/CHANGES/1343.feature.rst b/CHANGES/1343.feature.rst new file mode 100644 index 00000000..6ae25cd3 --- /dev/null +++ b/CHANGES/1343.feature.rst @@ -0,0 +1 @@ +The new FSM strategy CHAT_TOPIC, which sets the state for the entire topic in the chat, also works in private messages and regular groups without topics. diff --git a/aiogram/fsm/strategy.py b/aiogram/fsm/strategy.py index 2695d60e..f68aa045 100644 --- a/aiogram/fsm/strategy.py +++ b/aiogram/fsm/strategy.py @@ -7,6 +7,7 @@ class FSMStrategy(Enum): CHAT = auto() GLOBAL_USER = auto() USER_IN_TOPIC = auto() + CHAT_TOPIC = auto() def apply_strategy( @@ -21,4 +22,7 @@ def apply_strategy( return user_id, user_id, None if strategy == FSMStrategy.USER_IN_TOPIC: return chat_id, user_id, thread_id + if strategy == FSMStrategy.CHAT_TOPIC: + return chat_id, chat_id, thread_id + return chat_id, user_id, None diff --git a/tests/test_fsm/test_strategy.py b/tests/test_fsm/test_strategy.py index 782d1eeb..1f6f2e93 100644 --- a/tests/test_fsm/test_strategy.py +++ b/tests/test_fsm/test_strategy.py @@ -27,6 +27,9 @@ class TestStrategy: [FSMStrategy.USER_IN_TOPIC, CHAT, CHAT], [FSMStrategy.USER_IN_TOPIC, PRIVATE, PRIVATE], [FSMStrategy.USER_IN_TOPIC, THREAD, THREAD], + [FSMStrategy.CHAT_TOPIC, CHAT, (CHAT_ID, CHAT_ID, None)], + [FSMStrategy.CHAT_TOPIC, PRIVATE, PRIVATE], + [FSMStrategy.CHAT_TOPIC, THREAD, (CHAT_ID, CHAT_ID, THREAD_ID)], ], ) def test_strategy(self, strategy, case, expected):