Shandy, вынести по аналогии с другими ботами это в отдельный модуль и добавить настройки чтобы
1) антимат работал только в выбранных каналах
2) рассматривал сообщения только пользователей с определенной ролью.
Так же можно использовать для обработки сторонние разработки в этой области, например perspective
Алан Гибизов, по пунктам:
1) Значит ошибка в вычислениях. Судя по описанию время ответа = reated_at - created_at.
2) По логике ключевыми полями должны быть id и channel_id, тогда дублирующиеся id у сообщений не будут проблемой
3) Не поможет, если не разобраться что не так у вас сохраняется.
Код подробно не смотрел. На мой взгляд сами записи в таблицу пишутся неверно в save_engineer_reply_info
в WHERE учитывается только id сообщения и игнорируется канал, из-за чего скорее всего дальше по коду не срабатывает INSERT и не все записи пишутся.
Стоит еще раз посмотреть на БД, судя по проблемам у вас там возможно даже нет ключевых полей или они неверно определены иначе проблема дубликатов не должна была возникнуть.
Поправить связь таблиц, убедиться что каждая запись однозначно определяет обращение или ответ, по возможности написать миграцию и перенести часть не дублирующихся данных из старой базы в новую и уже на новой делать аналитику.
1) антимат работал только в выбранных каналах
2) рассматривал сообщения только пользователей с определенной ролью.
Так же можно использовать для обработки сторонние разработки в этой области, например perspective