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; } } }
/// <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); } }
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; } } }
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)); }); }
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)); }); }
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)); }); }