Что нового в Echo
История обновлений бота, сайта и игр.
Последнее обновление — 15 октября·159 записей
История обновлений бота, сайта и игр.
Последнее обновление — 15 октября·159 записей
Лимиты бесплатной версии, вопросы в активности и правка карточек
Обновление
Витрина ролей за рубли и два пакета Premium
Кнопка тикета отвечала «Не удалось создать тикет. Проверь права бота» — при исправных правах. Панель тикетов хранит роли поддержки, а на сервере их со временем удаляют и заводят заново. Если хотя бы одна роль из настроек панели больше не существовала, бот не мог собрать права для нового канала и тикет не создавался вовсе — ни у кого на сервере. Сообщение при этом кивало на права бота, и найти причину было невозможно.
Раньше многие разделы выводили всё разом: чейнджлог на две сотни записей, каталог серверов с «показать ещё», рейтинги мафии и бункера на пятьдесят строк, отзывы, сделки. Теперь везде не больше 25 строк на экране, остальное — по страницам с номерами внизу; номер страницы живёт в адресе, ссылкой на вторую страницу можно поделиться.
Галочка «Требовать формат ника» ничего не выключала. Стоило задать хоть один формат и включить «Роли по нику», как бот откатывал роли и слал уведомления «ник участника не соответствует формату сервера» — даже когда владелец снимал главную галочку. Теперь она действительно главная: без неё ни «Роли по нику», ни «Охрана смены ника» не срабатывают, а под галочкой появилась подсказка об этом.
Один замок вместо двух. У раздела была своя галочка «Разрешить администраторам пользоваться этими инструментами» — отдельно от общего замка «Доступ администраторов» на обзоре. Они спорили друг с другом: на обзоре раздел открыт, а у администратора он не открывается, потому что кто-то снял внутреннюю галочку (её мог снять и сам администратор, закрыв раздел от себя). Внутренняя галочка убрана; кому из администраторов доступна премиум-модерация, решает только замок на обзоре.
Мониторинг: ссылку на сервер бот делает сам
Карточка без ссылки больше не висит впустую. Владелец включал «Показывать в каталоге», а поле «Ссылка-приглашение» оставлял пустым — карточка попадала в каталог, но без кнопки «Войти», и людям было некуда нажимать. Одиннадцать серверов стояли так неделями. Теперь поле можно не заполнять: Echo стоит на сервере и сам создаёт вечное приглашение — в канал правил или системный канал, а если их нет, в первый текстовый, где ему разрешено звать людей. Сразу после сохранения карточки, а не по расписанию. Если у сервера есть собственный адрес discord.gg/имя — берётся он.
Если права нет — владелец узнает. Когда боту не хватает права «Создавать приглашения», он шлёт владельцу одно уведомление с просьбой выдать право или вписать ссылку руками, а не молчит.
Тумблер «Показывать в каталоге» срабатывает сразу. Раньше он был обычным полем формы: щёлкнул — «включено», а в каталог сервер попадал только после кнопки «Сохранить» внизу страницы; к тому же до первого сохранения тумблер рисовался включённым, и владелец уходил уверенным, что сервер в каталоге, — а его там не было. Теперь щелчок сам создаёт карточку и включает её (или снимает), без «Сохранить», а пока карточки нет, тумблер честно показывает «выкл».
Видно, есть ли сервер в каталоге — и почему нет. Над настройками стоит плашка с ответом: «Карточка в каталоге — N-е место в топе» со ссылкой на карточку, либо «Карточки в каталоге нет» с причиной — не сохранено, бота нет на сервере, выключен тумблер, скрыта модерацией. Если карточка есть, но без кнопки «Войти» (нет приглашения, ссылка мертва, вход заблокирован), плашка говорит и это, и что делать.
Панели действий: удалённая панель больше не висит в канале
В чём была проблема. Панель удаляли или переносили в другой канал, а сообщение с кнопками оставалось на месте. Кнопки выглядели живыми, но записи о панели уже не было — участники жали «Получить роль» и получали «Панель не найдена», админ был уверен, что панель давно снёс.
Что стало. При удалении панели сообщение в Discord снимается вместе с ней, как у форм, тикетов и ролевых панелей. При переносе в другой канал старое сообщение убирается, а в новом бот выкладывает свежее.
Обновление
Безопасность сайта: обновления и защита входа
Движок сайта обновлён. Next.js поднят до 16.3.5. В версиях до неё разработчики нашли дыру в обработке картинок: особым файлом в формате AVIF можно было заставить сервер выполнить чужой код, без всякого входа. Мы этот формат раздаём, так что заплатка касалась нас напрямую. Заодно обновлена почтовая библиотека — в ней чинили обход проверки адреса получателя.
Вход считает попытки по аккаунту. Раньше неудачные попытки пароля считались по адресу посетителя, а его сайту сообщает заголовок запроса — и на домены игры, которые открыты напрямую, этот заголовок можно было прислать поддельный и менять на каждой попытке. Починено с двух сторон. Во-первых, сайт больше не верит заголовку: настоящий адрес ему передаёт сам сервер, тем же путём, каким пришло соединение, — подставить туда чужой нельзя. Во-вторых, счётчик теперь стоит и на самом нике: пятнадцать промахов подряд — и вход в этот аккаунт замирает на десять минут, откуда бы ни стучались. Побочно починились и журналы: раньше все посетители были записаны одним адресом, и разбирать по ним было нечего.
Файл с ключами закрыт от посторонних. Настройки сайта с паролями к базам лежали с правом чтения для всех пользователей машины. Оставлено чтение только владельцу.
Музыка снова играет
Больше половины суток бот отказывался включать что-либо с ютуба: в ответ на любой трек — «формат недоступен». В логе за десять часов набралось одиннадцать тысяч таких отказов.
Причина в том, каким клиентом бот представляется ютубу. Клиенты ломаются по очереди и без предупреждения: прошлый раз мы уходили с одного, потому что тот стал отвечать отказом в доступе, — теперь перестал отдавать звуковые дорожки его сменщик.
Чинили дважды. Сначала вернули звук, отдав выбор клиента самой качалке. Потом убрали саму возможность повториться: теперь при отказе, похожем на сломанного клиента, бот сам переходит к следующему в очереди и повторяет попытку. Раньше это означало сутки тишины и правку руками.
Кнопка отклонения в кадровых заявках
Нажатие на «отклонить» иногда молчало: у нажатия есть три секунды на ответ, и запрос к базе перед показом окна успевал их съесть. Теперь окно с причиной открывается сразу, а проверки — при отправке.
Обновление
Ивенты: анонсы и победители
Новый раздел в панели управления — «Ивенты». Он для команд, которые регулярно проводят мероприятия и каждый раз собирают один и тот же пост руками: баннер, призовой фонд, тег роли.
Теперь мероприятия живут в справочнике: у каждого своё название, картинка и призовой фонд. Ивент-команда жмёт кнопку на панели, выбирает мероприятие из списка — и анонс уходит в канал готовым. Публикация победителя устроена так же: выбрал мероприятие, вписал имя, статик и фотоотчёт.
Справочник правится и с сайта, и прямо из Discord — кнопкой на самой панели, чтобы за добавлением нового конкурса не приходилось идти в браузер. Тексты обеих публикаций свои: в них подставляются название мероприятия, призовой фонд, имя победителя и статик.
Доступ раздаётся ролями: отдельно те, кто пользуется панелью, отдельно те, кому можно править справочник.
Подпись под анонсом
Под постом стоял юзернейм Discord — вида adm.roxy, а не то имя, под которым человека знают на сервере. Теперь по умолчанию ник на сервере, и это выбирается в настройках: ник, имя пользователя или вовсе без подписи.
В чём была проблема. Оба случая выглядели как поломка, а были молчаливым обрезанием при сохранении: редактор принимал сколько угодно, кнопка «Сохранить» отрабатывала без ошибки, а лишнее не доезжало до базы.
Поля формы заявок. Пятое поле пропадало: сохранялось только четыре, хотя Discord разрешает пять строк в окне и весь остальной бот работает именно с пятью. Теперь пятое поле сохраняется и показывается.
Цепочка действий. Сохранялись только первые пять действий — поэтому шестое и дальше «не срабатывали» и казалось, что после пятого ломается проверка условий. На деле их просто не было. Предел поднят до двадцати пяти: этого хватает на длинные цепочки с условиями, а выполняет их бот по очереди, как и раньше.
Спасибо @Metallist (баг #29) и @VanGex (баг #28) — оба репорта попали точно в причину.
В чём была проблема. Свой бот подключается отдельно от Echo, и на сервере, с которого Echo убрали, он продолжал работать как ни в чём не бывало: настройки хранятся ещё неделю на случай возвращения, а всё это время бот держал сессию и отвечал на команды. Со стороны это выглядело так, будто выгнать Echo нельзя — он остаётся под другим именем.
Что стало. Нет Echo — нет и своего бота: он не поднимается вовсе, а не отключается после подъёма. В панели у такого бота теперь стоит «отключён» с прямой причиной, а не «подключён» у бота, которого нет. Вернёте Echo — свой бот поднимется сам следующим проходом, ничего перенастраивать не нужно.
В чём была проблема. На сервере не оказалось ffmpeg — программы, через которую бот пропускает звук. Каждая попытка включить музыку упиралась в его отсутствие, и вместо отказа одного трека падал весь процесс: на минуту отваливались все серверы разом. Нажатые в этот момент кнопки и команды отвечали «приложение не ответило вовремя» — со стороны это выглядело как случайные сбои на ровном месте, хотя причина была одна.
Что стало. ffmpeg установлен, музыка играет. А чтобы это не повторилось, отказ запуска обрабатывается там же, где и отказ источника: не заигравший трек теперь остаётся не заигравшим треком и уводит плеер к следующему, вместо того чтобы гасить бота.
Одобренная бессрочная заявка считалась активной вечно. Если у кнопки включено «один активный запрос на человека», а срок не задан, то после первого же одобрения подать заявку снова было нельзя — никогда. Панель вступления во фракцию превращалась в одноразовую на всю жизнь, а бот советовал «дождитесь окончания» того, что не кончится.
Теперь активной считается только та заявка, которая действительно активна: ещё не рассмотренная либо одобренная на срок, пока срок идёт. Одобренная бессрочно не мешает подать новую.
Цепочки действий: условия заработали, а формы стали отправляться
Условие на заявке, тикете и форме не проверял никто. В цепочке действий у каждого шага можно указать «выполнять, только если есть роль». Для выдачи ролей, монет и сообщений это работало. Но заявка, тикет и форма без рассмотрения исполняются иначе — они забирают нажатие себе и открывают окно, — и выбирались просто как «первое действие такого типа», не глядя на условие.
Из-за этого ветвление не работало вовсе. Цепочка вида «заявка в канал A, если роль A → заявка в канал B, если роль B» всегда отправляла заявку в канал A: условие первого шага никто не смотрел, а до второго дело уже не доходило. Сколько бы шагов вы ни настроили, срабатывал первый.
Кнопка «Написать в канал» с полями формы не отправлялась. Отправка формы приходит отдельным событием, и бот заново искал нужное действие в цепочке — по тому же правилу «первое подходящее». Если перед формой стоял любой другой шаг, находился он, вид действия не совпадал, и вместо отправленной формы человек получал ошибку. Заявки в цепочке из нескольких штук по той же причине уходили не в тот канал, даже когда окно открывалось от правильной.
У панелей действий появился режим «Схема». Предпросмотр показывает, что будет, если нажать одну конкретную кнопку. Когда кнопок десяток, у половины свои условия, а у меню ещё и пункты со своими цепочками — собрать картину целиком можно было только в голове.
Видно то, что раньше приходилось помнить. У каждой кнопки её цвет, тип, значок замка при условиях доступа и значок формы, если бот что-то спросит перед действием. Кнопка «Настроить» на узле прокручивает к его настройкам и подсвечивает их.
Карта панелей: все панели сервера на одном холсте
Отдельная страница, куда ведёт кнопка «Карта панелей». Холст тянется мышью, приближается колесом, узлы перетаскиваются, раскладка запоминается. Тикет-панели показаны отдельными узлами, и от кнопки, которая открывает тикет, к ней ведёт стрелка: раньше эта связь существовала только в голове — панель действий и тикет-панель живут в разных разделах.
Поля в настройках снова видно
В «Ролях по реакциям» форма выглядела сломанной. Карточка и поля ввода оказались одного цвета, рамок нет — на экране висели только подсказки, и было непонятно, куда нажимать. Теперь у каждого поля свой лейбл и видимые границы. Та же ошибка нашлась и исправлена в «Активности / баллах».
Подписка теперь продаётся только помесячно
Оплата сразу за несколько месяцев со скидкой убрана. Предоплата вперёд фиксирует цену на год, а цена подписки со временем меняется: подняв её, мы оказались бы перед выбором между «держать слово» и «менять условия задним числом». Продавать только месяц — значит менять цену когда нужно, ничего никому не ломая.
Кнопка панели может открывать форму, ответы из которой сразу уходят карточкой в канал. Раньше форма была только у заявки на одобрение, и отчёт о проделанном — «сдал смену», «запись с рейда», «вынес предупреждение» — приходилось оформлять как заявку с кнопкой «одобрить», которую жали не глядя. Теперь у действия «Написать в канал» есть свои поля и пинг ролей: заполнил — ушло по адресу.
Тихий час в отклике на теги считается в своём часовом поясе. По умолчанию московский, но у команды из другого города «не дёргать с 23 до 8» означало нашу ночь, а не их. В настройке появился выбор пояса — от Калининграда до Камчатки.
Напоминания по заявкам можно ставить лестницей: через сколько минут звать дежурных, кого звать вторым шагом и нужно ли повторять дальше.
Авто-сообщение с удалённым каналом больше не бьётся в стену. Если канал удалили, публикация останавливается, а владельцу приходит уведомление — раньше бот пытался отправить его каждые полчаса бесконечно, и об этом никто не знал.