private async Task ReconnectImpl() { await CloseProto(); Debug.WriteLine("Creating new transport.."); if (ClientSettings.Session.AuthKey == null) { Step3_Response result = await Authenticator.Authenticate(ClientSettings.Session.ServerAddress, ClientSettings.Session.Port); ClientSettings.Session.AuthKey = result.authKey; ClientSettings.Session.TimeOffset = result.timeOffset; ClientSettings.Session.Salt = result.serverSalt; } _protoSender = new MtProtoSender(ClientSettings.Session); Subscribe(); _protoSender.Start(); var request = new InitConnectionAndGetConfigRequest(s_apiLayer, ClientSettings.AppId, _deviceInfo); await SendRpcRequest(request); _configuration = request.config; _dcOptions = new DcOptionsCollection(request.config.dcOptions); OnConnectionStateChanged(ConnectionStateEventArgs.Connected()); }
/// <summary> /// Authenticate to Telegram /// </summary> /// <param name="reconnect"></param> /// <param name="token"></param> /// <returns></returns> public async Task AuthenticateAsync( TelegramAuthModel authModel, bool reconnect = false, CancellationToken token = default) { if (authModel == null || authModel.ApiId <= 0 || string.IsNullOrWhiteSpace(authModel.ApiHash)) { throw new ArgumentException($"Argument {nameof(authModel)} can't be null or contains empty properties. See https://core.telegram.org/api/obtaining_api_id"); } token.ThrowIfCancellationRequested(); if (this._session.AuthKey == null || reconnect) { Step3_Response result = await Authenticator.DoAuthentication(this.transport, token); this._session.AuthKey = result.AuthKey; this._session.TimeOffset = result.TimeOffset; } this.sender = new MtProtoSender(this.transport, this._session); TLRequestGetConfig config = new TLRequestGetConfig(); TLRequestInitConnection request = new TLRequestInitConnection() { ApiId = apiId, AppVersion = "1.0.0", DeviceModel = "PC", LangCode = "en", Query = config, SystemVersion = "Win 10.0" }; TLRequestInvokeWithLayer invokewithLayer = new TLRequestInvokeWithLayer() { Layer = 66, Query = request }; await this.sender.Send(invokewithLayer, token); await this.sender.Receive(invokewithLayer, token); this.dcOptions = ((TLConfig)invokewithLayer.Response).DcOptions.ToList(); }