From e742ded371e378615fba10de8ecc8cf85b24b252 Mon Sep 17 00:00:00 2001 From: Xilosof Date: Sun, 14 Mar 2021 22:00:51 +0300 Subject: [PATCH] Change exception handling when sending a request. 1) Now RetryAfter is multiplied by 1000, because request contains value in second instead milliseconds. (see https://core.telegram.org/bots/api#responseparameters) 2) Now calls occur in a loop, but a limited number of times. This also ensures that exceptions are caught during a repeated request. --- TelegramBotBase/Sessions/DeviceSession.cs | 46 ++++++++++++++--------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/TelegramBotBase/Sessions/DeviceSession.cs b/TelegramBotBase/Sessions/DeviceSession.cs index e925cac..7ce93c1 100644 --- a/TelegramBotBase/Sessions/DeviceSession.cs +++ b/TelegramBotBase/Sessions/DeviceSession.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; @@ -770,20 +770,24 @@ namespace TelegramBotBase.Sessions /// public async Task API(Func> call) { - try + var numberOfTries = 0; + while (numberOfTries < DeviceSession.MaxNumberOfRetries) { - return await call(this.Client.TelegramClient); - } - catch (ApiRequestException ex) - { - if (ex.Parameters != null) + try { - await Task.Delay(ex.Parameters.RetryAfter); + return await call(Client.TelegramClient); + } + catch (ApiRequestException ex) + { + if (ex.ErrorCode != 429) + throw; - return await call(this.Client.TelegramClient); + if (ex.Parameters != null) + await Task.Delay(ex.Parameters.RetryAfter * 1000); + + numberOfTries++; } } - return default(T); } @@ -794,17 +798,23 @@ namespace TelegramBotBase.Sessions /// public async Task API(Func call) { - try + var numberOfTries = 0; + while (numberOfTries < DeviceSession.MaxNumberOfRetries) { - await call(this.Client.TelegramClient); - } - catch (ApiRequestException ex) - { - if (ex.Parameters != null) + try { - await Task.Delay(ex.Parameters.RetryAfter); + await call(Client.TelegramClient); + return; + } + catch (ApiRequestException ex) + { + if (ex.ErrorCode != 429) + throw; - await call(this.Client.TelegramClient); + if (ex.Parameters != null) + await Task.Delay(ex.Parameters.RetryAfter * 1000); + + numberOfTries++; } } }