.feed will now properly add feeds to the database
This commit is contained in:
parent
8f6ecff5af
commit
172b1ed5e6
4 changed files with 63 additions and 58 deletions
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue