Пример #1
0
        private void _checkOnlineStreams()
        {
            var liveStreamers = _getLiveStreamers().Result;

            foreach (var channel in _channelIds)
            {
                var currentStream = liveStreamers.Where(x => x.Channel.Id == channel).FirstOrDefault();
                if (currentStream == null)
                {
                    //offline
                    if (_statuses[channel] != null)
                    {
                        var channelName = _statuses[channel].Channel.Name;
                        //have gone offline
                        _statuses[channel] = null;

                        if (!_isStartup || (_isStartup && _invokeEventsOnStart))
                        {
                            OnStreamOffline?.Invoke(this,
                                                    new OnStreamOfflineArgs {
                                ChannelId = channel, Channel = channelName, CheckIntervalSeconds = CheckIntervalSeconds
                            });
                        }
                    }
                }
                else
                {
                    var channelName = currentStream.Channel.Name;
                    //online
                    if (_statuses[channel] == null)
                    {
                        //have gone online
                        if (!_isStartup || (_isStartup && _invokeEventsOnStart))
                        {
                            OnStreamOnline?.Invoke(this,
                                                   new OnStreamOnlineArgs {
                                ChannelId = channel, Channel = channelName, Stream = currentStream, CheckIntervalSeconds = CheckIntervalSeconds
                            });
                        }
                    }
                    else
                    {
                        //stream updated
                        if (!_isStartup || (_isStartup && _invokeEventsOnStart))
                        {
                            OnStreamUpdate?.Invoke(this,
                                                   new OnStreamUpdateArgs {
                                ChannelId = channel, Channel = channelName, Stream = currentStream, CheckIntervalSeconds = CheckIntervalSeconds
                            });
                        }
                    }
                    _statuses[channel] = currentStream;
                }
            }
        }
Пример #2
0
        /// <summary>
        /// Cleanup streams that have gone offline.
        /// </summary>
        /// <param name="users"></param>
        private void Cleanup(List <string> users)
        {
            List <string> streamsToRemove = new List <string>();

            foreach (string k in LiveStreams.Keys)
            {
                if (!users.Contains(k))
                {
                    streamsToRemove.Add(k);
                }
            }
            foreach (string s in streamsToRemove)
            {
                OnStreamArgs offlineArgs = new OnStreamArgs(s, LiveStreams[s]);
                OnStreamOffline?.Invoke(this, offlineArgs);
                LiveStreams.TryRemove(s, out Stream v);
            }
        }
Пример #3
0
        private void HandleOfflineStreamUpdate(string channel, bool callEvents)
        {
            var wasAlreadyLive = LiveStreams.TryGetValue(channel, out var cachedLiveStream);

            if (!wasAlreadyLive)
            {
                return;
            }

            LiveStreams.Remove(channel);

            if (!callEvents)
            {
                return;
            }

            OnStreamOffline?.Invoke(this, new OnStreamOfflineArgs {
                Channel = channel, Stream = cachedLiveStream
            });
        }
        private async void _streamMonitorTimerElapsed(object sender, ElapsedEventArgs e)
        {
            foreach (string channel in Channels)
            {
                bool current = await _checkStreamOnline(channel);

                if (current && !_statuses[channel])
                {
                    OnStreamOnline?.Invoke(this,
                                           new OnStreamOnlineArgs {
                        Channel = channel, IdentifierType = IdentifierType, CheckIntervalSeconds = CheckIntervalSeconds
                    });
                    _statuses[channel] = true;
                }
                else if (!current && _statuses[channel])
                {
                    OnStreamOffline?.Invoke(this,
                                            new OnStreamOfflineArgs {
                        Channel = channel, IdentifierType = IdentifierType, CheckIntervalSeconds = CheckIntervalSeconds
                    });
                    _statuses[channel] = false;
                }
            }
        }
