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