Source code for telegram_framework.py_telegram_bot_api.adapters

from dataclasses import fields
import functools
from telebot import types
from telegram_framework import messages, chats, user


[docs] def to_user_data(from_user: types.User)->user.UserData: user_data = user.UserData( id = from_user.id, first_name=from_user.first_name, last_name=from_user.last_name, username=from_user.username, ) return user_data
# Это по идее должен быть интерфейс DummyBot
[docs] class Sender: def __init__(self, user_data): self.user_data = user_data
[docs] def to_call(callback_query: types.CallbackQuery): # Дублирование получения sender тут и в to_message user_data = to_user_data(callback_query.from_user) sender = Sender(user_data) pure_message = messages.create_call( sender, data=callback_query.data ) chat = to_chat(callback_query.message.chat) chat = chats.save_message(chat, pure_message) chat_message = chats.get_last_message(chat) return chat_message
CHAT_STORE = {}
[docs] def to_chat_info(telebot_chat: types.Chat): info_field_names = {f.name for f in fields(chats.Info)} telebot_chat_dict = telebot_chat.__dict__ filtered_data = { key: value for key, value in telebot_chat_dict.items() if key in info_field_names } return chats.Info( _adapter_chat=telebot_chat, **filtered_data, )
[docs] def to_chat(telebot_chat: types.Chat): chat_id = telebot_chat.id new_chat_info = to_chat_info(telebot_chat) new_chat = chats.Chat( id=telebot_chat.id, info=new_chat_info, ) chat = CHAT_STORE.get( chat_id, new_chat, ) return chat
[docs] def to_message(telebot_message: types.Message): user_data = to_user_data(telebot_message.from_user) sender = Sender(user_data) pure_message = messages.create_message( telebot_message.text, # sender=telebot_message.from_user, sender=sender, format_type=telebot_message.reply_markup, message_id=telebot_message.message_id, ) # Тут похоже нужно еще как то восстановить чат chat = to_chat(telebot_message.chat) chat = chats.save_message(chat, pure_message) # chat_message = messages.create_chat_message(pure_message, chat) chat_message = chats.get_last_message(chat) return chat_message
[docs] def prepare_message(telebot_message): instance_mapper = { types.CallbackQuery: to_call, types.Message: to_message, } current_type_function = instance_mapper.get(type(telebot_message)) if current_type_function: return current_type_function(telebot_message) return telebot_message
[docs] def adapt_data(message, handler_function, bot, *args, **kwargs): message = prepare_message(message) result_chat = handler_function(bot, message, *args, **kwargs) CHAT_STORE[result_chat.id] = result_chat return result_chat
[docs] def prepare_handler(handler_function, bot): @functools.wraps(handler_function) def inner(message, *args, **kwargs): return adapt_data(message, handler_function, bot, *args, **kwargs) return inner
[docs] def prepare_call_handler(handler_function, bot): @functools.wraps(handler_function) def inner(call): return adapt_data(call, handler_function, bot) return inner