Оновлення WebSocket API

Короткий список нових action-ів і змін контрактів. Повна специфікація залишається у Domain Core Reference.

Media upload

Outgoing media без S3

create_tg_media_upload_url тепер повертає backend URL /api/tg-client/local-upload/<token>/ і opaque local-upload: key. Raw PUT атомарно записує файл у shared session_data/_outgoing; owner передає його TDLib через inputFileGenerated + local_file_v1 без S3, CDN, presigned GET і повторного network download.

Старі object-storage keys, cloud_key, довільний inputFileGenerated/#url# та абсолютний inputFileLocal у WebSocket-контракті більше не підтримуються.

Chat list

Точкові зміни списку чатів

chat_list_sync.changes[] і live payload.chat_list_change більше не повторюють повний chat item для кожного оновлення. Новий чат приходить як upsert, наявний — як patch у форматі json_patch_v1, видалений — як remove.

get_chats.result.chat.notification_settings містить повний TDLib chatNotificationSettings. Зміни mute, sound, preview, stories, mentions і pinned-message notifications синхронізуються тим самим revision/patch flow.

Messages

Пересилання media-альбомів

forward_message тепер передає весь message_ids[] одним TDLib batch. Telegram створює для пересланої групи спільний новий media_album_id.

Stories

Відповідь на story

Новий reply_to_story надсилає текст або media через нативний TDLib inputMessageReplyToStory. У вхідних повідомленнях story-reply поле replyInfo.is_expired показує, чи story вже вийшла з активного списку.

Stories

Story CRUD, архів і альбоми

Додані публікація/редагування, pin/unpin, архівування feed та CRUD story albums із додаванням, видаленням і reorder.

Media

Minithumbnail у chat list

preview.thumbs[] у результатах chat-list містить browser-ready minithumbnail для photo, video, animation, document, audio, video note і sticker. У пересланих media нормалізований preview також приходить у forwardInfo.minithumbnail.

Для type="sticker" thumb також містить Unicode-поле emoji, якщо воно задане у Telegram sticker metadata.

Search

Пошук і джерела «Збереженого»

search_messages_in_chat підтримує діапазон дат і режим saved_source_chats для чатів, з яких пересилали повідомлення у «Збережено».

Groups

Нові management actions

Додані отримання voters опитування, видалення фото групи/каналу та керування прихованими учасниками супергрупи.

Notifications

Налаштування та active notifications

Додані chat/scope/topic settings, mute presets, reactions, custom sounds і повний lifecycle активних TDLib notifications. Backend також транслює 8 notification updates.

chat_list_change та chat_list_sync

Backend зберігає повний materialized item у projection, але передає frontend лише різницю. Однакова версія item не створює нової revision.

{
  "operation":"patch",
  "format":"json_patch_v1",
  "revision":1843,
  "chat_id":"-100123",
  "patch":[
    {"op":"replace","path":"/chat/unread_count","value":4},
    {"op":"replace","path":"/last_message/text","value":"Нове повідомлення"}
  ]
}

Frontend застосовує операції add, replace і remove до вже наявного item та лише після успішного застосування зберігає revision. Масиви замінюються цілком. Якщо item відсутній, revision пропущена або reset_required=true, необхідно виконати повний get_chats.

Live update містить change у payload.chat_list_change. Після reconnect надішліть {"action":"sync_chat_list","userbot_id":183,"since_revision":1843}. Повний код застосування patch наведений у Domain Core Reference.

forward_message: альбомний flow

Для збереження grouping frontend передає всі повідомлення source-альбому одним масивом. Backend сортує ID, прибирає дублікати та робить один forwardMessages на кожний елемент to_chat_ids[]. Ліміт TDLib — 100 унікальних повідомлень за batch.

{
  "action": "forward_message",
  "userbot_id": 183,
  "from_chat_id": "-1001234567890",
  "to_chat_ids": ["700372203"],
  "message_ids": ["555", "556", "557"],
  "send_copy": false,
  "remove_caption": false
}

Telegram не переносить старий album ID між чатами. Він повертає новий спільний ID для пересланих повідомлень:

