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());
        }
Example #2
0
        /// <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();
        }