Example #1
0
        public async Task Check()
        {
            if (Settings <EraiRawsWatcherSettings> .Current.MatchPatterns.Count is 0)
            {
                Log.Warning("Erai Raws patterns for matching series is empty, skipping Check procedure");
                return;
            }

            if (Settings <EraiRawsWatcherSettings> .Current.ChatId is 0)
            {
                Log.Warning("Erai Raws ChatId is 0, skipping Check procedure");
                return;
            }

            int i = 0;

            Log.Information("Parsing Erai Raws Feed");

            var articles = (await ParseFeed()).Articles;

            var lastpost = articles.First();

            AsyncTaskManager tasks = new();

            foreach (var article in articles)
            {
                try
                {
                    Log.Information($"Reviewing article {++i}: {article.Title}");

                    Log.Debug($"Reviewing data in article {i}");

                    if (LastPost is not null && article.Published == LastPost.Published && article.Title == LastPost.Title)
                    {
                        Log.Information($"Nothing new after article {i}: {article.Title}");
                        break;
                    }

                    try
                    {
                        List <RssFeedArticle> relevantArticles = new();

                        var cancel = new CancellationTokenSource();
                        foreach (var pattern in Settings <EraiRawsWatcherSettings> .Current.MatchPatterns)
                        {
                            if (await Task.Run(() => Regex.IsMatch(article.Title, pattern, RegexOptions.IgnoreCase, TimeSpan.FromSeconds(10)), cancel.Token).AwaitWithTimeout(
                                    1000,
                                    ifError: () =>
                            {
                                Log.Error($"Regex pattern {pattern} timed out with title {article.Title}");
                                cancel.Cancel();
                            }
                                    ))
                            {
                                Log.Information($"Found {article.Title} to be interesting");
                                lock (relevantArticles)
                                    relevantArticles.Add(article);
                                goto Matched;
                            }
                        }
                        Log.Debug($"Ignoring {article.Title}");

                        Matched :;

                        await tasks;

                        var id = Settings <EraiRawsWatcherSettings> .Current.ChatId;
                        foreach (var art in relevantArticles)
                        {
                            OutBot.EnqueueAction(b => b.SendTextMessageAsync(id, $"<strong>{art.Title}</strong> @ {art.Published:g}\n-&gt; <a href=\"{art.Link}\">Link</a>", ParseMode.Html));
                        }
                    }
                    catch
                    {
                        Log.Error("One of the regex patterns timed out. Please verify the patterns");
                        throw;
                    }
                    finally
                    {
                        tasks.Clear();
                    }

                    await Task.Delay(50);
                }
                catch (Exception e)
                {
                    Log.Error($"Failed to check latest upload of Erai-raws: {e.GetType().Name}::{e.Message}");
                    break;
                }
            }

            Log.Debug("Updating LastPost");
            LastPost = lastpost;
            await Serialization.Serialize.JsonAsync(LastPost, LastPostDir, LastPostFile);

            Log.Information("Finished processing RSS feed data");
        }
Example #2
0
 public Task FirstCheck()
 {
     OutBot.EnqueueAction(b => b.SetMyCommandsAsync(OutBot.Processor.CommandList.AvailableCommands));
     return(Task.CompletedTask);
 }