Пример #1
0
        public async Task StartFresh()
        {
            Log("Starting fresh");
            if (!InternetAvailable())
            {
                Log("Internet not available. Exiting.");
                return;
            }

            if (Running)
            {
                Log("realtime client is already running");
                return;
            }

            if (AppIsInBackground)
            {
                Log("Application is in background");
                return;
            }
            if (Socket != null)
            {
                Shutdown();
                await Task.Delay(350);
            }
            try
            {
                var connectPacket = new FbnsConnectPacket
                {
                    Payload = await RealtimePayload.BuildPayload(_instaApi)
                };
                Socket = new StreamSocket();
                Socket.Control.KeepAlive = true;
                Socket.Control.NoDelay   = true;
                Socket.Control.OutboundBufferSizeInBytes = 20 * 1024 * 1024;
                await Socket.ConnectAsync(new HostName(DEFAULT_HOST), "443", SocketProtectionLevel.Tls12);

                _inboundReader                    = new DataReader(Socket.InputStream);
                _outboundWriter                   = new DataWriter(Socket.OutputStream);
                _inboundReader.ByteOrder          = ByteOrder.BigEndian;
                _inboundReader.InputStreamOptions = InputStreamOptions.Partial;
                _outboundWriter.ByteOrder         = ByteOrder.BigEndian;
                _runningTokenSource               = new CancellationTokenSource();
                await FbnsPacketEncoder.EncodePacket(connectPacket, _outboundWriter);
            }
            catch (Exception e)
            {
                e.PrintInDebug();
                Restart();
                return;
            }
            StartPollingLoop();
        }
Пример #2
0
        public async Task StartFresh()
        {
            this.Log("Starting fresh");
            if (!InternetAvailable())
            {
                this.Log("Internet not available. Exiting.");
                return;
            }

            if (Running)
            {
                throw new Exception("Push client is already running");
            }
            var connectPacket = new FbnsConnectPacket
            {
                Payload = await RealtimePayload.BuildPayload(_instaApi)
            };

            Socket = new StreamSocket();
            Socket.Control.KeepAlive = true;
            Socket.Control.NoDelay   = true;
            Socket.Control.OutboundBufferSizeInBytes = 10 * 1024 * 1024;
            try
            {
                await Socket.ConnectAsync(new HostName(DEFAULT_HOST), "443", SocketProtectionLevel.Tls12);

                _inboundReader                    = new DataReader(Socket.InputStream);
                _outboundWriter                   = new DataWriter(Socket.OutputStream);
                _inboundReader.ByteOrder          = ByteOrder.BigEndian;
                _inboundReader.InputStreamOptions = InputStreamOptions.Partial;
                _outboundWriter.ByteOrder         = ByteOrder.BigEndian;
                _runningTokenSource               = new CancellationTokenSource();
                await FbnsPacketEncoder.EncodePacket(connectPacket, _outboundWriter);
            }
            catch (Exception e)
            {
                DebugLogger.LogExceptionX(e);
                Restart();
                return;
            }
            StartPollingLoop();
        }
Пример #3
0
        public async Task StartFresh(bool withBG)
        {
            try
            {
                Log($"[{_instaApi.GetLoggedUser().UserName}] " + "Starting fresh");
                var connectPacket = new FbnsConnectPacket
                {
                    Payload = await PayloadProcessor.BuildPayload(ConnectionData)
                };

                Socket = new StreamSocket();
                Socket.Control.KeepAlive = true;
                Socket.Control.NoDelay   = true;
                if (await RequestBackgroundAccess() && !withBG)
                {
                    OnlyOnce = false;
                    if (CanRunInBG())
                    {
                        try
                        {
                            Socket.EnableTransferOwnership(_socketActivityTask.TaskId, SocketActivityConnectedStandbyAction.Wake);
                        }
                        catch (Exception connectedStandby)
                        {
                            Log(connectedStandby);
                            Log($"[{_instaApi.GetLoggedUser().UserName}] " + "Connected standby not available");
                            try
                            {
                                Socket.EnableTransferOwnership(_socketActivityTask.TaskId, SocketActivityConnectedStandbyAction.DoNotWake);
                            }
                            catch (Exception e)
                            {
                                Log(e);
                                Log($"[{_instaApi.GetLoggedUser().UserName}] " + "Failed to transfer socket completely!");
                                if (RetryConnection > 3)
                                {
                                    Shutdown();
                                    await StartFresh(true);

                                    RetryConnection++;
                                    return;
                                }
                                return;
                            }
                        }
                    }
                }
                _runningTokenSource = new CancellationTokenSource();
                await Socket.ConnectAsync(new HostName(HOST_NAME), "443", SocketProtectionLevel.Tls12);

                _inboundReader                    = new DataReader(Socket.InputStream);
                _outboundWriter                   = new DataWriter(Socket.OutputStream);
                _inboundReader.ByteOrder          = ByteOrder.BigEndian;
                _inboundReader.InputStreamOptions = InputStreamOptions.Partial;
                _outboundWriter.ByteOrder         = ByteOrder.BigEndian;
                await Task.Delay(2500);

                await FbnsPacketEncoder.EncodePacket(connectPacket, _outboundWriter);

                await Task.Delay(2500);

                StartPollingLoop();
            }
            catch (Exception ex)
            {
                PrintException("StartFresh", ex);
                Shutdown();
                if (!OnlyOnce)
                {
                    OnlyOnce = true;
                    await StartFresh(true);
                }
            }
        }
