private async Task <bool> SetStreamsOnline(List <string> OnlineStreamIDs, GetStreamsResponse StreamsData)
 {
     using (var scope = _scopeFactory.CreateScope())
     {
         var     _context = scope.ServiceProvider.GetRequiredService <ApplicationDbContext>();
         var     Streams  = _context.StreamModels.Where(s => OnlineStreamIDs.Contains(s.UserID) && s.Type == StreamProviderTypes.Twitch).Include(x => x.StreamSubscriptions).ThenInclude(y => y.User);
         Boolean write    = false;
         foreach (Data.DBModels.StreamModels.Stream stream in Streams)
         {
             TwitchLib.Api.Helix.Models.Streams.Stream streamdata = StreamsData.Streams.Single(sd => sd.UserId == stream.UserID);
             if (stream.StreamState == StreamState.NotRunning)
             {
                 stream.StreamState = StreamState.Running;
                 stream.Started     = streamdata.StartedAt.ToLocalTime();
                 write = true;
                 if (stream.DiscordRelayChannel == "An")
                 {
                     stream.DiscordRelayChannel = getRandomRelayChannel();
                 }
                 NotifyUsers(stream, streamdata);
             }
         }
         if (write)
         {
             _context.SaveChanges();
         }
     }
     return(true);
 }
