/admin/settings/notices меняет то, что установка говорит, когда с подпиской
что-то происходит: она скоро закончится, лимит трафика почти исчерпан,
автосписание не прошло.
Тексты кампаний пишутся в другом месте — в разделе
Кампании, где вы составляете сообщение и выбираете,
кто его получит. Здесь всё иначе. Эти сообщения доходят до каждого клиента, их
запускает событие, а не решение отправить, и это тот голос, который ваши клиенты
слышат от вас чаще всего, — поэтому оставлять его вшитым в код было неправильно.
Девять уведомлений
У большинства подставлять нечего. Это не упущение: обычно установка хочет
изменить тон, а не данные.
Значения именованные, а не позиционные
В переопределении пишется{days}, а не %d.
Вшитый каталог использует fmt.Sprintf — это безопасно для текста, написанного
рядом с кодом, который его отрисовывает, и небезопасно для текста, написанного в
браузере. %d, встретивший строку, печатает %!d(string=Pro). Лишний глагол
формата печатает %!(EXTRA ...). Ни то, ни другое не падает — оно доходит до
клиента в сломанном виде, а между тем, как вы написали сообщение, и тем, как он
его получил, его никто не читает.
Поэтому подстановка отклоняется при сохранении, если уведомление не несёт такого
значения. {name} в предупреждении об истечении — это ошибка на экране, который
вы сейчас смотрите, а не буквальные фигурные скобки в десяти тысячах сообщений.
Что отклоняется при сохранении
Всё перечисленное иначе превратилось бы в сообщение, которое падает или выглядит сломанным у клиента, спустя часы, когда никто не смотрит:- Значение, которого уведомление не несёт.
- Разметка вне
<b>,<i>,<u>,<s>,<code>,<pre>и<a>— того подмножества, которое принимает HTML-режим Telegram. - Незакрытый тег или закрывающий тег, который ничего не закрывает.
- Ссылка не на
https. Цель видаtg://илиjavascript:в сообщении, которое установка отправляет сама, — это ссылка, которой клиент имеет все основания доверять и которую он никак не может проверить. - Одиночная
<. Telegram отклоняет сообщение с такой, поэтому «5 < 10» ловится, пока вы ещё на экране. Пишите<. - Пустое тело или длиннее 2000 символов. Telegram принимает 4096; ограничение вдвое меньше, потому что к уведомлению добавляется строка с подпиской и клавиатура.
Предпросмотр и тестовая отправка
Предпросмотр подставляет в ваш текст примеры значений —{plan} становится
Pro, {days} становится 5, — чтобы вы оценивали сообщение, а не шаблон. В
панели он показывается как обычный текст: тело — это разметка Telegram, а это
браузер, и его интерпретация показала бы то, чего не выдаст ни Telegram, ни
клиент.
Отправить в группу операторов кладёт одну готовую копию в тему предпросмотра
уведомлений в вашей операторской группе. Именно это показывает настоящий
результат: принимает ли Telegram разметку, как выглядят эмодзи на телефоне, где
проходят переносы строк.
Клиенту это не уходит никогда, и это сделано намеренно. У транзакционного
уведомления есть повод. Сфабриковать предупреждение об истечении на реальной
подписке, чтобы посмотреть, как оно читается, значило бы сообщить человеку, что
его доступ заканчивается, когда это не так.
Тело отрисовывается и сохраняется в момент нажатия кнопки, поэтому группа
получает то, что было в редакторе тогда, — даже если вы продолжили править и
даже если так и не сохранили.
Переопределение — исключение, а не копия
Уведомление, у которого нет строки для языка, использует стандартный текст. Ничего не копируется в базу, когда вы впервые открываете экран. Поэтому Вернуть стандартный текст — это удаление, а не запись текущего стандартного текста. Установка, которая вернулась к стандарту сегодня и обновилась через месяц, получит улучшенный текст. Если бы возврат сохранял копию, установка застыла бы на том тексте, который был в день нажатия кнопки. Два языка независимы. Переписав английское предупреждение об истечении, вы ничего не решили про русское, и каждый сохраняется отдельным запросом — поэтому этот экран не может перезаписать перевод, над которым работает кто-то другой.Когда вступает в силу
В следующем проходе рассыльщика, в пределах пятнадцати минут. Тексты читаются один раз в начале прохода и используются для всех сообщений в нём. Это дешевле, чем запрос на сообщение, и связнее: сотня предупреждений об истечении, отправленных вместе, говорит одно и то же, даже если вы сохранили правку в середине. Если чтение не удалось, рассыльщик оставляет действующие тексты, а не откатывается к стандартным. Изменить то, что читает каждый клиент, из-за одного таймаута было бы хуже, чем отстать на один проход.Права
Для чтения текстов нужноsettings.read. Для записи, возврата, предпросмотра и
тестовой отправки — settings.write.
Предпросмотр относится к записи, хотя ничего не сохраняет: он прогоняет
отрисовщик по тексту, который прислал вызывающий, а право на чтение не должно
быть способом это сделать.
Каждое сохранение, возврат и тестовая отправка попадают в журнал аудита как
notice.overridden, notice.reverted и notice.tested. Тела сообщения в
записи аудита нет: это до 2000 символов текста, читаемых из той таблицы, куда
его только что записали, а журнал аудита фиксирует, кто что сделал, а не хранит
вторую копию содержимого.
Справочник
Отказы — это problem-документы RFC 9457, причина в поле
detail.
Смежные страницы
Уведомления
Что настраивает клиент и что было доставлено на самом деле.
Кампании
Маркетинговые тексты, сегменты и отправки — другой род сообщений.
Уведомления операторам
Группа, куда приходит тестовая отправка, и все её темы.
Брендирование
Вторая половина того, как установка себя подаёт.