Skip to content

Commit e909156

Browse files
authored
Merge pull request #167 from Chr1s70ph/fix_weekplan
Fix weekplan
2 parents 9d967f9 + 750e7ef commit e909156

File tree

1 file changed

+52
-39
lines changed

1 file changed

+52
-39
lines changed

interactions/wochenplan.ts

+52-39
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { SlashCommandBuilder } from '@discordjs/builders'
22
import { MessageEmbed } from 'discord.js'
33
import moment from 'moment-timezone'
44
import { async } from 'node-ical'
5+
import { start } from 'pm2'
56
import { DiscordClient, DiscordCommandInteraction } from '../types/customTypes'
67

78
exports.name = 'wochenplan'
@@ -17,22 +18,22 @@ export const data = new SlashCommandBuilder()
1718
option.setName('datum').setDescription('Das Datum, das angezeigt werden soll. Format: DD.MM.YYYY'),
1819
)
1920

20-
async function wochenplan(client: DiscordClient, interaction: DiscordCommandInteraction, pNow, pCourseAndSemester) {
21+
async function wochenplan(client: DiscordClient, interaction: DiscordCommandInteraction, date, pCourseAndSemester) {
2122
let returnData = {}
2223
for (const entry in client.config.calendars) {
2324
// eslint-disable-next-line no-await-in-loop
2425
returnData = { ...returnData, ...(await async.fromURL(client.config.calendars[entry])) }
2526
}
2627

2728
const relevantEvents = []
28-
const curWeekday = pNow.getDay() === 0 ? 6 : pNow.getDay() - 1
29-
const startOfWeek = new Date(pNow.setDate(pNow.getDate() - curWeekday))
29+
const curWeekday = date.getDay() === 0 ? 6 : date.getDay() - 1
30+
const startOfWeek = new Date(date.setDate(date.getDate() - curWeekday))
3031
startOfWeek.setHours(0, 0, 0)
3132

3233
const rangeStart = moment(startOfWeek)
3334
const rangeEnd = rangeStart.clone().add(7, 'days')
3435

35-
filterEvents(returnData, rangeStart, rangeEnd, pCourseAndSemester, interaction, relevantEvents)
36+
filterEvents(returnData, rangeStart, rangeEnd, interaction, relevantEvents)
3637

3738
const embed = new MessageEmbed()
3839
.setAuthor({
@@ -139,29 +140,16 @@ function filterEvents(
139140
returnData: any,
140141
rangeStart: moment.Moment,
141142
rangeEnd: moment.Moment,
142-
pCourseAndSemester: any,
143143
pMessageOrInteraction: any,
144144
relevantEvents: any[],
145145
) {
146146
for (const i in returnData) {
147147
const event = returnData[i]
148148
if (returnData[i].type === 'VEVENT') {
149-
const title = event.summary
150149
const startDate = moment(event.start)
151150
const endDate = moment(event.end)
152-
const duration = parseInt(endDate.format('x')) - parseInt(startDate.format('x'))
153-
secondFIlter(
154-
event,
155-
startDate,
156-
rangeStart,
157-
rangeEnd,
158-
pCourseAndSemester,
159-
pMessageOrInteraction,
160-
title,
161-
relevantEvents,
162-
duration,
163-
endDate,
164-
)
151+
const duration = Number.parseInt(endDate.format('x'), 10) - Number.parseInt(startDate.format('x'), 10)
152+
secondFIlter(event, startDate, rangeStart, rangeEnd, pMessageOrInteraction, relevantEvents, duration, endDate)
165153
}
166154
}
167155
}
@@ -171,62 +159,75 @@ function secondFIlter(
171159
startDate: any,
172160
rangeStart: moment.Moment,
173161
rangeEnd: moment.Moment,
174-
pCourseAndSemester: any,
175162
pMessageOrInteraction: any,
176-
title: any,
177163
relevantEvents: any[],
178164
duration: number,
179165
endDate: any,
180166
) {
181167
if (typeof event.rrule === 'undefined') {
182168
if (startDate.isBetween(rangeStart, rangeEnd)) {
183-
pushToWeeksEvents(pMessageOrInteraction, event, relevantEvents)
169+
pushToWeeksEvents(pMessageOrInteraction, event, relevantEvents, event.start, event.end)
184170
}
185171
} else {
186-
const dates = event.rrule.between(rangeStart.toDate(), rangeEnd.toDate(), true)
187-
172+
/**
173+
* Complicated case - if an RRULE exists, handle multiple recurrences of the event.
174+
* For recurring events, get the set of event start dates that fall within the range
175+
* of dates we're looking for.
176+
*/
177+
const dates = event.rrule.between(rangeStart.toDate(), rangeEnd.toDate(), true, () => true)
178+
179+
/**
180+
* The "dates" array contains the set of dates within our desired date range range that are valid
181+
* for the recurrence rule. *However*, it's possible for us to have a specific recurrence that
182+
* had its date changed from outside the range to inside the range. One way to handle this is
183+
* to add *all* recurrence override entries into the set of dates that we check, and then later
184+
* filter out any recurrences that don't actually belong within our range.
185+
*/
188186
if (event.recurrences !== undefined) {
189187
for (const recurrence in event.recurrences) {
188+
/**
189+
* Only add dates that weren't already in the range we added from the rrule so that
190+
* we don't double-add those events.
191+
*/
190192
if (moment(new Date(recurrence)).isBetween(rangeStart, rangeEnd) !== true) {
191193
dates.push(new Date(recurrence))
192194
}
193195
}
194196
}
195197

196-
for (const date of dates) {
198+
for (const i in dates) {
199+
/**
200+
* Reccurence date.
201+
*/
202+
const date = dates[i]
197203
let curEvent = event
198204
let relevantRecurrence = true
199-
let curDuration = duration
200205

201206
startDate = moment(date)
207+
endDate = startDate.clone().add(moment.duration(moment(curEvent.end).diff(curEvent.start)).asHours(), 'hours')
202208

203209
const dateLookupKey = date.toISOString().substring(0, 10)
204-
205210
if (curEvent.recurrences !== undefined && curEvent.recurrences[dateLookupKey] !== undefined) {
206211
curEvent = curEvent.recurrences[dateLookupKey]
207212
startDate = moment(curEvent.start)
208-
curDuration = parseInt(moment(curEvent.end).format('x')) - parseInt(startDate.format('x'))
213+
endDate = startDate.clone().add(moment.duration(moment(curEvent.end).diff(curEvent.start)).asHours(), 'hours')
209214
} else if (curEvent.exdate !== undefined && curEvent.exdate[dateLookupKey] !== undefined) {
210215
relevantRecurrence = false
211216
}
212217

213-
endDate = moment(parseInt(startDate.format('x')) + curDuration, 'x')
214-
215218
if (endDate.isBefore(rangeStart) || startDate.isAfter(rangeEnd)) {
216219
relevantRecurrence = false
217220
}
218221

219222
if (relevantRecurrence === true) {
220-
pushToWeeksEvents(pMessageOrInteraction, event, relevantEvents)
223+
pushToWeeksEvents(pMessageOrInteraction, curEvent, startDate, endDate, relevantEvents)
221224
}
222225
}
223226
}
224227
}
225228

226-
// TODO: Weekplan still not recocnizing all events (e.g. 28.04.2022 OFE is missing)
227-
228-
function pushToWeeksEvents(interaction, event, relevantEvents) {
229-
if (doubleEntry(relevantEvents, event)) {
229+
function pushToWeeksEvents(interaction, event, event_start, event_end, relevantEvents) {
230+
if (doubleEntry(relevantEvents, event, event_start, event_end)) {
230231
return
231232
}
232233
const roles = interaction.member.roles.cache.map(role => role)
@@ -238,7 +239,17 @@ function pushToWeeksEvents(interaction, event, relevantEvents) {
238239
searchQuery = event.summary.toString()
239240
}
240241
if (roles[role].name.toLowerCase().trim() === searchQuery.toLowerCase().trim()) {
241-
relevantEvents.push(event)
242+
/**
243+
* Add entry with new key.
244+
* Key increments by one (determined by length).
245+
*/
246+
relevantEvents[Object.keys(relevantEvents).length] = {
247+
start: event_start,
248+
end: event_end,
249+
summary: event.summary,
250+
description: event.description,
251+
location: event.location,
252+
}
242253
}
243254
}
244255
}
@@ -247,9 +258,11 @@ function pushToWeeksEvents(interaction, event, relevantEvents) {
247258
* Check if the new element added to @link{array} creates a duplicate
248259
* @param {any[]} array array to check
249260
* @param {any} new_element new element on which to check if duplicate
261+
* @param {Date} start_date end date of event
262+
* @param {Date} end_date start date of event
250263
* @returns {boolean}
251264
*/
252-
function doubleEntry(array: any[], new_element: any): boolean {
265+
function doubleEntry(array: any[], new_element: any, start_date: Date, end_date: Date): boolean {
253266
/**
254267
* Always return false, if array has no entry
255268
* There are no possible duplicates if there is nothing in the array
@@ -265,9 +278,9 @@ function doubleEntry(array: any[], new_element: any): boolean {
265278
if (
266279
array[entry].start === new_element.start &&
267280
array[entry].summary === new_element.summary &&
268-
array[entry].start.getDay() === new_element.start.getDay()
281+
array[entry].start.getDay() === start_date &&
282+
array[entry].end.getDay() === end_date
269283
) {
270-
console.log(new_element.start.getDay())
271284
return true
272285
}
273286
}

0 commit comments

Comments
 (0)