diff --git a/kairon/chat/converters/channels/telegram.py b/kairon/chat/converters/channels/telegram.py index 1271bf4c5..9b5b83d72 100644 --- a/kairon/chat/converters/channels/telegram.py +++ b/kairon/chat/converters/channels/telegram.py @@ -34,6 +34,27 @@ def link_transformer(self, message): except Exception as ex: raise Exception(f" Error in TelegramResponseConverter::link_transformer {str(ex)}") + def button_transformer(self, message): + try: + jsoniterator = ElementTransformerOps.json_generator(message) + reply_markup = {} + inline_keyboard = [] + reply_markup.update({"inline_keyboard": inline_keyboard}) + inline_keyboard_array = [] + for item in jsoniterator: + if item.get("type") == ElementTypes.BUTTON.value: + title = ElementTransformerOps.json_generator(item.get("children")) + for titletext in title: + button_text = titletext.get("text") + btn_body = {} + btn_body.update({"text": button_text}) + btn_body.update({"callback_data": item.get("value")}) + inline_keyboard_array.append(btn_body) + inline_keyboard.append(inline_keyboard_array) + return reply_markup + except Exception as ex: + raise Exception(f"Exception in TelegramResponseConverter::button_transfomer: {str(ex)}") + async def messageConverter(self, message): try: if self.message_type == ElementTypes.IMAGE.value: @@ -42,5 +63,7 @@ async def messageConverter(self, message): return self.link_transformer(message) elif self.message_type == ElementTypes.VIDEO.value: return super().video_transformer(message) + elif self.message_type == ElementTypes.BUTTON.value: + return self.button_transformer(message) except Exception as ex: raise Exception(f"Error in TelegramResponseConverter::messageConverter {str(ex)}") diff --git a/kairon/chat/handlers/channels/telegram.py b/kairon/chat/handlers/channels/telegram.py index 0669f7ee8..15615e78f 100644 --- a/kairon/chat/handlers/channels/telegram.py +++ b/kairon/chat/handlers/channels/telegram.py @@ -25,6 +25,8 @@ from kairon.chat.agent_processor import AgentProcessor from kairon import Utility from kairon.chat.converters.channels.response_factory import ConverterFactory +from kairon.chat.converters.channels.responseconverter import ElementTransformerOps +import json logger = logging.getLogger(__name__) @@ -159,6 +161,9 @@ async def send_custom_json( del response["text"] api_call = getattr(self, send_functions[("text",)]) api_call(recipient_id, *response_list, **response) + elif ops_type in ["button"]: + body_default = ElementTransformerOps.getChannelConfig(ChannelTypes.TELEGRAM.value, "body_message") + self.send_message(recipient_id, text=body_default, reply_markup=json.dumps(response)) else: self.send_message(recipient_id, str(json_message)) except Exception as ap: diff --git a/metadata/message_template.yml b/metadata/message_template.yml index 4b97be8f5..335e81bc4 100644 --- a/metadata/message_template.yml +++ b/metadata/message_template.yml @@ -122,6 +122,7 @@ telegram: "disable_notification":false, "reply_to_message_id":0}' video: '{"text":""}' + body_message: 'Please select from quick buttons:' msteams: body_message: "Please select from quick buttons:" diff --git a/tests/testing_data/channel_data/channel_data.json b/tests/testing_data/channel_data/channel_data.json index 582cef603..fbdb56800 100644 --- a/tests/testing_data/channel_data/channel_data.json +++ b/tests/testing_data/channel_data/channel_data.json @@ -457,5 +457,10 @@ ], "button": "Submit Option" } - } + }, + "telegram_button_op_one": {"inline_keyboard": [[{"text": "One", "callback_data": "single button is clicked"}]]}, + "telegram_button_op_multi": {"inline_keyboard": [[{"text": "Veg", "callback_data": "Vegetables only"}, + {"text": "Non-veg", "callback_data": "fish food served"}, + {"text": "Desert", "callback_data": "Only Desert food"}]]} + } \ No newline at end of file diff --git a/tests/unit_test/utility_test.py b/tests/unit_test/utility_test.py index 1f34d7ac5..e8a001e9f 100644 --- a/tests/unit_test/utility_test.py +++ b/tests/unit_test/utility_test.py @@ -2747,3 +2747,21 @@ def test_is_picklable_for_mongo_failure(self): assert not Utility.is_picklable_for_mongo({"requests": requests}) assert not Utility.is_picklable_for_mongo({"utility": Utility}) assert not Utility.is_picklable_for_mongo({"is_picklable_for_mongo": Utility.is_picklable_for_mongo}) + + def test_button_transformer_telegram_single_button(self): + json_data = json.load(open("tests/testing_data/channel_data/channel_data.json")) + input_json = json_data.get("button_one") + from kairon.chat.converters.channels.telegram import TelegramResponseConverter + telegram = TelegramResponseConverter("button", "telegram") + response = telegram.button_transformer(input_json) + expected_output = json_data.get("telegram_button_op_one") + assert expected_output == response + + def test_button_transformer_telegram_multi_buttons(self): + json_data = json.load(open("tests/testing_data/channel_data/channel_data.json")) + input_json = json_data.get("button_three") + from kairon.chat.converters.channels.telegram import TelegramResponseConverter + telegram = TelegramResponseConverter("button", "telegram") + response = telegram.button_transformer(input_json) + expected_output = json_data.get("telegram_button_op_multi") + assert expected_output == response \ No newline at end of file