mirror of
https://github.com/NoiTheCat/BirthdayBot.git
synced 2024-11-24 17:34:13 +00:00
Merge ee9e0b0444
into a15b5fd6cf
This commit is contained in:
commit
0bb22cc554
5 changed files with 39 additions and 5 deletions
|
@ -20,7 +20,7 @@ public class BirthdayModule : BotModuleBase {
|
||||||
public class SubCmdsBirthdaySet : BotModuleBase {
|
public class SubCmdsBirthdaySet : BotModuleBase {
|
||||||
[SlashCommand("date", HelpCmdSetDate)]
|
[SlashCommand("date", HelpCmdSetDate)]
|
||||||
public async Task CmdSetBday([Summary(description: HelpOptDate)] string date,
|
public async Task CmdSetBday([Summary(description: HelpOptDate)] string date,
|
||||||
[Summary(description: HelpOptZone)] string? zone = null) {
|
[Summary(description: HelpOptZone), Autocomplete<TzAutocompleteHandler>] string? zone = null) {
|
||||||
int inmonth, inday;
|
int inmonth, inday;
|
||||||
try {
|
try {
|
||||||
(inmonth, inday) = ParseDate(date);
|
(inmonth, inday) = ParseDate(date);
|
||||||
|
@ -59,7 +59,7 @@ public class BirthdayModule : BotModuleBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
[SlashCommand("timezone", HelpCmdSetZone)]
|
[SlashCommand("timezone", HelpCmdSetZone)]
|
||||||
public async Task CmdSetZone([Summary(description: HelpOptZone)] string zone) {
|
public async Task CmdSetZone([Summary(description: HelpOptZone), Autocomplete<TzAutocompleteHandler>] string zone) {
|
||||||
using var db = new BotDatabaseContext();
|
using var db = new BotDatabaseContext();
|
||||||
|
|
||||||
var user = ((SocketGuildUser)Context.User).GetUserEntryOrNew(db);
|
var user = ((SocketGuildUser)Context.User).GetUserEntryOrNew(db);
|
||||||
|
|
|
@ -44,7 +44,7 @@ public class BirthdayOverrideModule : BotModuleBase {
|
||||||
|
|
||||||
[SlashCommand("set-timezone", "Set a user's time zone on their behalf.")]
|
[SlashCommand("set-timezone", "Set a user's time zone on their behalf.")]
|
||||||
public async Task OvSetTimezone([Summary(description: HelpOptOvTarget)] SocketGuildUser target,
|
public async Task OvSetTimezone([Summary(description: HelpOptOvTarget)] SocketGuildUser target,
|
||||||
[Summary(description: HelpOptZone)] string zone) {
|
[Summary(description: HelpOptZone), Autocomplete<TzAutocompleteHandler>] string zone) {
|
||||||
using var db = new BotDatabaseContext();
|
using var db = new BotDatabaseContext();
|
||||||
|
|
||||||
var user = target.GetUserEntryOrNew(db);
|
var user = target.GetUserEntryOrNew(db);
|
||||||
|
|
|
@ -193,7 +193,7 @@ public class ConfigModule : BotModuleBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
[SlashCommand("set-timezone", "Configure the time zone to use by default in the server." + HelpPofxBlankUnset)]
|
[SlashCommand("set-timezone", "Configure the time zone to use by default in the server." + HelpPofxBlankUnset)]
|
||||||
public async Task CmdSetTimezone([Summary(description: HelpOptZone)] string? zone = null) {
|
public async Task CmdSetTimezone([Summary(description: HelpOptZone), Autocomplete<TzAutocompleteHandler>] string? zone = null) {
|
||||||
const string Response = ":white_check_mark: The server's time zone has been ";
|
const string Response = ":white_check_mark: The server's time zone has been ";
|
||||||
|
|
||||||
if (zone == null) {
|
if (zone == null) {
|
||||||
|
|
34
ApplicationCommands/TzAutocompleteHandler.cs
Normal file
34
ApplicationCommands/TzAutocompleteHandler.cs
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
|
||||||
|
using BirthdayBot.Data;
|
||||||
|
using Discord.Interactions;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
|
namespace BirthdayBot.ApplicationCommands;
|
||||||
|
|
||||||
|
public class TzAutocompleteHandler : AutocompleteHandler {
|
||||||
|
public override Task<AutocompletionResult> GenerateSuggestionsAsync(IInteractionContext cx,
|
||||||
|
IAutocompleteInteraction ia, IParameterInfo pm,
|
||||||
|
IServiceProvider sv) {
|
||||||
|
var input = ((SocketAutocompleteInteraction)ia).Data.Current.Value.ToString()!;
|
||||||
|
var inparts = input.Split('/', 2, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
|
||||||
|
|
||||||
|
var db = new BotDatabaseContext();
|
||||||
|
var query = db.UserEntries.AsNoTracking();
|
||||||
|
if (inparts.Length == 2) {
|
||||||
|
query = query.Where(u => EF.Functions.ILike(u.TimeZone!, $"%{inparts[0]}%/%{inparts[1]}%"));
|
||||||
|
} else {
|
||||||
|
// No '/' in query - search for string within each side of zone name (tested to not give conflicting results)
|
||||||
|
query = query.Where(u =>
|
||||||
|
EF.Functions.ILike(u.TimeZone!, $"%{input}%/%") || EF.Functions.ILike(u.TimeZone!, $"%/%{input}%"));
|
||||||
|
}
|
||||||
|
// TODO Could find a way to include all remaining zones at the bottom of results for full completion
|
||||||
|
// TODO Filter out undesirable zone names, aliases, etc from autocompletion
|
||||||
|
var result = query.GroupBy(u => u.TimeZone)
|
||||||
|
.Select(g => new { ZoneName = g.Key, Count = g.Count() })
|
||||||
|
.OrderByDescending(x => x.Count)
|
||||||
|
.Take(25)
|
||||||
|
.Select(x => new AutocompleteResult(x.ZoneName, x.ZoneName))
|
||||||
|
.ToList();
|
||||||
|
return Task.FromResult(AutocompletionResult.FromSuccess(result));
|
||||||
|
}
|
||||||
|
}
|
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="CommandLineParser" Version="2.9.1" />
|
<PackageReference Include="CommandLineParser" Version="2.9.1" />
|
||||||
<PackageReference Include="Discord.Net" Version="3.14.1" />
|
<PackageReference Include="Discord.Net" Version="3.15.2" />
|
||||||
<PackageReference Include="EFCore.NamingConventions" Version="8.0.3" />
|
<PackageReference Include="EFCore.NamingConventions" Version="8.0.3" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.4">
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.4">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
|
Loading…
Reference in a new issue