Ejemplo n.º 1
0
 public void Execute()
 {
     using (var context = new DggContext())
     {
         var throttle = context.Throttles.FirstOrDefault(x =>
                                                         x.DiscordChannelId == _discordChannelId && x.CommandName == _commandName);
         if (throttle is null)
         {
             context.Throttles.Add(new Throttle
             {
                 DiscordChannelId = _discordChannelId,
                 CommandName      = _commandName
             });
             context.SaveChanges();
             JobManager.AddJob(new ThrottleJob(_commandName, _discordChannelId),
                               s => s.ToRunOnceIn(120).Seconds());
         }
         else
         {
             context.Throttles.Remove(throttle);
             context.SaveChanges();
             Log.Information("Throttle ended in {channel} for {commandName}", _discordChannelId, _commandName);
         }
     }
 }
Ejemplo n.º 2
0
        public void Execute()
        {
            Log.Debug("Twitter check started for {twitter}", _twitter.FriendlyUsername);
            using (var context = new DggContext())
            {
                var existing = context.TweetRecords.FirstOrDefault(t => t.UserId == _twitter.UserId);
                var tweets   = _twitterService.GetTweet(_twitter.UserId, existing?.TweetId).GetAwaiter().GetResult();
                var channel  = _client.GetChannel((ulong)_twitter.DiscordChannelId) as SocketTextChannel;

                for (var i = 0; i < tweets.Count; i++)
                {
                    var tweet = tweets[i];

                    if (tweet.FullText.StartsWith("@"))
                    {
                        tweets.RemoveAt(i);
                        i--;
                        continue;
                    }

                    var embed = CreateEmbed(tweet);

                    try
                    {
                        channel.SendMessageAsync("", embed: embed).GetAwaiter().GetResult();
                    }
                    catch (Exception ex)
                    {
                        Console.Error.WriteLine("[" + DateTime.UtcNow +
                                                "] TWITTER ERROR, CheckTwitterAsync");
                        Console.Error.WriteLine(ex.ToString());
                        Console.Error.WriteLine(ex.InnerException?.ToString());
                        Console.Error.WriteLine("------------");
                        Console.Error.WriteLine();
                    }

                    if (existing == null)
                    {
                        tweets.Reverse();
                        break;
                    }
                }
                if (tweets.Count == 0)
                {
                    return;
                }

                var latestTweet = tweets[tweets.Count - 1];

                using (var db = new DggContext())
                {
                    if (existing == null)
                    {
                        existing = new TweetRecord
                        {
                            UserId          = latestTweet.User.Id,
                            TweetId         = latestTweet.Id,
                            Text            = WebUtility.HtmlDecode(latestTweet.FullText),
                            AuthorName      = latestTweet.User.Name,
                            AuthorUsername  = latestTweet.User.Username,
                            ProfileImageUrl = latestTweet.User.ProfileImageUrl,
                            CreatedAt       = latestTweet.CreatedAt.UtcDateTime
                        };

                        db.TweetRecords.Add(existing);
                    }
                    else
                    {
                        existing.TweetId         = latestTweet.Id;
                        existing.Text            = WebUtility.HtmlDecode(latestTweet.FullText);
                        existing.AuthorName      = latestTweet.User.Name;
                        existing.AuthorUsername  = latestTweet.User.Username;
                        existing.ProfileImageUrl = latestTweet.User.ProfileImageUrl;
                        existing.CreatedAt       = latestTweet.CreatedAt.UtcDateTime;

                        db.TweetRecords.Update(existing);
                    }

                    db.SaveChanges();
                }
            }
        }