Пример #4
0
        public async Task StartFresh()
        {
            this.Log("Starting fresh");
            if (!Instagram.InternetAvailable())
            {
                this.Log("Internet not available. Exiting.");
                return;
            }

            if (Running)
            {
                throw new Exception("Push client is already running");
            }
            var connectPacket = new FbnsConnectPacket
            {
                Payload = await PayloadProcessor.BuildPayload(ConnectionData)
            };

            Socket = new StreamSocket();
            Socket.Control.KeepAlive = true;
            Socket.Control.NoDelay   = true;
            if (await RequestBackgroundAccess())
            {
                try
                {
                    Socket.EnableTransferOwnership(_socketActivityTask.TaskId, SocketActivityConnectedStandbyAction.Wake);
                }
                catch (Exception connectedStandby)
                {
                    this.Log(connectedStandby);
                    this.Log("Connected standby not available");
                    try
                    {
                        Socket.EnableTransferOwnership(_socketActivityTask.TaskId, SocketActivityConnectedStandbyAction.DoNotWake);
                    }
                    catch (Exception e)
                    {
                        DebugLogger.LogException(e);
                        this.Log("Failed to transfer socket completely!");
                        return;
                    }
                }
            }
            else
            {
                // if cannot get background access then there is no point of running push client
                return;
            }

            try
            {
                await Socket.ConnectAsync(new HostName(HOST_NAME), "443", SocketProtectionLevel.Tls12);

                _inboundReader                    = new DataReader(Socket.InputStream);
                _outboundWriter                   = new DataWriter(Socket.OutputStream);
                _inboundReader.ByteOrder          = ByteOrder.BigEndian;
                _inboundReader.InputStreamOptions = InputStreamOptions.Partial;
                _outboundWriter.ByteOrder         = ByteOrder.BigEndian;
                _runningTokenSource               = new CancellationTokenSource();
                await FbnsPacketEncoder.EncodePacket(connectPacket, _outboundWriter);
            }
            catch (Exception e)
            {
                DebugLogger.LogException(e);
                Restart();
                return;
            }
            StartPollingLoop();
        }
Пример #5
0
        public async Task StartFresh()
        {
            try
            {
                Debug.WriteLine($"{nameof(PushClient)}: Starting fresh.");
                if (_loopGroup != null)
                {
                    await Shutdown();
                }
                _loopGroup = new SingleThreadEventLoop();

                var connectPacket = new FbnsConnectPacket
                {
                    Payload = await PayloadProcessor.BuildPayload(ConnectionData)
                };

                Socket = new StreamSocket();
                Socket.Control.KeepAlive = true;
                Socket.Control.NoDelay   = true;
                if (await RequestBackgroundAccess())
                {
                    try
                    {
                        Socket.EnableTransferOwnership(_socketActivityTask.TaskId, SocketActivityConnectedStandbyAction.Wake);
                    }
                    catch (Exception connectedStandby)
                    {
                        Debug.WriteLine(connectedStandby);
                        Debug.WriteLine($"{nameof(PushClient)}: Connected standby not available.");
                        try
                        {
                            Socket.EnableTransferOwnership(_socketActivityTask.TaskId, SocketActivityConnectedStandbyAction.DoNotWake);
                        }
                        catch (Exception e)
                        {
#if !DEBUG
                            Crashes.TrackError(e);
#endif
                            Debug.WriteLine(e);
                            Debug.WriteLine($"{nameof(PushClient)}: Failed to transfer socket completely!");
                            await Shutdown().ConfigureAwait(false);

                            return;
                        }
                    }
                }

                await Socket.ConnectAsync(new HostName(HOST_NAME), "443", SocketProtectionLevel.Tls12);

                var streamSocketChannel = new StreamSocketChannel(Socket);
                streamSocketChannel.Pipeline.AddLast(new FbnsPacketEncoder(), new FbnsPacketDecoder(), this);

                await _loopGroup.RegisterAsync(streamSocketChannel).ConfigureAwait(false);

                await streamSocketChannel.WriteAndFlushAsync(connectPacket).ConfigureAwait(false);
            }
            catch (Exception e)
            {
#if !DEBUG
                Crashes.TrackError(e);
#endif
                await Shutdown().ConfigureAwait(false);
            }
        }