From 6a1114ccd5903f0a64d2b60545664de599af40d8 Mon Sep 17 00:00:00 2001
From: Wizou <11647984+wiz0u@users.noreply.github.com>
Date: Sun, 18 Feb 2024 22:50:42 +0100
Subject: [PATCH] ConnectAsync can be used for quickResume of sessions
(experimental)
---
src/Client.cs | 61 ++++++++++++++++++++++++++++----------------------
src/Session.cs | 1 +
2 files changed, 35 insertions(+), 27 deletions(-)
diff --git a/src/Client.cs b/src/Client.cs
index 922925e..f408fea 100644
--- a/src/Client.cs
+++ b/src/Client.cs
@@ -773,16 +773,17 @@ namespace WTelegram
}
/// Establish connection to Telegram servers without negociating a user session
+ /// Attempt to resume session immediately without issuing Layer/InitConnection/GetConfig (not recommended by default)
/// Usually you shouldn't need to call this method: Use LoginUserIfNeeded instead.
Config callback is queried for: server_address
/// Most methods of this class are async (Task), so please use
- public async Task ConnectAsync()
+ public async Task ConnectAsync(bool quickResume = false)
{
lock (this)
- _connecting ??= DoConnectAsync();
+ _connecting ??= DoConnectAsync(quickResume);
await _connecting;
}
- private async Task DoConnectAsync()
+ private async Task DoConnectAsync(bool quickResume)
{
_cts = new();
IPEndPoint endpoint = null;
@@ -893,32 +894,38 @@ namespace WTelegram
await CreateAuthorizationKey(this, _dcSession);
var keepAliveTask = KeepAlive(_cts.Token);
- var initParams = JSONValue.FromJsonElement(System.Text.Json.JsonSerializer.Deserialize(Config("init_params")));
- TLConfig = await this.InvokeWithLayer(Layer.Version,
- new TL.Methods.InitConnection
- {
- flags = TL.Methods.InitConnection.Flags.has_params,
- api_id = _session.ApiId,
- device_model = Config("device_model"),
- system_version = Config("system_version"),
- app_version = Config("app_version"),
- system_lang_code = Config("system_lang_code"),
- lang_pack = Config("lang_pack"),
- lang_code = Config("lang_code"),
- params_ = initParams,
- query = new TL.Methods.Help_GetConfig()
- });
- _session.DcOptions = TLConfig.dc_options;
- if (_dcSession.DataCenter == null)
+ if (quickResume && _dcSession.Layer == Layer.Version && _dcSession.DataCenter != null && _session.MainDC != 0)
+ TLConfig = new Config { this_dc = _session.MainDC, dc_options = _session.DcOptions };
+ else
{
- _dcSession.DataCenter = _session.DcOptions.Where(dc => dc.id == TLConfig.this_dc)
- .OrderByDescending(dc => dc.ip_address == endpoint?.Address.ToString())
- .ThenByDescending(dc => dc.port == endpoint?.Port)
- .ThenByDescending(dc => dc.flags == (endpoint?.AddressFamily == AddressFamily.InterNetworkV6 ? DcOption.Flags.ipv6 : 0))
- .First();
- _session.DCSessions[TLConfig.this_dc] = _dcSession;
+ var initParams = JSONValue.FromJsonElement(System.Text.Json.JsonSerializer.Deserialize(Config("init_params")));
+ TLConfig = await this.InvokeWithLayer(Layer.Version,
+ new TL.Methods.InitConnection
+ {
+ flags = TL.Methods.InitConnection.Flags.has_params,
+ api_id = _session.ApiId,
+ device_model = Config("device_model"),
+ system_version = Config("system_version"),
+ app_version = Config("app_version"),
+ system_lang_code = Config("system_lang_code"),
+ lang_pack = Config("lang_pack"),
+ lang_code = Config("lang_code"),
+ params_ = initParams,
+ query = new TL.Methods.Help_GetConfig()
+ });
+ _dcSession.Layer = Layer.Version;
+ _session.DcOptions = TLConfig.dc_options;
+ if (_dcSession.DataCenter == null)
+ {
+ _dcSession.DataCenter = _session.DcOptions.Where(dc => dc.id == TLConfig.this_dc)
+ .OrderByDescending(dc => dc.ip_address == endpoint?.Address.ToString())
+ .ThenByDescending(dc => dc.port == endpoint?.Port)
+ .ThenByDescending(dc => dc.flags == (endpoint?.AddressFamily == AddressFamily.InterNetworkV6 ? DcOption.Flags.ipv6 : 0))
+ .First();
+ _session.DCSessions[TLConfig.this_dc] = _dcSession;
+ }
+ if (_session.MainDC == 0) _session.MainDC = TLConfig.this_dc;
}
- if (_session.MainDC == 0) _session.MainDC = TLConfig.this_dc;
}
finally
{
diff --git a/src/Session.cs b/src/Session.cs
index caaee08..7211e84 100644
--- a/src/Session.cs
+++ b/src/Session.cs
@@ -33,6 +33,7 @@ namespace WTelegram
public long LastSentMsgId;
public TL.DcOption DataCenter;
public bool WithoutUpdates;
+ public int Layer;
internal Client Client;
internal int DcID => DataCenter?.id ?? 0;