diff --git a/src/reservations/worker.ts b/src/reservations/worker.ts index deaa33e..1f1bdc8 100644 --- a/src/reservations/worker.ts +++ b/src/reservations/worker.ts @@ -43,13 +43,14 @@ export class ReservationsWorker { reservation.dateRangeStart, reservation.dateRangeEnd, ) - await this.performReservation(reservation, job.attemptsMade) + await this.performReservation(reservation, job.attemptsMade, false) } private async handleReservationErrors( error: Error, reservation: Reservation, attemptsMade: number, + timeSensitive = true, ) { const shouldWaitlist = error instanceof NoCourtAvailableError if (shouldWaitlist) { @@ -67,13 +68,17 @@ export class ReservationsWorker { reservation.dateRangeStart, reservation.dateRangeEnd, ) - await this.addReservationToWaitList(reservation) + await this.addReservationToWaitList(reservation, timeSensitive) } else { throw error } } - async performReservation(reservation: Reservation, attemptsMade: number) { + async performReservation( + reservation: Reservation, + attemptsMade: number, + timeSensitive = true, + ) { try { await this.brService.performReservation(reservation) await this.reservationsService.deleteById(reservation.id) @@ -82,14 +87,19 @@ export class ReservationsWorker { error as Error, reservation, attemptsMade, + timeSensitive, ) } } - async addReservationToWaitList(reservation: Reservation) { + async addReservationToWaitList( + reservation: Reservation, + timeSensitive = true, + ) { try { const waitingListId = await this.brService.addReservationToWaitList( reservation, + timeSensitive, ) await this.reservationsService.update(reservation.id, { waitListed: true, diff --git a/src/runner/baanreserveren/service.ts b/src/runner/baanreserveren/service.ts index 37de804..aa86f3d 100644 --- a/src/runner/baanreserveren/service.ts +++ b/src/runner/baanreserveren/service.ts @@ -116,6 +116,18 @@ export class BaanReserverenService { return TYPING_DELAY_MS } + private async handleError() { + await this.page + .screenshot({ + type: 'jpeg', + path: `./${Date.now()}_error-screenshot.jpeg`, + quality: 50, + }) + .catch((reason: any) => + this.loggerService.warn('Failed to take screenshot', { reason }), + ) + } + // Check session by going to /reservations to see if we are still logged in via cookies private async checkSession(username: string) { this.loggerService.debug('Checking session', { @@ -553,20 +565,28 @@ export class BaanReserverenService { return courtStatuses } - public async performReservation(reservation: Reservation) { + public async performReservation( + reservation: Reservation, + timeSensitive = true, + ) { try { await this.init() await this.navigateToDay(reservation.dateRangeStart) + await this.monitorCourtReservations() await this.selectAvailableTime(reservation) await this.selectOwner(reservation.ownerId) await this.selectOpponents(reservation.opponents) await this.confirmReservation() } catch (error: unknown) { + if (!timeSensitive) await this.handleError() throw error } } - public async addReservationToWaitList(reservation: Reservation) { + public async addReservationToWaitList( + reservation: Reservation, + timeSensitive = true, + ) { try { await this.init() await this.navigateToWaitingList() @@ -589,6 +609,7 @@ export class BaanReserverenService { return waitingListId } catch (error: unknown) { + if (!timeSensitive) await this.handleError() throw error } } @@ -600,6 +621,7 @@ export class BaanReserverenService { await this.navigateToWaitingList() await this.deleteWaitingListEntryRowById(reservation.waitingListId) } catch (error: unknown) { + await this.handleError() throw error } }