Как ведёт себя бот
Одно сообщение, редактируемое на месте
Команда отправляет одно сообщение. Каждое следующее нажатие редактирует то же самое сообщение, а не отправляет новое, поэтому живой экран ровно один и он всегда актуален. Чат, в котором накапливается по сообщению на нажатие, станет непригодным уже внутри одной сессии, а старый экран с прошлонедельной ценой — это будущее обращение в поддержку. Пока экран загружается, сообщение заменяется на⏳ Обновляем данные…, а затем
на результат. Повторная отрисовка экрана, который не изменился, ошибкой не
считается: ответ Telegram «message is not modified» проглатывается, потому что с
точки зрения клиента ничего не сломалось.
Новое сообщение отправляют пять вещей: /start и /menu, каждая команда,
открывающая экран, счёт Telegram Stars, подтверждение любого сценария со
свободным вводом и каждое push-уведомление.
Только личные чаты
/start, каждая команда, каждая кнопка, /ops и /login молча ничего не
отвечают, если чат не личный. На экранах аккаунта видны состояние подписки, даты
окончания и суммы платежей, а групповой чат — это аудитория.
Ничего нельзя переслать
Каждое сообщение бота помечено как защищённое от пересылки, а предпросмотр ссылок в нём отключён. Это относится ко всем сообщениям, а не только к аккаунтным, так что вынести экран из чата можно только скриншотом.Русский и английский
Интерфейс существует на двух языках. По умолчанию бот следует локали клиента Telegram: любой код локали, начинающийся сru, получает русский, всё
остальное — английский. Откройте /settings и нажмите ● Авто, RU или EN,
чтобы переопределить выбор: текущий помечен ●, остальные — ○.
Даты в обоих языках всегда отображаются в UTC в виде
02 Jan 2026, 15:04 UTC. Отсутствующая дата отображается как —. Telegram Stars
отображаются как ⭐ 250; любая другая валюта использует собственный показатель
дробной части и отбрасывает её, когда она нулевая. Русские длительности
используют правильные формы множественного числа.
Команды
В меню команд Telegram опубликованы девять команд; десятая скрыта намеренно.
Любое другое сообщение, начинающееся с
/, открывает меню, а не выдаёт ошибку.
/cancel существует потому, что каждый шаг со свободным вводом — промокод,
сообщение в поддержку, сумма пополнения, название подписки, текст к подарку, код
подарка, получатель или промокод в магазине — это состояние, из которого клиент
обязан иметь возможность выйти. Нажатие любой кнопки, пока такой шаг открыт,
тоже выводит из него: собственная Отмена подсказки, пункт меню, кнопка
push-уведомления. Клиент, который ушёл от подсказки и позже набрал «500», получит
меню, а не экран способа пополнения. Иначе состояние жило бы тридцать минут.
Русский список команд, публикуемый в Telegram, не содержит
/login, поэтому
клиент с русской локалью видит восемь пунктов там, где английский видит девять.
Сама команда работает в обоих языках.Глубокие ссылки
Ссылкаt.me/<bot>?start=<payload> открывает чат и отправляет
/start <payload>. Понимаются три значения; любое другое открывает меню.
Идентификатор заказа должен быть корректным UUID, а чужой заказ отрисовывает
домашний экран — бот не раскрывает, существует ли такой заказ.
Первый /start
Первый/start находит — или создаёт — канонического клиента Omniflow за
аккаунтом Telegram. Сосуществовать должны три идентичности: аккаунт Telegram,
клиент Omniflow, которому принадлежат биллинг, кошелёк, поддержка и согласия, и
пользователь Remnawave, которому принадлежит доступ к VPN. Клиент Omniflow должен
существовать до первой покупки, потому что тарифы, кошелёк, поддержка и новости
принадлежат именно ему, тогда как пользователь Remnawave не существует, пока не
отработает выдача доступа.
Разрешение берёт рекомендательную блокировку по Telegram ID, так что два
одновременно пришедших апдейта сходятся на одном клиенте, а не гонятся за
созданием двух. Затем оно ищет связанную идентичность Telegram; если её нет —
принимает существующее сопоставление Remnawave для того же ID, чтобы обновлённая
установка не получила второго клиента; если нет и его — создаёт клиента.
Связь с Remnawave устанавливается лениво и только по точному совпадению
Telegram ID. Когда у клиента нет пользователя Remnawave в записях, бот
спрашивает Remnawave о пользователе с этим Telegram ID и, найдя его, связывает
с клиентом и отдаёт первому слоту подписки этого пользователя — так что
обновлённая или импортированная установка, у которой пользователи VPN уже знают
свои аккаунты Telegram, показывает каждому клиенту его живой доступ на первом
/start, а не «подписки нет» с кнопкой покупки. Если Remnawave не удалось
спросить, запрос повторяется на следующем экране.
Если ни один пользователь Remnawave не несёт этот ID, дальнейшее зависит от
установки. С настроенными покупками у клиента просто пока нет подписки, и он
видит поверхность покупки. Без них бот сообщает об этом и останавливается:
Ваш Telegram пока не связан с подпиской. Обратитесь в поддержку — сотрудник безопасно привяжет аккаунт.с кнопкой
💬 Поддержка, ведущей на настроенный оператором URL поддержки. Бот
никогда не спрашивает имя пользователя, адрес электронной почты или ссылку
подписки и никогда не угадывает: любая альтернатива точному совпадению ID — это
способ присвоить чужую подписку. Привязка существующего аккаунта Remnawave —
операторское действие.
Главное меню
Домашний экран показывает состояние аккаунта, полосу трафика, дату окончания и — когда подписка не просто здорова — уведомление о жизненном цикле вместо строки «Выберите действие». Статус — один из🟢 Активна, ⚪️ Отключена, 🟠 Ограничена, 🔴 Истекла или
⚪️ Неизвестно. Трафик отображается десятиблочной полосой с процентом или как
📡 Трафик: <израсходовано> · безлимит, когда у тарифа нет лимита.
Клавиатура строится один раз, из одного круга запросов, и ряд появляется только
тогда, когда экран за ним действительно можно использовать. Кнопка, ведущая на
пустой или ненастроенный экран, учит клиентов, что боту нельзя доверять.
Клиент, для которого пользователь Remnawave ещё не выдан, не может попасть на
экраны подписки и устройств: эти маршруты возвращают на домашний экран с
уведомлением о жизненном цикле, объясняющим состояние.
🚀 Подключиться
объясняется прямо — он сообщает, что ссылка подписки появится после активации
доступа, — а 🎁 Пригласить работает в любом случае, потому что реферальный
код принадлежит клиенту, а не пользователю VPN.Подписка и трафик
📊 Подписка отвечает на вопрос, ради которого клиенты и открывают бота. Экран
показывает метку статуса, ⏳ Осталось: N дн., 📅 До: <дата> и
📡 Использовано: <израсходовано> / <лимит>. Все четыре числа приходят из
Remnawave, который остаётся авторитетным источником по трафику, сроку и самой
ссылке.
Кнопки — 🔗 Открыть подписку, 📋 Скопировать ссылку,
🔐 Обновить секретную ссылку, 🔄 и ‹ Назад. Первые две появляются только
тогда, когда URL подписки разбирается, содержит хост и использует http или
https: некорректная ссылка опускается, а не отрисовывается сломанной кнопкой.
Обновление ссылки
Ссылка подписки — это предъявительский секрет. Клиенту, который где-то её вставил, нужно отозвать её, не дожидаясь поддержки, и он должен знать цену до подтверждения.🔐 Обновить секретную ссылку показывает:
Текущая ссылка сразу перестанет работать. Подписку потребуется заново добавить на устройства.Подтверждение отзывает ссылку в Remnawave и заново отрисовывает экран подписки с новой. С экрана конкретной подписки обновление возвращает вместо него экран подключения, чтобы новую ссылку можно было сразу добавить. Пока доступ ещё настраивается, обновление отклоняется: «Доступ ещё настраивается. Обновите экран через минуту.»
Подключение устройства
🚀 Подключиться открывает выбор платформы — iPhone/iPad, Android, Windows,
macOS, Linux — и каждая платформа ведёт к инструкции из трёх шагов: установите
рекомендованное приложение, нажмите кнопку добавления профиля, подтвердите,
подключитесь. Каждая инструкция заканчивается фразой «Никому не пересылайте
ссылку подписки.»
Каждый документированный клиент предлагается кнопкой копирования текста с
его deep-link импорта, а не URL-кнопкой. Инлайн-кнопки Telegram принимают только
URL http, https и tg, а в браузере на компьютере обработчика для happ://
может не быть вовсе, — поэтому скопированная ссылка работает везде, где кнопка не
сработала бы. Под ними находятся 📋 Скопировать ссылку с исходным URL подписки
и 🔗 Открыть подписку в виде настоящей URL-кнопки.
Список клиентов общий с личным кабинетом, поэтому две поверхности не могут
рекомендовать разные приложения. Когда ссылки подписки ещё нет, экран сообщает,
что она появится после активации доступа, и не предлагает никаких кнопок
копирования. Полные подробности по каждой платформе — в разделе
Подключение устройства.
Устройства
📱 Устройства показывает Используется: <всего> / <лимит или ∞>, затем по
строке на устройство в виде • <модель или платформа> · <дата последней активности>, а затем:
Для безопасности бот не показывает HWID и IP-адреса.Это жёсткая граница, а не предпочтение отображения: аппаратный идентификатор указывает на конкретную машину человека, поэтому он никогда не появляется ни на экране, ни в callback-данных, ни в логе, а тест защищает от его утечки в кнопку. Удаление устройства — два нажатия:
🗑 <имя устройства>, затем Удалить на
экране подтверждения. При наличии более одного устройства появляется
⚠️ Удалить все устройства, которое подтверждается так же. Оба вызывают
Remnawave и затем заново отрисовывают список; при сбое показывается «Действие не
выполнено — данные могли измениться.»
Бот адресует устройство по его позиции в только что отрисованном списке. Если за
это время список изменился, удаление отклоняется с device list changed; refresh and try again вместо того, чтобы подействовать на то, что теперь стоит на этой
позиции.
Несколько подписок
Когда оператор включает одновременные подписки, первый ряд меню превращается в🗂 Мои подписки. Список показывает для каждой подписки её название, значок фазы
и дату окончания, а также ➕ Добавить подписку, пока это позволяет лимит.
Открытие одной из них даёт название тарифа, фазу, дату окончания и — после выдачи
доступа — 🚀 Подключиться, 📱 Устройства, 🔄 Обновить ссылку вместе с
♻️ Продлить, 🧩 Дополнения там, где тариф их предлагает, ♻️ Автопродление и
✏️ Переименовать.
Экран 📱 Устройства у подписки работает так же, как описанный выше, и каждая
его кнопка — удаление, его подтверждение, обновление и возврат — называет эту
подписку, поэтому удаление действует на собственного VPN-пользователя этой
подписки. Раньше там использовались кнопки экрана с одной подпиской, которые
находят первого VPN-пользователя клиента, и клиент с двумя подписками удалял
устройство не у той.
Значки фаз: Подписки нет, ⚙️ Активируется, 🟢 Активна,
🟡 Скоро закончится, 🟠 Льготный период, 🟠 Лимит исчерпан, ⚪️ Отключена,
🔴 Истекла и ⚠️ Активация не завершена.
✏️ Переименовать открывает шаг со свободным вводом: отправьте новое название из
1–40 обычных символов. Всё, что длиннее или содержит управляющие символы,
отклоняется с «Название должно быть от 1 до 40 обычных символов.» Название новой
подписки по умолчанию — Subscription <slot>.
➕ Добавить подписку заново проверяет политику перед показом каталога, чтобы
отказ был назван, а не общим: одновременные подписки выключены оператором,
достигнут лимит аккаунта или достигнут лимит самого тарифа. При единственной
подписке и выключенном режиме одновременности маршрут переключателя открывает
единственный экран подписки напрямую — режим невидим для установок, которые им не
пользуются. См. Подписки.
♻️ Продлить и 🧩 Дополнения действуют на тариф этой подписки: клиент с
двумя подписками на разных тарифах продлевает вторую на её тарифе, а не на тарифе
первой.
Истёкшая подписка возрождается, а не дублируется. При включённых одновременных
подписках 🛒 Купить на тарифе, который клиент уже держит на истёкшей подписке,
открывает продление этой подписки, а не новый слот рядом с ней — иначе каждое
истечение плодило бы новую подписку, нового пользователя Remnawave и новую
ссылку, пока аккаунт не упёрся бы в лимит и не смог бы купить ничего. Новый слот
открывает только ➕ Добавить подписку: показанный ею каталог несёт это
намерение до самого оформления, а страницы тарифов в нём предлагают одно
🛒 Купить.
Покупка тарифа
1
Откройте каталог
/plans или 🛒 Тарифы. Каждый тариф отрисовывается блоком с четырьмя
фактами, которые решают вопрос о покупке, — период, объём трафика, лимит
устройств, цена — и кнопкой с подписью <название> · <цена>. Пробный тариф
несёт значок 🎁 Пробный период. Сравнение происходит до того, как тариф
открыт, чтобы никому не пришлось открывать пять экранов ради сравнения
четырёх чисел.Тариф без цены в расчётной валюте или без текста на выбранном языке
опускается целиком, а не показывается как недоступный. Когда не остаётся
ничего, пустое состояние называет валюту: «Сейчас нет доступных тарифов в
валюте USD.»2
Прочитайте описание тарифа
Экран деталей добавляет описание, политики повышения, понижения и отмены
словами, льготный период, если он есть, и фразу «Продолжая, вы соглашаетесь с
условиями обслуживания.» Кнопка
📄 Условия обслуживания появляется, когда
оператор настроил URL условий.Предлагается одно действие, выбранное по тому же правилу, что и в
личном кабинете, поэтому две поверхности никогда
не расходятся в том, чем этот тариф является для вас:Запрещённая операция убирается, а не оставляется на провал после нажатия;
бэкенд перепроверяет политику при создании заказа. Пробный период, на
который аккаунт не имеет права, показывает причину — уже использован, есть
активная подписка, аккаунт слишком новый и так далее — и никакой кнопки.
3
Выберите локации, если тариф их предлагает
Тариф, версия которого открывает выбираемые группы серверов, спрашивает о них
до того, как спросит о деньгах; обязательный выбор, собранный после оплаты, —
это возврат. Каждая группа серверов — переключаемая строка, а строка
инструкции формулирует правило: выбирайте свободно, выберите не больше N,
выберите от N до M или выберите минимум N.
Продолжить заново проверяет выбор
и заново отрисовывает конфигуратор, а не идёт дальше, если выбор не сходится.4
Выберите способ оплаты
Перечисляются только подключённые адаптеры, которые действительно могут
провести расчёт в валюте этого тарифа, каждый с подписью, показывающей цену,
которую он спишет:
⭐ Telegram Stars, 🪙 CryptoBot, 🏦 YooKassa,
🧾 Оплата вручную. Предложение способа, который не может провести расчёт,
перенесло бы сбой за точку принятия обязательства. Если не может ни один,
экран сообщает об этом и указывает на поддержку.Выбор способа — это ещё и то, что фиксирует валюту заказа, поэтому он идёт до
итогового экрана. См. Платежи.5
Прочитайте итог и оплатите
Итоговый экран — это ровно та расшифровка, из которой создаётся заказ: тариф,
период, способ, стоимость, скидка, дополнения, применённый кошелёк, сумма к
оплате, — так что предпросмотр и заказ не могут разойтись. Когда кошелёк
покрывает всё, там написано
К оплате: 0 — заказ полностью покрыт кошельком.Элементы управления: 💳 Оплатить, ряд промокода,
👛 Использовать кошелёк, когда на балансе что-то есть, 🧩 Дополнения,
когда у тарифа они есть, 🛍 Отложить и пополнить, когда остаётся внешняя
сумма, 💱 Другой способ и Отмена.💱 Другой способ заново открывает список способов для этого оформления,
а его ‹ Назад возвращает к итогу. Промокод, дополнения, переключатель
кошелька, выбор локаций и продлеваемая подписка сохраняются — меняется
только способ, а вместе с ним валюта.Промокоды
🏷 Ввести промокод открывает шаг со свободным вводом: отправьте код одним
сообщением. Код нормализуется и затем проверяется на этом конкретном заказе
запуском настоящего предпросмотра, поэтому код, действующий на другой тариф,
отклоняется здесь, а не при оплате. При успехе экран подтверждает
✅ Промокод X применён. и заново отправляет итог со строкой скидки. При отказе
сохранённый код очищается, а причина называется: кода не существует или он больше
не действует, он не действует для этого тарифа или аккаунта, он исчерпал лимит
активаций, либо его формат неверен.
Код, переставший быть действительным между экранами, никогда не ломает
оформление: заказ пересчитывается без него, а причина сообщается в итоге. Ввод
промокода ограничен пятью попытками в минуту.
Дополнения
Купленное на итоговом экране оформления дополнение оплачивается вместе с тарифом одним платежом и действует весь период. Купленное посреди периода с экрана🧩 Дополнения конкретной подписки, оно стоит столько, сколько зависит от
остатка периода, и правило напечатано под каждым дополнением, а не обнаруживается
в чеке: оплачивается полностью, оплачивается пропорционально оставшемуся времени
или оплачивается по дневной ставке за оставшиеся дни.
Нажатие на дополнение открывает подтверждение, а не списание. Оно называет
подписку, дополнение, правило пересчёта, точную сумму к списанию сейчас и её
источник: кошелёк, когда баланса хватает, — тогда ✅ Подтвердить подключает
дополнение сразу, — или кошелёк на ту часть, которую он покрывает, и способ
оплаты, который вы выберете следующим шагом, на остаток. Этот экран способа —
тот же, что получает любой заказ с остатком к оплате: в нём каждый подключённый
способ, способный рассчитать валюту, с ценой, равной долгу. См.
Дополнения и конфигуратор.
Проверка подписки на каналы
Если оператор требует подписки на один или несколько каналов Telegram перед покупкой, проверка выполняется в момент движения денег — при нажатии💳 Оплатить в оформлении, 🛒 Купить сейчас в отложенном заказе,
✅ Подтвердить у дополнения, при выборе тарифа или суммы подарка и снова при
создании его заказа, при Подтвердить и оплатить у товара в магазине, — а не
при выборе тарифа. Клиент может выйти из канала между просмотром и оплатой, а
это последний момент перед движением денег. Покупка сохраняется нетронутой, так
что подписка на канал и повторное нажатие кнопки возобновляют ровно то, на чём
остановились:
📣 Сначала подпишитесь — Чтобы продолжить покупку, подпишитесь на:с кнопкой
Открыть <канал> на каждый канал и кнопкой Я подписался, которая
возвращает к прерванной покупке, а не в каталог.
Я подписался спрашивает Telegram заново. Недавний ответ, что клиент состоит в
канале, принимается на веру пять минут, чтобы сценарий не стоил одного вызова
Telegram на экран, но ответ, что не состоит, на веру не принимается никогда
— клиент на этом экране, скорее всего, только что подписался, — и живой ответ
записывается, чтобы фоновый воркер и следующая покупка тоже его видели.
Проверка пропускает при сбое. Канал, о котором Telegram не удалось спросить,
или канал без пригласительной ссылки, которой клиент мог бы воспользоваться, не
блокирует продажу: потерять реальную продажу из-за короткого сбоя Telegram дороже,
чем стоит маркетинговое требование, а фоновый воркер всё равно перепроверяет
членство. Участник без права писать по-прежнему считается участником, а покинувший
канал — нет, хотя Telegram сохраняет ограничение на его аккаунте. См.
Обязательные каналы.
Оплата
Нажатие💳 Оплатить создаёт заказ и сразу запускает платёж. Заказ, который
кошелёк покрывает полностью, никогда не касается платёжного провайдера и сразу
переходит на экран заказа. Иначе экран предлагает 💳 Перейти к оплате для
хостируемого провайдера или ⭐ Оплатить в Telegram для Stars.
Telegram Stars рассчитываются прямо в чате: ⭐ Оплатить в Telegram отправляет
настоящий счёт, после чего Telegram задаёт боту вопрос предпроверки. Бот
одобряет его только тогда, когда заказ принадлежит этому клиенту, валюта
совпадает, сумма совпадает до минорной единицы и заказ ещё открыт — иначе он
отвечает «Заказ больше не активен. Оформите его заново.»
Каждый отказ на подтверждении получает собственный экран: технические работы,
отклонённая дополнительная подписка с указанием причины, неразрешимый выбор
локаций, пробный период, на который права больше нет, операция, запрещённая
тарифом, или общее «Заказ не создан. Попробуйте ещё раз или выберите другой
способ оплаты.» Платёж, который не удалось запустить, сохраняет заказ — и его
резерв в кошельке — и предлагает 🔄 Повторить, которая снова запускает платёж
тем способом, что записан в оформлении, и 💱 Другой способ оплаты, которая
открывает выбор способа для этого заказа. Список содержит каждый подключённый
способ, способный рассчитать валюту заказа, с ценой, равной остатку к оплате, за
вычетом способа, платёж которым по этому заказу уже не прошёл: платёжный сервис
возобновляет существующий платёж на пару «заказ — способ», поэтому неудачный
вернулся бы без изменений.
💳 Оплатить, 🔄 Повторить и выбор способа для заказа защищены от повтора и
делят один лимит частоты — шесть в минуту, — так что двойное нажатие или повторно
доставленный апдейт Telegram не могут превратиться во второй заказ или второй
платёж.
Бот создаёт заказы и платёжные намерения. Он никогда не ставит в очередь выдачу
доступа: провижининг принадлежит воркеру, поэтому заказ переходит в
provisioning, а затем в completed без участия чата. См.
Выдача доступа.Статус и история заказов
/orders или 🧾 Мои заказы перечисляет десять последних заказов в виде
• <дата> · <тариф> · <сумма> · <состояние>, по кнопке на каждый.
Идентификаторы заказов показываются первым блоком UUID — этого достаточно, чтобы
назвать его поддержке. Постраничной навигации нет.
У каждой фазы свой экран:
Оплаченные состояния выше — это состояния заказа на подписку. Заказ, купивший
что-то другое, говорит, что сделали деньги, потому что только воркер переводит
заказ на подписку в «выполнен»: пополнение, подарок и покупка в магазине
навсегда остаются оплаченными и читались бы как «активация» вечно:
Неоплаченный заказ на подарок добавляет, что подарок станет активируемым сразу
после оплаты.
Каждый экран заканчивается кнопками
🔄 Обновить, 🧾 Мои заказы и ‹ В меню.
Обновление делает больше, чем перечитывает собственную запись Omniflow: для
незавершённого заказа с платёжным намерением оно заново опрашивает
провайдера, так что клиент, вернувшийся раньше, чем пришёл вебхук, всё равно
видит рассчитанное состояние. Оплата вручную добавляет строку о том, что оператор
подтвердит её вручную. См. Заказы и платежи.
Отмена записывает причину «cancelled by the customer in Telegram». Отмена, в
которой бэкенд отказал, заново отрисовывает экран заказа без изменений, а не
показывает ошибку.
Кошелёк
/wallet или 👛 Кошелёк показывает доступный баланс, фразу «Средства кошелька
применяются к заказу автоматически, если вы этого не отключите» и последние
десять проводок в расчётной валюте, каждая в виде
<дата> · <тип> · <сумма со знаком>. Типы проводок: пополнение, списание, оплата
заказа, возврат, реферальная награда, корректировка или истечение срока.
Баланс — это итог книги проводок минус всё, что уже зарезервировано черновым или
незавершённым заказом, с нижней границей в ноль, поэтому деньги, обещанные
незаконченной покупке, нельзя потратить дважды. Когда что-то зарезервировано,
экран говорит об этом — «Зарезервировано неоплаченными заказами: X» — и что
сумма вернётся, когда заказ будет оплачен или отменён в 🧾 Мои заказы, потому
что баланс, уменьшившийся без объяснения, выглядит как пропавшие деньги. См.
Кошелёк и книга проводок.
Пополнение
➕ Пополнить кошелёк показывает текущий баланс, Минимум: X · Максимум: Y и —
когда оператор настроил скользящее окно — оставшийся лимит по нему. Готовые суммы
идут по две в ряд, а ✍️ Своя сумма открывает шаг со свободным вводом. Сумма
проверяется до экрана выбора способа оплаты, поэтому отказ объясняется рано,
а не после попытки платежа: ниже минимума, выше максимума, сверх лимита окна или
просто нечитаемая («Не удалось разобрать сумму. Отправьте число, например 500.»).
Отрисовываются только те готовые суммы, которые установка действительно приняла
бы.
Свободный ввод принимает , или . как десятичный разделитель, убирает пробелы
и отказывает отрицательным значениям. Затем выбирается способ оплаты, появляется
экран заказа, и средства зачисляются, когда платёж проходит.
📜 История пополнений перечисляет последние десять с их состояниями и заново
открывает незавершённое. Переплата и недоплата разрешаются в книге проводок:
Omniflow зачисляет ровно то, что провёл провайдер. См.
Пополнение кошелька и отложенный заказ.
Отложенный заказ
🛍 Отложить и пополнить на итоговом экране оформления сохраняет покупку вместо
того, чтобы её бросить, и именно это делает нехватку баланса паузой, а не
тупиком. Экран отложенного заказа показывает тариф, итог, баланс кошелька, сумму
дополнений и одну из четырёх строк состояния: покрыто с включённой или выключенной
автопокупкой либо не хватает суммы с включённой или выключенной автопокупкой.
Он также сообщает, до какого момента заказ хранится — по умолчанию тридцать дней.
Сохранённая цена никогда не используется повторно. Отложенный заказ всегда
котируется по каталогу в его нынешнем виде, поэтому тариф, у которого изменилась
цена, пересчитывается, а исчезнувший тариф даёт «Заказ устарел — очистите
отложенный заказ и соберите его заново.»
Кнопки: 🛒 Купить сейчас, когда баланса хватает, ➕ Пополнить кошелёк, когда
не хватает, 🤖 Автопокупка включена/выключена, 🗑 Очистить и ‹ В меню.
Купить сейчас использует тот же ключ идемпотентности, что и автоматический
проход, поэтому нажатие во время его работы не может списать дважды. Кнопка
работает и при выключенной автопокупке: этот переключатель решает, можно ли
купить заказ, пока вас нет, а клиент, нажимающий кнопку, на месте. Все остальные
проверки — заказ не истёк, покупки не приостановлены, баланс покрывает сумму —
действуют в обоих случаях.
Отложенный заказ один на клиента и общий с магазином: сохранение товара из
магазина заменяет сохранённый тариф. Сохранённый выбор в магазине никогда не
покупается автоматически, потому что цена в магазине — это котировка поставщика,
которая истекает, и списание по ней без присмотра означало бы списание суммы,
которую клиент последний раз видел несколько дней назад.
Магазин цифровых товаров
🛍 Магазин появляется, когда оператор опубликовал хотя бы один товар. В нём
продаются Telegram Premium и Telegram Stars, разделённые на два списка, потому
что на один отвечают длительностью, а на другой — количеством. Это не права на
VPN: они никогда не создают и не изменяют подписку, и каждый экран говорит о
товаре, а не о платеже — клиент, спрашивающий, где его Stars, не спрашивает,
списались ли деньги с карты.
1
Откройте товар
Цена котируется здесь, а не при подтверждении, и экран сообщает, до какого
момента она держится. Если получить цену у поставщика не удалось, экран
сообщает об этом и не предлагает кнопки покупки вообще, чтобы никому не
предлагали покупку, которая сорвалась бы на последнем шаге.
2
Назовите получателя
Купить другому спрашивает @username; Купить себе пропускает этот вопрос,
когда Telegram опубликовал имя пользователя для аккаунта. Вставленные ссылки
t.me/… и голые имена принимаются одинаково и нормализуются, а затем
проверяются по собственному правилу Telegram: от 5 до 32 символов, начиная с
буквы.3
Проверьте и оплатите
Экран проверки заново называет товар, количество, цену, любую скидку, итог и
получателя — отдельной строкой прямо над кнопкой, которая тратит деньги, — а
следом идёт «После отправки доставку нельзя отменить или вернуть.»
Купить себе всё равно показывает этот шаг, потому что аккаунт, о котором знает бот,
и аккаунт, на который клиент хочет получить Stars, — не всегда один и тот же.
Заказ, который кошелёк покрывает полностью, никогда не доходит до платёжного
провайдера.🧾 Мои покупки перечисляет последние десять с состоянием
доставки каждого заказа: ожидает оплаты, оплачено, отправляем, доставлено, не
доставлено, на проверке или возвращено. Доставка на проверке добавляет:
Мы проверяем эту доставку вручную: поставщик не подтвердил результат. Оплата не потеряна — мы либо завершим доставку, либо вернём деньги на баланс.Имя пользователя получателя хранится в заказе магазина, где оно действительно нужно доставке и поддержке, и никогда — в записи клиента. До появления заказа оно сутки хранится в собственной записи экрана проверки: каждый экран сохраняется один раз, а его кнопки несут только идентификатор этой записи, потому что Telegram отводит кнопке 64 байта, и идентификатор товара вместе с именем пользователя в них не помещается. Поэтому старое сообщение с проверкой покупает ровно то, что показывало, даже если после него открыли проверку для другого получателя. См. Подарки и цифровые товары.
🏷 Промокод на экране проверки открывает шаг со свободным вводом: отправьте код
одним сообщением, и экран проверки отрисуется заново со скидкой или с причиной,
по которой код отклонён. Это тот же шаг, который
личный кабинет предлагает для цифровых товаров.
Подарки
🎁 Подарки перечисляет отправленные вами подарки, каждый — последними четырьмя
символами его кода с видом и статусом рядом, не более десяти. Экран предлагает
🎁 Подарить подписку, 👛 Подарить баланс и 🔑 Активировать подарок.
Получателю не нужен аккаунт Omniflow заранее.
Подарок подписки использует обычный каталог тарифов, а не отдельный подарочный
каталог, потому что два прайс-листа могут разойтись. Подарок баланса использует
настроенные оператором суммы пополнения; если не настроено ни одной, экран
сообщает об этом и указывает на поддержку. В любом случае бот затем просит
короткое сообщение до 200 символов. Сообщение необязательно: кнопка
🎁 Подарить без сообщения под подсказкой сразу оформляет подарок, как и
отправленный одиночный -. Более длинное сообщение отклоняется с текстом
«Сообщение длиннее 200 символов», а подсказка остаётся открытой для того же
подарка, так что сокращённое сообщение его завершает.
Код активации после этого показывается один раз:
Мы показываем код один раз и не храним его — сохраните и передайте получателю сами.Хранится только SHA-256 кода, поэтому чтение базы никогда не даёт активируемый код — и отправитель, потерявший его, не может его восстановить, и это осознанный размен. Подарок, который кошелёк не покрыл, добавляет «Подарок станет активируемым сразу после оплаты заказа», кнопку
💳 Оплатить — она открывает
выбор способа для заказа, так что отправитель сам решает, как платить, а не
получает первый настроенный способ, — и ссылку на заказ. Подарки действуют
тридцать дней, чтобы деньги отправителя не удерживались под неизвестный исход
бесконечно.
Один сценарий — один подарок. Сценарий получает собственный ключ
идемпотентности в момент запроса текста, поэтому текст, доставленный Telegram
дважды, попадает на тот же заказ, а второй подарок того же тарифа другому
человеку — это второй заказ, а не повтор первого. Если повтор всё же дойдёт до
экрана, он говорит «Этот подарок уже создан», называет последние символы кода и
ссылается на заказ; пустой код он не показывает никогда.
🔑 Активировать подарок принимает код и отвечает либо «На баланс зачислено
<сумма>», либо «Подписка активируется — это займёт меньше минуты.»
Каждый отказ отрисовывает одно и то же сообщение: «Этот код нельзя
активировать. Проверьте его или попросите отправителя выдать новый.» Получатель,
узнающий разницу между «такого кода нет», «уже активирован» и «истёк», был бы
заодно и атакующим, узнающим, какие коды существуют. Активация ограничена пятью
попытками в минуту на аккаунт Telegram, и это вместе с 80 битами энтропии кода
ограничивает перебор. Активация собственного подарка отклоняется.
Персональные предложения
✨ Ваше предложение появляется в меню только тогда, когда активно хотя бы одно
предложение. Перечисляются до пяти, каждое с обратным отсчётом в целых днях —
«Срок истёк», «Последний день» или «Осталось N дн.», — потому что предложение,
измеряемое в часах, читается как давление, а не как информация. Открытие
предложения показывает его условия и промокод, а также «Предложение можно
использовать один раз. Введите промокод при оформлении заказа.»
Код показывается, а не применяется молча, чтобы клиент видел, что именно ему
скидывают, а оформление заказа оставалось единственным местом, где считается
скидка. Открытие предложения его не расходует: клиент, открывший каталог и
передумавший, ничего не потратил. Не интересно убирает предложение навсегда.
Поддержка
/support или 💬 Поддержка перечисляет до десяти обращений в виде
• <тема> · <статус> · <дата> · N новых с кнопками ✍️ Новое обращение,
необязательной кнопкой прямого контакта, когда оператор настроил URL поддержки,
🔄 Обновить и ‹ Назад. Тема — это первая строка первого сообщения,
обрезанная.
Перед написанием сообщения показываются правила:
Отправьте текст одним сообщением. Можно приложить скриншот или документ до 10 МБ. Никогда не отправляйте пароли, токены и ссылку подписки. Для отмены: /cancel.Сообщение — от 1 до 4000 символов. Принимаются только фото и документы, не более пяти на сообщение и каждый не больше 10 МБ; видео, голосовое сообщение, анимация или стикер отклоняются прямо, а не отбрасываются молча. Сообщение с вложением и без текста сохраняется с телом
[attachment]; сообщение без того и
другого отклоняется.
Omniflow никогда не скачивает и не хранит файл. Сохраняются только ссылка на
файл в Telegram и безопасные метаданные — вид, имя файла, MIME-тип, размер, — и
эти ссылки вычищаются через 90 дней. Файл, загруженный через личный кабинет,
хранится самой установкой, и именно поэтому той поверхности нужен каталог с
правом записи, а боту — нет.
👤 Вы, 🛟 Поддержка или
⚙️ Система, с вложениями, перечисленными как 📎 <имя> (<размер>). Сообщение
обрезается до 600 символов, а экран оставляет самые новые сообщения, которые
помещаются в лимит Telegram в 4096 символов, и сообщает, сколько более ранних он
опустил; последнее сообщение показывается всегда. Раньше длинная переписка
занимала втрое больше лимита, и обращение вообще не открывалось. Все остальные
экраны в крайнем случае подчиняются тому же лимиту: текст, который всё ещё
слишком длинный, сокращается с … между тегами, а не отклоняется. Статус
читается как открыто, ждёт вашего ответа (в панели это pending), решено,
закрыто или объединено, на языке клиента. Кнопки подчиняются тем же правилам,
что и в личном кабинете:
Повторное открытие учитывается в счётчике переоткрытий обращения и поднимает
бейдж непрочитанного у оператора — ровно так же, как из личного кабинета, —
поэтому переоткрытие из чата появляется в очереди как новая работа. Сбой
хранения — в установке нет очереди по умолчанию, недоступна база — сообщается как
«Поддержка сейчас недоступна», и сообщение не сохраняется; на длину сообщения это
никогда не списывается. Если обращение, в которое писал клиент, оказалось
закрытым, объединённым или исчезло, сеанс ввода завершается, и следующая
набранная строка уходит в меню, а не в тот же отказ.
✍️ Новое обращение продолжает самое свежее открытое обращение, а не открывает
второе, — именно это означает клиент, пишущий в чат. Список обращений и личный
кабинет — те места, где второе обращение выбирают осознанно.
Так же читается и сообщение, набранное вне какого-либо сценария. Когда клиент
получает 🛟 Ответ поддержки и просто печатает ответ — текст либо фото или
документ с подписью, — бот добавляет его в самое недавно активное обращение,
которое ещё принимает сообщения (открытое, ждущее ответа клиента или решённое),
при условии, что оно было активно в последние 72 часа, и подтверждает это
сообщением ✅ Сообщение добавлено в обращение с темой и кнопкой
💬 Открыть обращение. Сообщение в решённое обращение открывает его заново, в
ждущее — возвращает оператору. Закрытое или объединённое обращение так никогда
не продолжается, а клиент без недавней переписки получает главное меню, как и
раньше. Подтверждение называет обращение именно потому, что клиент его не
выбирал: если бот угадал неверно, нужная переписка — в одном нажатии.
Ответ оператора приходит push-сообщением с заголовком 🛟 Ответ поддержки,
темой, телом и кнопкой 💬 Открыть обращение. Счётчик непрочитанного
увеличивается только после того, как Telegram принял сообщение, поэтому повторная
доставка не может посчитать его дважды. См.
Служба поддержки.
Новости
📰 Новости — это входящие с отслеживанием прочтения для публикаций оператора,
разделённые на категории 📰 Новость, 📢 Объявление, 🚨 Инцидент и
🛠 Технические работы. Объявление, отправленное в чат и потерянное в истории
переписки, нельзя перечитать; входящие делают его долговечным, а состояние
прочтения управляет значком в меню.
Перечисляются до десяти публикаций, от новых к старым, каждая как 🔵 <заголовок>
со своей категорией и датой. Открытие помечает публикацию прочитанной. Только что
опубликованная запись также приходит push-сообщением с кнопкой 📰 Читать, не
более одного раза на клиента. Публикация, которая была отозвана, истекла или не
имеет текста на языке клиента, невидима, а её открытие по старой кнопке отвечает
«Публикация больше недоступна.»
Настройки и уведомления
/settings содержит все средства управления связью, которыми владеет клиент:
переключатель языка, пять переключателей уведомлений по видам, согласие на
рекламу, тихие часы и ярлык к автопродлению. ✅ означает «включено», ☑️ —
«выключено».
Переключатели сделаны по видам, чтобы отключение предупреждений о трафике не
отключало заодно напоминания о продлении. Реклама выключена, пока клиент её не
включит, и каждое изменение добавляет неизменяемую запись согласия, называющую
цель, версию политики и тот факт, что оно пришло из бота.
Тихие часы предлагают всего три варианта —
22:00–08:00, 23:00–09:00 и
выключены, — потому что явный список удерживает callback-данные закрытыми и
избавляет от разбора времени из свободного ввода. Окно вычисляется в собственном
часовом поясе клиента и может переходить через полночь. Экран прямо
формулирует исключение: «В это время мы не присылаем несрочные сообщения.
Уведомления об оплате, активации и ответах поддержки приходят всегда.»
Зона называется рядом с окном — 22:00–08:00 · Москва · UTC+03:00, — а
🌍 Часовой пояс открывает список примерно из тридцати распространённых зон,
каждая со своим сегодняшним смещением. Выбор записывается в тот же
users.timezone, что и экран настроек веб-кабинета, а зона, выбранная на сайте и
отсутствующая в списке, всё равно показывается по имени. Клиент, который всё ещё
на значении UTC по умолчанию, видит «Часовой пояс не выбран, поэтому
используется UTC», а если язык его Telegram подсказывает зону, выбор сначала
спрашивает о ней («Судя по языку Telegram, вам может подойти Москва ·
UTC+03:00. Это так?»), а не принимает её молча.
Всё, что попадает в чат без запроса, проходит через одну политику доставки —
согласие, предпочтение по виду, тихие часы, лимит рекламы и достижимость в
Telegram, — вычисляемую в одном месте, чтобы два отправителя не могли разойтись в
том, можно ли писать клиенту. Уведомления
описывают полный набор сообщений и причины, по которым сообщение может быть
задержано.
Автопродление и сохранённые способы оплаты
⚙️ Настройки → ♻️ Продлить сообщает, что будет списано, откуда и когда,
потому что это три вещи, которые человеку нужно знать до согласия на списание, при
котором он присутствовать не будет. Здесь ничто не включено по умолчанию.
Когда ни один подключённый провайдер не поддерживает регулярные списания в
расчётной валюте, экран сообщает об этом и не предлагает ничего другого: «Ни один
подключённый способ оплаты не поддерживает автосписание. Мы напомним о продлении
заранее.» Сегодня YooKassa — единственный адаптер, заявляющий поддержку
регулярных списаний, поэтому автопродление требует настроенного YooKassa.
Автопродление — это настройка одной подписки, а не аккаунта. На установке с
одной подпиской экран принадлежит именно ей, и разница невидима. При включённых
одновременных подписках ♻️ Продлить сначала спрашивает, какую подписку
настроить, — «Выберите подписку, которую нужно настроить», — а имя выбранной
возглавляет следующий экран; тот же экран открывается кнопкой ♻️ Автопродление
на странице самой подписки. Каждая кнопка на нём называет подписку, которую
меняет, поэтому включение автопродления для одной никогда не включает его для
другой.
В выключенном состоянии экран читается как «♻️ Автопродление выключено — Мы
напомним о продлении за 7, 3 и 1 день до окончания», с кнопкой
Включить автопродление — она предлагается только когда у подписки есть тариф,
который можно продлить, — и 💳 Способы оплаты, когда хоть один способ сохранён.
Во включённом он показывает тариф, способ, Списываем с: <Баланс или Сохранённая карта>, срок предварительного списания и кнопки на 1, 3 и 7 дней, а также
уведомление о неудачном списании, когда последнее списание не прошло: «Последнее
списание не прошло. Мы попробуем ещё раз автоматически» или, после нескольких
неудач, «Автосписание остановлено после нескольких неудачных попыток. Продлите
вручную или измените способ оплаты.» Собственный код ошибки провайдера намеренно
не показывается: «недостаточно средств» и «отклонено» — операторская лексика.
Ряд источника средств всегда предлагает Баланс, а Сохранённая карта — только
когда способ действительно сохранён. Без него экран говорит об этом прямо —
«Сохранённой карты нет — списание возможно только с баланса кошелька» — вместо
кнопки, единственный исход которой — отказ. Сегодня ни один путь в коде не
сохраняет способ оплаты, поэтому на любой установке кошелёк — единственный
источник, который клиент может выбрать; элементы для сохранённой карты
существуют на тот день, когда она появится.
💳 Способы оплаты перечисляет каждый сохранённый способ с меткой его провайдера,
указанием, какой из них основной, и его статусом — под уведомлением:
Мы храним только ссылку от платёжного провайдера — номер карты и срок действия не сохраняются.Удаление последнего способа никого не повышает, возвращает источник средств к кошельку и приостанавливает автопродление, сохраняя при этом запись согласия. Выключение автопродления очищает тариф, провайдера, валюту и согласие, но намеренно оставляет сохранённые способы в покое: отзыв согласия на автоматические списания — это не то же самое, что просьба забыть карту. См. Регулярные платежи.
Реферальная программа
🎁 Пригласить показывает ваш реферальный код, число приглашённых и фразу
«Награды определяет администратор сервиса.» 📨 Поделиться открывает окно
пересылки Telegram со ссылкой t.me/<bot>?start=ref_<code>, а вторая кнопка
копирует полную ссылку, а не голый код.
Атрибуция записывается в тот момент, когда приглашённый отправляет
/start ref_<code>, до того, как что-либо будет отрисовано, и она работает по
принципу «первая запись побеждает» и навсегда: у приглашённого клиента может быть
только один пригласивший. Самореферал невозможен по построению, а не из-за
проверки, которую можно обойти. Действуют два условия: реферальная программа
должна быть включена, а приглашённый должен быть новым — клиент с оплаченным
заказом в истории не атрибутируется, потому что реферал вознаграждает за
привлечение клиента, а платящего клиента не привела ссылка, по которой он
перешёл сегодня. Код выпускается один раз и остаётся неизменным.
Если Omniflow не смог определить собственное имя пользователя бота при запуске,
кнопки «Поделиться» и копирования опускаются, а не указывают на неработающую
ссылку.
Реферальный экран бота показывает только код и число приглашённых.
Подтверждённые приглашения, начисленные награды, оставшиеся награждаемые места и
условия программы находятся в личном кабинете.
Уровней лояльности в боте нет вовсе — нет ни экрана, ни значка, ни команды.
См. Реферальная программа и лояльность.
/login — вход на сайте
/login выпускает одноразовую ссылку в личный кабинет клиента, действующую
десять минут, и отправляет её обычным текстом:
🔐 Вход в личный кабинет — Ссылка действует 10 минут и сработает один раз. Не пересылайте её — тот, кто откроет ссылку, войдёт в ваш аккаунт.Сценарий начинается в чате, а не в веб-форме, потому что форме пришлось бы принять какой-то идентификатор и ответить, знает ли его Omniflow, а любая версия такого ответа сообщает постороннему, есть ли здесь такой клиент. Ссылка отправляется текстом, а не кнопкой, потому что инлайн-кнопка Telegram открывает встроенный браузер, у которого на нескольких платформах отдельное хранилище cookie от настоящего браузера клиента, — человек вошёл бы туда, куда не собирается возвращаться. Три отказа держатся раздельно: вход по ссылке сейчас недоступен (оператор его не включил или не настроен ключ шифрования), запрошено слишком много ссылок входа и ссылку не удалось создать. Действуют два независимых ограничения — собственный бюджет бота на аккаунт и пять ссылок в час на клиента у сервиса идентичности.
Когда аккаунт приостановлен или удалён
Клиент, которого оператор приостановил, или чей аккаунт удалён, видит один экран вместо любого другого:⛔ Аккаунт приостановлен — Доступ к покупкам и подписке временно закрыт администратором сервиса. Напишите в поддержку — мы разберёмся.или, для удалённого аккаунта, «Этот аккаунт был удалён. Если это ошибка, напишите в поддержку.» На нём есть
💬 Поддержка и, когда оператор настроил URL
поддержки, 💬 Написать в поддержку. Каждая команда, кнопка и шаг со свободным
вводом отвечают им — меню, тарифы, кошелёк, заказы, устройства, обновление
ссылки, /login, — кроме службы поддержки: список обращений, открытие обращения
и запись в него продолжают работать, потому что оператор приостанавливает
клиента, чтобы поговорить с ним, а клиент хочет ответить. Это сторона бота в
том же правиле, которое личный кабинет применяет своим
403 account_unavailable.
Когда покупки не настроены
Коммерческая поверхность необязательна. На установке, где её не удалось собрать, бот сохраняет своё исходное самообслуживание — подписка, подключение, устройства, поддержка, приглашения, настройки, — а каждый коммерческий маршрут отвечает «Покупки ещё не настроены администратором сервиса. Обратитесь в поддержку.» Поддержка при этом сохраняет одно простое сообщение без вложений и без обращения, а из переключателей уведомлений существуют только срок подписки и лимит трафика.Во время технических работ
Пока установка приостановлена, открытие/plans или попытка любой покупки,
пополнения, дополнения, подарка или покупки в магазине показывает:
🛠 Технические работы — Покупки и активация временно недоступны. Уже оплаченные заказы и активные подписки не затронуты — доступ продолжает работать.с ожидаемым временем возобновления, когда оператор его указал, кнопкой
🔄 Повторить и кнопкой 💬 Поддержка. Уведомление появляется на входе, а не на
шаге оплаты, чтобы клиенту сообщили до того, как он что-либо выберет. Просмотр
никогда не блокируется: история заказов, поддержка, новости, кошелёк и уже
выданный доступ продолжают работать, а сбой самой проверки режима обслуживания
никогда не блокирует покупку — режим обслуживания это сигнал оператора, а не
средство контроля, которое закрывается при отказе. См.
Режим обслуживания.
Ограничение частоты запросов и двойные нажатия
Каждое взаимодействие бюджетируется на аккаунт Telegram в окне длиной в одну минуту. Превышение бюджета отвечает «⏳ Слишком много запросов. Подождите немного и попробуйте снова.»
Сбой ограничителя частоты закрывается для действий, двигающих деньги, и
открывается для навигации, так что инфраструктурный инцидент ухудшает
просмотр, а не допускает неограниченные попытки оформления заказа.
Отдельно каждая значимая кнопка — оплата, отмена заказа, выбор провайдера,
переключение кошелька, отправка счёта Stars, удаление устройств, обновление
ссылки, закрытие или переоткрытие обращения, включение автопродления, запуск
пополнения, покупка или очистка отложенного заказа, покупка дополнения, покупка
подарка без текста, подтверждение покупки в магазине, изменение настройки
автопродления — захватывается ровно один раз. Повторно доставленный апдейт Telegram или второе
нажатие разрешаются в «Это действие уже выполнено», а не во второй заказ, платёж
или удаление. Действия, не покрытые этим захватом, несут собственные ключи
идемпотентности.
Захватов два, потому что Telegram доставляет каждое нажатие как новый колбэк со
своим идентификатором, а бот обрабатывает обновления параллельно. Идентификатор
колбэка захватывается на сутки — это останавливает повторно доставленное
обновление; само нажатие — чат, сообщение и кнопка — захватывается на десять
секунд — это останавливает двойное нажатие. Захват только по идентификатору
пропускал два быстрых нажатия на
💳 Оплатить вместе. Заказ, который открывает
нажатие, — пополнение, дополнение, подарок без текста — тоже привязан к ключу
нажатия, поэтому та же кнопка в том же сообщении в течение десяти минут ведёт к
тому же заказу, даже если дубликат прошёл мимо захвата.
Что бот сознательно не делает
/ops — единственная операторская команда
Telegram несёт только операторские уведомления и действия резервного копирования и восстановления; любое другое административное управление живёт в панели администратора./ops находится здесь потому, что резервная копия и
восстановление — это то, что нужно оператору, когда сломана как раз панель.
Отправленная с аккаунта, названного в списке операторов, /ops показывает пять
последних резервных копий с их статусом, размером и временной меткой — и ничего
больше: ни реквизитов подключения, ни путей к файлам, ни материала шифрования.
💾 Back up now делает резервную копию вручную; ♻️ Restore latest… требует
второго подтверждения с указанием копии и предупреждает, что все изменения,
сделанные с момента её создания, будут потеряны. Каждое действие пишет событие
аудита, актором которого является telegram:<id>.
Отправленная с любого другого аккаунта, /ops не даёт вообще никакого ответа.
Её кнопки дополнительно требуют включённой коммерческой поверхности; на установке
без неё они отвечают «Действие не выполнено». См.
Резервное копирование и восстановление.
Проверки состояния и метрики
Процесс бота публикует/healthz, /livez, /readyz и /metrics на отдельном
слушателе, который выключен, пока оператор не задаст его адрес, — и отказывается
делить адрес с вебхуком, чтобы внутренности никогда не публиковались на хосте,
смотрящем в интернет. Каждый апдейт считается по виду, а виды образуют замкнутое
множество, поэтому метка метрики не может расти без ограничения. Ни аккаунт
Telegram, ни тело сообщения, ни callback-данные никогда не становятся меткой
метрики. Спаны для апдейтов создаются, но провайдер трассировки нигде в Omniflow
не установлен, поэтому ничего не экспортируется — см.
Наблюдаемость.