Exemplo n.º 1
0
        public async Task <bool> ConnectAsync(bool reconnect = false)
        {
            if (_session.AuthKey == null || reconnect)
            {
                var result = await Authenticator.DoAuthentication(_transport);

                _session.AuthKey    = result.AuthKey;
                _session.TimeOffset = result.TimeOffset;
            }

            _sender = new MtProtoSender(_transport, _session);

            //set-up layer
            var config  = new TLRequestGetConfig();
            var request = new TLRequestInitConnection()
            {
                ApiId         = _apiId,
                AppVersion    = "1.0.0",
                DeviceModel   = "PC",
                LangCode      = "en",
                Query         = config,
                SystemVersion = "Win 10.0"
            };
            var invokewithLayer = new TLRequestInvokeWithLayer()
            {
                Layer = 66, Query = request
            };
            await _sender.Send(invokewithLayer);

            await _sender.Receive(invokewithLayer);

            dcOptions = ((TLConfig)invokewithLayer.Response).DcOptions.ToList();

            return(true);
        }
Exemplo n.º 2
0
        public async Task <bool> ConnectAsync(bool reconnect = false)
        {
            if (_session.AuthKey == null || reconnect)
            {
                var result = await Authenticator.DoAuthentication(_transport);

                _session.AuthKey    = result.AuthKey;
                _session.TimeOffset = result.TimeOffset;
            }

            _sender = new MtProtoSender(_transport, _session);

            //set-up layer
            var config  = new TLRequestGetConfig();
            var request = new TLRequestInitConnection()
            {
                api_id = _apiId, app_version = "1.0.0", device_model = "PC", lang_code = "en", query = config, system_version = "Win 10.0"
            };
            var invokewithLayer = new TLRequestInvokeWithLayer()
            {
                layer = 57, query = request
            };
            await _sender.Send(invokewithLayer);

            await _sender.Receive(invokewithLayer);

            dcOptions = ((TLConfig)invokewithLayer.Response).dc_options.lists;

            return(true);
        }
Exemplo n.º 3
0
        public async Task ConnectAsync(bool reconnect = false, CancellationToken token = default(CancellationToken))
        {
            token.ThrowIfCancellationRequested();

            if (session.AuthKey == null || reconnect)
            {
                var result = await Authenticator.DoAuthentication(transport, token).ConfigureAwait(false);

                session.AuthKey    = result.AuthKey;
                session.TimeOffset = result.TimeOffset;
            }

            sender = new MtProtoSender(transport, session);

            //set-up layer
            var config  = new TLRequestGetConfig();
            var request = new TLRequestInitConnection()
            {
                ApiId         = apiId,
                AppVersion    = "1.0.0",
                DeviceModel   = "PC",
                LangCode      = "en",
                Query         = config,
                SystemVersion = "Win 10.0"
            };
            var invokewithLayer = new TLRequestInvokeWithLayer()
            {
                Layer = 66, Query = request
            };
            await sender.Send(invokewithLayer, token).ConfigureAwait(false);

            await sender.Receive(invokewithLayer, token).ConfigureAwait(false);

            dcOptions = ((TLConfig)invokewithLayer.Response).DcOptions.ToList();
        }
Exemplo n.º 4
0
        public async Task <bool> Connect(bool reconnect = false)
        {
            if (_transport == null)
            {
                _transport = new TcpTransport(_session.ServerAddress, _session.Port);
            }

            if (_session.AuthKey == null || reconnect)
            {
                var result = await Authenticator.DoAuthentication(_transport);

                _session.AuthKey    = result.AuthKey;
                _session.TimeOffset = result.TimeOffset;
            }

            _sender = new MtProtoSender(_transport, _session);

            if (!reconnect)
            {
                var request = new InitConnectionRequest(_apiId);

                await _sender.Send(request);

                await _sender.Recieve(request);

                dcOptions            = request.ConfigConstructor.dc_options;
                _session.CurrentDcId = request.ConfigConstructor.this_dc;
            }

            return(true);
        }
