예제 #1
0
        public static async Task ExecuteUrlAsync(long chatId, string rssUrl)
        {
            int newRssCount = 0;
            var rssService  = new RssService();

            var rssFeeds = await FeedReader.ReadAsync(rssUrl)
                           .ConfigureAwait(false);

            var rssTitle = rssFeeds.Title;

            // var castLimit = 10;
            // var castStep = 0;

            foreach (var rssFeed in rssFeeds.Items)
            {
                // Prevent flood in first time;
                // if (castLimit == castStep)
                // {
                //     Log.Information($"Send stopped due limit {castLimit} for prevent flooding in first time");
                //     break;
                // }

                var whereHistory = new Dictionary <string, object>()
                {
                    ["chat_id"]    = chatId,
                    ["rss_source"] = rssUrl
                };

                var rssHistory = await rssService.GetRssHistory(whereHistory)
                                 .ConfigureAwait(false);

                var lastRssHistory = rssHistory.LastOrDefault();

                if (!rssHistory.Any())
                {
                    break;
                }

                var lastArticleDate    = DateTime.Parse(lastRssHistory.PublishDate);
                var currentArticleDate = rssFeed.PublishingDate.Value;

                if (currentArticleDate < lastArticleDate)
                {
                    Log.Information($"Current article is older than last article. Stopped.");
                    break;
                }

                Log.Information($"LastArticleDate: {lastArticleDate}");
                Log.Information($"CurrentArticleDate: {currentArticleDate}");


                Log.Information("Prepare sending article.");

                var titleLink = $"{rssTitle} - {rssFeed.Title}".MkUrl(rssFeed.Link);
                var category  = rssFeed.Categories.MkJoin(", ");
                var sendText  = $"{rssTitle} - {rssFeed.Title}" +
                                $"\n{rssFeed.Link}" +
                                $"\nTags: {category}";

                var where = new Dictionary <string, object>()
                {
                    { "chat_id", chatId },
                    { "url", rssFeed.Link }
                };

                var isExist = await rssService.IsExistInHistory(where)
                              .ConfigureAwait(false);

                if (isExist)
                {
                    Log.Information($"This feed has sent to {chatId}");
                    break;
                }

                Log.Information($"Sending feed to {chatId}");

                try
                {
                    await BotSettings.Client.SendTextMessageAsync(chatId, sendText, ParseMode.Html)
                    .ConfigureAwait(false);

                    var data = new Dictionary <string, object>()
                    {
                        { "url", rssFeed.Link },
                        { "rss_source", rssUrl },
                        { "chat_id", chatId },
                        { "title", rssFeed.Title },
                        { "publish_date", rssFeed.PublishingDate.ToString() },
                        { "author", rssFeed.Author },
                        { "created_at", DateTime.Now.ToString(CultureInfo.InvariantCulture) }
                    };

                    Log.Information($"Writing to RSS History");
                    await rssService.SaveRssHistoryAsync(data)
                    .ConfigureAwait(false);

                    // castStep++;
                    newRssCount++;
                }
                catch (ChatNotFoundException chatNotFoundException)
                {
                    Log.Information($"May Bot not added in {chatId}.");
                    Log.Error(chatNotFoundException, "Chat Not Found");
                }
                catch (Exception ex)
                {
                    Log.Error(ex, "RSS Broadcaster error");
                }
            }
        }