Skip to content

Commit 7a44c08

Browse files
committed
feat: add /supportedversions command for quick version checks
1 parent a8abca6 commit 7a44c08

File tree

4 files changed

+86
-42
lines changed

4 files changed

+86
-42
lines changed

src/interactions/commands/command-manager.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { infoSlashCommand } from './handlers/info/info-slash';
2323
import { backupRequestCommand } from './handlers/backup-request';
2424
import { createVoicechat } from './handlers/voicechat/voice-slash';
2525
import { removeBlueskyPostFromFeedSlashCommand } from './handlers/remove-bluesky-post-from-feed-slash';
26+
import { supportedVersionsSlashCommand } from './handlers/supported-versions-slash';
2627

2728
class CommandManager implements IInteractionManager {
2829
private handlers: ICommandHandler[] = [];
@@ -48,6 +49,7 @@ class CommandManager implements IInteractionManager {
4849
backupRequestCommand,
4950
createVoicechat,
5051
removeBlueskyPostFromFeedSlashCommand,
52+
supportedVersionsSlashCommand
5153
];
5254

5355
for (const handler of commandsToRegister) {

src/interactions/commands/handlers/info/info-helpers.ts

Lines changed: 6 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
ButtonStyle,
77
EmbedBuilder,
88
} from 'discord.js';
9-
import { getSupportedFirebotVersions } from '../../../../services/github.service';
9+
import { getSupportedFirebotVersionField } from '../../../../services/github.service';
1010

1111
export function getBaseEmbed() {
1212
return new EmbedBuilder().setColor('#FFBE00');
@@ -18,35 +18,12 @@ export type InfoTopic = {
1818
};
1919

2020
export async function getSupportPolicyEmbed(): Promise<EmbedBuilder> {
21-
const supportedVersions = await getSupportedFirebotVersions();
22-
23-
// Build the list of currently supported versions
24-
const versionLines: string[] = [];
25-
if (supportedVersions.currentStable) {
26-
versionLines.push(`- **${supportedVersions.currentStable}** (Latest)`);
27-
}
28-
if (
29-
supportedVersions.previousStable &&
30-
supportedVersions.previousStableExpiresAt
31-
) {
32-
versionLines.push(
33-
`- **${supportedVersions.previousStable}** (Previous - support expires <t:${supportedVersions.previousStableExpiresAt}:R>)`
34-
);
35-
}
36-
if (supportedVersions.prerelease) {
37-
versionLines.push(
38-
`- **${supportedVersions.prerelease}** (Pre-release)`
39-
);
40-
}
41-
21+
4222
const fields: APIEmbedField[] = [];
43-
44-
if (versionLines.length > 0) {
45-
fields.push({
46-
name: 'Currently Supported Versions',
47-
value: versionLines.join('\n'),
48-
inline: false,
49-
});
23+
24+
const supportedVersionsField = await getSupportedFirebotVersionField();
25+
if (supportedVersionsField) {
26+
fields.push(supportedVersionsField);
5027
}
5128

5229
fields.push({
@@ -60,10 +37,6 @@ export async function getSupportPolicyEmbed(): Promise<EmbedBuilder> {
6037
inline: false,
6138
});
6239

63-
const currentlySupportedSection =
64-
versionLines.length > 0
65-
? `**Currently Supported Versions:**\n${versionLines.join('\n')}\n\n`
66-
: '';
6740
return getBaseEmbed()
6841
.setTitle('Support Policy')
6942
.setDescription(
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { EmbedBuilder, SlashCommandBuilder } from 'discord.js';
2+
import { CommandType, ICommandHandler } from '../command-handler.interface';
3+
import { getSupportedFirebotVersionField } from '../../../services/github.service';
4+
5+
const config = new SlashCommandBuilder()
6+
.setName('supportedversions')
7+
.setDescription('Get the currently supported Firebot versions');
8+
9+
export const supportedVersionsSlashCommand: ICommandHandler = {
10+
type: CommandType.SlashCommand,
11+
config,
12+
async onTrigger(interaction) {
13+
await interaction.deferReply({ ephemeral: true });
14+
15+
const supportedVersionsField = await getSupportedFirebotVersionField();
16+
17+
if (!supportedVersionsField) {
18+
await interaction.followUp({
19+
content: "Couldn't get the supported Firebot versions :(",
20+
ephemeral: true,
21+
});
22+
return;
23+
}
24+
25+
const embed = new EmbedBuilder()
26+
.setColor('#FFBE00')
27+
.setFields(supportedVersionsField);
28+
29+
await interaction.followUp({
30+
embeds: [embed],
31+
ephemeral: true,
32+
});
33+
},
34+
};

src/services/github.service.ts

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
IRelease,
1010
} from '../types/github';
1111
import { config } from '../config';
12+
import { APIEmbedField } from 'discord.js';
1213

1314
function getDefaultAxiosConfig(): AxiosRequestConfig {
1415
return {
@@ -198,14 +199,10 @@ export async function getSupportedFirebotVersions(): Promise<SupportedVersions>
198199
}
199200

200201
// Find stable releases
201-
const stableReleases = releases.filter(
202-
(r) => !r.prerelease
203-
);
202+
const stableReleases = releases.filter((r) => !r.prerelease);
204203

205204
// Find prerelease versions (betas, etc)
206-
const prereleases = releases.filter(
207-
(r) => r.prerelease
208-
);
205+
const prereleases = releases.filter((r) => r.prerelease);
209206

210207
// Current stable is the most recent stable release
211208
if (stableReleases.length > 0) {
@@ -216,14 +213,19 @@ export async function getSupportedFirebotVersions(): Promise<SupportedVersions>
216213
const currentStableDate = new Date(stableReleases[0].published_at);
217214
const now = new Date();
218215
const daysSinceCurrentStable = Math.floor(
219-
(now.getTime() - currentStableDate.getTime()) / (1000 * 60 * 60 * 24)
216+
(now.getTime() - currentStableDate.getTime()) /
217+
(1000 * 60 * 60 * 24)
220218
);
221219

222220
if (daysSinceCurrentStable <= 30) {
223221
result.previousStable = stableReleases[1].tag_name;
224222
// Calculate expiration date (30 days from current stable release)
225-
const expirationDate = new Date(currentStableDate.getTime() + 30 * 24 * 60 * 60 * 1000);
226-
result.previousStableExpiresAt = Math.floor(expirationDate.getTime() / 1000);
223+
const expirationDate = new Date(
224+
currentStableDate.getTime() + 30 * 24 * 60 * 60 * 1000
225+
);
226+
result.previousStableExpiresAt = Math.floor(
227+
expirationDate.getTime() / 1000
228+
);
227229
}
228230
}
229231
}
@@ -246,3 +248,36 @@ export async function getSupportedFirebotVersions(): Promise<SupportedVersions>
246248

247249
return result;
248250
}
251+
252+
export async function getSupportedFirebotVersionField(): Promise<APIEmbedField | null> {
253+
const supportedVersions = await getSupportedFirebotVersions();
254+
255+
// Build the list of currently supported versions
256+
const versionLines: string[] = [];
257+
if (supportedVersions.currentStable) {
258+
versionLines.push(`- **${supportedVersions.currentStable}** (Latest)`);
259+
}
260+
if (
261+
supportedVersions.previousStable &&
262+
supportedVersions.previousStableExpiresAt
263+
) {
264+
versionLines.push(
265+
`- **${supportedVersions.previousStable}** (Previous - support expires <t:${supportedVersions.previousStableExpiresAt}:R>)`
266+
);
267+
}
268+
if (supportedVersions.prerelease) {
269+
versionLines.push(
270+
`- **${supportedVersions.prerelease}** (Pre-release)`
271+
);
272+
}
273+
274+
if (versionLines.length > 0) {
275+
return {
276+
name: 'Currently Supported Versions',
277+
value: versionLines.join('\n'),
278+
inline: false,
279+
};
280+
}
281+
282+
return null;
283+
}

0 commit comments

Comments
 (0)