Wiki
猫Table of Contents
- Update Routing Model RU
- Верхнеуровневая маршрутизация
- Что делает prepareUpdateCtx(...)
- Контракт command flow
- Контракт payload flow
- Контракт generic update handlers
- Нормализованные поля MessageContext по видам update
- Update types, которые несут message
- Update types с user, но без message
- Callback-specific update type
- Update types без нормализованных гарантий по user/message
- Что уже достаточно стабильно
- Что пока намеренно не закрыто
- Связанные страницы
Update Routing Model RU
English version: Update-Routing-Model
Эта страница фиксирует текущий контракт маршрутизации обновлений в Laniakea: какие Telegram update types идут через команды, какие через данные callback, какие через generic update handlers, и какие гарантии по MessageContext существуют в каждом потоке.
Это описание текущего поведения фреймворка, а не отдельная новая API-поверхность. Цель страницы — сделать уже существующую маршрутизацию и нормализацию MessageContext явной и тестируемой.
Верхнеуровневая маршрутизация
Сейчас Laniakea маршрутизирует обновления так:
| Update type | Routing path |
|---|---|
message |
command flow |
channel_post |
command flow |
callback_query |
payload flow |
| всё остальное | AddUpdateHandler(...) |
Важно:
message,channel_postиcallback_queryзарезервированы и не должны регистрироваться черезAddUpdateHandler(...).- сцены проверяются раньше обычной маршрутизации, но текущая модель сцен всё ещё по сути ориентирована на сообщения.
Что делает prepareUpdateCtx(...)
До маршрутизации обработчиков Laniakea нормализует MessageContext из входящего Telegram update.
Эта нормализация намеренно шире, чем command и payload routing:
- некоторые update types заполняют
ctx.Msg - некоторые заполняют
ctx.Fromиctx.FromID - callback queries могут заполнять callback target поля
ctx.Text,ctx.Argsиctx.Prefixна этом этапе не заполняются
Это важное разделение:
prepareUpdateCtx(...)задаёт сырой нормализованный shape контекста- routing потом определяет, какой handler path получит этот контекст
Контракт command flow
Command flow применяется только к:
messagechannel_post
Когда команда совпала, действуют такие гарантии:
ctx.Updateвсегда заполненctx.Msgзаполненctx.Prefixсодержит совпавший префикс командыctx.Textсодержит хвост после имени командыctx.Argsсодержитstrings.Fields(ctx.Text)ctx.Loggerпереключается на logger совпавшего плагина, если он задан
Не гарантируется:
ctx.Fromctx.FromID
Показательный edge case:
channel_post, пришедший черезsender_chat, всё равно даётctx.Msg- но
ctx.Fromможет бытьnil - а
ctx.FromIDможет оставаться0
Контракт payload flow
Payload flow применяется только к:
callback_query
Базовые гарантии:
ctx.Updateвсегда заполненctx.CallbackQueryIDзаполненctx.Fromиctx.FromIDзаполняются, если Telegram прислал userctx.Argsзаполняется из декодированных данных callbackctx.Loggerпереключается на logger совпавшего плагина, если он задан
Не гарантируется:
ctx.Textctx.Prefix
У payload flow есть две формы target.
Callback query, привязанный к обычному сообщению
Гарантии:
ctx.Msgзаполненctx.CallbackMsgIDзаполненctx.InlineMsgID == ""
Callback query, привязанный к inline message
Гарантии:
ctx.Msg == nilctx.CallbackMsgID == 0ctx.InlineMsgIDзаполнен
Контракт generic update handlers
Generic update handlers регистрируются через Plugin.AddUpdateHandler(...).
Они применяются ко всем update types вне зарезервированного command/payload flow.
Общие гарантии:
ctx.Updateвсегда заполненctx.Textне нормализуетсяctx.Argsне нормализуетсяctx.Prefixне нормализуется- каждый plugin update handler получает свою копию
MessageContextstruct
Важное ограничение:
- копируется сам
MessageContext, но не обещается глубокая копия всех вложенных Telegram-структур
Нормализованные поля MessageContext по видам update
Update types, которые несут message
| Update type | ctx.Msg |
ctx.From / ctx.FromID |
|---|---|---|
message |
да | да, если есть Msg.From |
edited_message |
да | да, если есть Msg.From |
channel_post |
да | только если есть Msg.From |
edited_channel_post |
да | только если есть Msg.From |
business_message |
да | да, если есть Msg.From |
edited_business_message |
да | да, если есть Msg.From |
Важно:
- message-backed не означает command-routed
edited_message,edited_channel_post,business_messageиedited_business_messageсейчас автоматически не попадают в command flow
Update types с user, но без message
| Update type | ctx.Msg |
ctx.From / ctx.FromID |
|---|---|---|
inline_query |
нет | да |
chosen_inline_result |
нет | да |
shipping_query |
нет | да |
pre_checkout_query |
нет | да |
purchased_paid_media |
нет | да |
my_chat_member |
нет | да |
chat_member |
нет | да |
chat_join_request |
нет | да |
business_connection |
нет | да |
poll_answer |
нет | да |
message_reaction |
нет | да, если Telegram прислал User |
chat_boost |
нет | да |
removed_chat_boost |
нет | да |
Callback-specific update type
| Update type | ctx.Msg |
ctx.From / ctx.FromID |
Спецполя |
|---|---|---|---|
callback_query с Message |
да | да | CallbackQueryID, CallbackMsgID |
callback_query с InlineMessageID |
нет | да | CallbackQueryID, InlineMsgID |
Update types без нормализованных гарантий по user/message
| Update type | ctx.Msg |
ctx.From / ctx.FromID |
|---|---|---|
poll |
нет | нет |
message_reaction_count |
нет | нет |
deleted_business_messages |
нет | нет |
unknown |
нет | нет |
Что уже достаточно стабильно
messageиchannel_postостаются в command flowcallback_queryостаётся в payload flowprepareUpdateCtx(...)сам по себе не заполняетText,ArgsиPrefix- command parsing заполняет
Text,ArgsиPrefix - payload decoding заполняет
Args, но неText - callback target разделяется на chat-message callbacks и inline-message callbacks
edited_messageиedited_channel_postне входят в command routing
Что пока намеренно не закрыто
- должны ли сцены оставаться только message-driven или получить более широкую update model
- должны ли edited/business message-backed updates когда-нибудь получить command-style routing
- стоит ли оформлять “message-backed update” как отдельную внутреннюю концепцию фреймворка
Связанные страницы
Navigation
Start here
Runtime and Architecture
- Bot-Lifecycle
- Webhook-Runtime
- Middleware
- Runners
- Error-Handling
- Logging
- Update-Routing-Model
- Policies
- Scenes
Interaction and Telegram API
- Inline-Keyboards-and-Payloads
- Auto-Generated-Commands
- Drafts
- Rich-Messages
- Localization
- Rate-Limiting
- tgapi-Overview