Compare commits

..

No commits in common. "790a0d65f431c1bcc7470a817cd9f687bc9f375b" and "c58c3c61a833f7bf72d7beb81ddc9d7493d34f89" have entirely different histories.

7 changed files with 16 additions and 88 deletions

View File

@ -7,7 +7,7 @@
"build": "tsc",
"clean": "rimraf build",
"watch": "yarn run clean && yarn run build -- -w",
"monitor": "nodemon build/index.js",
"monitor": "nodemon index.ts",
"start": "node build/index.js",
"buildstart": "yarn run build && node build/index.js",
"lint": "eslint . --ext .ts --fix",

View File

@ -1,10 +1,8 @@
import { GuildScheduledEvent } from 'discord.js'
import { validateRepetitionStringAndSendMessageOnFail } from '../handler/repeatingEvents/helper'
export const name = 'guildScheduledEventCreate'
export async function execute(guildScheduledEvent: GuildScheduledEvent) {
export function execute(guildScheduledEvent: GuildScheduledEvent) {
try{
console.log(`${JSON.stringify(guildScheduledEvent)} has been created.`)
validateRepetitionStringAndSendMessageOnFail(guildScheduledEvent)
}catch(error) {
console.error(error)
}

View File

@ -1,19 +1,13 @@
import { GuildScheduledEvent } from "discord.js"
import { config } from "../configuration"
import { repetitionMarkerIsFound, validateRepetitionStringAndSendMessageOnFail } from "../handler/repeatingEvents/helper"
import { repetitionMarkerIsFound } from "../handler/repeatingEvents/helper"
import { handleRepeatingEvent } from "../handler/repeatingEvents/repeatingEvents.controller"
export const name = 'guildScheduledEventUpdate'
export function execute(oldguildScheduledEvent: GuildScheduledEvent, newguildScheduledEvent: GuildScheduledEvent) {
if (config.debug) {
console.dir(oldguildScheduledEvent)
console.dir(newguildScheduledEvent)
}
if (oldguildScheduledEvent.description !== newguildScheduledEvent.description) {
validateRepetitionStringAndSendMessageOnFail(newguildScheduledEvent)
}
if (oldguildScheduledEvent.description && repetitionMarkerIsFound(oldguildScheduledEvent.description)) {
// valid repeating event
if (newguildScheduledEvent.status === 'COMPLETED')

View File

@ -1,9 +1,8 @@
import { format } from "date-fns"
import add from "date-fns/add"
import { DateResolvable, Guild, GuildScheduledEvent, GuildScheduledEventCreateOptions } from "discord.js"
import { client } from "../../.."
import { findInScheduleTypes } from "../../helper/typeFind"
import { CustomError, errorCodes, Maybe } from "../../interfaces"
import { Maybe } from "../../interfaces"
import { RepetitonInfo, supportedSchedule } from "../../types/scheduledEventTypes"
export const repetitionMarkerIsFound = (desc: string): boolean => desc.includes('$rep')
@ -15,7 +14,7 @@ export function getRepetitonInfo(description: string): RepetitonInfo {
const lines = description.split(`\n`)
const repetitionString = lines.find(x => x.startsWith('$rep:'))
if (!repetitionString)
throw new CustomError('Cant find repetition string', errorCodes.no_string_present)
throw new Error('Cant find repetition string')
const schedule: supportedSchedule = determineSchedule(repetitionString)
const { totalAmount, alreadyOccured } = determineRepetitionCount(repetitionString)
const endDate = determineEndDate(repetitionString)
@ -34,18 +33,14 @@ export function determineSchedule(repetitionLine: string): supportedSchedule {
if (easilyKnownScheduleName)
return easilyKnownScheduleName
else
throw new CustomError('Inferring schedule names is not yet supported', errorCodes.schedule_not_supported)
throw new Error('Inferring schedule names is not yet supported')
}
export function determineRepetitionCount(description: string): { totalAmount: number; alreadyOccured: number } {
const segments = description.split(':')
const amountSegment = segments[2]
if (amountSegment) {
const amounts = amountSegment.split('/')
return { totalAmount: Number(amounts[1]) ?? 0, alreadyOccured: Number(amounts[0]) ?? 0 }
} else {
throw new CustomError('No amount was defined', errorCodes.no_repetition_amount)
}
}
export function buildNewRepetitionString(repetitionInfo: RepetitonInfo) {
@ -77,7 +72,7 @@ export function getNewScheduledStart(oldguildScheduledEvent: GuildScheduledEvent
monthsToAdd = 1
break
default:
throw new CustomError('No schedule found, cant add days', errorCodes.no_schedule)
throw new Error('No schedule found, cant add days')
}
const duration: Duration = {
days: daysToAdd,
@ -107,45 +102,4 @@ function determineEndDate(description: string): Maybe<Date> {
}
return
}
export function checkIfRepetitionStringIsValid(description: string): string {
if (!description) return 'not_present'
if (repetitionMarkerIsFound(description)) {
let repetitionInfo
try {
repetitionInfo = getRepetitonInfo(description)
if (!repetitionInfo.schedule) return 'no_schedule'
if (!repetitionInfo.totalAmount && !repetitionInfo.alreadyOccured && !repetitionInfo.endDate) {
if (!repetitionInfo.totalAmount || !repetitionInfo.alreadyOccured) return 'no_amount'
if (!repetitionInfo.endDate) return 'no_end'
}
return 'valid'
} catch (error) {
if (error instanceof CustomError) {
return error.getCode()
}
return 'invalid'
}
} return 'not_present'
}
export async function validateRepetitionStringAndSendMessageOnFail(event: GuildScheduledEvent): Promise<void> {
const validResponses = [
'valid',
'not_present'
]
const resultstring: string = checkIfRepetitionStringIsValid(event.description ?? "")
if (validResponses.includes(resultstring)) {
// do success things?
} else {
const creatorMessage = `The repetition string in your event could not be parsed. Reason: ${resultstring}`
console.log(creatorMessage)
if (!event.creatorId) throw new CustomError('No creator ID present', errorCodes.no_creator_id)
const creator = await client.users.fetch(event.creatorId)
console.log(`Creator ${JSON.stringify(creator)}`)
if (creator)
if (!creator.dmChannel)
await creator.createDM()
await creator.dmChannel?.send(creatorMessage)
}
}

View File

@ -1,4 +1,3 @@
import { CustomError, errorCodes } from "../interfaces";
import { scheduleNames, supportedSchedule } from "../types/scheduledEventTypes";
export function findInScheduleTypes(inputString: string): supportedSchedule {
@ -8,7 +7,7 @@ export function findInScheduleTypes(inputString: string): supportedSchedule {
// `sheepName` comes from the list of `sheepNames` so the compiler is happy.
return scheduleName;
}
throw new CustomError('That is not a schedule name.', errorCodes.schedule_not_supported);
throw new Error('That is not a schedule name.');
}

View File

@ -9,21 +9,3 @@ export interface localized_string {
[k in supported_languages]: string
}
}
export class CustomError extends Error {
private code: string
public constructor(message: string, errorCode: string) {
super(message)
this.code = errorCode
}
public getCode() { return this.code }
}
export const errorCodes = {
no_end_date: 'no_end_date',
no_string_present: 'no_string_present',
no_schedule: 'no_schedule',
schedule_not_supported: 'schedule_not_supported',
no_repetition_amount: 'no_repetition_amount',
invalid_repetition_string: 'invalid_repetition_string',
no_creator_id: "no_creator_id",
}

View File

@ -5,6 +5,7 @@ export interface RepetitonInfo {
totalAmount: number,
alreadyOccured: number,
schedule: supportedSchedule
numberOfDays?: number
}
export const scheduleNames = ['daily', 'weekly', 'monthly', 'everyTwoWeeks', 'everyNDays']
export type supportedSchedule = typeof scheduleNames[number]