Skip to content

Commit a5c96a3

Browse files
committed
save filter to modrinth entry, apply filter when sending data to guild
1 parent 1bd8f5d commit a5c96a3

File tree

4 files changed

+103
-59
lines changed

4 files changed

+103
-59
lines changed

Asterion/Interfaces/IDataService.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,4 +135,5 @@ public Task<bool> UpdateModrinthProjectAsync(string projectId, string? newVersio
135135

136136
public Task<bool> SetPingRoleAsync(ulong guildId, ulong? roleId, string? projectId = null);
137137
public Task<ulong?> GetPingRoleIdAsync(ulong guildId, string? projectId = null);
138+
public Task<bool> SetReleaseFilterAsync(ulong entryId, ReleaseType releaseType);
138139
}

Asterion/Modules/EntryInteractionModule.cs

Lines changed: 85 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,44 @@ namespace Asterion.Modules
1111
public class EntryInteractionModule(ILocalizationService localizationService, IDataService dataService)
1212
: AsterionInteractionModuleBase(localizationService)
1313
{
14+
public static Embed CreateModrinthEntryEmbed(ModrinthEntry entry, ReleaseType releaseFilter)
15+
{
16+
return new EmbedBuilder()
17+
.WithTitle("Modrinth Entry Information")
18+
.WithDescription("Here is the information about the Modrinth entry:")
19+
.AddField("📂 Project ID", $"`{entry.ProjectId}`", false)
20+
.AddField("📢 Custom Update Channel",
21+
entry.CustomUpdateChannel.HasValue ? MentionUtils.MentionChannel(entry.CustomUpdateChannel.Value) : "None",
22+
true)
23+
.AddField("📜 Custom Ping Role",
24+
entry.CustomPingRole.HasValue ? MentionUtils.MentionRole(entry.CustomPingRole.Value) : "None",
25+
false)
26+
.AddField("🔖 Release Filter", releaseFilter.ToString(), true)
27+
.AddField("🕒 Created", TimestampTag.FromDateTime(entry.Created).ToString(), true)
28+
.WithColor(Color.Blue)
29+
.WithCurrentTimestamp()
30+
.Build();
31+
}
32+
33+
private static MessageComponent CreateReleaseFilterComponent(string projectId, ReleaseType releaseFilter)
34+
{
35+
var selectMenu = new SelectMenuBuilder()
36+
.WithCustomId($"release_filter:{projectId}")
37+
.WithPlaceholder("Select release type(s)")
38+
.WithMinValues(1)
39+
.WithMaxValues(3)
40+
.AddOption("Alpha", ((int)ReleaseType.Alpha).ToString(), "Include Alpha releases",
41+
isDefault: releaseFilter.HasFlag(ReleaseType.Alpha))
42+
.AddOption("Beta", ((int)ReleaseType.Beta).ToString(), "Include Beta releases",
43+
isDefault: releaseFilter.HasFlag(ReleaseType.Beta))
44+
.AddOption("Release", ((int)ReleaseType.Release).ToString(), "Include Release",
45+
isDefault: releaseFilter.HasFlag(ReleaseType.Release));
46+
47+
return new ComponentBuilder()
48+
.WithSelectMenu(selectMenu)
49+
.Build();
50+
}
51+
1452
// Interaction command to display the entry info and provide a dropdown
1553
[SlashCommand("entry", "Displays entry information and allows selection of release type filters.")]
1654
public async Task ShowEntryAsync([Summary("project_id")] [Autocomplete(typeof(SubscribedIdAutocompletionHandler))] string projectId)
@@ -26,73 +64,62 @@ public async Task ShowEntryAsync([Summary("project_id")] [Autocomplete(typeof(Su
2664
}
2765

2866
// Create embed with entry details
29-
var embed = new EmbedBuilder()
30-
.WithTitle("Modrinth Entry Information")
31-
.AddField("Project ID", entry.ProjectId)
32-
.AddField("Array ID", entry.ArrayId)
33-
.AddField("Custom Update Channel", entry.CustomUpdateChannel?.ToString() ?? "None")
34-
.AddField("Custom Ping Role", entry.CustomPingRole?.ToString() ?? "None")
35-
.AddField("Release Filter", entry.ReleaseFilter.ToString())
36-
.AddField("Created", TimestampTag.FromDateTime(entry.Created))
37-
.WithColor(Color.Blue)
38-
.Build();
67+
var embed = CreateModrinthEntryEmbed(entry, entry.ReleaseFilter);
3968

40-
// Create a SelectMenu for ReleaseType filter
41-
var selectMenu = new SelectMenuBuilder()
42-
.WithCustomId($"release_filter:{entry.EntryId}") // Unique ID to handle interactions
43-
.WithPlaceholder("Select release type(s)")
44-
.WithMinValues(1)
45-
.WithMaxValues(3)
46-
.AddOption("Alpha", ((int)ReleaseType.Alpha).ToString(), "Include Alpha releases",
47-
isDefault: entry.ReleaseFilter.HasFlag(ReleaseType.Alpha))
48-
.AddOption("Beta", ((int)ReleaseType.Beta).ToString(), "Include Beta releases",
49-
isDefault: entry.ReleaseFilter.HasFlag(ReleaseType.Beta))
50-
.AddOption("Release", ((int)ReleaseType.Release).ToString(), "Include Release",
51-
isDefault: entry.ReleaseFilter.HasFlag(ReleaseType.Release));
5269

53-
var component = new ComponentBuilder()
54-
.WithSelectMenu(selectMenu)
55-
.Build();
70+
// Create a SelectMenu for ReleaseType filter
71+
var component = CreateReleaseFilterComponent(projectId, entry.ReleaseFilter);
5672

5773
// Send the embed with the dropdown menu
5874
await FollowupAsync(embed: embed, components: component);
5975
}
6076

61-
// Handle the dropdown interaction
6277
[ComponentInteraction("release_filter:*")]
63-
public async Task HandleReleaseFilterSelectionAsync(string entryId, string[] selectedValues)
78+
public async Task HandleReleaseFilterSelectionAsync(string projectId, string[] selectedValues)
6479
{
65-
// Parse the entry ID
66-
// if (!ulong.TryParse(entryId, out var parsedEntryId))
67-
// {
68-
// await RespondAsync("Invalid entry ID.");
69-
// return;
70-
// }
71-
//
72-
// // Retrieve the entry
73-
// var entry = await _modrinthEntryService.GetEntryByIdAsync(parsedEntryId);
74-
// if (entry == null)
75-
// {
76-
// await RespondAsync("Entry not found.");
77-
// return;
78-
// }
79-
//
80-
// // Convert selectedValues back into the ReleaseType enum
81-
// ReleaseType? newReleaseFilter = null;
82-
// foreach (var value in selectedValues)
83-
// {
84-
// if (int.TryParse(value, out var releaseTypeValue))
85-
// {
86-
// newReleaseFilter |= (ReleaseType)releaseTypeValue;
87-
// }
88-
// }
89-
//
90-
// // Update the entry with the new filter (handle updating it in your data source here)
91-
// entry.ReleaseFilter = newReleaseFilter;
92-
// await _modrinthEntryService.UpdateEntryAsync(entry); // Update via your custom connector
93-
//
94-
// // Respond with the updated information
95-
// await RespondAsync($"Release filter updated to: {entry.ReleaseFilter}");
80+
// Defer the interaction to avoid timeout issues
81+
await DeferAsync(ephemeral: true);
82+
83+
// Retrieve the entry using projectId
84+
var entry = await dataService.GetModrinthEntryAsync(Context.Guild.Id, projectId);
85+
if (entry == null)
86+
{
87+
await FollowupAsync("Entry not found.", ephemeral: true);
88+
return;
89+
}
90+
91+
// Convert selectedValues back into the ReleaseType enum
92+
ReleaseType newReleaseFilter = 0;
93+
foreach (var value in selectedValues)
94+
{
95+
if (int.TryParse(value, out var releaseTypeValue))
96+
{
97+
newReleaseFilter |= (ReleaseType)releaseTypeValue;
98+
}
99+
}
100+
101+
if (newReleaseFilter == 0)
102+
{
103+
await FollowupAsync("Please select at least one release type.", ephemeral: true);
104+
return;
105+
}
106+
107+
// Update the release filter in the database
108+
await dataService.SetReleaseFilterAsync(entry.EntryId, newReleaseFilter);
109+
110+
// Use the static method to generate the updated embed
111+
var updatedEmbed = CreateModrinthEntryEmbed(entry, newReleaseFilter);
112+
113+
// Update the original message with the new embed
114+
await ModifyOriginalResponseAsync(msg => {
115+
msg.Embed = updatedEmbed;
116+
msg.Components = CreateReleaseFilterComponent(projectId, newReleaseFilter);
117+
});
118+
119+
// Optionally, acknowledge the selection change in a temporary message
120+
await FollowupAsync("Release filter updated successfully!", ephemeral: true);
96121
}
122+
123+
97124
}
98125
}

Asterion/Services/DataService.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,22 @@ public async Task<bool> SetPingRoleAsync(ulong guildId, ulong? roleId, string? p
411411
}
412412
}
413413

