Skip to content

Commit 7c307ea

Browse files
luca-montaigutneolectronManuel
authored andcommitted
feat: better display for recurring messages list (#64)
Co-authored-by: Manu <[email protected]> Co-authored-by: Manuel <[email protected]>
1 parent c1d1be3 commit 7c307ea

File tree

1 file changed

+42
-12
lines changed

1 file changed

+42
-12
lines changed

src/modules/recurringMessage/recurringMessage.helpers.ts

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { CronJob } from 'cron';
2-
import { randomUUID } from 'crypto';
32
import type {
43
ChatInputCommandInteraction,
54
Client,
@@ -26,6 +25,8 @@ const frequencyDisplay = {
2625

2726
const inMemoryJobList: { id: string; job: CronJob }[] = [];
2827

28+
const generateId = () => Math.random().toString(36).slice(2);
29+
2930
export type Frequency = keyof typeof cronTime;
3031

3132
export const isFrequency = (frequency: string): frequency is Frequency => {
@@ -34,7 +35,7 @@ export const isFrequency = (frequency: string): frequency is Frequency => {
3435

3536
export const hasPermission = (interaction: ChatInputCommandInteraction) => {
3637
if (!isModo(interaction.member)) {
37-
interaction.reply('You are not allowed to use this command').catch(console.error);
38+
void interaction.reply('You are not allowed to use this command');
3839
return false;
3940
}
4041
return true;
@@ -63,7 +64,7 @@ export const createRecurringMessage = (
6364
};
6465

6566
export const addRecurringMessage = async (interaction: ChatInputCommandInteraction) => {
66-
const jobId = randomUUID();
67+
const jobId = generateId();
6768
const channelId = interaction.channelId;
6869
const frequency = interaction.options.getString('frequency', true);
6970
if (!isFrequency(frequency)) {
@@ -124,16 +125,45 @@ export const listRecurringMessages = async (interaction: ChatInputCommandInterac
124125
return;
125126
}
126127

127-
const recurringMessagesList = recurringMessages
128-
.map(
129-
({ id, frequency, message }) =>
130-
`id: ${id} - frequency: ${frequency} - ${message.substring(0, 50)}${
131-
message.length > 50 ? '...' : ''
132-
}`,
133-
)
134-
.join('\n');
128+
const messagesInCurrentGuild = recurringMessages.filter(
129+
({ channelId }) => interaction.guild?.channels.cache.has(channelId),
130+
);
131+
132+
const messagesByChannelName = messagesInCurrentGuild.reduce<
133+
Record<string, Array<{ id: string; frequency: string; message: string }>>
134+
>((acc, { id, frequency, message, channelId }) => {
135+
const channel = interaction.guild?.channels.cache.get(channelId);
136+
if (channel === undefined) throw new Error('Channel not found');
137+
138+
const { name } = channel;
139+
const currentMessages = acc[name];
140+
141+
if (currentMessages === undefined) {
142+
return { ...acc, [name]: [{ id, frequency, message }] };
143+
}
144+
145+
currentMessages.push({ id, frequency, message });
146+
147+
return acc;
148+
}, {});
149+
150+
const embeds = Object.entries(messagesByChannelName).map(([channelName, messages]) => {
151+
const fields = messages.map(({ id, frequency, message }) => ({
152+
name: `⏰ - ${frequencyDisplay[frequency as Frequency]} (id: ${id})`,
153+
value: message.substring(0, 1000) + (message.length > 1000 ? '...' : ''),
154+
}));
155+
156+
return {
157+
title: `# ${channelName}`,
158+
color: 0x0099ff,
159+
fields,
160+
footer: {
161+
text: '\u2800'.repeat(256), // hackish way have even width for all embeds
162+
},
163+
};
164+
});
135165

136-
await interaction.reply(recurringMessagesList);
166+
await interaction.reply({ embeds });
137167
};
138168

139169
export const relaunchRecurringMessages = async (client: Client<true>) => {

0 commit comments

Comments
 (0)