-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmax.diff
More file actions
78 lines (72 loc) · 6.61 KB
/
max.diff
File metadata and controls
78 lines (72 loc) · 6.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
1. Собираем несколько пакетов из одного репозитория - или один пакет в несколько экземпляров?
2. Либо потратить время и переделать бот под универсальный, либо придётся всегда вести рядом два бота
2.5 Есть два варианта: полностью переделать maxapi под телеграм, либо сделать универсальный движок и обёртки для каждого мессенджера. Первый вариант для ленивых, но он непредсказуем. Второй вариант даёт больше контроля.
3. FSM без связки с базой данных, для чего создаётся PostgresDispatcher
4. Заменить основное тело программы на работу с объектами engine, добавить недостающие middlware
5. include_router vs include_routers
6. Нет привычного главного меню с командами - потом нашёл set_my_commands. Мучения с 'Content-Encoding': 'br'. Реверс-инжиниринг официального API ts
7. dp.on_started (max при создании экземпляра диспетчера) vs dp.startup (tg при начале poolling)
7. Синтаксис событий-сообщений и событий-кнопок - нет привычных полей
8. В обработчиках придётся отказаться от аннотации типов параметров
9. Отличия в объектах сообщений и состояний между Телеграмом и Максом
------------ Telegram ------------
message: Message
message_id : int
from_user : User
chat : Chat
date : datetime
text : str
state: FSMContext
set_state(state: str | None) -> Awaitable[None]
get_state() -> Awaitable[Optional[str]]
update_data(**kwargs) -> Awaitable[None]
get_data() -> Awaitable[Dict[str, Any]]
set_data(data: Dict[str, Any]) -> Awaitable[None]
clear() -> Awaitable[None]
callback: CallbackQuery,
from_user: User
message: Message
callback_data: env.BookFields,
event_from_user: NotRequired[User]
event_chat: NotRequired[Chat]
------------ Max ------------
event: MessageCreated
message : Message
sender Optional[User] Отправитель сообщения, может быть None, если сообщение отправлено каналом https://github.com/love-apples/maxapi/discussions/14.
recipient Recipient Получатель сообщения.
timestamp int Временная метка сообщения.
link Optional[LinkedMessage] Связанное сообщение. Может быть None.
body Optional[MessageBody] Тело сообщения. Может быть None.
text str Текст сообщения. Может быть None.
attachments Optional[List[Union[AttachmentButton, Audio, Video, File, Image, Sticker, Share]]] Список вложений. По умолчанию пустой.
stat Optional[MessageStat] Статистика сообщения. Может быть None.
url Optional[str] URL сообщения. Может быть None.
bot Optional[Bot]
get_ids() — получить идентификаторы сообщения (chat_id, user_id)
context: MemoryContext
set_state(state) — установить состояние (State или None для сброса)
get_state() — получить текущее состояние
get_data() — получить все данные контекста
update_data(**kwargs) — обновить данные
set_data(data) — полностью заменить данные
clear()
event: MessageCallback
timestamp: int
message: Message
callback: Callback
timestamp: int
payload: str
user: User
get_ids() — получить идентификаторы сообщения (chat_id, user_id)
10. Даже дата и время передаются по-разному datetime vs timestamp
11. Бот не может поставить лайк сообщению
12. В телеграм команда /start, в макс - отдельное событие
13. Событие bot_started в макс не передаёт context
14. Современный python стал плохо читаем. Проанализируй исходники библиотеки maxapi и объясни, почему когда я в декораторе указываю аргумент context у функции wrapper_max без аннотации типа, выходит ошибка cause=TypeError: on_message.<locals>.decorator.<locals>.wrapper_max() missing 1 required positional argument: 'context'))
А когда явно указываю тип context: MemoryContext - этой ошибки нет
15. Идентификатор сообщения: int+int vs str
16. Из объекта Message нельзя получить chat_id (? через recipient)
17. bot send_message разный порядок реквизитов. Поэтому только именованные параметры
18. Command не поддерживает несколько команд в одном декораторе, поэтому нужно создавать по одной функции на каждую команду. Но можно обойтись одной функцией, которая будет обрабатывать все команды, если внутри неё парсить текст сообщения и выделять команду. Но тогда придётся отказываться от аннотации типов параметров, так как они будут разными для разных событий. Поэтому лучше всё-таки создать по одной функции на каждую команду, чтобы сохранить типизацию и читаемость кода.
19. state.update_data не принимает на вход словарь в чистом виде, только после **.
20. Классические magic-фильтры F имеют разную структуру: например, отфильтровать текстовые сообщения и сообщения с вложениями одинаково не получится.