mirror of
https://gitlab.com/Kwoth/nadekobot.git
synced 2025-09-10 09:18:27 -04:00
dev: feed code cleaned up a bit
This commit is contained in:
@@ -79,6 +79,15 @@ public class FeedsService : INService
|
||||
}
|
||||
}
|
||||
|
||||
private DateTime? GetPubDate(FeedItem item)
|
||||
{
|
||||
if (item.PublishingDate is not null)
|
||||
return item.PublishingDate;
|
||||
if (item.SpecificItem is AtomFeedItem atomItem)
|
||||
return atomItem.UpdatedDate;
|
||||
return null;
|
||||
}
|
||||
|
||||
public async Task<EmbedBuilder> TrackFeeds()
|
||||
{
|
||||
while (true)
|
||||
@@ -94,24 +103,32 @@ public class FeedsService : INService
|
||||
{
|
||||
var feed = await FeedReader.ReadAsync(rssUrl);
|
||||
|
||||
var items = feed
|
||||
.Items.Select(item => (Item: item,
|
||||
LastUpdate: item.PublishingDate?.ToUniversalTime()
|
||||
?? (item.SpecificItem as AtomFeedItem)?.UpdatedDate?.ToUniversalTime()))
|
||||
.Where(data => data.LastUpdate is not null)
|
||||
.Select(data => (data.Item, LastUpdate: (DateTime)data.LastUpdate))
|
||||
.OrderByDescending(data => data.LastUpdate)
|
||||
.Reverse() // start from the oldest
|
||||
.ToList();
|
||||
var items = new List<(FeedItem Item, DateTime LastUpdate)>();
|
||||
foreach (var item in feed.Items)
|
||||
{
|
||||
var pubDate = GetPubDate(item);
|
||||
|
||||
if (pubDate is null)
|
||||
continue;
|
||||
|
||||
items.Add((item, pubDate.Value.ToUniversalTime()));
|
||||
|
||||
// show at most 3 items if you're behind
|
||||
if (items.Count > 2)
|
||||
break;
|
||||
}
|
||||
|
||||
if (items.Count == 0)
|
||||
continue;
|
||||
|
||||
if (!_lastPosts.TryGetValue(kvp.Key, out var lastFeedUpdate))
|
||||
{
|
||||
lastFeedUpdate = _lastPosts[kvp.Key] =
|
||||
items.Any() ? items[items.Count - 1].LastUpdate : DateTime.UtcNow;
|
||||
lastFeedUpdate = _lastPosts[kvp.Key] = items[0].LastUpdate;
|
||||
}
|
||||
|
||||
foreach (var (feedItem, itemUpdateDate) in items)
|
||||
for (var index = 1; index <= items.Count; index++)
|
||||
{
|
||||
var (feedItem, itemUpdateDate) = items[^index];
|
||||
if (itemUpdateDate <= lastFeedUpdate)
|
||||
continue;
|
||||
|
||||
@@ -168,27 +185,26 @@ public class FeedsService : INService
|
||||
if (!string.IsNullOrWhiteSpace(feedItem.Description))
|
||||
embed.WithDescription(desc.TrimTo(2048));
|
||||
|
||||
//send the created embed to all subscribed channels
|
||||
var feedSendTasks = kvp.Value
|
||||
.Where(x => x.GuildConfig is not null)
|
||||
.Select(x =>
|
||||
|
||||
var tasks = new List<Task>();
|
||||
|
||||
foreach (var val in kvp.Value)
|
||||
{
|
||||
var ch = _client.GetGuild(x.GuildConfig.GuildId)
|
||||
?.GetTextChannel(x.ChannelId);
|
||||
var ch = _client.GetGuild(val.GuildConfig.GuildId).GetTextChannel(val.ChannelId);
|
||||
|
||||
if (ch is null)
|
||||
return null;
|
||||
continue;
|
||||
|
||||
return _sender.Response(ch)
|
||||
var sendTask = _sender.Response(ch)
|
||||
.Embed(embed)
|
||||
.Text(string.IsNullOrWhiteSpace(x.Message)
|
||||
.Text(string.IsNullOrWhiteSpace(val.Message)
|
||||
? string.Empty
|
||||
: x.Message)
|
||||
: val.Message)
|
||||
.SendAsync();
|
||||
})
|
||||
.Where(x => x is not null);
|
||||
tasks.Add(sendTask);
|
||||
}
|
||||
|
||||
allSendTasks.Add(feedSendTasks.WhenAll());
|
||||
allSendTasks.Add(tasks.WhenAll());
|
||||
|
||||
// as data retrieval was successful, reset error counter
|
||||
ClearErrors(rssUrl);
|
||||
|
Reference in New Issue
Block a user