diff --git a/CHANGELOG.md b/CHANGELOG.md index f2bc17a..a561485 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,12 @@ *a,c,f,r,o* -## [6.1.1] - 02.04.2025 +## [6.1.2] - 03.04.2025 + +### Fixed +- Fixed `.feed` not adding new feeds to the database + +## [6.1.1] - 03.04.2025 ### Added - Added some config options for .conf fish diff --git a/src/EllieBot/EllieBot.csproj b/src/EllieBot/EllieBot.csproj index 87916e7..4024227 100644 --- a/src/EllieBot/EllieBot.csproj +++ b/src/EllieBot/EllieBot.csproj @@ -4,7 +4,7 @@ <Nullable>enable</Nullable> <ImplicitUsings>true</ImplicitUsings> <SatelliteResourceLanguages>en</SatelliteResourceLanguages> - <Version>6.1.1</Version> + <Version>6.1.2</Version> <!-- Output/build --> <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory> diff --git a/src/EllieBot/Modules/Searches/Feeds/FeedCommands.cs b/src/EllieBot/Modules/Searches/Feeds/FeedCommands.cs index 95e83aa..4984ed4 100644 --- a/src/EllieBot/Modules/Searches/Feeds/FeedCommands.cs +++ b/src/EllieBot/Modules/Searches/Feeds/FeedCommands.cs @@ -53,6 +53,8 @@ public partial class Searches [Priority(1)] public async Task Feed(string url, ITextChannel? channel = null, [Leftover] string? message = null) { + await ctx.Channel.TriggerTypingAsync(); + if (!Uri.TryCreate(url, UriKind.Absolute, out var uri) || (uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps)) { @@ -61,7 +63,7 @@ public partial class Searches } channel ??= (ITextChannel)ctx.Channel; - + if (!((IGuildUser)ctx.User).GetPermissions(channel).MentionEveryone) message = message?.SanitizeAllMentions(); @@ -79,7 +81,7 @@ public partial class Searches if (ctx.User is not IGuildUser gu || !gu.GuildPermissions.Administrator) message = message?.SanitizeMentions(true); - var result = _service.AddFeed(ctx.Guild.Id, channel.Id, url, message); + var result = await _service.AddFeedAsync(ctx.Guild.Id, channel.Id, url, message); if (result == FeedAddResult.Success) { await Response().Confirm(strs.feed_added).SendAsync(); @@ -117,32 +119,32 @@ public partial class Searches { if (--page < 0) return; - + var feeds = _service.GetFeeds(ctx.Guild.Id); if (!feeds.Any()) { await Response() - .Embed(CreateEmbed().WithOkColor().WithDescription(GetText(strs.feed_no_feed))) - .SendAsync(); + .Embed(CreateEmbed().WithOkColor().WithDescription(GetText(strs.feed_no_feed))) + .SendAsync(); return; } await Response() - .Paginated() - .Items(feeds) - .PageSize(10) - .CurrentPage(page) - .Page((items, cur) => - { - var embed = CreateEmbed().WithOkColor(); - var i = 0; - var fs = string.Join("\n", - items.Select(x => $"`{(cur * 10) + ++i}.` <#{x.ChannelId}> {x.Url}")); + .Paginated() + .Items(feeds) + .PageSize(10) + .CurrentPage(page) + .Page((items, cur) => + { + var embed = CreateEmbed().WithOkColor(); + var i = 0; + var fs = string.Join("\n", + items.Select(x => $"`{(cur * 10) + ++i}.` <#{x.ChannelId}> {x.Url}")); - return embed.WithDescription(fs); - }) - .SendAsync(); + return embed.WithDescription(fs); + }) + .SendAsync(); } } } \ No newline at end of file diff --git a/src/EllieBot/Modules/Searches/Feeds/FeedsService.cs b/src/EllieBot/Modules/Searches/Feeds/FeedsService.cs index a3d9db2..3240ec4 100644 --- a/src/EllieBot/Modules/Searches/Feeds/FeedsService.cs +++ b/src/EllieBot/Modules/Searches/Feeds/FeedsService.cs @@ -40,13 +40,13 @@ public class FeedsService : IEService, IReadyExecutor await using (var uow = _db.GetDbContext()) { var subs = await uow.Set<FeedSub>() - .AsQueryable() - .Where(x => Queries.GuildOnShard(x.GuildId, _shardData.TotalShards, _shardData.ShardId)) - .ToListAsyncLinqToDB(); + .AsQueryable() + .Where(x => Queries.GuildOnShard(x.GuildId, _shardData.TotalShards, _shardData.ShardId)) + .ToListAsyncLinqToDB(); _subs = subs - .GroupBy(x => x.Url.ToLower()) - .ToDictionary(x => x.Key, x => x.ToList()) - .ToConcurrent(); + .GroupBy(x => x.Url.ToLower()) + .ToDictionary(x => x.Key, x => x.ToList()) + .ToConcurrent(); } await TrackFeeds(); @@ -66,7 +66,7 @@ public class FeedsService : IEService, IReadyExecutor // remove from db await using var ctx = _db.GetDbContext(); await ctx.GetTable<FeedSub>() - .DeleteAsync(x => ids.Contains(x.Id)); + .DeleteAsync(x => ids.Contains(x.Id)); // remove from the local cache _subs.TryRemove(url, out _); @@ -163,12 +163,12 @@ public class FeedsService : IEService, IReadyExecutor if (!gotImage && feedItem.SpecificItem is AtomFeedItem afi) { var previewElement = afi.Element.Elements() - .FirstOrDefault(x => x.Name.LocalName == "preview"); + .FirstOrDefault(x => x.Name.LocalName == "preview"); if (previewElement is null) { previewElement = afi.Element.Elements() - .FirstOrDefault(x => x.Name.LocalName == "thumbnail"); + .FirstOrDefault(x => x.Name.LocalName == "thumbnail"); } if (previewElement is not null) @@ -201,11 +201,11 @@ public class FeedsService : IEService, IReadyExecutor continue; var sendTask = _sender.Response(ch) - .Embed(embed) - .Text(string.IsNullOrWhiteSpace(val.Message) - ? string.Empty - : val.Message) - .SendAsync(); + .Embed(embed) + .Text(string.IsNullOrWhiteSpace(val.Message) + ? string.Empty + : val.Message) + .SendAsync(); tasks.Add(sendTask); } @@ -236,12 +236,14 @@ public class FeedsService : IEService, IReadyExecutor using var uow = _db.GetDbContext(); return uow.GetTable<FeedSub>() - .Where(x => x.GuildId == guildId) - .OrderBy(x => x.Id) - .ToList(); + .Where(x => x.GuildId == guildId) + .OrderBy(x => x.Id) + .ToList(); } - public FeedAddResult AddFeed( + private const int MAX_FEEDS = 10; + + public async Task<FeedAddResult> AddFeedAsync( ulong guildId, ulong channelId, string rssFeed, @@ -249,25 +251,24 @@ public class FeedsService : IEService, IReadyExecutor { ArgumentNullException.ThrowIfNull(rssFeed, nameof(rssFeed)); - var fs = new FeedSub - { - ChannelId = channelId, - Url = rssFeed.Trim(), - Message = message - }; - - using var uow = _db.GetDbContext(); - var feeds = uow.GetTable<FeedSub>() - .Where(x => x.GuildId == guildId) - .ToArray(); - - if (feeds.Any(x => x.Url.ToLower() == fs.Url.ToLower())) + await using var uow = _db.GetDbContext(); + var feedUrl = rssFeed.Trim(); + if (await uow.GetTable<FeedSub>().AnyAsyncLinqToDB(x => x.GuildId == guildId && + x.Url.ToLower() == feedUrl.ToLower())) return FeedAddResult.Duplicate; - if (feeds.Length >= 10) + + var count = await uow.GetTable<FeedSub>().CountAsyncLinqToDB(x => x.GuildId == guildId); + if (count >= MAX_FEEDS) return FeedAddResult.LimitReached; - uow.Add(fs); - uow.SaveChanges(); + var fs = await uow.GetTable<FeedSub>() + .InsertWithOutputAsync(() => new FeedSub + { + GuildId = guildId, + ChannelId = channelId, + Url = feedUrl, + Message = message, + }); _subs.AddOrUpdate(fs.Url.ToLower(), [fs], @@ -293,10 +294,7 @@ public class FeedsService : IEService, IReadyExecutor var toRemove = items[index]; _subs.AddOrUpdate(toRemove.Url.ToLower(), [], - (_, old) => - { - return old.Where(x => x.Id != toRemove.Id).ToList(); - }); + (_, old) => { return old.Where(x => x.Id != toRemove.Id).ToList(); }); uow.Remove(toRemove); uow.SaveChanges();