Skip to content

Commit

Permalink
Merge pull request #28 from gillohner/scheduled-meetup-message
Browse files Browse the repository at this point in the history
improve timeframe
  • Loading branch information
gillohner authored Oct 11, 2024
2 parents ef4487e + 0e13a19 commit a01232e
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 35 deletions.
41 changes: 15 additions & 26 deletions handlers/meetupHandlers/meetupDisplayingHandler.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import {
escapeHTML
} from '../../utils/helpers.js'
import {
fetchCalendarEvents,
checkForDeletionEvent
} from '../../utils/nostrUtils.js';
import {
Expand All @@ -22,30 +21,18 @@ import {
import {
fetchAndProcessEvents
} from "../../utils/eventUtils.js";
import { getTimeFrameName, getCallbackData } from '../../utils/timeFrameUtils.js';
import url from 'url';


const handleMeetups = async (bot, msg) => {
const chatId = msg.chat.id;
const timeFrames = ['heute', 'dieseWoche', '7Tage', '30Tage', 'alle'];
const keyboard = {
inline_keyboard: [
[{
text: 'Heute',
callback_data: 'meetups_today'
}],
[{
text: 'Diese Woche',
callback_data: 'meetups_week'
}],
[{
text: 'Diesen Monat',
callback_data: 'meetups_month'
}],
[{
text: 'Alle',
callback_data: 'meetups_all'
}]
]
inline_keyboard: timeFrames.map(timeFrame => [{
text: getTimeFrameName(timeFrame),
callback_data: getCallbackData(timeFrame)
}])
};

// Delete the user's /meetup command message
Expand All @@ -54,7 +41,7 @@ const handleMeetups = async (bot, msg) => {
// Delete previous meetup message
if (userStates[chatId]?.lastMeetupMessageId) {
deleteMessage(bot, chatId, userStates[chatId].lastMeetupMessageId);
};
}
const sentMessage = await sendAndStoreMessage(
bot,
chatId,
Expand All @@ -79,7 +66,7 @@ const handleMeetupsFilter = async (bot, msg, timeFrame, returnMessage = "lastMee
disable_notification: true
});

const meetupMessage = await fetchMeetupsLogic(bot, chatId, timeFrame);
const meetupMessage = await fetchMeetupsLogic(timeFrame);

const sentMessage = await editAndStoreMessage(
bot,
Expand Down Expand Up @@ -198,7 +185,7 @@ const formatMeetupsMessage = async (allEvents, timeFrame) => {
return message;
};

const fetchMeetupsLogic = async (bot, chatId, timeFrame) => {
const fetchMeetupsLogic = async (timeFrame) => {
const result = await fetchAndProcessEvents(config, timeFrame);

if (result.status === 'empty' || result.status === 'noEvents') {
Expand All @@ -210,12 +197,14 @@ const fetchMeetupsLogic = async (bot, chatId, timeFrame) => {

const getHeaderMessage = (timeFrame) => {
switch (timeFrame) {
case 'today':
case 'heute':
return 'Meetups heute';
case 'week':
case 'dieseWoche':
return 'Meetups diese Woche';
case 'month':
return 'Meetups diesen Monat';
case '7Tage':
return 'Meetups in den nächsten 7 Tagen';
case '30Tage':
return 'Meetups in den nächsten 30 Tagen';
default:
return 'Alle bevorstehenden Meetups';
}
Expand Down
4 changes: 2 additions & 2 deletions scheduledTasks.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ const postWeeklyMeetups = async (bot) => {
await deleteMessage(bot, chatId, pinnedMessageId);
}

const meetupMessage = await fetchMeetupsLogic(bot, chatId, 'week');
const meetupMessage = await fetchMeetupsLogic('dieseWoche');

if (meetupMessage) {
let sentMessage = await sendAndStoreMessage(bot, chatId, meetupMessage, {
Expand All @@ -37,7 +37,7 @@ const postWeeklyMeetups = async (bot) => {
}, 'pinnedMeetupMessageId');

await bot.pinChatMessage(chatId, sentMessage.message_id);
}
}
} catch (error) {
console.error('Error posting weekly meetups:', error);
}
Expand Down
31 changes: 24 additions & 7 deletions utils/eventUtils.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import { fetchCalendarEvents } from './nostrUtils.js';
import { getTimeFrameName, getTimeFrameFromCallback } from '../utils/timeFrameUtils.js'

const sortEventsByStartDate = (eventList) => {
return eventList.map(calendar => ({
...calendar,
Expand All @@ -22,7 +24,8 @@ const fetchAndFilterEvents = async (config, timeFrame) => {
return sortEventsByStartDate(filterEventsByTimeFrame(allEvents, timeFrame));
};

const fetchAndProcessEvents = async (config, timeFrame) => {
const fetchAndProcessEvents = async (config, callbackData) => {
const timeFrame = getTimeFrameFromCallback(callbackData);
let allEvents = await fetchAndFilterEvents(config, timeFrame);

if (allEvents.length === 0) {
Expand All @@ -32,7 +35,10 @@ const fetchAndProcessEvents = async (config, timeFrame) => {
const filteredEvents = filterEventsByTimeFrame(allEvents, timeFrame);

if (filteredEvents.every(cal => cal.events.length === 0)) {
return { status: 'noEvents', message: `Keine Meetups für den gewählten Zeitraum (${timeFrame}) gefunden.` };
return {
status: 'noEvents',
message: `Keine Meetups für den gewählten Zeitraum (${getTimeFrameName(timeFrame)}) gefunden.`
};
}

return { status: 'success', events: filteredEvents };
Expand All @@ -41,24 +47,35 @@ const fetchAndProcessEvents = async (config, timeFrame) => {
const filterEventsByTimeFrame = (allEvents, timeFrame) => {
const now = new Date();
const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());

const endOfDay = new Date(today);
endOfDay.setHours(23, 59, 59, 999);

const in7Days = new Date(today);
in7Days.setDate(today.getDate() + 7);
in7Days.setHours(23, 59, 59, 999);

const in30Days = new Date(today);
in30Days.setDate(today.getDate() + 30);
in30Days.setHours(23, 59, 59, 999);

const endOfWeek = new Date(today);
endOfWeek.setDate(today.getDate() + (7 - today.getDay()));
endOfWeek.setHours(23, 59, 59, 999);
const inOneMonth = new Date(today.getTime() + 31 * 24 * 60 * 60 * 1000);

return allEvents.map(calendar => ({
...calendar,
events: calendar.events.filter(event => {
const eventDate = new Date(parseInt(event.tags.find(t => t[0] === 'start')?.[1] || '0') * 1000);
switch (timeFrame) {
case 'today':
case 'heute':
return eventDate >= today && eventDate <= endOfDay;
case 'week':
case 'dieseWoche':
return eventDate >= today && eventDate <= endOfWeek;
case 'month':
return eventDate >= today && eventDate <= inOneMonth;
case '7Tage':
return eventDate >= today && eventDate <= in7Days;
case '30Tage':
return eventDate >= today && eventDate <= in30Days;
default:
return eventDate >= today;
}
Expand Down
27 changes: 27 additions & 0 deletions utils/timeFrameUtils.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// timeFrameUtils.js

const timeFrameMap = {
'heute': 'Heute',
'dieseWoche': 'Diese Woche',
'7Tage': '7 Tage',
'30Tage': '30 Tage',
'alle': 'Alle'
};

const getTimeFrameName = (timeFrame) => {
return timeFrameMap[timeFrame] || 'Unbekannter Zeitraum';
};

const getCallbackData = (timeFrame) => {
return `meetups_${timeFrame}`;
};

const getTimeFrameFromCallback = (callbackData) => {
return callbackData.replace('meetups_', '');
};

export {
getTimeFrameName,
getCallbackData,
getTimeFrameFromCallback
};

0 comments on commit a01232e

Please sign in to comment.