Отчёт по ремонту

? Отчёт по ремонту

В этой записи хочу коснуться тем разработки и исправления ошибок в системе бота. Постараюсь разобрать последние из сбоев: арест через ночь, анабиоз при массовом спаме, переходные даты месяца и года и пересылка сообщений.

Да. Не смотря на то, что нам и так есть чем заняться — приходится возвращаться. Приходится переделывать. Ладно. Насколько я понял, мы не из тех, кто боится признавать ошибки, делать, переделывать, разбирать и собирать по-новой. К счастью, подтверждают слова — дела. И в данном случае, мне повезло писать не о вымыслах, а уже о фактах.

За прошедшее время, мы встретились с 4-я опасными недочётами в программном коде бота. Игнорировать их было опасно. Тем более, что и участников, как я увидел, сильно это беспокоило. И до этого, мы достаточно долго откладывали эти недочёты. Время пришло.

Ошибка «Пересылка сообщений»:

Первая ошибка была с тем, что бот просто отключился в один из дней. И это доставило не мало беспокойства, которое можно заметить по сообщению Сашульки (https://t.me/dostavista_unofficial/1814416 ) и не только её.

Описание:
Ошибка была в двух строчках. Точнее в их отсутствии. Не хватало команд, которые создают объект активного пользователя. Ошибка была в том, что бот обращался к этому объекту в дальнейшем. Но так как, переменной этой не было, то программа обращалась к тому чего не существует. «Возьми то, не знаю что»/ «Возьми то, чего не существует». Естественно это приводило к полному крушению.

Исправление:
Исправили данную проблему просто: добавили недостающие строки, которые указывали создать объект. Как итог: объект появился, бот обращается к тому, что существует и работает благополучно.

Ошибка «Анабиоз при массовом спаме»:

Необходимость принять меры выявилась при очередной спам-атаке. Когда нам присылали кучу стикеров, а бот не мог на них отреагировать, так как был в «анабиозе» https://t.me/dostavista_unofficial/1807103 .

Описание:

Как оказалось, проблема в том, что Телеграм разрешает ботам присылать лишь одно сообщение в одну секунду. Два нельзя. Три тоже. Я позволю себе напомнить, что бот у нас ещё и осуществлял архивацию чата. То есть он обязан был перекидывать сообщения из чата в архив и попутно исполнять команды участников

Собственно, при флуде (с англ. «флуд» — потоп) сообщениями, боту приходилось присылать их в архив. И здесь он получал ограничение на «одно сообщение в секунду». Поэтому, он не мог ответить в чат. Он был занят архивом.

Исправление:

Ошибку исправили, как мне кажется, единственно возможным способом — разгрузили основного бота, переложив архивацию на другого. Для этого создали ещё одного робота, специально под архив. И теперь именно он занимается сохранением сообщений. Наш же бот, теперь полностью может сконцентрироваться на обслуживании пользователей

Как показал результат обновления, при очередной спам-атаке, мы довольно быстро смогли её прекратить. Так сказать — малыми жертвами. Ну, и ещё думаю, стоит отметить, что разделение задач между роботами, повышает качество архивации. Насколько мне известно. У сообщений меньше шансов «пропасть», пока бот обслуживает команду пользователя.

Ошибка «Арест через ночь»:

Проявилась при очередной вспышке необоснованных арестов, как я понял. Была необходимость прекратить аресты от участника с помутнённым на тот момент рассудком. У него было много аккаунтов. Но арестовать их на ночь не получилось. Из-за неправильно написанного кода.

Описание:

Проблема заключалась в условии. Дело в том, что изначально в коде было упущено одно сравнение. Он сравнивал: текущее время и время окончания дня, текущее время и начало дня, текущее время + 4 часа и время окончания дня. Всё. Не хватало сравнения текущего времени + 4 часа и времени начала дня.

Дело вот как было. Время начала дня 08:35, окончания 21:35. Теперь предположим, что мы делаем арест в 19:00. Итак проверяем. 19:00 меньше 21:35 ? Да. 19:00 больше 08:35 ? Да. Это условия для простого ареста (в 4 часа).

Проверяем переход. 19:00 +4 часа, больше 21:35 ? Больше. 19+4 = 23. Значит здесь — переход через ночь и арест даём до утра.

А теперь смотрим то же самое но в 20:30. Проверяем условия. 20:30 меньше 21:35 ? Да, меньше. 20:30 больше 08:35? Да. Хорошо. Условия для простого ареста (на 4 часа) пройдены. Проверяем переход через ночь. 20:30 + 4 часа, больше 21:35 ? Нет. Из-за того, что у нас в полночь, начинается отсчёт с нулей: 20:30 +4 = 00:30 . А 00:30 меньше чем 21:35.

Собственно из-за этого сброса времени была ошибка. Сейчас у нас есть дополнительное условие. Проверим ещё и с ним. 20:30 + 4 часа, меньше 08:35 ? Да, меньше. Значит имеет место переход через ночь и даём арест до утра.

Исправление:

Добавили условие проверки времени после полуночи в виде сравнения с началом дня.

Ошибка «Переходные даты»:

Проявлялось давно. О чём уже сообщали https://t.me/dostavista_unofficial/1733633 .

Вчера снова столкнулись. Была опасность в том, что данной утечкой начнут пользоваться недобросовестные люди и ломать чат.

Описание:

Ошибка заключалась просто в неверном указании даты окончания ареста. Мы создавали объект «календарный день» по описанию: текущий год, текущий месяц, текущий день +1, текущий час, текущие минуты, текущие секунды и тд.

При переходе даты на месяц/год, мы получали первый день месяца, так как добавляли только к полю «дни», а месяц, год и тд оставались прежними.

Исправление:

Переделали создание объекта «календарный день», взяв полностью как копию — текущий день с указанием добавить к созданному 1 день, если арест переходит на следующую дату. Как итог, такой вариант программа понимает нормально. Как итог, вместо 1ое ноября, арест переходил на 1ое декабря.

И это было вкратце об исправлении ошибок. Да-да, вкратце! Как я недавно узнал, подобные записи воодушевляют. Ну, типа не дают пасть духом, вроде того, что показывают, типа «идём к развитию». И да, все и так бы узнали, но лишним, считаю не будет ещё раз отчитаться. Тем более это не какое-то позорное дело, а общее.

Ну, и как итог, я постарался объяснить понятным языком в чём были ошибки и проблемы. Чтобы мы чуть-чуть стали лучше понимать друг-друга.

Ваш, НЕ СТАЛИН.

Обсуждение закрыто.