finalize time parsing, reorg all date/time parsing to new file
This commit is contained in:
parent
06b35d5a2c
commit
2b62cd0e72
|
@ -0,0 +1,132 @@
|
||||||
|
export const monthsLong: Array<string> = ["JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER"];
|
||||||
|
export const monthsShort: Array<string> = monthsLong.map(month => month.slice(0, 3));
|
||||||
|
export const tzMap: Map<string, string> = 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<string> = ['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}`);
|
||||||
|
};
|
|
@ -72,7 +72,7 @@ const execute = async (bot: Bot, interaction: Interaction) => {
|
||||||
type: MessageComponentTypes.InputText,
|
type: MessageComponentTypes.InputText,
|
||||||
customId: eventDateId,
|
customId: eventDateId,
|
||||||
label: 'Start Date:',
|
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,
|
style: TextStyles.Short,
|
||||||
minLength: 1,
|
minLength: 1,
|
||||||
maxLength: 20,
|
maxLength: 20,
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
import { Bot, Interaction, InteractionResponseTypes, MessageComponentTypes, TextStyles } from '../../../deps.ts';
|
import { Bot, Interaction, InteractionResponseTypes, MessageComponentTypes, TextStyles } from '../../../deps.ts';
|
||||||
import { somethingWentWrong } from '../../commandUtils.ts';
|
import { somethingWentWrong } from '../../commandUtils.ts';
|
||||||
import { eventTimeId, eventTimeZoneId, eventDateId, eventDescriptionId } from './step1-gameSelection.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 { Activities, Activity } from './activities.ts';
|
||||||
|
import { getDateFromRawInput } from './dateTimeUtils.ts';
|
||||||
|
|
||||||
export const customId = 'finalize';
|
export const customId = 'finalize';
|
||||||
|
|
||||||
|
@ -49,48 +50,8 @@ const execute = async (bot: Bot, interaction: Interaction) => {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify/Set Time
|
// Get Date Object from user input
|
||||||
let preParsedEventTime = rawEventTime.replaceAll(':', '').toUpperCase();
|
const eventDateTime = getDateFromRawInput(rawEventTime, rawEventTimeZone, rawEventDate);
|
||||||
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
|
|
||||||
|
|
||||||
somethingWentWrong(bot, interaction, `TESTING@${rawEventTime}_${rawEventTimeZone}_${rawEventDate}`);
|
somethingWentWrong(bot, interaction, `TESTING@${rawEventTime}_${rawEventTimeZone}_${rawEventDate}`);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -9,60 +9,6 @@ export const idSeparator = '@';
|
||||||
export const pathIdxSeparator = '|';
|
export const pathIdxSeparator = '|';
|
||||||
export const pathIdxEnder = '&';
|
export const pathIdxEnder = '&';
|
||||||
export const selfDestructMessage = (currentTime: number) => `**Please note:** This message will self destruct <t:${Math.floor((currentTime + tokenTimeoutMS) / 1000)}:R> due to limits imposed by the Discord API.`;
|
export const selfDestructMessage = (currentTime: number) => `**Please note:** This message will self destruct <t:${Math.floor((currentTime + tokenTimeoutMS) / 1000)}:R> due to limits imposed by the Discord API.`;
|
||||||
export const monthsLong: Array<string> = ["JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER"];
|
|
||||||
export const monthsShort: Array<string> = monthsLong.map(month => month.slice(0, 3));
|
|
||||||
export const tzMap: Map<string, string> = 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<string, {
|
export const tokenMap: Map<string, {
|
||||||
token: string;
|
token: string;
|
||||||
|
|
Loading…
Reference in New Issue