private void SetStreamListenerState(string sport, string fixtureId, StreamListenerState state)
        {
            var invalidSport     = string.IsNullOrWhiteSpace(sport);
            var invalidFixtureId = string.IsNullOrWhiteSpace(fixtureId);

            if (invalidSport || invalidFixtureId)
            {
                if (invalidSport)
                {
                    _logger.Warn("SetStreamListenerState has sport=null");
                }
                if (invalidFixtureId)
                {
                    _logger.Warn("SetStreamListenerState has fixtureId=null");
                }
                return;
            }

            if (!_streamListeners.ContainsKey(sport))
            {
                _streamListeners.Add(sport, new Dictionary <string, StreamListenerState>());
            }

            if (!_streamListeners[sport].ContainsKey(fixtureId))
            {
                _streamListeners[sport].Add(fixtureId, state);
            }

            _streamListeners[sport][fixtureId] = state;
        }
        /// <summary>
        /// This method determines whether we can connect to the streaming server
        /// by checking current streaming state and match status
        /// </summary>
        /// <param name="resource"></param>
        /// <param name="state"></param>
        /// <returns></returns>
        public bool CanConnectToStreamServer(IResourceFacade resource, StreamListenerState state)
        {
            var isFixtureInSetup = resource.Content.MatchStatus == (int)MatchStatus.Setup;

            return
                (state != StreamListenerState.Streaming &&
                 (!isFixtureInSetup || _settings.AllowFixtureStreamingInSetupMode));
        }
        /// <summary>
        /// This method validates the streaming conditions
        /// check for resource sequence, match status, streaming state
        /// </summary>
        /// <param name="resource"></param>
        /// <param name="state"></param>
        /// <param name="sequence"></param>
        /// <returns></returns>
        public bool ValidateStream(IResourceFacade resource, StreamListenerState state, int sequence)
        {
            if (resource.Content.Sequence - sequence < _settings.StreamSafetyThreshold)
            {
                return(true);
            }

            if (ShouldIgnoreUnprocessedSequence(resource, state))
            {
                return(true);
            }

            return(false);
        }
        private bool ShouldIgnoreUnprocessedSequence(IResourceFacade resource, StreamListenerState state)
        {
            if (state != StreamListenerState.Streaming)
            {
                _logger.Debug($"ValidateStream skipped for {resource} Reason=\"Not Streaming\"");
                return(true);
            }

            if (resource.Content.MatchStatus == (int)MatchStatus.Setup && !_settings.AllowFixtureStreamingInSetupMode)
            {
                _logger.Debug($"ValidateStream skipped for {resource} Reason=\"Fixture is in setup state\"");
                return(true);
            }

            return(false);
        }
        private void SetStreamListenerState(string sport, string fixtureId, StreamListenerState state)
        {
            if (!IsValidStreamListenerData(sport, fixtureId))
            {
                return;
            }

            if (!_streamListeners.ContainsKey(sport))
            {
                _streamListeners.Add(sport, new Dictionary <string, StreamListenerState>());
            }

            if (!_streamListeners[sport].ContainsKey(fixtureId))
            {
                _streamListeners[sport].Add(fixtureId, state);
            }

            _streamListeners[sport][fixtureId] = state;
        }
        private void RecoverFromErroredState(StreamListenerState prevState, out Exception erroredEx)
        {
            erroredEx = null;

            try
            {
                _logger.Warn(
                    $"Fixture {_resource} is in Errored State - trying now to reprocess full snapshot");

                RetrieveAndProcessSnapshot();

                switch (prevState)
                {
                case StreamListenerState.Initializing:
                {
                    Initialize();
                    break;
                }

                case StreamListenerState.Streaming:
                {
                    Become(Streaming);
                    break;
                }
                }

                _erroredException = null;
            }
            catch (Exception ex)
            {
                _logger.Error(
                    $"Fixture {_resource} failed to recover from Errored State - exception - {ex}");

                erroredEx = ex;
            }
        }
 /// <summary>
 /// This method validates the streaming conditions
 /// check for resource sequence, match status, streaming state
 /// </summary>
 /// <param name="resource"></param>
 /// <param name="state"></param>
 /// <param name="sequence"></param>
 /// <returns></returns>
 public bool IsSequenceValid(IResourceFacade resource, StreamListenerState state, int sequence)
 {
     return(resource.Content.Sequence <= sequence || ShouldIgnoreUnprocessedSequence(resource, state));
 }