import asyncio import logging import time import pendulum from aiohttp import ClientSession from pendulum import DateTime import config from gestion_sports.gestion_sports_connector import GestionSportsConnector from models import BookingFilter, Club, User LOGGER = logging.getLogger(__name__) def wait_until_booking_time(club: Club, booking_filter: BookingFilter): LOGGER.info("Waiting booking time") booking_datetime = build_booking_datetime(booking_filter, club) now = pendulum.now() while now < booking_datetime: time.sleep(1) now = pendulum.now() def build_booking_datetime(booking_filter: BookingFilter, club: Club) -> DateTime: date_to_book = booking_filter.date booking_date = date_to_book.subtract(days=club.booking_open_days_before) booking_hour = club.booking_opening_time.hour booking_minute = club.booking_opening_time.minute return booking_date.at(booking_hour, booking_minute) async def book(club: Club, user: User, booking_filter: BookingFilter) -> int | None: async with ClientSession() as session: platform = GestionSportsConnector(session, club.url) await platform.connect() await platform.login(user, club) wait_until_booking_time(club, booking_filter) return await platform.book(booking_filter, club) def main() -> int | None: user = config.get_user() booking_filter = config.get_booking_filter() club = config.get_club() LOGGER.info( "Starting booking court of %s for user %s at club %s at %s", booking_filter.sport_id, user.login, club.id, booking_filter.date, ) court_booked = asyncio.run(book(club, user, booking_filter)) if court_booked: LOGGER.info( "Court %s booked successfully at %s", court_booked, booking_filter.date ) else: LOGGER.info("Booking did not work") return court_booked