Exemplo n.º 5
0
        public async Task <bool> Connect(bool reconnect = false)
        {
            if (_session.AuthKey == null || reconnect)
            {
                var result = await Authenticator.DoAuthentication(_transport);

                _session.AuthKey    = result.AuthKey;
                _session.TimeOffset = result.TimeOffset;
            }

            _sender = new MtProtoSender(_transport, _session);

            if (!reconnect)
            {
                var request = new TL.InvokeWithLayerRequest(config.currentLayer,
                                                            new TL.InitConnectionRequest(config.apiId, config.DeviceModel, config.SystemVersion, config.AppVersion, config.LangCode,
                                                                                         new TL.HelpGetConfigRequest()));

                await _sender.Send(request);

                await _sender.Receive(request);

                var result = (TL.ConfigType)request.Result;
                dcOptions = result.DcOptions;
            }

            return(true);
        }
Exemplo n.º 6
0
        private async Task ReconnectImpl()
        {
            await CloseProto();

            Debug.WriteLine("Creating new transport..");
            if (session.authKey == null)
            {
                var result = await Authenticator.Authenticate(session.serverAddress, session.port);

                session.authKey    = result.authKey;
                session.timeOffset = result.timeOffset;
                session.salt       = result.serverSalt;
            }

            protoSender = new MtProtoSender(session);

            Subscribe();
            protoSender.Start();

            var request = new InitConnectionAndGetConfigRequest(apiLayer, apiId, deviceInfo);

            await SendRpcRequest(request);

            configuration = request.config;
            dcOptions     = new DcOptionsCollection(request.config.dcOptions);

            OnConnectionStateChanged(ConnectionStateEventArgs.Connected());
        }
Exemplo n.º 7
0
        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());
        }
Exemplo n.º 8
0
        public void Dispose()
        {
            if (_transport != null)
            {
                _transport.Dispose();
                _transport = null;
            }

            _sender   = null;
            dcOptions = null;
        }
Exemplo n.º 9
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();
        }
Exemplo n.º 10
0
        private async Task <MtProtoSender> CreateProto(Session protoSession)
        {
            Debug.WriteLine("Creating new transport..");
            if (protoSession.authKey == null)
            {
                var authResult = await Authenticator.Authenticate(protoSession.serverAddress, protoSession.port);

                protoSession.authKey    = authResult.authKey;
                protoSession.timeOffset = authResult.timeOffset;
                protoSession.salt       = authResult.serverSalt;
            }

            var proto = new MtProtoSender(protoSession, true);

            var initRequest = new InitConnectionAndGetConfigRequest(apiLayer, apiId, deviceInfo);
            await proto.Send(initRequest);

            return(proto);
        }
Exemplo n.º 11
0
        public async Task <bool> Connect()
        {
            if (_session.AuthKey == null)
            {
                var result = await Authenticator.DoAuthentication(_transport);

                _session.AuthKey    = result.AuthKey;
                _session.TimeOffset = result.TimeOffset;
            }

            _sender = new MtProtoSender(_transport, _session);

            var request = new InitConnectionRequest(Values.ApiID);

            await _sender.Send(request);

            await _sender.Recieve(request);

            return(IsUserAuthorized());
        }
Exemplo n.º 12
0
        private async Task ConnectInternalAsync(bool reconnect = false, CancellationToken token = default(CancellationToken))
        {
            token.ThrowIfCancellationRequested();

            Session   = SessionFactory.TryLoadOrCreateNew(store, sessionUserId);
            transport = new TcpTransport(Session.DataCenter.Address, Session.DataCenter.Port, this.handler);

            if (Session.AuthKey == null || reconnect)
            {
                var result = await Authenticator.DoAuthentication(transport, token).ConfigureAwait(false);

                Session.AuthKey    = result.AuthKey;
                Session.TimeOffset = result.TimeOffset;
            }

            sender = new MtProtoSender(transport, store, Session);

            //set-up layer
            var config  = new TLRequestGetConfig();
            var request = new TLRequestInitConnection()
            {
                ApiId          = apiId,
                AppVersion     = "1.0.0",
                DeviceModel    = "PC",
                LangCode       = "en",
                Query          = config,
                SystemVersion  = "Win 10.0",
                SystemLangCode = "en",
                LangPack       = ""
            };
            var invokewithLayer = new TLRequestInvokeWithLayer()
            {
                Layer = 108, Query = request
            };
            await sender.Send(invokewithLayer, token).ConfigureAwait(false);

            await sender.Receive(invokewithLayer, token).ConfigureAwait(false);

            dcOptions = ((TLConfig)invokewithLayer.Response).DcOptions.ToList();
        }