{
  "type": "forward_message",
  "result": [
    {"message_id":"555","forwarded_message_id":9001,"media_album_id":"778899"},
    {"message_id":"556","forwarded_message_id":9002,"media_album_id":"778899"},
    {"message_id":"557","forwarded_message_id":9003,"media_album_id":"778899"}
  ]
}

У нормалізованих message updates доступні обидві назви з однаковим значенням: album_id і media_album_id. Якщо передати тільки один елемент source-альбому, Telegram не може відновити інші елементи автоматично.

send_copy/without_sender, remove_caption/without_caption, new_caption і show_caption_above_media залишаються підтриманими.

Telegram notifications: actions та updates

Усі команди надсилаються через Control WebSocket. Детальні поля chatNotificationSettings, scopeNotificationSettings, aliases mute і правила active Notification API описані в Notification Settings — Core Reference.

Нові TDLib updates

UpdateКоли приходитьЩо робить frontend
updateChatNotificationSettingsЗмінилися settings окремого чату.Оновити mute, preview, sound, stories, mentions і pinned notifications цього чату.
updateScopeNotificationSettingsЗмінилися defaults для private/group/channel scope.Оновити глобальні settings відповідного scope.
updateReactionNotificationSettingsЗмінилися правила сповіщень про reactions.Оновити джерела message/story reactions, sound і preview.
updateSavedNotificationSoundsЗмінився список Telegram custom sounds.Перезапросити sounds через get_saved_notification_sounds.
updateActiveNotificationsПочатковий snapshot після ввімкнення Notification API.Атомарно замінити локальний список active notification groups.
updateNotificationGroupДодані або видалені notifications у групі.Застосувати added_notifications[] і removed_notification_ids[] за ID.
updateNotificationЗмінився вміст активного notification.Замінити notification за notification_group_id + notification.id.
updateHavePendingNotificationsTDLib має затримані або ще не отримані notifications.Показати pending-state; не трактувати його як нове повідомлення.

Групи actions

ФункціяActionsПовний опис
Chat settingsget_chat_notification_settings, set_chat_notification_settings, mute_chat, unmute_chat, reset_chat_notification_settingsВідкрити
Scope settingsget_scope_notification_settings, set_scope_notification_settings, get_chat_notification_settings_exceptionsВідкрити
Forum topicsget_forum_topic_notification_settings, set_forum_topic_notification_settingsВідкрити
Reactionsset_reaction_notification_settingsВідкрити
Custom soundsget_saved_notification_sounds, get_saved_notification_sound, add_saved_notification_sound, remove_saved_notification_soundВідкрити
Lifecyclereset_all_notification_settings, configure_notification_api, remove_notification, remove_notification_groupВідкрити

Швидкі payload-и

{"action":"mute_chat","userbot_id":183,"chat_id":"-100123","mute_for":"8h"}
{"action":"set_chat_notification_settings","userbot_id":183,"chat_id":"-100123","show_preview":false,"use_default_show_preview":false}
{"action":"set_scope_notification_settings","userbot_id":183,"scope":"group","mute_for":0,"show_preview":true}
{"action":"configure_notification_api","userbot_id":183,"notification_group_count_max":25,"notification_group_size_max":10}
{"action":"remove_notification","userbot_id":183,"notification_group_id":17,"notification_id":401}

Badge counter options зі скриншотів є локальними UI/OS preferences. Frontend розраховує badge з updateUnreadChatCount і updateUnreadMessageCount; вони не належать до Telegram notification settings.

Швидкі payload-и

ActionМінімальний запитПовний опис
reply_to_story{"action":"reply_to_story","userbot_id":183,"story_poster_chat_id":"775560683","story_id":42,"text":"Відповідь"}Відкрити
get_poll_voters{"action":"get_poll_voters","userbot_id":183,"chat_id":"123","message_id":"555"}Відкрити
delete_chat_photo{"action":"delete_chat_photo","userbot_id":183,"chat_id":"-100123"}Відкрити
toggle_supergroup_has_hidden_members{"action":"toggle_supergroup_has_hidden_members","userbot_id":183,"chat_id":"-100123","has_hidden_members":true}Відкрити