diff --git a/src/buttons/event-creation/dateTimeUtils.ts b/src/buttons/event-creation/dateTimeUtils.ts new file mode 100644 index 0000000..b08e880 --- /dev/null +++ b/src/buttons/event-creation/dateTimeUtils.ts @@ -0,0 +1,132 @@ +export const monthsLong: Array = ["JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER"]; +export const monthsShort: Array = monthsLong.map(month => month.slice(0, 3)); +export const tzMap: Map = new Map([ + ['CDT', '-05:00'], + ['CST', '-06:00'], + ['PST', '-08:00'], + ['IST', '+05:30'], + ['GMT', '+00:00'], + ['EAT', '+03:00'], + ['CET', '+01:00'], + ['WAT', '+01:00'], + ['CAT', '+02:00'], + ['EET', '+02:00'], + ['CEST', '+02:00'], + ['SAST', '+02:00'], + ['HST', '-10:00'], + ['HDT', '-09:00'], + ['AKST', '-09:00'], + ['AKDT', '-08:00'], + ['AST', '-04:00'], + ['EST', '-05:00'], + ['MST', '-07:00'], + ['MDT', '-06:00'], + ['EDT', '-04:00'], + ['PDT', '-07:00'], + ['ADT', '-03:00'], + ['NST', '-03:30'], + ['NDT', '-02:30'], + ['AEST', '+10:00'], + ['AEDT', '+11:00'], + ['NZST', '+12:00'], + ['NZDT', '+13:00'], + ['EEST', '+03:00'], + ['HKT', '+08:00'], + ['WIB', '+07:00'], + ['WIT', '+09:00'], + ['IDT', '+03:00'], + ['PKT', '+05:00'], + ['WITA', '+08:00'], + ['KST', '+09:00'], + ['JST', '+09:00'], + ['WET', '+00:00'], + ['WEST', '+01:00'], + ['ACST', '+09:30'], + ['ACDT', '+10:30'], + ['AWST', '+08:00'], + ['UTC', '+00:00'], + ['BST', '+01:00'], + ['MSK', '+03:00'], + ['MET', '+01:00'], + ['MEST', '+02:00'], + ['CHST', '+10:00'], + ['SST', '-11:00'], +]); +export const shorthandUSTZ: Array = ['ET', 'CT', 'MT', 'PT']; + +// Takes user input Time and makes it actually usable +const parseEventTime = (preParsedEventTime: string): [string, string, string] => { + let parsedEventTimePeriod = ''; + // Get AM or PM out of the rawTime + if (preParsedEventTime.endsWith('AM') || preParsedEventTime.endsWith('PM')) { + parsedEventTimePeriod = preParsedEventTime.slice(-2); + preParsedEventTime = preParsedEventTime.slice(0, -2).trim(); + } + let parsedEventTimeHours: string; + let parsedEventTimeMinutes: string; + // Get Hours and Minutes out of rawTime + if (preParsedEventTime.length > 2) { + parsedEventTimeMinutes = preParsedEventTime.slice(-2); + parsedEventTimeHours = preParsedEventTime.slice(0, -2).trim(); + } else { + parsedEventTimeHours = preParsedEventTime.trim(); + parsedEventTimeMinutes = '00' + } + // Determine if we need to remove the time period + if (parseInt(parsedEventTimeHours) > 12) { + parsedEventTimePeriod = ''; + } + + return [parsedEventTimeHours, parsedEventTimeMinutes, parsedEventTimePeriod]; +} + +// Takes user input Time Zone and makes it actually usable +const parseEventTimeZone = (preParsedEventTimeZone: string): string => { + if (shorthandUSTZ.includes(preParsedEventTimeZone)) { + // Handle shorthand US timezones, adding S for standard time and D for Daylight Savings + const today = new Date(); + const jan = new Date(today.getFullYear(), 0, 1); + const jul = new Date(today.getFullYear(), 6, 1); + if (today.getTimezoneOffset() < Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset())) { + preParsedEventTimeZone = `${preParsedEventTimeZone.slice(0, 1)}DT`; + } else { + preParsedEventTimeZone = `${preParsedEventTimeZone.slice(0, 1)}ST`; + } + } + if (tzMap.has(preParsedEventTimeZone)) { + // TZ is proper abbreviation, use our map to convert + return tzMap.get(preParsedEventTimeZone) || 'how did we get here?'; + } else { + // Determine if user put in UTC4, which needs to be UTC+4 + let addPlusSign = false; + if (!preParsedEventTimeZone.includes('+') || !preParsedEventTimeZone.includes('-')) { + addPlusSign = true; + } + // Determine if we need to prepend UTC/GMT, handle adding the + into the string + if (!preParsedEventTimeZone.startsWith('UTC') || preParsedEventTimeZone.startsWith('GMT')) { + preParsedEventTimeZone = `UTC${addPlusSign && '+'}${preParsedEventTimeZone}`; + } else if (addPlusSign) { + preParsedEventTimeZone = `${preParsedEventTimeZone.slice(0, 3)}+${preParsedEventTimeZone.slice(3)}`; + } + return preParsedEventTimeZone; + } +}; + +// Takes user input Date and makes it actually usable +const parseEventDate = (preParsedEventDate: string): [string, string, string] => { + return ['','','']; +} + +// Take full raw Date/Time input and convert it to a proper Date +export const getDateFromRawInput = (rawEventTime: string, rawEventTimeZone: string, rawEventDate: string): Date => { + // Verify/Set Time + const [parsedEventTimeHours, parsedEventTimeMinutes, parsedEventTimePeriod] = parseEventTime(rawEventTime.replaceAll(':', '').toUpperCase()) + + // Verify/Set Time Zone + const parsedEventTimeZone = parseEventTimeZone(rawEventTimeZone.replaceAll(' ', '').trim().toUpperCase()); + + // Verify/Set Date + const [parsedEventYear, parsedEventMonth, parsedEventDay] = parseEventDate(rawEventDate.trim().toUpperCase()); + + return new Date(`${parsedEventMonth} ${parsedEventDay}, ${parsedEventYear} ${parsedEventTimeHours}:${parsedEventTimeMinutes} ${parsedEventTimePeriod} ${parsedEventTimeZone}`); +}; \ No newline at end of file diff --git a/src/buttons/event-creation/step1-gameSelection.ts b/src/buttons/event-creation/step1-gameSelection.ts index a9171e1..9280b70 100644 --- a/src/buttons/event-creation/step1-gameSelection.ts +++ b/src/buttons/event-creation/step1-gameSelection.ts @@ -72,7 +72,7 @@ const execute = async (bot: Bot, interaction: Interaction) => { type: MessageComponentTypes.InputText, customId: eventDateId, label: 'Start Date:', - placeholder: 'Enter date as "MONTH/DAY" or "Month, Day"', + placeholder: 'Enter date as "MONTH/DAY/YEAR" or "Month, Day, Year"', style: TextStyles.Short, minLength: 1, maxLength: 20, diff --git a/src/buttons/event-creation/step2-finalize.ts b/src/buttons/event-creation/step2-finalize.ts index a7a294c..a316273 100644 --- a/src/buttons/event-creation/step2-finalize.ts +++ b/src/buttons/event-creation/step2-finalize.ts @@ -1,8 +1,9 @@ import { Bot, Interaction, InteractionResponseTypes, MessageComponentTypes, TextStyles } from '../../../deps.ts'; import { somethingWentWrong } from '../../commandUtils.ts'; import { eventTimeId, eventTimeZoneId, eventDateId, eventDescriptionId } from './step1-gameSelection.ts'; -import { getFinalActivity, tzMap, idSeparator, pathIdxSeparator } from './utils.ts'; +import { getFinalActivity, idSeparator, pathIdxSeparator } from './utils.ts'; import { Activities, Activity } from './activities.ts'; +import { getDateFromRawInput } from './dateTimeUtils.ts'; export const customId = 'finalize'; @@ -49,48 +50,8 @@ const execute = async (bot: Bot, interaction: Interaction) => { return; } - // Verify/Set Time - let preParsedEventTime = rawEventTime.replaceAll(':', '').toUpperCase(); - let parsedEventTimePeriod = ''; - // Get AM or PM out of the rawTime - if (preParsedEventTime.endsWith('AM') || preParsedEventTime.endsWith('PM')) { - parsedEventTimePeriod = preParsedEventTime.slice(-2); - preParsedEventTime = preParsedEventTime.slice(0, -2).trim(); - } - let parsedEventTimeHours: string; - let parsedEventTimeMinutes: string; - // Get Hours and Minutes out of rawTime - if (preParsedEventTime.length > 2) { - parsedEventTimeMinutes = preParsedEventTime.slice(-2); - parsedEventTimeHours = preParsedEventTime.slice(0, -2).trim(); - } else { - parsedEventTimeHours = preParsedEventTime.trim(); - parsedEventTimeMinutes = '00' - } - // Determine if we need to remove the time period - if (parseInt(parsedEventTimeHours) > 12) { - parsedEventTimePeriod = ''; - } - - // Verify/Set Time Zone - let preParsedEventTimeZone = rawEventTimeZone.replaceAll(' ', '').trim().toUpperCase(); - let parsedEventTimeZone = ''; - if (tzMap.has(preParsedEventTimeZone)) { - parsedEventTimeZone = tzMap.get(preParsedEventTimeZone) || 'UTC+0'; - } else { - let addPlusSign = false; - if (!preParsedEventTimeZone.includes('+') || !preParsedEventTimeZone.includes('-')) { - addPlusSign = true; - } - if (!preParsedEventTimeZone.startsWith('UTC') || preParsedEventTimeZone.startsWith('GMT')) { - preParsedEventTimeZone = `UTC${addPlusSign && '+'}${preParsedEventTimeZone}`; - } else if (addPlusSign) { - preParsedEventTimeZone = `${preParsedEventTimeZone.slice(0, 3)}+${preParsedEventTimeZone.slice(3)}`; - } - parsedEventTimeZone = preParsedEventTimeZone; - } - - // Verify/Set Date + // Get Date Object from user input + const eventDateTime = getDateFromRawInput(rawEventTime, rawEventTimeZone, rawEventDate); somethingWentWrong(bot, interaction, `TESTING@${rawEventTime}_${rawEventTimeZone}_${rawEventDate}`); } else { diff --git a/src/buttons/event-creation/utils.ts b/src/buttons/event-creation/utils.ts index e2b90f8..a2fe87a 100644 --- a/src/buttons/event-creation/utils.ts +++ b/src/buttons/event-creation/utils.ts @@ -9,60 +9,6 @@ export const idSeparator = '@'; export const pathIdxSeparator = '|'; export const pathIdxEnder = '&'; export const selfDestructMessage = (currentTime: number) => `**Please note:** This message will self destruct due to limits imposed by the Discord API.`; -export const monthsLong: Array = ["JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER"]; -export const monthsShort: Array = monthsLong.map(month => month.slice(0, 3)); -export const tzMap: Map = new Map([ - ['CDT', '-05:00'], - ['CST', '-06:00'], - ['PST', '-08:00'], - ['IST', '+05:30'], - ['GMT', '+00:00'], - ['EAT', '+03:00'], - ['CET', '+01:00'], - ['WAT', '+01:00'], - ['CAT', '+02:00'], - ['EET', '+02:00'], - ['CEST', '+02:00'], - ['SAST', '+02:00'], - ['HST', '-10:00'], - ['HDT', '-09:00'], - ['AKST', '-09:00'], - ['AKDT', '-08:00'], - ['AST', '-04:00'], - ['EST', '-05:00'], - ['MST', '-07:00'], - ['MDT', '-06:00'], - ['EDT', '-04:00'], - ['PDT', '-07:00'], - ['ADT', '-03:00'], - ['NST', '-03:30'], - ['NDT', '-02:30'], - ['AEST', '+10:00'], - ['AEDT', '+11:00'], - ['NZST', '+12:00'], - ['NZDT', '+13:00'], - ['EEST', '+03:00'], - ['HKT', '+08:00'], - ['WIB', '+07:00'], - ['WIT', '+09:00'], - ['IDT', '+03:00'], - ['PKT', '+05:00'], - ['WITA', '+08:00'], - ['KST', '+09:00'], - ['JST', '+09:00'], - ['WET', '+00:00'], - ['WEST', '+01:00'], - ['ACST', '+09:30'], - ['ACDT', '+10:30'], - ['AWST', '+08:00'], - ['UTC', '+00:00'], - ['BST', '+01:00'], - ['MSK', '+03:00'], - ['MET', '+01:00'], - ['MEST', '+02:00'], - ['CHST', '+10:00'], - ['SST', '-11:00'], -]); export const tokenMap: Map