From f5a734a62264fb536aaf0764c997fec4cbe9ca3d Mon Sep 17 00:00:00 2001 From: Guillermo Rodriguez Date: Wed, 19 Feb 2025 01:34:52 -0300 Subject: [PATCH] Finally have feature parity, callback query redo works --- skynet/frontend/chatbot/__init__.py | 10 +++++++--- skynet/frontend/chatbot/telegram.py | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/skynet/frontend/chatbot/__init__.py b/skynet/frontend/chatbot/__init__.py index 106ac7f..1e15864 100644 --- a/skynet/frontend/chatbot/__init__.py +++ b/skynet/frontend/chatbot/__init__.py @@ -123,9 +123,12 @@ class BaseChatbot(ABC): ''' ... - async def create_status_msg(self, msg: BaseMessage, init_text: str) -> tuple[BaseUser, BaseMessage, dict]: + async def create_status_msg(self, msg: BaseMessage, init_text: str, force_user: BaseUser | None = None) -> tuple[BaseUser, BaseMessage, dict]: # maybe init user user = msg.author + if force_user: + user = force_user + user_row = await self.db.get_or_create_user(user.id) # create status msg @@ -202,7 +205,8 @@ class BaseChatbot(ABC): async def handle_request( self, - msg: BaseMessage + msg: BaseMessage, + force_user: BaseUser | None = None ): if msg.chat.is_private: return @@ -218,7 +222,7 @@ class BaseChatbot(ABC): # maybe initialize user db row and send a new msg thats gonna # be updated throughout the request lifecycle user, status_msg, user_row = await self.create_status_msg( - msg, f'started processing a {msg.command} request...') + msg, f'started processing a {msg.command} request...', force_user=force_user) # if this is a redo msg, we attempt to get the input params from db # else use msg properties diff --git a/skynet/frontend/chatbot/telegram.py b/skynet/frontend/chatbot/telegram.py index ccaf271..baf56af 100644 --- a/skynet/frontend/chatbot/telegram.py +++ b/skynet/frontend/chatbot/telegram.py @@ -1,3 +1,4 @@ +import json import logging import traceback @@ -9,6 +10,7 @@ from telebot.types import ( Chat as TGChat, PhotoSize as TGPhotoSize, Message as TGMessage, + CallbackQuery, InputMediaPhoto, InlineKeyboardButton, InlineKeyboardMarkup @@ -118,6 +120,8 @@ class TelegramMessage(BaseMessage): self._chat = TelegramChatRoom(msg.chat) self._inputs: list[TelegramFileInput] | None = None + self._author = None + @property def id(self) -> int: return self._msg.message_id @@ -136,6 +140,9 @@ class TelegramMessage(BaseMessage): @property def author(self) -> TelegramUser: + if self._author: + return self._author + return TelegramUser(self._msg.from_user) @property @@ -270,6 +277,17 @@ class TelegramChatbot(BaseChatbot): msg = TelegramMessage(cmd='unknown', msg=tg_msg) await self.echo_unknown(msg) + @bot.callback_query_handler(func=lambda _: True) + async def callback_query(call: CallbackQuery): + call_json = json.loads(call.data) + method = call_json.get('method') + match method: + case 'redo': + msg = await self.new_msg(self.main_group, 'processing a redo request...') + msg._cmd = 'redo' + await self.handle_request(msg, force_user=TelegramUser(user=call.from_user)) + await bot.delete_message(chat_id=self.main_group.id, message_id=msg.id) + self.bot = bot self._main_room: TelegramChatRoom | None = None