414+
public async Task<bool> SetReleaseFilterAsync(ulong entryId, ReleaseType releaseType)
415+
{
416+
using var scope = _services.CreateScope();
417+
var db = scope.ServiceProvider.GetRequiredService<DataContext>();
418+
419+
var entry = await db.ModrinthEntries.FirstOrDefaultAsync(x => x.EntryId == entryId);
420+
421+
if (entry is null) return false;
422+
423+
entry.ReleaseFilter = releaseType;
424+
425+
await db.SaveChangesAsync();
426+
427+
return true;
428+
}
429+
414430
private async Task JoinGuild(SocketGuild guild)
415431
{
416432
await AddGuildAsync(guild.Id);

Asterion/Services/Modrinth/SendDiscordNotificationJob.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ private async Task SendNotifications(Project project, Version[] versions)
119119
_logger.LogDebug("Skipping version {VersionId} of project {ProjectId} due to release filter", version.Id, project.Id);
120120
continue;
121121
default:
122-
_logger.LogError("Unknown version type {VersionType} for version {VersionId} of project {ProjectId}", version.ProjectVersionType, version.Id, project.Id);
122+
_logger.LogDebug("Version {VersionId} of project {ProjectId} passed release filter", version.Id, project.Id);
123123
break;
124124
}
125125

0 commit comments

Comments
 (0)