import { TEventType } from "./component/event/event.types"; import { db } from "./sql"; import { Event, type TEventEntityNew, type TGetEventsOptions } from "./component/event/events"; import { sendNotification } from "./sendNotification"; import { createPlaceholders, pad_l2 } from "./util"; const argv = require('minimist')(process.argv.slice(2)); console.dir(argv) // const TS_TODAY = new Date(); function getTsNow() { const now = new Date(); const rtn = { year: now.getFullYear(), month: now.getMonth() + 1, day: now.getDate(), minute: now.getMinutes(), seconds: now.getSeconds() } return rtn; } async function main( ) { const TODAY = getTsNow(); const events_currentMonth = await Event.fetch_events( TODAY.year, TODAY.month , -120 ); const events_nextMonth = await Event.fetch_events( TODAY.year, TODAY.month + 1 , -120 ); const events = [...events_currentMonth, ...events_nextMonth]; // Write to JSON File Section START // const data = JSON.stringify(events, null, 2); // const TS = `${TS_TODAY.getFullYear()}-${TS_TODAY.getMonth() + 1}-${TS_TODAY.getDate()}_${TS_TODAY.getHours()}-${TS_TODAY.getMinutes()}-${TS_TODAY.getSeconds()}`; // await Bun.write(path.join(import.meta.dir, "output", `output_${TS}.json`), data ); // Write to JSON File Section END const allEventUids = events.map( event => { return event.uid; }); const placeholders = createPlaceholders( allEventUids ); const getAllRelevantEventsQuery = db.query( `SELECT * FROM events WHERE uid IN (${placeholders}); ` ).as(Event ); const AllRelevantEvents = getAllRelevantEventsQuery.all(...allEventUids); const eventsToInsert: TEventEntityNew[] = []; for ( const ev of events ) { const found = AllRelevantEvents.find(event => event.uid === ev.uid); if ( found ) { if ( found.title != ev.title || found.description != ev.description || found.date_at != ev.date_at || found.time_start != ev.time_start || found.time_end != ev.time_end || found.posted_by != ev.posted_by || found.location != ev.location || found.event_type != ev.event_type || found.timezone != ev.timezone || found.link != ev.link ) { const newEventToInsert: TEventEntityNew = {... ev, notification: "changed"}; eventsToInsert.push( newEventToInsert ); } } else { const newEventToInsert: TEventEntityNew = {... ev, notification: "new"}; eventsToInsert.push( newEventToInsert ); } } Event.insert( eventsToInsert, db); const options: TGetEventsOptions = { } if (argv.today) { options.date = { year: TODAY.year, month: TODAY.month, day: TODAY.day } } else { options.notification = ["new", "changed"] } const list_of_events = Event.get_events( options, db ); for ( const ev of list_of_events ) { const body = [ `Title: ${ev.title}`, `Location: ${ev.location}`, `Type: ${ TEventType[ ev.event_type ] }`, `Date: ${ev.date_at}`, `Time: ${ev.time_start}`, `By: ${ev.posted_by}`, `Link: ${ev.link}`, ].join("\n"); const notification_prefix = ( (event: Event) => { switch( event.notification) { case "new": return "New"; case "changed": return "Changed"; case "deleted": return "Deleted"; default: return null; } } ) ( ev ); const today_prefix = ( (ev: Event) => { const now = getTsNow(); const [year, month, day] = ev.date_at.split("-") if ( year == String(now.year) && month == pad_l2( String(now.month) ) && day == pad_l2( String( now.day ) ) ) { return true; } return false; })( ev ); sendNotification( `${today_prefix ? "TODAY " : ""}${notification_prefix ? notification_prefix + ": " : ""} ${ev.title} (${ TEventType[ ev.event_type ] })`, `${body}` // `${ev.link || "https://77th-jsoc.com/#/events"}` ); ev.set_notification("done", db); } }; main();