示例#1
0
        public async Task ConnectAsync(bool reconnect = false)
        {
            if (ClientSettings.Session.AuthKey == null || reconnect)
            {
                var result = await DoAuthentication();

                ClientSettings.Session.AuthKey    = result.AuthKey;
                ClientSettings.Session.TimeOffset = result.TimeOffset;

                SessionStore.Save();
            }

            //set-up layer
            var config  = new TlRequestGetConfig();
            var request = new TlRequestInitConnection
            {
                ApiId         = ClientSettings.AppId,
                AppVersion    = "1.0.0",
                DeviceModel   = "PC",
                LangCode      = "en",
                Query         = config,
                SystemVersion = "Win 10.0"
            };

            ConfirmationSendService.StartSendingConfirmation();
            ProtoRecieveService.StartReceiving();

            var response = await SendRequestAsync <TlConfig>(new TlRequestInvokeWithLayer { Layer = 57, Query = request });

            _dcOptions = response.DcOptions.Lists;
        }
        public void StartReceiving()
        {
            if (_recievingCts != null && _recievingCts.IsCancellationRequested)
            {
                return;
            }

            _recievingCts = new CancellationTokenSource();

            Task.Run(
                () =>
            {
                while (!_recievingCts.Token.IsCancellationRequested)
                {
                    try
                    {
                        var recieveTask = TcpTransport.Receieve();
                        recieveTask.Wait(_recievingCts.Token);
                        var recieveData = recieveTask.Result;

                        var decodedData = DecodeMessage(recieveData);

                        Log.Debug($"Recieve message with remote id: {decodedData.Item2}");

                        ProcessReceivedMessage(decodedData.Item1);

                        ConfirmationSendService.AddForSend(decodedData.Item2);
                    }
                    catch (Exception e)
                    {
                        Log.Error("Recieve message failed", e);
                    }
                }
            });
        }
        private async Task StartRecievingTask(CancellationToken cancellationToken)
        {
            while (!cancellationToken.IsCancellationRequested)
            {
                try
                {
                    var recieveData = await TcpTransport.Receieve().ConfigureAwait(false);

                    var decodedData = DecodeMessage(recieveData);

                    Log.Debug($"Receive message with remote id: {decodedData.Item2}");

                    ProcessReceivedMessage(decodedData.Item1);

                    ConfirmationSendService.AddForSend(decodedData.Item2);
                }
                catch (Exception e)
                {
                    Log.Error("Receive message failed. Reconnecting", e);

                    var request = new RequestInvokeWithLayer
                    {
                        Layer = SchemaInfo.SchemaVersion,
                        Query = new RequestInitConnection
                        {
                            ApiId          = ClientSettings.AppId,
                            AppVersion     = "1.0.0",
                            DeviceModel    = "PC",
                            LangCode       = "en",
                            LangPack       = "tdesktop",
                            Query          = new RequestGetConfig(),
                            SystemLangCode = "en",
                            SystemVersion  = "Win 10.0"
                        }
                    };

                    try
                    {
                        await TcpTransport.Disconnect().ConfigureAwait(false);

                        var sendTask = await Sender.SendWithConfim(request).ConfigureAwait(false);

                        ResponseResultGetter.Receive(sendTask.Item2).ContinueWith(
                            async task =>
                        {
                            await sendTask.Item1.ConfigureAwait(false);
                        });
                    }
                    catch
                    {
                        Log.Error("Failed to reconnect", e);
                    }
                }
            }
        }
        private void ProcessContainerMessage(BinaryReader reader)
        {
            Log.Debug("Handle container");

            var size = reader.ReadInt32();

            for (var i = 0; i < size; i++)
            {
                var innerMessageId = reader.ReadUInt64();
                var innerSequence  = reader.ReadInt32();
                var innerLength    = reader.ReadInt32();

                Log.Debug($"Process responce with inner id = '{innerMessageId}' into container");

                ProcessReceivedMessage(reader.ReadBytes(innerLength));

                ConfirmationSendService.AddForSend(innerMessageId);
            }
        }
        private void ProcessReceivedMessage(IObject obj)
        {
            if (Log.IsDebugEnabled)
            {
                var jObject = JsonConvert.SerializeObject(obj);
                Log.Debug($"Try handle response for object: {obj} \n{jObject}");
            }

            switch (obj)
            {
            case var o when RecieveHandlersMap.TryGetValue(o.GetType(), out var handler):
                Log.Debug($"Handler found - {handler}");

                handler.HandleResponce(obj);
                break;

            case TMsgContainer container:
                foreach (var containerMessage in container.Messages)
                {
                    ProcessReceivedMessage(containerMessage.Body);
                    ConfirmationSendService.AddForSend(containerMessage.MsgId);
                }

                break;

            case TgZipPacked zipPacked:
                var unzippedData = ZipPackedHandler.HandleGZipPacked(zipPacked);
                ProcessReceivedMessage(unzippedData);
                break;

            default:
                if (Log.IsErrorEnabled)
                {
                    var jObject = JsonConvert.SerializeObject(obj);
                    Log.Error($"Cannot handle object: {obj} \n{jObject}");
                }

                break;
            }
        }
        private async Task StartRecievingTask(CancellationToken cancellationToken)
        {
            while (!cancellationToken.IsCancellationRequested)
            {
                try
                {
                    var recieveData = await TcpTransport.Receieve().ConfigureAwait(false);

                    var decodedData = DecodeMessage(recieveData);

                    Log.Debug($"Receive message with remote id: {decodedData.Item2}");

                    ProcessReceivedMessage(decodedData.Item1);

                    ConfirmationSendService.AddForSend(decodedData.Item2);
                }
                catch (Exception e)
                {
                    Log.Error("Receive message failed", e);
                }
            }
        }
示例#7
0
        private async Task ConnectAsync(bool forceAuth)
        {
            if (ClientSettings.Session.AuthKey == null || forceAuth)
            {
                var result = await DoAuthentication().ConfigureAwait(false);

                ClientSettings.Session.AuthKey    = result.AuthKey;
                ClientSettings.Session.TimeOffset = result.TimeOffset;

                SessionStore.Save();
            }

            ConfirmationSendService.StartSendingConfirmation();
            ProtoRecieveService.StartReceiving();

            //set-up layer
            var request = new RequestInvokeWithLayer
            {
                Layer = SchemaInfo.SchemaVersion,
                Query = new RequestInitConnection
                {
                    ApiId          = ClientSettings.AppId,
                    AppVersion     = "1.0.0",
                    DeviceModel    = "PC",
                    LangCode       = "en",
                    LangPack       = "tdesktop",
                    SystemLangCode = "en",
                    Query          = new RequestGetConfig(),
                    SystemVersion  = "Win 10.0"
                }
            };

            var response = (TConfig)await SendService.SendRequestAsync(request).ConfigureAwait(false);

            _dcOptions = response.DcOptions.Items.Cast <TDcOption>().ToArray();
        }