Example #2
0
        public static async Task <Stream> TryGetStreamAsync(this ArisaTwitchClient arisaTwitchClient)
        {
            GetStreamsResponse streamsResponse =
                await arisaTwitchClient.StreamsApi.GetStreamsAsync(first : 1, userIds : arisaTwitchClient.ChannelUser.Id.AsList());

            if (streamsResponse.Streams.Length == 1)
            {
                return(streamsResponse.Streams[0]);
            }

#if DEBUG
            return(JsonConvert.DeserializeObject <Stream>(@"
{
	""id"":             ""321321321"",
	""user_id"":        ""123123123"",
	""user_name"":      ""MOCKUSER"",
	""game_id"":        ""12345"",
	""type"":           ""live"",
	""title"":          ""MOCK TITLE"",
	""viewer_count"":   9001,
	""started_at"":     ""2019-03-22T16:00:00Z"",
	""language"":       ""en""
}
"));
#else
            return(null);
#endif
        }
        public async Task CheckOnlineStreams()
        {
            try
            {
                if (!_inProgress)
                {
                    _inProgress = true;
                    await FillClientIDs();

                    GetStreamsResponse StreamsData = await GetStreamData();

                    List <string> OnlineStreamIDs = StreamsData.Streams.Select(x => x.UserId).ToList();
                    await SetStreamsOffline(OnlineStreamIDs);

                    if (StreamsData.Streams.Count() > 0)
                    {
                        await SetStreamsOnline(OnlineStreamIDs, StreamsData);
                    }
                    _inProgress = false;
                }
            }
            catch (Exception ex)
            {
                _inProgress = false;
            }
            return;
        }
Example #4
0
        //public async Task ConfigLiveMonitorAsync(string [] channelsToMonitor)
        //{
        //    Monitor.OnChannelsSet += (sender, e) => TwitchHelper.Monitor_OnChannelsSet(sender, e);

        //    //EITHER
        //    //var users = await API.V5.Users.GetUserByNameAsync("stanleyhun15");
        //    //var userId = users.Matches[0].Id;

        //    //List<string> lst = new List<string> { userId };

        //    //OR
        //    List<string> TwitchChannelIDs = new List<string>();

        //    var channelsToMonitorList = channelsToMonitor.ToList();
        //    if (channelsToMonitor != null && channelsToMonitorList.Count >= 1)
        //    {
        //        var tasks = new List<Task<string>>();
        //        //This is some next level async shit
        //        channelsToMonitorList.ForEach((x) => tasks.Add(GetTwitchIDAsync(API, x)));
        //        var results = await Task.WhenAll(tasks);

        //        foreach (string userId in results)
        //        {
        //            if (userId != null && !string.IsNullOrEmpty(userId))
        //            {
        //                TwitchChannelIDs.Add(userId);
        //            }
        //        }
        //    }

        //    //úgyse lesz benne semmi ha valami nem jó
        //    if (TwitchChannelIDs.Count >= 1)
        //    {
        //        Monitor.SetChannelsById(TwitchChannelIDs);
        //    }

        //    //Monitor.OnStreamOnline += async (sender, e) => await DiscordEventHandler.Monitor_OnStreamOnline(sender, e, client, API);
        //    //Monitor.OnStreamOffline += Monitor_OnStreamOffline;
        //    //Monitor.OnStreamUpdate += Monitor_OnStreamUpdate;


        //    Monitor.Start(); //Keep at the end!

        //}

        public async Task <GetStreamOnlineResponse> GetStreamOnline(string channel)
        {
            GetStreamsResponse getStreamResponse = new GetStreamsResponse();

            try
            {
                getStreamResponse = await RetrieveTwitchChannelInfoAsync(channel);
            }
            catch (Exception) { return(new GetStreamOnlineResponse()
                {
                    Online = false, ViewerCount = 0, TimeLapsedString = string.Empty
                }); }

            if (getStreamResponse.Streams != null && getStreamResponse.Streams.Count() > 0)
            {
                return(new GetStreamOnlineResponse()
                {
                    Online = true,
                    TimeLapsedString = TwitchHelper.GetTimeLapsedFormattedString(getStreamResponse.Streams[0].StartedAt),
                    ViewerCount = getStreamResponse.Streams[0].ViewerCount
                });
            }
            else
            {
                return new GetStreamOnlineResponse()
                       {
                           Online = false, ViewerCount = 0, TimeLapsedString = string.Empty
                       }
            };
        }
Example #5
0
        public async Task <int> GetViewerCountAsync()
        {
            var userIds = new List <string> {
                _twitchClientSettings.TwitchChannelId
            };
            GetStreamsResponse streamInfo = await _twitchApi.Helix.Streams.GetStreamsAsync(userIds : userIds);

            return(streamInfo.Streams.SingleOrDefault()?.ViewerCount ?? 0);
        }
Example #6
0
        public async Task <TimeSpan?> GetUptimeAsync()
        {
            if (_streamStartedAt == null || _streamStartedAt < DateTime.UtcNow.AddHours(-1))
            {
                var userIds = new List <string> {
                    _twitchClientSettings.TwitchChannelId
                };
                GetStreamsResponse streamInfo = await _twitchApi.Helix.Streams.GetStreamsAsync(userIds : userIds);

                _streamStartedAt = streamInfo.Streams.SingleOrDefault()?.StartedAt;
            }
            return(DateTime.UtcNow - _streamStartedAt);
        }
Example #7
0
        protected override async Task Execute <T>(ChatMessage <T> message, CommandContext context, Bot bot)
        {
            GetStreamsResponse response = await TwitchBot.TwitchApi.Helix.Streams.GetStreamsAsync(userIds : new List <string> {
                TwitchBot.CurrentChannel.Id
            });

            if (response.Streams.Length > 0)
            {
                TimeSpan uptime = DateTime.UtcNow - response.Streams[0].StartedAt;

                bot.SendMessage($"@{message.Sender.UserName} Stream has been live for {Helpers.FormatTimeSpan(uptime)}.", context);
            }
            else
            {
                bot.SendMessage($"@{message.Sender.UserName} Stream is offline.", context);
            }
        }
Example #8
0
        private static List <TwitchLib.Api.Models.Helix.Streams.GetStreams.Stream> getTopChannels()
        {
            List <TwitchLib.Api.Models.Helix.Streams.GetStreams.Stream> list = new List <TwitchLib.Api.Models.Helix.Streams.GetStreams.Stream>();
            bool   done = false;
            string next = "";

            while (!done)
            {
                GetStreamsResponse resp = FetchChannels(next);
                List <TwitchLib.Api.Models.Helix.Streams.GetStreams.Stream> toAdd = resp.Streams.ToList();
                list = list.Concat(toAdd).ToList();
                done = toAdd.Last().ViewerCount < min_viewers;
                next = resp.Pagination.Cursor;
                Thread.Sleep(limit);
            }

            return(list);
        }
Example #9
0
        /// <summary>
        /// Gets all the currently live streams of the users we're tracking.
        /// </summary>
        /// <returns>A list of all the live streams.</returns>
        public async Task <Stream[]> GetStreams()
        {
            if (usersBeingTracked == null || usersBeingTracked.Count() == 0)
            {
                return(null);
            }

            try
            {
                GetStreamsResponse liveStreams = await api.Helix.Streams.GetStreamsAsync(null, null, 100, null, null,
                                                                                         "live", null, usersBeingTracked.ToList());

                return(liveStreams.Streams);
            }catch (Exception e)
            {
                Console.WriteLine($"Exception thrown while fetching streams. {e.Message}");
                return(null);
            }
        }
Example #10
0
        void ITimerService.Process(double time)
        {
            if (!isconnected)
            {
                return;
            }

            followercheck -= time;
            if (followercheck <= 0.0)
            {
                try {
                    CheckFollowers();
                }
                catch (Exception e) {
                    Logger.Error(this, "Unable to check for followers", e);
                }

                followercheck = 300.0;
            }

            viewercheck -= time;
            if (viewercheck <= 0.0)
            {
                if (userdata != null)
                {
                    GetStreamsResponse response = twitchapi.GetStreams(userdata.ID);
                    TwitchStream       stream   = response.Data.FirstOrDefault();
                    if (stream == null)
                    {
                        Logger.Warning(this, "There was no active stream found.");
                        viewercheck = 180.0;
                        return;
                    }

                    Viewers     = stream.ViewerCount;
                    viewercheck = 180.0;
                }
            }
        }
Example #11
0
        public TwitchTracker()
        {
            Tracking = new List <long>();

            Online  = new List <long>();
            Offline = new List <long>();

            try
            {
                if (File.Exists("Data/TwitchTracking.json"))
                {
                    TwitchLocal obj = SaveManager.LoadSettings <TwitchLocal>("TwitchTracking");

                    Online.AddRange(obj.Online);
                    Offline.AddRange(obj.Offline);
                }
            }
            catch { /* Probably some errors with the json file, manual impact or sth ~ better be sure ~ */ }

            StreamDatabase = new Dictionary <long, StreamResponse>();
            UserDatabase   = new Dictionary <long, UserResponse>();

            Update = new Timer(Global.Settings.TwitchStreamUpdate);
            UserDatabaseUpdater = new Timer(Global.Settings.TwitchUserUpdate);

            api = new TwitchAPI();
            api.Settings.ClientId = Global.Settings.Credentials.Twitch.ClientId;
            api.Settings.Secret   = Global.Settings.Credentials.Twitch.ClientSecret;
            string token = api.Helix.Streams.GetAccessToken();

            api.Settings.AccessToken = token;

            Restore();

            Update.Elapsed += async(s, a) =>
            {
                List <StreamResponse> Streams = new List <StreamResponse>();

                await ValidateAsync();

                for (int i = 0; i < Tracking.Count; i += 100)
                {
                    GetStreamsResponse resp = api.Helix.Streams.GetStreamsAsync(userIds: Tracking.Skip(i).Take(100).Select(t => t.ToString()).ToList()).Result;
                    Streams.AddRange(resp.Streams.Select(t => new StreamResponse(t)));
                }

                long[] Ids = Streams.Select(t => t.UserId).ToArray();
                for (int i = 0; i < Ids.Length; i++)
                {
                    long UserId = Ids[i];

                    if (!Online.Contains(UserId))
                    {
                        Online.Add(UserId);
                        Offline.Remove(UserId);

                        StreamDatabase.Add(UserId, Streams[i]);

                        OnStreamUp?.Invoke(Streams[i], UserDatabase[UserId]);
                    }
                }
                for (int i = 0; i < Online.Count; i++)
                {
                    long UserId = Online[i];

                    if (!Ids.Contains(UserId))
                    {
                        Offline.Add(UserId);
                        Online.Remove(UserId);
                        if (StreamDatabase.ContainsKey(UserId))
                        {
                            OnStreamDown?.Invoke(StreamDatabase[UserId], UserDatabase[UserId]);
                            StreamDatabase.Remove(UserId);
                        }
                    }
                }

                SaveManager.SaveData("TwitchTracking", new TwitchLocal()
                {
                    Online  = Online,
                    Offline = Offline
                });
            };

            UserDatabaseUpdater.Elapsed += async(s, a) =>
            {
                var Keys = UserDatabase.Keys;

                await ValidateAsync();


                List <UserResponse> Users = new List <UserResponse>();

                for (int i = 0; i < Keys.Count; i += 100)
                {
                    GetUsersResponse resp = api.Helix.Users.GetUsersAsync(Keys.Skip(i).Take(100).Select(t => t.ToString()).ToList()).Result;
                    Users.AddRange(resp.Users.Select(t => new UserResponse(t)));
                }

                UserDatabase.Clear();

                for (int i = 0; i < Users.Count; i++)
                {
                    UserResponse User = Users[i];
                    UserDatabase.Add(User.Id, User);
                }
            };

            UserDatabaseUpdater.Start();
        }