diff --git a/freqtrade/rpc/telegram.py b/freqtrade/rpc/telegram.py index c7248f354..0a634ffae 100644 --- a/freqtrade/rpc/telegram.py +++ b/freqtrade/rpc/telegram.py @@ -914,10 +914,11 @@ class Telegram(RPCHandler): self._send_msg(str(e)) def _forcebuy_action(self, pair, price=None): - try: - self._rpc._rpc_forcebuy(pair, price) - except RPCException as e: - self._send_msg(str(e)) + if pair != 'cancel': + try: + self._rpc._rpc_forcebuy(pair, price) + except RPCException as e: + self._send_msg(str(e)) def _forcebuy_inline(self, update: Update, _: CallbackContext) -> None: if update.callback_query: @@ -947,10 +948,13 @@ class Telegram(RPCHandler): self._forcebuy_action(pair, price) else: whitelist = self._rpc._rpc_whitelist()['whitelist'] - pairs = [InlineKeyboardButton(text=pair, callback_data=pair) for pair in whitelist] + pair_buttons = [ + InlineKeyboardButton(text=pair, callback_data=pair) for pair in sorted(whitelist)] + buttons_aligned = self._layout_inline_keyboard(pair_buttons) + buttons_aligned.append([InlineKeyboardButton(text='Cancel', callback_data='cancel')]) self._send_msg(msg="Which pair?", - keyboard=self._layout_inline_keyboard(pairs)) + keyboard=buttons_aligned) @authorized_only def _trades(self, update: Update, context: CallbackContext) -> None: diff --git a/tests/rpc/test_rpc_telegram.py b/tests/rpc/test_rpc_telegram.py index 796147609..67a6c72fe 100644 --- a/tests/rpc/test_rpc_telegram.py +++ b/tests/rpc/test_rpc_telegram.py @@ -1260,7 +1260,8 @@ def test_forcebuy_no_pair(default_conf, update, mocker) -> None: assert msg_mock.call_args_list[0][1]['msg'] == 'Which pair?' # assert msg_mock.call_args_list[0][1]['callback_query_handler'] == 'forcebuy' keyboard = msg_mock.call_args_list[0][1]['keyboard'] - assert reduce(lambda acc, x: acc + len(x), keyboard, 0) == 4 + # One additional button - cancel + assert reduce(lambda acc, x: acc + len(x), keyboard, 0) == 5 update = MagicMock() update.callback_query = MagicMock() update.callback_query.data = 'XRP/USDT'