From 05ef4f9b6f3eeaa5b549812658923734cfaebebb Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 1 Nov 2023 09:09:49 +0100 Subject: [PATCH] Fix forceenter - cancel dialog not working closes #9368 --- freqtrade/rpc/telegram.py | 29 +++++++++++++++++++---------- tests/rpc/test_rpc_telegram.py | 11 ++++++++++- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/freqtrade/rpc/telegram.py b/freqtrade/rpc/telegram.py index be27c38f4..1ae50938b 100644 --- a/freqtrade/rpc/telegram.py +++ b/freqtrade/rpc/telegram.py @@ -240,7 +240,7 @@ class Telegram(RPCHandler): CallbackQueryHandler(self._mix_tag_performance, pattern='update_mix_tag_performance'), CallbackQueryHandler(self._count, pattern='update_count'), CallbackQueryHandler(self._force_exit_inline, pattern=r"force_exit__\S+"), - CallbackQueryHandler(self._force_enter_inline, pattern=r"\S+\/\S+"), + CallbackQueryHandler(self._force_enter_inline, pattern=r"force_enter__\S+"), ] for handle in handles: self._app.add_handler(handle) @@ -1149,12 +1149,19 @@ class Telegram(RPCHandler): async def _force_enter_inline(self, update: Update, _: CallbackContext) -> None: if update.callback_query: query = update.callback_query - if query.data and '_||_' in query.data: - pair, side = query.data.split('_||_') - order_side = SignalDirection(side) - await query.answer() - await query.edit_message_text(text=f"Manually entering {order_side} for {pair}") - await self._force_enter_action(pair, None, order_side) + if query.data and '__' in query.data: + # Input data is "force_enter___" + payload = query.data.split("__")[1] + if payload == 'cancel': + await query.answer() + await query.edit_message_text(text="Force enter canceled.") + return + if payload and '_||_' in payload: + pair, side = payload.split('_||_') + order_side = SignalDirection(side) + await query.answer() + await query.edit_message_text(text=f"Manually entering {order_side} for {pair}") + await self._force_enter_action(pair, None, order_side) @staticmethod def _layout_inline_keyboard( @@ -1183,12 +1190,14 @@ class Telegram(RPCHandler): else: whitelist = self._rpc._rpc_whitelist()['whitelist'] pair_buttons = [ - InlineKeyboardButton(text=pair, callback_data=f"{pair}_||_{order_side}") - for pair in sorted(whitelist) + InlineKeyboardButton( + text=pair, callback_data=f"force_enter__{pair}_||_{order_side}" + ) for pair in sorted(whitelist) ] buttons_aligned = self._layout_inline_keyboard(pair_buttons) - buttons_aligned.append([InlineKeyboardButton(text='Cancel', callback_data='cancel')]) + buttons_aligned.append([InlineKeyboardButton(text='Cancel', + callback_data='force_enter__cancel')]) await self._send_msg(msg="Which pair?", keyboard=buttons_aligned, query=update.callback_query) diff --git a/tests/rpc/test_rpc_telegram.py b/tests/rpc/test_rpc_telegram.py index 41c24cc45..92a4384b4 100644 --- a/tests/rpc/test_rpc_telegram.py +++ b/tests/rpc/test_rpc_telegram.py @@ -1359,10 +1359,19 @@ async def test_force_enter_no_pair(default_conf, update, mocker) -> None: assert reduce(lambda acc, x: acc + len(x), keyboard, 0) == 5 update = MagicMock() update.callback_query = AsyncMock() - update.callback_query.data = 'XRP/USDT_||_long' + update.callback_query.data = 'force_enter__XRP/USDT_||_long' await telegram._force_enter_inline(update, None) assert fbuy_mock.call_count == 1 + fbuy_mock.reset_mock() + update.callback_query = AsyncMock() + update.callback_query.data = 'force_enter__cancel' + await telegram._force_enter_inline(update, None) + assert fbuy_mock.call_count == 0 + query = update.callback_query + assert query.edit_message_text.call_count == 1 + assert query.edit_message_text.call_args_list[-1][1]['text'] == "Force enter canceled." + async def test_telegram_performance_handle(default_conf_usdt, update, ticker, fee, mocker) -> None: