Experimental untagged and also search any carousel command

This commit is contained in:
barelyprofessional
2026-05-14 07:04:50 -05:00
parent b170065ca3
commit b346a3b303
+20 -5
View File
@@ -303,7 +303,9 @@ public class GetRandomImage : ICommand
{ {
public List<Regex> Patterns => [ public List<Regex> Patterns => [
new Regex(@"^(?<key>\w+)$"), new Regex(@"^(?<key>\w+)$"),
new Regex(@"^(?<key>\w+) (?<search>.+)") new Regex(@"^(?<key>\w+) (?<search>.+)"),
new Regex("^untagged$", RegexOptions.IgnoreCase),
new Regex("i (?<search>.+)")
]; ];
public string HelpText => "Get a random image"; public string HelpText => "Get a random image";
public UserRight RequiredRight => UserRight.Loser; public UserRight RequiredRight => UserRight.Loser;
@@ -319,9 +321,16 @@ public class GetRandomImage : ICommand
CancellationToken ctx) CancellationToken ctx)
{ {
await using var db = new ApplicationDbContext(); await using var db = new ApplicationDbContext();
var key = arguments["key"].Value.ToLower(); var untagged = message.MessageRawHtmlDecoded.Equals("untagged", StringComparison.CurrentCultureIgnoreCase);
var keyKnown = arguments.TryGetValue("key", out var keyGroup);
var key = "everything";
if (keyKnown) key = keyGroup!.Value;
var searchTerm = arguments.TryGetValue("search", out var searchArg) ? searchArg.Value.ToLower().Trim() : null; var searchTerm = arguments.TryGetValue("search", out var searchArg) ? searchArg.Value.ToLower().Trim() : null;
var images = db.Images.Where(i => i.Key == key); var images = db.Images.AsQueryable();
if (keyKnown)
{
images = images.Where(i => i.Key == key);
}
if (!await images.AnyAsync(ctx)) if (!await images.AnyAsync(ctx))
{ {
RateLimitService.RemoveMostRecentEntry(user, this); RateLimitService.RemoveMostRecentEntry(user, this);
@@ -341,6 +350,12 @@ public class GetRandomImage : ICommand
]); ]);
var selection = await images.ToListAsync(ctx); var selection = await images.ToListAsync(ctx);
// It's buried down here instead of right up the top since it needs to be a list first as SQLite doesn't have
// native support for JSON types so it won't be able to construct a query to see if it's empty using IQueryable
if (untagged)
{
selection = selection.Where(s => s.TagList.Count == 0).ToList();
}
if (!string.IsNullOrEmpty(searchTerm)) if (!string.IsNullOrEmpty(searchTerm))
{ {
var searchTokens = searchTerm.ToLower().Split(' ', StringSplitOptions.RemoveEmptyEntries); var searchTokens = searchTerm.ToLower().Split(' ', StringSplitOptions.RemoveEmptyEntries);
@@ -369,14 +384,14 @@ public class GetRandomImage : ICommand
db.Images.Update(image); db.Images.Update(image);
await db.SaveChangesAsync(ctx); await db.SaveChangesAsync(ctx);
TimeSpan? timeToDeletion = null; TimeSpan? timeToDeletion = null;
if (key == "pigcube" && settings[BuiltIn.Keys.BotImagePigCubeSelfDestruct].ToBoolean()) if (image.Key == "pigcube" && settings[BuiltIn.Keys.BotImagePigCubeSelfDestruct].ToBoolean())
{ {
timeToDeletion = TimeSpan.FromMilliseconds(image.Url == settings[BuiltIn.Keys.BotImageInvertedCubeUrl].Value timeToDeletion = TimeSpan.FromMilliseconds(image.Url == settings[BuiltIn.Keys.BotImageInvertedCubeUrl].Value
? settings[BuiltIn.Keys.BotImageInvertedPigCubeSelfDestructDelay].ToType<int>() ? settings[BuiltIn.Keys.BotImageInvertedPigCubeSelfDestructDelay].ToType<int>()
: new Random().Next(settings[BuiltIn.Keys.BotImagePigCubeSelfDestructMin].ToType<int>(), : new Random().Next(settings[BuiltIn.Keys.BotImagePigCubeSelfDestructMin].ToType<int>(),
settings[BuiltIn.Keys.BotImagePigCubeSelfDestructMax].ToType<int>())); settings[BuiltIn.Keys.BotImagePigCubeSelfDestructMax].ToType<int>()));
} }
else if (key is "chink" or "sloppa" && settings[BuiltIn.Keys.BotImageChinkSelfDestruct].ToBoolean()) else if (image.Key is "chink" or "sloppa" && settings[BuiltIn.Keys.BotImageChinkSelfDestruct].ToBoolean())
{ {
RateLimitService.AddEntry(user, this, message.MessageRawHtmlDecoded); RateLimitService.AddEntry(user, this, message.MessageRawHtmlDecoded);
timeToDeletion = TimeSpan.FromMilliseconds(settings[BuiltIn.Keys.BotImageChinkSelfDestructDelay].ToType<int>()); timeToDeletion = TimeSpan.FromMilliseconds(settings[BuiltIn.Keys.BotImageChinkSelfDestructDelay].ToType<int>());