Fixing speedy reservation from attempting to find selectors that will never be present

This commit is contained in:
Collin Duncan 2024-05-13 09:40:12 +02:00
parent 1a6fa08f6d
commit 10da5b1120
No known key found for this signature in database

View file

@ -339,9 +339,12 @@ export class BaanReserverenService {
date, date,
}) })
const utcSeconds = date.valueOf() / 1000 const utcSeconds = date.valueOf() / 1000
await this.page.goto( const response = await this.page.goto(
`${BAAN_RESERVEREN_ROOT_URL}/reservations/make/${courtSlot}/${utcSeconds}`, `${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) { private async navigateToDay(date: Dayjs) {
@ -517,11 +520,8 @@ export class BaanReserverenService {
private async selectOwner(id: string) { private async selectOwner(id: string) {
this.loggerService.debug('Selecting owner', { id }) this.loggerService.debug('Selecting owner', { id })
await this.page.waitForNetworkIdle().catch((e: Error) => {
throw new RunnerOwnerSearchNetworkError(e)
})
await this.page await this.page
.$('select.br-user-select[name="players[1]"]') .waitForSelector('select.br-user-select[name="players[1]"]')
.then((d) => d?.select(id)) .then((d) => d?.select(id))
.catch((e: Error) => { .catch((e: Error) => {
throw new RunnerOwnerSearchSelectionError(e) throw new RunnerOwnerSearchSelectionError(e)
@ -711,21 +711,26 @@ export class BaanReserverenService {
} }
for (const courtSlot of courtSlots) { for (const courtSlot of courtSlots) {
let errorReserving = false
try {
await this.navigateToReservationPrompt( await this.navigateToReservationPrompt(
courtSlot, courtSlot,
reservation.dateRangeStart, reservation.dateRangeStart,
) )
await this.selectOwner(reservation.ownerId) await this.selectOwner(reservation.ownerId)
await this.selectOpponents(reservation.opponents, true) await this.selectOpponents(reservation.opponents, true)
let errorReserving = false await this.confirmReservation()
await this.confirmReservation().catch((error: Error) => { } catch (error: unknown) {
if (error instanceof RunnerReservationConfirmSubmitError) { if (
error instanceof CourtNotAvailableError ||
error instanceof RunnerReservationConfirmSubmitError
) {
this.loggerService.warn('Court taken, retrying', { courtSlot }) this.loggerService.warn('Court taken, retrying', { courtSlot })
errorReserving = true errorReserving = true
} else { } else {
throw error throw error
} }
}) }
if (!errorReserving) return 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 { export class RunnerOwnerSearchNetworkError extends RunnerError {
constructor(error: Error) { constructor(error: Error) {
super(error, 'RunnerOwnerSearchNetworkError') super(error, 'RunnerOwnerSearchNetworkError')