Skip to content

Commit ace7bd0

Browse files
committed
feat: Consolidate dnd embed formatter
1 parent f7f856c commit ace7bd0

File tree

3 files changed

+57
-79
lines changed

3 files changed

+57
-79
lines changed

src/interactions/dnd-poll.ts

Lines changed: 2 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { parse, format, eachDayOfInterval, isEqual } from 'date-fns'
2-
import { EmbedBuilder } from 'discord.js'
32
import { google } from 'googleapis'
43
import { MongoClient, ReturnDocument } from 'mongodb'
4+
import { getDiscordEmbedFromDbResult, parseDate } from '../shared/dnd-poll-embed'
55

66
function getRangeFromTitle(title: string) {
77
const [from, to] = title
@@ -13,10 +13,6 @@ function getRangeFromTitle(title: string) {
1313
return { from, to }
1414
}
1515

16-
function parseDate(str: string) {
17-
return parse(str, 'yyyy-MM-dd', new Date())
18-
}
19-
2016
function getDays(start, end) {
2117
return eachDayOfInterval({ start, end })
2218
}
@@ -46,41 +42,7 @@ export async function handleDndPoll(body) {
4642
throw new Error('Missing schedule')
4743
}
4844
const voted = new Set(Object.values(result.dates).flat(1))
49-
const example = new EmbedBuilder()
50-
.setTitle(
51-
`Dates for ${format(parseDate(result.from), 'EEEE dd/MM/yy')} to ${format(
52-
parseDate(result.to),
53-
'EEEE dd/MM/yy'
54-
)}`
55-
)
56-
.setAuthor({ name: 'Hobby Scheduler' })
57-
.addFields(
58-
Object.entries(result.dates)
59-
.map(([d, v]: any) => ({
60-
name: `${format(d, 'dd/MM - EEEE')}`,
61-
value: `${
62-
v.length === 0
63-
? ':red_circle:'
64-
: v.length === result.members.length
65-
? ':green_circle:'
66-
: ':orange_circle:'
67-
} - ${v.length}/${result.members.length}`,
68-
}))
69-
.concat([
70-
{
71-
name: 'Voted',
72-
value: [...voted].map((m) => `<@${m}>`).join(', ') || 'No one',
73-
},
74-
{
75-
name: 'Waiting on',
76-
value:
77-
result.members
78-
.filter((m) => !voted.has(m))
79-
.map((m) => `<@${m}>`)
80-
.join(', ') || 'No one',
81-
},
82-
])
83-
)
45+
const example = getDiscordEmbedFromDbResult(result)
8446
console.info('updating to', example.toJSON())
8547
if (voted.size === result.members.length) {
8648
console.info('creating event')

src/scripts/poll.ts

Lines changed: 12 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@
1111
*/
1212

1313
import { SelectMenuBuilder } from '@discordjs/builders'
14-
import { parse } from 'date-fns'
1514
import { addDays } from 'date-fns/addDays'
1615
import { eachDayOfInterval } from 'date-fns/eachDayOfInterval'
1716
import { format } from 'date-fns/format'
18-
import { Client, Events, GatewayIntentBits, ActionRowBuilder, EmbedBuilder, TextChannel } from 'discord.js'
19-
import { MongoClient } from 'mongodb'
17+
import { Client, Events, GatewayIntentBits, ActionRowBuilder, TextChannel } from 'discord.js'
18+
import { MongoClient, ReturnDocument } from 'mongodb'
19+
import { getDiscordEmbedFromDbResult } from '../shared/dnd-poll-embed'
2020
;(async () => {
2121
console.info('[start]')
2222
await sendMessage()
@@ -28,44 +28,12 @@ function getDays() {
2828
return eachDayOfInterval({ start: current, end: addDays(current, 13) })
2929
}
3030

31-
function parseDate(str: string) {
32-
return parse(str, 'yyyy-MM-dd', new Date())
33-
}
34-
3531
async function sendMessage() {
3632
const client = await getClient()
3733
const channel = (await client.channels.fetch(process.env.DISCORD_DND_POLL_CHANNEL!)) as TextChannel
3834
const days = getDays()
3935
const result = await createDbRecord(days)
40-
const voted = new Set(Object.values(result.dates).flat(1))
41-
const embedopen = new EmbedBuilder()
42-
.setTitle(
43-
`Dates for ${format(parseDate(result.from), 'EEEE dd/MM/yy')} to ${format(parseDate(result.to), 'EEEE dd/MM/yy')}`
44-
)
45-
.setAuthor({ name: 'Hobby Scheduler' })
46-
.addFields(
47-
Object.entries(result.dates)
48-
.map(([d, v]: any) => ({
49-
name: `${format(d, 'dd/MM - EEEE')}`,
50-
value: `${
51-
v.length === 0 ? ':red_circle:' : v.length === result.members.length ? ':green_circle:' : ':orange_circle:'
52-
} - ${v.length}/${result.members.length}`,
53-
}))
54-
.concat([
55-
{
56-
name: 'Voted',
57-
value: [...voted].map((m) => `<@${m}>`).join(', ') || 'No one',
58-
},
59-
{
60-
name: 'Waiting on',
61-
value:
62-
result.members
63-
.filter((m) => !voted.has(m))
64-
.map((m) => `<@${m}>`)
65-
.join(', ') || 'No one',
66-
},
67-
])
68-
)
36+
const embedopen = getDiscordEmbedFromDbResult(result)
6937
const _message = await channel.send({
7038
embeds: [embedopen],
7139
components: [
@@ -80,7 +48,6 @@ async function sendMessage() {
8048
),
8149
],
8250
})
83-
console.info({ result })
8451
await client.destroy()
8552
}
8653

@@ -97,10 +64,16 @@ async function createDbRecord(days: Date[]) {
9764
from,
9865
to,
9966
dates: days.reduce((acc, d) => ({ ...acc, [format(d, 'yyyy-MM-dd')]: [] })),
100-
members: ['137678852628545539', '185741150714331136', '217741486115127297'],
67+
members: [
68+
'137678852628545539',
69+
'185741150714331136',
70+
'217741486115127297',
71+
'272791476340260865',
72+
'361624461243449345',
73+
],
10174
},
10275
},
103-
{ upsert: true }
76+
{ upsert: true, returnDocument: ReturnDocument.AFTER }
10477
)
10578
await client.close()
10679
return result

src/shared/dnd-poll-embed.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { format, parse } from 'date-fns'
2+
import { EmbedBuilder } from 'discord.js'
3+
4+
export function getDiscordEmbedFromDbResult(result: any) {
5+
console.info({ result })
6+
const voted = new Set(Object.values(result.dates).flat(1))
7+
const embedopen = new EmbedBuilder()
8+
.setTitle(
9+
`Dates for ${format(parseDate(result.from), 'EEEE dd/MM/yy')} to ${format(parseDate(result.to), 'EEEE dd/MM/yy')}`
10+
)
11+
.setAuthor({ name: 'Hobby Scheduler' })
12+
.addFields(
13+
Object.entries(result.dates)
14+
.map(([d, v]: any) => ({
15+
name: `${
16+
v.length === 0 ? ':red_circle:' : v.length === result.members.length ? ':green_circle:' : ':orange_circle:'
17+
} ${format(d, 'dd/MM - EEEE')}`,
18+
value: [`${v.length}/${result.members.length}`, `${v.map((m) => `<@${m}>`).join(', ')}`]
19+
.filter(Boolean)
20+
.join(' - '),
21+
}))
22+
.concat([
23+
{
24+
name: 'Voted',
25+
value: [...voted].map((m) => `<@${m}>`).join(', ') || 'No one',
26+
},
27+
{
28+
name: 'Waiting on',
29+
value:
30+
result.members
31+
.filter((m) => !voted.has(m))
32+
.map((m) => `<@${m}>`)
33+
.join(', ') || 'No one',
34+
},
35+
])
36+
)
37+
38+
return embedopen
39+
}
40+
41+
export function parseDate(str: string) {
42+
return parse(str, 'yyyy-MM-dd', new Date())
43+
}

0 commit comments

Comments
 (0)