В этой записи хочу коснуться тем разработки и исправления ошибок в системе бота. Постараюсь разобрать последние из сбоев: арест через ночь, анабиоз при массовом спаме, переходные даты месяца и года и пересылка сообщений.
Да. Не смотря на то, что нам и так есть чем заняться — приходится возвращаться. Приходится переделывать. Ладно. Насколько я понял, мы не из тех, кто боится признавать ошибки, делать, переделывать, разбирать и собирать по-новой. К счастью, подтверждают слова — дела. И в данном случае, мне повезло писать не о вымыслах, а уже о фактах.
За прошедшее время, мы встретились с 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ое декабря.
И это было вкратце об исправлении ошибок. Да-да, вкратце! Как я недавно узнал, подобные записи воодушевляют. Ну, типа не дают пасть духом, вроде того, что показывают, типа «идём к развитию». И да, все и так бы узнали, но лишним, считаю не будет ещё раз отчитаться. Тем более это не какое-то позорное дело, а общее.
Ну, и как итог, я постарался объяснить понятным языком в чём были ошибки и проблемы. Чтобы мы чуть-чуть стали лучше понимать друг-друга.
Ваш, НЕ СТАЛИН.