diff --git a/TLSharp.Core/DataCenter.cs b/TLSharp.Core/DataCenter.cs new file mode 100644 index 0000000..96e6898 --- /dev/null +++ b/TLSharp.Core/DataCenter.cs @@ -0,0 +1,21 @@ + +namespace TLSharp.Core +{ + internal class DataCenter + { + internal DataCenter (int? dcId, string address, int port) + { + DataCenterId = dcId; + Address = address; + Port = port; + } + + internal DataCenter (string address, int port) : this (null, address, port) + { + } + + internal int? DataCenterId { get; private set; } + internal string Address { get; private set; } + internal int Port { get; private set; } + } +} diff --git a/TLSharp.Core/Session.cs b/TLSharp.Core/Session.cs index 987c5d2..6264770 100644 --- a/TLSharp.Core/Session.cs +++ b/TLSharp.Core/Session.cs @@ -59,8 +59,7 @@ namespace TLSharp.Core private const int defaultConnectionPort = 443; public string SessionUserId { get; set; } - public string ServerAddress { get; set; } - public int Port { get; set; } + internal DataCenter DataCenter { get; set; } public AuthKey AuthKey { get; set; } public ulong Id { get; set; } public int Sequence { get; set; } @@ -89,8 +88,8 @@ namespace TLSharp.Core writer.Write(Salt); writer.Write(LastMessageId); writer.Write(TimeOffset); - Serializers.String.write(writer, ServerAddress); - writer.Write(Port); + Serializers.String.write(writer, DataCenter.Address); + writer.Write(DataCenter.Port); if (TLUser != null) { @@ -132,6 +131,7 @@ namespace TLSharp.Core } var authData = Serializers.Bytes.read(reader); + var defaultDataCenter = new DataCenter (serverAddress, port); return new Session(store) { @@ -144,8 +144,7 @@ namespace TLSharp.Core SessionExpires = sessionExpires, TLUser = TLUser, SessionUserId = sessionUserId, - ServerAddress = serverAddress, - Port = port + DataCenter = defaultDataCenter, }; } } @@ -157,12 +156,13 @@ namespace TLSharp.Core public static Session TryLoadOrCreateNew(ISessionStore store, string sessionUserId) { + var defaultDataCenter = new DataCenter (defaultConnectionAddress, defaultConnectionPort); + return store.Load(sessionUserId) ?? new Session(store) { Id = GenerateRandomUlong(), SessionUserId = sessionUserId, - ServerAddress = defaultConnectionAddress, - Port = defaultConnectionPort + DataCenter = defaultDataCenter, }; } diff --git a/TLSharp.Core/TLSharp.Core.csproj b/TLSharp.Core/TLSharp.Core.csproj index fbef942..74efe73 100644 --- a/TLSharp.Core/TLSharp.Core.csproj +++ b/TLSharp.Core/TLSharp.Core.csproj @@ -68,6 +68,7 @@ + diff --git a/TLSharp.Core/TelegramClient.cs b/TLSharp.Core/TelegramClient.cs index 6880313..d9f0454 100644 --- a/TLSharp.Core/TelegramClient.cs +++ b/TLSharp.Core/TelegramClient.cs @@ -45,7 +45,7 @@ namespace TLSharp.Core _handler = handler; _session = Session.TryLoadOrCreateNew(store, sessionUserId); - _transport = new TcpTransport(_session.ServerAddress, _session.Port, _handler); + _transport = new TcpTransport(_session.DataCenter.Address, _session.DataCenter.Port, _handler); } public async Task ConnectAsync(bool reconnect = false) @@ -90,10 +90,10 @@ namespace TLSharp.Core } var dc = dcOptions.First(d => d.Id == dcId); + var dataCenter = new DataCenter (dcId, dc.IpAddress, dc.Port); _transport = new TcpTransport(dc.IpAddress, dc.Port, _handler); - _session.ServerAddress = dc.IpAddress; - _session.Port = dc.Port; + _session.DataCenter = dataCenter; await ConnectAsync(true); @@ -121,6 +121,12 @@ namespace TLSharp.Core } catch(DataCenterMigrationException e) { + if (_session.DataCenter.DataCenterId.HasValue && + _session.DataCenter.DataCenterId.Value == e.DC) + { + throw new Exception($"Telegram server replied requesting a migration to DataCenter {e.DC} when this connection was already using this DataCenter", e); + } + await ReconnectToDcAsync(e.DC); // prepare the request for another try request.ConfirmReceived = false;