Ejemplo n.º 3
0
        //TRUMPED
        private static void CreateScheduledJobs(IServiceProvider serviceProvider)
        {
            try
            {
                var registry = new Registry();
                using (var context = new DggContext())
                {
                    context.Database.Migrate();
                    var throttles = context.Throttles;

                    context.Throttles.RemoveRange(throttles);
                    context.SaveChanges();

                    var twitters = context.TwittersToCheck;
                    foreach (var twitter in twitters)
                    {
                        registry.Schedule(new TwitterJob(
                                              serviceProvider.GetRequiredService <DiscordSocketClient>(),
                                              twitter,
                                              serviceProvider.GetRequiredService <TwitterService>()))
                        .WithName(twitter.UserId.ToString())
                        .ToRunEvery(twitter.Frequency)
                        .Seconds();
                        Log.Information("{jobtype} started for {name} with ID: {id}", nameof(TwitterJob),
                                        twitter.FriendlyUsername, twitter.UserId);
                    }


                    var youtubes = context.YouTubesToCheck;
                    foreach (var youTube in youtubes)
                    {
                        registry.Schedule(new YoutubeJob(
                                              serviceProvider.GetRequiredService <DiscordSocketClient>(),
                                              serviceProvider.GetRequiredService <YoutubeService>(),
                                              youTube,
                                              new HttpClient(),
                                              serviceProvider.GetRequiredService <IConfiguration>())).WithName(youTube.ChannelId)
                        .WithName(youTube.ChannelId)
                        .ToRunEvery(youTube.Frequency)
                        .Seconds();
                        Log.Information("{jobtype} started for {name} with ID: {id}", nameof(YoutubeJob),
                                        youTube.FriendlyUsername, youTube.ChannelId);
                    }

                    var streamsToCheck = context.StreamsToCheck.ToList();
                    foreach (var stream in streamsToCheck)
                    {
                        registry.Schedule(new TwitchJob(
                                              serviceProvider.GetRequiredService <DiscordSocketClient>(),
                                              serviceProvider.GetRequiredService <TwitchService>(),
                                              stream))
                        .WithName(stream.UserId.ToString())
                        .ToRunEvery(30).Seconds();
                        Log.Information("{jobtype} started for {name} with ID: {id}", nameof(TwitchJob),
                                        stream.FriendlyUsername, stream.UserId);
                    }


                    var streamRecords = context.StreamRecords;
                    foreach (var stream in streamRecords)
                    {
                        var thisStreamToCheck = streamsToCheck.Find(s => s.UserId == stream.UserId);
                        registry.Schedule(new TwitchUpdateJob(
                                              serviceProvider.GetRequiredService <DiscordSocketClient>(),
                                              serviceProvider.GetRequiredService <TwitchService>(),
                                              thisStreamToCheck
                                              )).WithName(stream.StreamId.ToString()).ToRunEvery(5).Minutes();
                        Log.Information("{jobtype} started for {name} with ID: {id}", nameof(TwitchUpdateJob),
                                        thisStreamToCheck.FriendlyUsername, stream.StreamId);
                    }
                    JobManager.Initialize(registry);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
        public void Execute()
        {
            Log.Debug("Stream update check started for {stream}", _stream.FriendlyUsername);
            StreamRecord record;

            using (var db = new DggContext())
            {
                record = db.StreamRecords.FirstOrDefault(sr => sr.UserId == _stream.UserId);
                if (record == null)
                {
                    return;
                }
            }

            var stream = _twitchService.GetTwitchStreamAsync(_stream.UserId).GetAwaiter().GetResult();

            if (stream == null)
            {
                return;
            }

            if (string.IsNullOrEmpty(stream.Game))
            {
                stream.Game = "(no game)";
            }

            if (record.CurrentGame != stream.Game)
            {
                using (var db = new DggContext())
                {
                    var streamGame = db.StreamGames
                                     .FirstOrDefault(g => g.StreamId == stream.Id && g.StopTime == null);

                    streamGame.StopTime = DateTime.UtcNow;
                    record.CurrentGame  = stream.Game;

                    db.StreamGames.Add(new StreamGame
                    {
                        StreamId  = stream.Id,
                        Game      = stream.Game,
                        StartTime = DateTime.UtcNow
                    });

                    db.StreamRecords.Update(record);

                    db.SaveChanges();
                }
            }

            var embed = CreateEmbed(stream, (uint)_stream.EmbedColor);

            try
            {
                var channel = _client.GetChannel((ulong)_stream.DiscordChannelId) as SocketTextChannel;
                var msg     =
                    channel.GetMessageAsync((ulong)record.DiscordMessageId).GetAwaiter()
                    .GetResult() as RestUserMessage;

                msg.ModifyAsync(f => f.Embed = embed).GetAwaiter().GetResult();
                using (var context = new DggContext())
                {
                    var responses = context.StreamNullResponses;
                    if (responses.Any(f => f.UserId == _stream.UserId))
                    {
                        responses.Remove(responses.First(f => f.UserId == _stream.UserId));
                    }
                    context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine("[" + DateTime.UtcNow + "] TWITCH ERROR, UpdateEmbedAsync");
                Console.Error.WriteLine(ex.ToString());
                Console.Error.WriteLine(ex.InnerException?.ToString());
                Console.Error.WriteLine("------------");
                Console.Error.WriteLine();
            }
        }
Ejemplo n.º 5
0
        public void Execute()
        {
            Log.Debug("Stream check started for {stream}", _stream.FriendlyUsername);
            var streamToCheck = _stream;

            var stream = _twitchService.GetTwitchStreamAsync(streamToCheck.UserId).GetAwaiter().GetResult();

            StreamRecord existingRecord;

            using (var db = new DggContext())
            {
                existingRecord = db.StreamRecords.FirstOrDefault(sr => sr.UserId == streamToCheck.UserId);
            }

            // live and was not previously live
            if (stream != null && existingRecord == null)
            {
                var msgId = SendMessageAsync(streamToCheck, stream).GetAwaiter().GetResult();

                using (var db = new DggContext())
                {
                    db.StreamRecords.Add(new StreamRecord
                    {
                        UserId           = stream.Channel.Id,
                        StreamId         = stream.Id,
                        DiscordMessageId = msgId,
                        CurrentGame      = stream.Game,
                        StartTime        = DateTime.UtcNow
                    });

                    db.SaveChanges();

                    db.StreamGames.Add(new StreamGame
                    {
                        Game      = stream.Game,
                        StreamId  = stream.Id,
                        StartTime = DateTime.UtcNow
                    });

                    var lastOnlines = db.StreamLastOnlines.Where(s => s.UserId == streamToCheck.UserId);
                    db.StreamLastOnlines.RemoveRange(lastOnlines);

                    db.SaveChanges();
                }

                if (streamToCheck.EmbedColor != 0)
                {
                    Console.WriteLine("add");

                    JobManager.AddJob(new TwitchUpdateJob(_client, _twitchService, streamToCheck),
                                      s => s.WithName(stream.Id.ToString()).ToRunEvery(5).Minutes());
                }

                return;
            }

            // not live and was previously live
            if (stream == null && existingRecord != null)
            {
                using (var context = new DggContext())
                {
                    var responses = context.StreamNullResponses;
                    StreamNullResponse response;
                    if (responses.Any(r => r.UserId == existingRecord.UserId))
                    {
                        response = responses.First(r => r.UserId == existingRecord.UserId);
                        Console.WriteLine($"{response.NullResponseDate} + {DateTimeOffset.UtcNow.AddMinutes(-2)}");
                        if (response.NullResponseDate > DateTimeOffset.UtcNow.AddMinutes(-2))
                        {
                            return;
                        }
                    }
                    else
                    {
                        context.StreamNullResponses.Add(new StreamNullResponse
                        {
                            UserId           = existingRecord.UserId,
                            NullResponseDate = DateTimeOffset.Now
                        });
                        context.SaveChanges();
                        return;
                    }

                    context.StreamNullResponses.Remove(response);
                    context.SaveChanges();
                }


                var channel = _client.GetChannel((ulong)streamToCheck.DiscordChannelId) as SocketTextChannel;
                var msgId   = existingRecord.DiscordMessageId;

                if (streamToCheck.DeleteDiscordMessage && existingRecord.DiscordMessageId != 0)
                {
                    Log.Debug("removing message");
                    var msg =
                        channel.GetMessageAsync((ulong)existingRecord.DiscordMessageId).GetAwaiter().GetResult() as
                        RestUserMessage;

                    msg.DeleteAsync().GetAwaiter().GetResult();
                }
                else if (!streamToCheck.DeleteDiscordMessage && streamToCheck.EmbedColor != 0 &&
                         existingRecord.DiscordMessageId != 0)
                {
                    FinalMessageUpdateAsync(streamToCheck, existingRecord).GetAwaiter().GetResult();
                }

                if (streamToCheck.PinMessage && existingRecord.DiscordMessageId != 0)
                {
                    Log.Debug("removing Pin");
                    var msg =
                        channel.GetMessageAsync((ulong)existingRecord.DiscordMessageId).GetAwaiter().GetResult() as
                        RestUserMessage;
                    if (!(msg is null))
                    {
                        msg.UnpinAsync().GetAwaiter().GetResult();
                    }
                }

                using (var db = new DggContext())
                {
                    db.StreamLastOnlines.Add(new StreamLastOnline
                    {
                        UserId           = streamToCheck.UserId,
                        FriendlyUsername = streamToCheck.FriendlyUsername,
                        LastOnlineAt     = DateTime.UtcNow,
                        LastGame         = existingRecord.CurrentGame
                    });

                    var games = db.StreamGames.Where(g => g.StreamId == existingRecord.StreamId);
                    db.StreamGames.RemoveRange(games);

                    Console.WriteLine($"Games: {db.SaveChanges()}");

                    var updateJob =
                        JobManager.AllSchedules.FirstOrDefault(u => u.Name == existingRecord.StreamId.ToString());
                    if (updateJob == null)
                    {
                        return;
                    }
                    Console.WriteLine("remove jhob");
                    JobManager.RemoveJob(updateJob.Name);

                    db.StreamRecords.Remove(existingRecord);
                    Console.WriteLine($"Records: {db.SaveChanges()}");
                }
            }
        }
Ejemplo n.º 6
0
        public void Execute()
        {
            Log.Debug("Checking youtube updates for {channel}", _youTubeToCheck.FriendlyUsername);
            var videos = _youtubeService.GetYouTubeVideoListAsync(_youTubeToCheck.ChannelId).GetAwaiter()
                         .GetResult();

            if (videos.Items is null)
            {
                return;
            }
            var latestVideo   = videos.Items.FirstOrDefault();
            var latestVideoId = latestVideo.Id.VideoId;

            YouTubeRecord existingRecord;

            using (var db = new DggContext())
            {
                existingRecord = db.YouTubeRecords.FirstOrDefault(r => r.ChannelId == _youTubeToCheck.ChannelId);
            }


            if (existingRecord != null &&
                latestVideo.Snippet.PublishedAt.CompareTo(new DateTimeOffset(existingRecord.PublishedAt)) <= 0)
            {
                return;
            }

            var embed = SendMessageAsync(_youTubeToCheck, latestVideo).GetAwaiter().GetResult();

            if (embed == null)
            {
                return;
            }

            using (var db = new DggContext())
            {
                if (existingRecord == null)
                {
                    existingRecord = new YouTubeRecord
                    {
                        ChannelId        = _youTubeToCheck.ChannelId,
                        VideoId          = latestVideoId,
                        VideoTitle       = latestVideo.Snippet.Title,
                        VideoDescription = embed.Description,
                        ImageUrl         = embed.Image.Value.Url,
                        AuthorName       = embed.Author.Value.Name,
                        AuthorUrl        = embed.Author.Value.Url,
                        AuthorIconUrl    = embed.Author.Value.IconUrl,
                        PublishedAt      = latestVideo.Snippet.PublishedAt.UtcDateTime
                    };

                    db.YouTubeRecords.Add(existingRecord);
                }
                else
                {
                    existingRecord.VideoId          = latestVideoId;
                    existingRecord.VideoTitle       = latestVideo.Snippet.Title;
                    existingRecord.VideoDescription = embed.Description;
                    existingRecord.ImageUrl         = embed.Image.Value.Url;
                    existingRecord.AuthorName       = embed.Author.Value.Name;
                    existingRecord.AuthorUrl        = embed.Author.Value.Url;
                    existingRecord.AuthorIconUrl    = embed.Author.Value.IconUrl;
                    existingRecord.PublishedAt      = latestVideo.Snippet.PublishedAt.UtcDateTime;

                    db.YouTubeRecords.Update(existingRecord);
                }

                db.SaveChanges();
            }
        }