Пример #5
0
        public UnityLiveStreamMonitor(ITwitchAPI api, int checkIntervalSeconds = 60, bool checkStatusOnStart = true, bool invokeEventsOnStart = false) : base(api, checkIntervalSeconds, checkStatusOnStart, invokeEventsOnStart)
        {
            ThreadDispatcher.EnsureCreated();

            base.OnStreamOnline         += ((object sender, OnStreamOnlineArgs e) => { ThreadDispatcher.Enqueue(() => OnStreamOnline?.Invoke(sender, e)); });
            base.OnStreamOffline        += ((object sender, OnStreamOfflineArgs e) => { ThreadDispatcher.Enqueue(() => OnStreamOffline?.Invoke(sender, e)); });
            base.OnStreamUpdate         += ((object sender, OnStreamUpdateArgs e) => { ThreadDispatcher.Enqueue(() => OnStreamUpdate?.Invoke(sender, e)); });
            base.OnStreamMonitorStarted += ((object sender, OnStreamMonitorStartedArgs e) => { ThreadDispatcher.Enqueue(() => OnStreamMonitorStarted?.Invoke(sender, e)); });
            base.OnStreamMonitorEnded   += ((object sender, OnStreamMonitorEndedArgs e) => { ThreadDispatcher.Enqueue(() => OnStreamMonitorEnded?.Invoke(sender, e)); });
            base.OnStreamsSet           += ((object sender, OnStreamsSetArgs e) => { ThreadDispatcher.Enqueue(() => OnStreamsSet?.Invoke(sender, e)); });
        }
Пример #6
0
        public UnityFollowerService(ITwitchAPI api, int checkIntervalSeconds = 60, bool checkStatusOnStart = true, bool invokeEventsOnStart = false) : base(api, checkIntervalSeconds, checkStatusOnStart, invokeEventsOnStart)
        {
            _threadDispatcher = new GameObject("ThreadDispatcher");
            _threadDispatcher.AddComponent <ThreadDispatcher>();
            UnityEngine.Object.DontDestroyOnLoad(_threadDispatcher);

            base.OnStreamOnline         += ((object sender, OnStreamOnlineArgs e) => { ThreadDispatcher.Instance().Enqueue(() => OnStreamOnline?.Invoke(sender, e)); });
            base.OnStreamOffline        += ((object sender, OnStreamOfflineArgs e) => { ThreadDispatcher.Instance().Enqueue(() => OnStreamOffline?.Invoke(sender, e)); });
            base.OnStreamUpdate         += ((object sender, OnStreamUpdateArgs e) => { ThreadDispatcher.Instance().Enqueue(() => OnStreamUpdate?.Invoke(sender, e)); });
            base.OnStreamMonitorStarted += ((object sender, OnStreamMonitorStartedArgs e) => { ThreadDispatcher.Instance().Enqueue(() => OnStreamMonitorStarted?.Invoke(sender, e)); });
            base.OnStreamMonitorEnded   += ((object sender, OnStreamMonitorEndedArgs e) => { ThreadDispatcher.Instance().Enqueue(() => OnStreamMonitorEnded?.Invoke(sender, e)); });
            base.OnStreamsSet           += ((object sender, OnStreamsSetArgs e) => { ThreadDispatcher.Instance().Enqueue(() => OnStreamsSet?.Invoke(sender, e)); });
        }
Пример #7
0
        public UnityLiveStreamMonitor(ITwitchAPI api, int checkIntervalSeconds = 60, int maxStreamRequestCountPerRequest = 100) : base(api, checkIntervalSeconds, maxStreamRequestCountPerRequest)
        {
            ThreadDispatcher.EnsureCreated();

            base.OnStreamOnline   += ((object sender, OnStreamOnlineArgs e) => { ThreadDispatcher.Enqueue(() => OnStreamOnline?.Invoke(sender, e)); });
            base.OnStreamOffline  += ((object sender, OnStreamOfflineArgs e) => { ThreadDispatcher.Enqueue(() => OnStreamOffline?.Invoke(sender, e)); });
            base.OnStreamUpdate   += ((object sender, OnStreamUpdateArgs e) => { ThreadDispatcher.Enqueue(() => OnStreamUpdate?.Invoke(sender, e)); });
            base.OnServiceStarted += ((object sender, OnServiceStartedArgs e) => { ThreadDispatcher.Enqueue(() => OnServiceStarted?.Invoke(sender, e)); });
            base.OnServiceStopped += ((object sender, OnServiceStoppedArgs e) => { ThreadDispatcher.Enqueue(() => OnServiceStopped?.Invoke(sender, e)); });
            base.OnChannelsSet    += ((object sender, OnChannelsSetArgs e) => { ThreadDispatcher.Enqueue(() => OnChannelsSet?.Invoke(sender, e)); });
        }