From 10da5b11206dbc3d110d96f12fbe42e450e8e964 Mon Sep 17 00:00:00 2001 From: Collin Duncan <3679940+cgduncan7@users.noreply.github.com> Date: Mon, 13 May 2024 09:40:12 +0200 Subject: [PATCH] Fixing speedy reservation from attempting to find selectors that will never be present --- src/runner/baanreserveren/service.ts | 40 ++++++++++++++++++---------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/src/runner/baanreserveren/service.ts b/src/runner/baanreserveren/service.ts index 0e7a739..77f7fa1 100644 --- a/src/runner/baanreserveren/service.ts +++ b/src/runner/baanreserveren/service.ts @@ -339,9 +339,12 @@ export class BaanReserverenService { date, }) const utcSeconds = date.valueOf() / 1000 - await this.page.goto( + const response = await this.page.goto( `${BAAN_RESERVEREN_ROOT_URL}/reservations/make/${courtSlot}/${utcSeconds}`, ) + if (response == null || response.status() >= 400) { + throw new CourtNotAvailableError('Court taken at the given time') + } } private async navigateToDay(date: Dayjs) { @@ -517,11 +520,8 @@ export class BaanReserverenService { private async selectOwner(id: string) { this.loggerService.debug('Selecting owner', { id }) - await this.page.waitForNetworkIdle().catch((e: Error) => { - throw new RunnerOwnerSearchNetworkError(e) - }) await this.page - .$('select.br-user-select[name="players[1]"]') + .waitForSelector('select.br-user-select[name="players[1]"]') .then((d) => d?.select(id)) .catch((e: Error) => { throw new RunnerOwnerSearchSelectionError(e) @@ -711,21 +711,26 @@ export class BaanReserverenService { } for (const courtSlot of courtSlots) { - await this.navigateToReservationPrompt( - courtSlot, - reservation.dateRangeStart, - ) - await this.selectOwner(reservation.ownerId) - await this.selectOpponents(reservation.opponents, true) let errorReserving = false - await this.confirmReservation().catch((error: Error) => { - if (error instanceof RunnerReservationConfirmSubmitError) { + try { + await this.navigateToReservationPrompt( + courtSlot, + reservation.dateRangeStart, + ) + await this.selectOwner(reservation.ownerId) + await this.selectOpponents(reservation.opponents, true) + await this.confirmReservation() + } catch (error: unknown) { + if ( + error instanceof CourtNotAvailableError || + error instanceof RunnerReservationConfirmSubmitError + ) { this.loggerService.warn('Court taken, retrying', { courtSlot }) errorReserving = true } else { throw error } - }) + } if (!errorReserving) return } @@ -917,6 +922,13 @@ export class NoCourtAvailableError extends Error { } } +export class CourtNotAvailableError extends Error { + constructor(message: string) { + super(message) + this.name = 'CourtNotAvailableError' + } +} + export class RunnerOwnerSearchNetworkError extends RunnerError { constructor(error: Error) { super(error, 'RunnerOwnerSearchNetworkError')