11using System ;
2- using System . Net ;
32using System . Net . Http ;
43using System . Threading . Tasks ;
54using NetTelegramBotApi . Requests ;
65using NetTelegramBotApi . Util ;
76using NetTelegramBotApi . Types ;
8- using Newtonsoft . Json ;
7+ using System . Text . Json ;
98
109namespace NetTelegramBotApi
1110{
12- public class TelegramBot
11+ public class TelegramBot : ITelegramBot
1312 {
14- public static readonly JsonSerializerSettings JsonSettings = new JsonSerializerSettings
13+ public static readonly JsonSerializerOptions JsonOptions = new JsonSerializerOptions
1514 {
16- ContractResolver = new Util . JsonLowerCaseUnderscoreContractResolver ( ) ,
17- NullValueHandling = NullValueHandling . Ignore ,
15+ PropertyNamingPolicy = new JsonLowerCaseUnderscoreNamingPolicy ( ) ,
16+ DefaultIgnoreCondition = System . Text . Json . Serialization . JsonIgnoreCondition . WhenWritingNull ,
1817 } ;
1918
20- private string accessToken ;
21-
22- private Uri baseAddress ;
19+ private readonly string accessToken ;
20+ private readonly HttpClient httpClient ;
2321
2422 static TelegramBot ( )
2523 {
26- JsonSettings . Converters . Add ( new UnixDateTimeConverter ( ) ) ;
24+ JsonOptions . Converters . Add ( new UnixDateTimeConverter ( ) ) ;
2725 }
2826
29- /// <summary>
30- /// Proxy information for internet access
31- /// </summary>
32- public IWebProxy WebProxy { get ; set ; }
33-
34- public TelegramBot ( string accessToken )
27+ public TelegramBot ( string accessToken , HttpClient httpClient )
3528 {
3629 if ( string . IsNullOrWhiteSpace ( accessToken ) )
3730 {
38- throw new ArgumentNullException ( " accessToken" ) ;
31+ throw new ArgumentNullException ( nameof ( accessToken ) ) ;
3932 }
4033
4134 this . accessToken = accessToken ;
42- this . baseAddress = new Uri ( "https://api.telegram.org/bot" + accessToken + "/" ) ;
35+ this . httpClient = httpClient ?? new HttpClient ( ) ;
4336 }
4437
4538 /// <exception cref="BotRequestException">When non-Ok response returned from server.</exception>
4639 public async Task < T > MakeRequestAsync < T > ( RequestBase < T > request )
4740 {
48- using ( var client = new HttpClient ( MakeHttpMessageHandler ( ) ) )
41+ var uri = new Uri ( "https://api.telegram.org/bot" + accessToken + "/" + request . MethodName ) ;
42+ using var httpMessage = new HttpRequestMessage ( HttpMethod . Get , uri ) ;
43+ using var postContent = request . CreateHttpContent ( ) ;
44+ if ( postContent != null )
4945 {
50- client . BaseAddress = baseAddress ;
51- using ( var httpMessage = new HttpRequestMessage ( HttpMethod . Get , request . MethodName ) )
52- {
53- var postContent = request . CreateHttpContent ( ) ;
54- if ( postContent != null )
55- {
56- httpMessage . Method = HttpMethod . Post ;
57- httpMessage . Content = postContent ;
58- }
59-
60- using ( var response = await client . SendAsync ( httpMessage ) . ConfigureAwait ( false ) )
61- {
62- if ( ( int ) response . StatusCode >= 500 )
63- {
64- // Let's throw exception. It's server fault
65- response . EnsureSuccessStatusCode ( ) ;
66- }
67-
68- var responseText = await response . Content . ReadAsStringAsync ( ) . ConfigureAwait ( false ) ;
69- var result = DeserializeMessage < BotResponse < T > > ( responseText ) ;
70- if ( ! result . Ok || ! response . IsSuccessStatusCode )
71- {
72- var exceptionMessage = $ "Request failed (status code { ( int ) response . StatusCode } ): { result . Description } ";
73- throw new BotRequestException ( exceptionMessage )
74- {
75- StatusCode = response . StatusCode ,
76- ResponseBody = responseText ,
77- Description = result . Description ,
78- ErrorCode = result . ErrorCode ,
79- Parameters = result . Parameters ,
80- } ;
81- }
46+ httpMessage . Method = HttpMethod . Post ;
47+ httpMessage . Content = postContent ;
48+ }
8249
83- var retVal = result . Result ;
84- var forPostProcessing = retVal as IPostProcessingRequired ;
85- if ( forPostProcessing != null )
86- {
87- forPostProcessing . PostProcess ( accessToken ) ;
88- }
50+ using var response = await httpClient . SendAsync ( httpMessage ) . ConfigureAwait ( false ) ;
51+ if ( ( int ) response . StatusCode >= 500 )
52+ {
53+ // Let's throw exception. It's server fault
54+ response . EnsureSuccessStatusCode ( ) ;
55+ }
8956
90- return retVal ;
91- }
92- }
57+ var responseText = await response . Content . ReadAsStringAsync ( ) . ConfigureAwait ( false ) ;
58+ var result = DeserializeMessage < BotResponse < T > > ( responseText ) ;
59+ if ( ! result . Ok || ! response . IsSuccessStatusCode )
60+ {
61+ var exceptionMessage = $ "Request failed (status code { ( int ) response . StatusCode } ): { result . Description } ";
62+ throw new BotRequestException ( exceptionMessage )
63+ {
64+ StatusCode = response . StatusCode ,
65+ ResponseBody = responseText ,
66+ Description = result . Description ,
67+ ErrorCode = result . ErrorCode ,
68+ Parameters = result . Parameters ,
69+ } ;
9370 }
94- }
9571
96- protected virtual HttpClientHandler MakeHttpMessageHandler ( )
97- {
98- return new HttpClientHandler
72+ var retVal = result . Result ;
73+ if ( retVal is IPostProcessingRequired forPostProcessing )
9974 {
100- Proxy = WebProxy ,
101- UseProxy = ( WebProxy != null )
102- } ;
75+ forPostProcessing . PostProcess ( accessToken ) ;
76+ }
77+
78+ return retVal ;
10379 }
10480
10581 /// <summary>
@@ -112,9 +88,9 @@ public Update DeserializeUpdate(string json)
11288 return DeserializeMessage < Update > ( json ) ;
11389 }
11490
115- protected T DeserializeMessage < T > ( string json )
91+ protected static T DeserializeMessage < T > ( string json )
11692 {
117- return JsonConvert . DeserializeObject < T > ( json , JsonSettings ) ;
93+ return JsonSerializer . Deserialize < T > ( json , JsonOptions ) ;
11894 }
11995 }
12096}
0 commit comments