nerzh / swift-telegram-sdk

🤖 The wrapper for the Telegram Bot API written in Swift. It's not a framework. There is no special syntax here. This is a library that implements all Telegram Bot API methods, which is available to you to work with Vapor, Smoke, Hummingbird, FlyingFox.
https://core.telegram.org/bots/api#available-methods
MIT License
203 stars 32 forks source link

Бот перестает реагировать #22

Closed freefelt closed 1 month ago

freefelt commented 6 months ago

Привет! Есть ли у бота какой-то таймаут? Такое чувство, что, если не пользоваться им 3-4 часа, он просто перестает реагировать. Причем в консоль ничего не выводится, процесс Vapor запущен и работает, а бот не отвечает. Делал на основе примера.

freefelt commented 6 months ago

Вот прям сейчас проект запущен в Xcode. Последний раз в боту было обращение 3.5 часа назад (я на каждую функцию повесил лог, чтобы понять что происходит перед зависанием). Проект выполняется, но бот ни на что не реагирует. http://127.0.0.1:8080 отвечает. Инициализация бота ровно такая же, как и в примере. Я только токен указал.

nerzh commented 6 months ago

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

freefelt commented 6 months ago

Спасибо! Как снова зависнет, я попробую проверить продолжается ли вызываться getUpdates() у connection. Я правильно понимаю, что если он перестает вызываться, то еще раз connection.start() может помочь?

ct4h commented 2 months ago

Ошибка внутри таски лонг пуллинг, на веб хуке аналогично. Если в getUpdates произойдет ошибка, тогда все останавливается

        Task.detached { [weak self] in
            guard let self = self else { return }

            while !Task.isCancelled {
                try await Task.sleep(nanoseconds: 100)
                try await self.getUpdates()
            }
        }

Содержимое цикла обернул в do/catch и в случае ошибки выполняю рестарт

freefelt commented 2 months ago

Спасибо! А можно попросить сам код, где и как ты делаешь рестарт, пожалуйста?

freefelt commented 2 months ago

Нашел в твоем форке, видимо оно. Спасибо большое)

nerzh commented 2 months ago

@ct4h спасибо за ответ, посмотрю детальнее то, о чем вы написали, но судя по коду - похоже на правду, при переписывании кода на async была допущена логическая ошибка и все говорит о том, что исключение затеряется

ct4h commented 2 months ago

@nerzh идея с рестартом провалилась, как только перестал наблюдать за ботом, он перестал реагировать на команды)

обратил внимание, что после каждого запроса увеличивает переменную offset, может упираемся в предел?

Пока склоняюсь к варианту - с помощью https://github.com/vapor/queues-redis-driver.git , раз в час пересоздавать LongPollingConnection

nerzh commented 2 months ago

@ct4h обновил библиотеку до мажорной версии. Логика вынесена, а пример сетевого слоя для вапора все там же в папке -example . Тоесть можно реализовать протокол клиента и использовать с другим фреймворком.

Изменения не сильно но ломающие, логика хендлеров такая же, изменена только начальная конфигурация. Можете попробовать проверить решилась ли проблема, но я так же просто делаю переподключение при ошибке. И не забывайте выставлять уровень логов debug. А в остальном, используйте лучше webhook

nerzh commented 1 month ago

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