Skip to content

Commit 30e767b

Browse files
committed
feat(bots/discord): improve reminders
- Split viewing and creating reminders into 2 separate commands - Show ID in header and remind count in footer instead of just count in header
1 parent 87765a4 commit 30e767b

3 files changed

Lines changed: 70 additions & 52 deletions

File tree

bots/discord/src/commands/utilities/remind.ts

Lines changed: 3 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { EmbedBuilder, MessageFlags } from 'discord.js'
2-
import { eq } from 'drizzle-orm'
1+
import { EmbedBuilder } from 'discord.js'
32
import Command from '$/classes/Command'
43
import { config, database } from '$/context'
54
import { reminders } from '$/database/schemas'
@@ -12,7 +11,7 @@ const MAX_DURATION = parseDuration('1y')
1211

1312
export default new Command({
1413
name: 'remind',
15-
description: 'Set a reminder or list your reminders',
14+
description: 'Set a reminder',
1615
type: Command.Type.ChatGuild,
1716
requirements: {
1817
roles: config.utilities?.roles,
@@ -21,7 +20,7 @@ export default new Command({
2120
options: {
2221
message: {
2322
description: 'The reminder message',
24-
required: false,
23+
required: true,
2524
type: Command.OptionType.String,
2625
maxLength: 1000,
2726
},
@@ -37,52 +36,6 @@ export default new Command({
3736
},
3837
},
3938
async execute({ logger }, interaction, { message, interval, user }) {
40-
// If no message is provided, list all reminders
41-
if (!message) {
42-
const userReminders = await database.query.reminders.findMany({
43-
where: eq(reminders.creatorId, interaction.user.id),
44-
})
45-
46-
if (userReminders.length === 0) {
47-
const embed = applyCommonEmbedStyles(
48-
new EmbedBuilder().setTitle('No Reminders').setDescription('You have no active reminders.'),
49-
false,
50-
true,
51-
true,
52-
)
53-
54-
await interaction.reply({
55-
embeds: [embed],
56-
flags: MessageFlags.Ephemeral,
57-
})
58-
return
59-
}
60-
61-
const reminderList = userReminders
62-
.map(r => {
63-
const targetStr = r.targetId === r.creatorId ? 'yourself' : `<@${r.targetId}>`
64-
return (
65-
`**${r.id}.** ${r.message.substring(0, 50)}${r.message.length > 50 ? '...' : ''}\n` +
66-
`-# For ${targetStr} • <t:${r.remindAt}:R> • Reminded ${r.count}x`
67-
)
68-
})
69-
.join('\n\n')
70-
71-
const embed = applyCommonEmbedStyles(
72-
new EmbedBuilder().setTitle('Your Reminders').setDescription(reminderList),
73-
false,
74-
true,
75-
true,
76-
)
77-
78-
await interaction.reply({
79-
embeds: [embed],
80-
flags: MessageFlags.Ephemeral,
81-
})
82-
return
83-
}
84-
85-
// Create a new reminder
8639
const targetUser = user ?? interaction.user
8740
const durationMs = parseDuration(interval ?? '1d', 'd')
8841

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import { EmbedBuilder, MessageFlags } from 'discord.js'
2+
import { eq } from 'drizzle-orm'
3+
import Command from '$/classes/Command'
4+
import { config, database } from '$/context'
5+
import { reminders } from '$/database/schemas'
6+
import { applyCommonEmbedStyles } from '$/utils/discord/embeds'
7+
8+
export default new Command({
9+
name: 'reminders',
10+
description: 'View reminders',
11+
type: Command.Type.ChatGuild,
12+
requirements: {
13+
roles: config.utilities?.roles,
14+
mode: 'any',
15+
},
16+
options: {
17+
user: {
18+
description: 'The user to see reminders of (defaults to yourself)',
19+
required: false,
20+
type: Command.OptionType.User,
21+
},
22+
},
23+
async execute(_, interaction, { user }) {
24+
const userReminders = await database.query.reminders.findMany({
25+
where: eq(reminders.creatorId, user?.id ?? interaction.user.id),
26+
})
27+
28+
if (userReminders.length === 0) {
29+
const embed = applyCommonEmbedStyles(
30+
new EmbedBuilder().setTitle('No Reminders').setDescription('You have no active reminders.'),
31+
false,
32+
true,
33+
true,
34+
)
35+
36+
await interaction.reply({
37+
embeds: [embed],
38+
flags: MessageFlags.Ephemeral,
39+
})
40+
return
41+
}
42+
43+
const reminderList = userReminders
44+
.map(r => {
45+
const targetStr = r.targetId === r.creatorId ? 'yourself' : `<@${r.targetId}>`
46+
return (
47+
`**${r.id}.** ${r.message.substring(0, 50)}${r.message.length > 50 ? '...' : ''}\n` +
48+
`-# For ${targetStr} • <t:${r.remindAt}:R> • Reminded ${r.count}x`
49+
)
50+
})
51+
.join('\n\n')
52+
53+
const embed = applyCommonEmbedStyles(
54+
new EmbedBuilder().setTitle('Your Reminders').setDescription(reminderList),
55+
false,
56+
true,
57+
true,
58+
)
59+
60+
await interaction.reply({
61+
embeds: [embed],
62+
flags: MessageFlags.Ephemeral,
63+
})
64+
},
65+
})

bots/discord/src/events/discord/ready/checkReminders.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@ async function checkReminders(client: Client) {
4343

4444
const embed = applyCommonEmbedStyles(
4545
new EmbedBuilder()
46-
.setTitle(`Reminder (#${newCount})`)
46+
.setTitle(`Reminder #${reminder.id}`)
4747
.setDescription(reminder.message)
4848
.setFooter({
49-
text: `Set on ${new Date(reminder.createdAt * 1000).toLocaleDateString()}`,
49+
text: `Set on ${new Date(reminder.createdAt * 1000).toLocaleDateString()} • Reminded ${newCount} times`,
5050
}),
5151
false,
5252
false,

0 commit comments

Comments
 (0)