Skip to content

Commit

Permalink
feat: show premium details in settings
Browse files Browse the repository at this point in the history
Backwards compatibility: Yes - will show expired if previously whitelisted
  • Loading branch information
zapteryx committed Dec 2, 2022
1 parent 6c60cd4 commit 7d6b021
Show file tree
Hide file tree
Showing 9 changed files with 229 additions and 78 deletions.
18 changes: 18 additions & 0 deletions locales/en/cmd.js
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,24 @@ export default {
HEADER: 'Settings for **%1**'
},
MISC: {
PREMIUM: {
NAME: 'Premium',
DESCRIPTION: 'Premium features for this server.',
FEATURES: {
STAY: '24/7 Mode',
AUTOLYRICS: 'Auto Lyrics'
},
DISPLAY: {
UNLOCKED: {
PERMANENT: 'Available **forever**',
TEMPORARY: 'Available until **<t:%1:f>**'
},
LOCKED: {
DEFAULT: 'Requires Premium',
EXPIRED: 'Expired at **<t:%1:f>**'
}
}
},
LANGUAGE: {
NAME: 'Language',
DESCRIPTION: 'The language to use for this server.'
Expand Down
63 changes: 33 additions & 30 deletions src/commands/247.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,38 +55,41 @@ export default {
});
return;
}
if (
settings.features.stay.whitelist &&
!(await data.guild.get(
if (settings.features.stay.whitelist) {
const whitelisted = await data.guild.get<number>(
interaction.guildId,
'features.stay.whitelisted',
))
) {
settings.features.stay.premium && settings.premiumURL
? await interaction.replyHandler.locale(
'FEATURE.NO_PERMISSION.PREMIUM',
{
type: MessageOptionsBuilderType.Error,
components: [
new ActionRowBuilder<ButtonBuilder>().setComponents(
new ButtonBuilder()
.setLabel(
await getGuildLocaleString(
interaction.guildId,
'MISC.GET_PREMIUM',
),
)
.setStyle(ButtonStyle.Link)
.setURL(settings.premiumURL),
),
],
},
)
: await interaction.replyHandler.locale(
'FEATURE.NO_PERMISSION.DEFAULT',
{ type: MessageOptionsBuilderType.Error },
);
return;
);
if (
!whitelisted ||
(whitelisted !== -1 && Date.now() > whitelisted)
) {
settings.features.stay.premium && settings.premiumURL
? await interaction.replyHandler.locale(
'FEATURE.NO_PERMISSION.PREMIUM',
{
type: MessageOptionsBuilderType.Error,
components: [
new ActionRowBuilder<ButtonBuilder>().setComponents(
new ButtonBuilder()
.setLabel(
await getGuildLocaleString(
interaction.guildId,
'MISC.GET_PREMIUM',
),
)
.setStyle(ButtonStyle.Link)
.setURL(settings.premiumURL),
),
],
},
)
: await interaction.replyHandler.locale(
'FEATURE.NO_PERMISSION.DEFAULT',
{ type: MessageOptionsBuilderType.Error },
);
return;
}
}
const player = interaction.client.music.players.get(
interaction.guildId,
Expand Down
63 changes: 33 additions & 30 deletions src/components/buttons/autolyrics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,38 +78,41 @@ export default {
);
return;
}
if (
settings.features.autolyrics.whitelist &&
!(await data.guild.get(
if (settings.features.autolyrics.whitelist) {
const whitelisted = await data.guild.get<number>(
interaction.guildId,
'features.autolyrics.whitelisted',
))
) {
settings.features.autolyrics.premium && settings.premiumURL
? await interaction.replyHandler.locale(
'FEATURE.NO_PERMISSION.PREMIUM',
{
type: MessageOptionsBuilderType.Error,
components: [
new ActionRowBuilder<ButtonBuilder>().setComponents(
new ButtonBuilder()
.setLabel(
await getGuildLocaleString(
interaction.guildId,
'MISC.GET_PREMIUM',
),
)
.setStyle(ButtonStyle.Link)
.setURL(settings.premiumURL),
),
],
},
)
: await interaction.replyHandler.locale(
'FEATURE.NO_PERMISSION.DEFAULT',
{ type: MessageOptionsBuilderType.Error },
);
return;
);
if (
!whitelisted ||
(whitelisted !== -1 && Date.now() > whitelisted)
) {
settings.features.autolyrics.premium && settings.premiumURL
? await interaction.replyHandler.locale(
'FEATURE.NO_PERMISSION.PREMIUM',
{
type: MessageOptionsBuilderType.Error,
components: [
new ActionRowBuilder<ButtonBuilder>().setComponents(
new ButtonBuilder()
.setLabel(
await getGuildLocaleString(
interaction.guildId,
'MISC.GET_PREMIUM',
),
)
.setStyle(ButtonStyle.Link)
.setURL(settings.premiumURL),
),
],
},
)
: await interaction.replyHandler.locale(
'FEATURE.NO_PERMISSION.DEFAULT',
{ type: MessageOptionsBuilderType.Error },
);
return;
}
}
}
await data.guild.set(
Expand Down
9 changes: 0 additions & 9 deletions src/events/music/trackStart.ts
Original file line number Diff line number Diff line change
Expand Up @@ -176,15 +176,6 @@ export default {
},
);
if (settings.features.autolyrics.enabled) {
if (
settings.features.autolyrics.whitelist &&
!(await data.guild.get<boolean>(
queue.player.guildId,
'features.autolyrics.whitelisted',
))
) {
return;
}
if (
!(await data.guild.get<boolean>(
queue.player.guildId,
Expand Down
2 changes: 1 addition & 1 deletion src/lib/DataHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ export default class DataHandler {
async set(
key: string,
item: string,
value: string | boolean,
value: string | number | boolean,
): Promise<true> {
let data: DatabaseObject = await this.cache.get(key);
if (!data) data = {};
Expand Down
7 changes: 6 additions & 1 deletion src/lib/util/common.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,12 @@ export type SearchStateRecord = {
selected: Snowflake[];
};

export type SettingsPageOptions = 'language' | 'format' | 'dj' | 'autolyrics';
export type SettingsPageOptions =
| 'premium'
| 'language'
| 'format'
| 'dj'
| 'autolyrics';

export type SettingsPage = {
current: string;
Expand Down
10 changes: 9 additions & 1 deletion src/lib/util/constants.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { settings } from './settings.js';

export enum Check {
/**
* Only allowed in guild
Expand Down Expand Up @@ -25,4 +27,10 @@ export enum Language {
en = 'English',
fil = 'Filipino',
}
export const settingsOptions = ['language', 'format', 'dj', 'autolyrics'];
export const settingsOptions = [
...(settings.premiumURL ? ['premium'] : []),
'language',
'format',
'dj',
'autolyrics',
];
101 changes: 101 additions & 0 deletions src/lib/util/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,36 @@ export function msToTimeString(msObject: TimeObject, simple?: boolean): string {
}`.slice(0, -2);
}

/**
* Parses a human-readable time string into milliseconds.
* @param timeString - The time string to parse.
* @returns The parsed milliseconds.
*/
export function parseTimeString(timeString: string): number {
const timeRegex = /(\d+)([smhd])/g;
const timeMatches = timeString.matchAll(timeRegex);
let time = 0;
for (const match of timeMatches) {
const amount = parseInt(match[1]);
const unit = match[2];
switch (unit) {
case 's':
time += amount * 1000;
break;
case 'm':
time += amount * 1000 * 60;
break;
case 'h':
time += amount * 1000 * 60 * 60;
break;
case 'd':
time += amount * 1000 * 60 * 60 * 24;
break;
}
}
return time;
}

/**
* Returns a number rounded to the number of decimal places provided.
* Reference: https://stackoverflow.com/a/15762794
Expand Down Expand Up @@ -421,6 +451,77 @@ export async function buildSettingsPage(
embeds: EmbedBuilder[] = [];
const actionRow = new ActionRowBuilder<MessageActionRowComponentBuilder>();
switch (option) {
case 'premium': {
current = '';
actionRow.addComponents(
new ButtonBuilder()
.setLabel(
await getGuildLocaleString(
interaction.guildId,
'MISC.GET_PREMIUM',
),
)
.setStyle(ButtonStyle.Link)
.setURL(settings.premiumURL),
);
const whitelisted = {
stay: await data.guild.get<number>(
interaction.guildId,
'features.stay.whitelisted',
),
autolyrics: await data.guild.get<number>(
interaction.guildId,
'features.autolyrics.whitelisted',
),
};
const features = Object.keys(whitelisted)
.filter(
(key: 'stay' | 'autolyrics'): boolean =>
settings.features[key].enabled &&
settings.features[key].whitelist &&
settings.features[key].premium,
)
.map(
(key: 'stay' | 'autolyrics'): string =>
`**${getLocaleString(
guildLocaleCode,
`CMD.SETTINGS.MISC.PREMIUM.FEATURES.${key.toUpperCase()}`,
)}** ─ ${
!whitelisted[key]
? getLocaleString(
guildLocaleCode,
'CMD.SETTINGS.MISC.PREMIUM.DISPLAY.LOCKED.DEFAULT',
)
: whitelisted[key] !== -1 &&
Date.now() > whitelisted[key]
? getLocaleString(
guildLocaleCode,
'CMD.SETTINGS.MISC.PREMIUM.DISPLAY.LOCKED.EXPIRED',
Math.floor(
whitelisted[key] / 1000,
).toString(),
)
: whitelisted[key] === -1
? getLocaleString(
guildLocaleCode,
'CMD.SETTINGS.MISC.PREMIUM.DISPLAY.UNLOCKED.PERMANENT',
)
: getLocaleString(
guildLocaleCode,
'CMD.SETTINGS.MISC.PREMIUM.DISPLAY.UNLOCKED.TEMPORARY',
Math.floor(
whitelisted[key] / 1000,
).toString(),
)
}`,
);
embeds = [
new EmbedBuilder()
.setDescription(features.join('\n'))
.setColor(settings.colors.neutral),
];
break;
}
case 'language':
current = `\`${
Language[guildLocaleCode] ?? 'Unknown'
Expand Down
Loading

0 comments on commit 7d6b021

Please sign in to comment.