Skip to content

Commit

Permalink
Fixing Boarding pass subscriptions
Browse files Browse the repository at this point in the history
As boarding passes change over time we need to stay subscribed to them after their initial creation.

Cleaned up sensors, images and coordinators to reduce reused code.

changed infant QR code for infant icon as it's less confusing.
  • Loading branch information
jampez77 committed Sep 27, 2023
1 parent a857c66 commit 89ad2d0
Show file tree
Hide file tree
Showing 6 changed files with 110 additions and 322 deletions.
3 changes: 1 addition & 2 deletions custom_components/ryanair/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
from homeassistant import config_entries
from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResult
from homeassistant.exceptions import HomeAssistantError
from homeassistant.const import CONF_EMAIL, CONF_PASSWORD
from homeassistant.helpers.json import save_json
from .const import (
Expand All @@ -27,7 +26,7 @@
)
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from .coordinator import RyanairCoordinator, RyanairMfaCoordinator
from .errors import CannotConnect, RyanairError
from .errors import CannotConnect

_LOGGER = logging.getLogger(__name__)
CREDENTIALS = LOCAL_FOLDER + PERSISTENCE
Expand Down
112 changes: 56 additions & 56 deletions custom_components/ryanair/coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,12 @@
CLIENT_ERROR,
TYPE,
BOARDING_PASS_URL,
EMAIL,
RECORD_LOCATOR,
LOCAL_FOLDER,
BOARDING_PASSES_URI,
BOARDING_PASS_HEADERS
BOOKING_REFERENCES,
BOARDING_PASS_HEADERS,
EMAIL,
RECORD_LOCATOR,
)
from .errors import RyanairError, InvalidAuth, APIRatelimitExceeded, UnknownError
from homeassistant.exceptions import ConfigEntryAuthFailed
Expand All @@ -53,7 +54,7 @@

USER_PROFILE_URL = HOST + USER_PROFILE + V
ORDERS_URL = HOST + ORDERS + V

BOARDING_PASS_PERSISTENCE = LOCAL_FOLDER + BOARDING_PASS_HEADERS
CREDENTIALS = LOCAL_FOLDER + PERSISTENCE


Expand Down Expand Up @@ -118,7 +119,6 @@ async def getFlights(self, data):
},
)
body = await resp.json()

return body


Expand All @@ -134,7 +134,6 @@ async def getUserProfile(self, data):
},
)
body = await resp.json()

return body


Expand All @@ -153,7 +152,6 @@ async def getBoardingPasses(self, data, headers):
}
)
body = await resp.json()
print("getBoardingPasses")
return body


Expand All @@ -169,67 +167,65 @@ def __init__(self, hass: HomeAssistant, session, data) -> None:
# Name of the data. For logging purposes.
name="Ryanair",
# Polling interval. Will only be polled if there are subscribers.
update_interval=timedelta(seconds=30),
update_interval=timedelta(minutes=1),
)
self.email = data[EMAIL]
self.record_locator = data[RECORD_LOCATOR]
self.session = session

async def _async_update_data(self):
"""Fetch data from API endpoint."""
try:
data = load_json_object(CREDENTIALS)
print("update boarding pass data")
boardingPassData = load_json_object(BOARDING_PASS_PERSISTENCE)

if X_REMEMBER_ME_TOKEN not in data:
rememberMeTokenResp = await rememberMeToken(self, data)
if BOOKING_REFERENCES in boardingPassData and EMAIL in boardingPassData:
for bookingRef in boardingPassData[BOOKING_REFERENCES]:
headers = {
EMAIL: boardingPassData[EMAIL],
RECORD_LOCATOR: bookingRef
}

data = {
CONF_DEVICE_FINGERPRINT: data[CONF_DEVICE_FINGERPRINT],
CUSTOMER_ID: data[CUSTOMER_ID],
TOKEN: data[TOKEN],
X_REMEMBER_ME_TOKEN: rememberMeTokenResp[TOKEN]
}
save_json(CREDENTIALS, data)
data = load_json_object(CREDENTIALS)

headers = {
EMAIL: self.email,
RECORD_LOCATOR: self.record_locator
}
if X_REMEMBER_ME_TOKEN not in data:
rememberMeTokenResp = await rememberMeToken(self, data)

body = await getBoardingPasses(self, data, headers)
data = {
CONF_DEVICE_FINGERPRINT: data[CONF_DEVICE_FINGERPRINT],
CUSTOMER_ID: data[CUSTOMER_ID],
TOKEN: data[TOKEN],
X_REMEMBER_ME_TOKEN: rememberMeTokenResp[TOKEN]
}
save_json(CREDENTIALS, data)

if (ACCESS_DENIED in body and body[CAUSE] == NOT_AUTHENTICATED) or (
TYPE in body and body[TYPE] == CLIENT_ERROR
):
refreshedData = await refreshToken(self, data)
body = await getBoardingPasses(self, data, headers)

headers = {
EMAIL: self.email,
RECORD_LOCATOR: self.record_locator
}
if (ACCESS_DENIED in body and body[CAUSE] == NOT_AUTHENTICATED) or (
TYPE in body and body[TYPE] == CLIENT_ERROR
):
refreshedData = await refreshToken(self, data)

body = await getBoardingPasses(self, refreshedData, headers)
body = await getBoardingPasses(self, refreshedData, headers)

for boardingPass in body:
aztec_code = AztecCode(boardingPass['barcode'])
for boardingPass in body:
aztec_code = AztecCode(boardingPass['barcode'])

flightName = "(" + boardingPass["flight"]["label"] + ") " + \
boardingPass["departure"]["name"] + \
" - " + boardingPass["arrival"]["name"]
flightName = "(" + boardingPass["flight"]["label"] + ") " + \
boardingPass["departure"]["name"] + \
" - " + boardingPass["arrival"]["name"]

seat = boardingPass["seat"]["designator"]
seat = boardingPass["seat"]["designator"]

passenger = boardingPass["name"]["first"] + \
" " + boardingPass["name"]["last"]
passenger = boardingPass["name"]["first"] + \
" " + boardingPass["name"]["last"]

name = passenger + ": " + \
flightName + "(" + seat + ")"
name = passenger + ": " + \
flightName + "(" + seat + ")"

fileName = re.sub(
"[\W_]", "", name + boardingPass["departure"]["dateUTC"]) + ".png"
print("Saving Aztec")
aztec_code.save(
LOCAL_FOLDER + BOARDING_PASSES_URI + fileName, module_size=16)
fileName = re.sub(
"[\W_]", "", name + boardingPass["departure"]["dateUTC"]) + ".png"
print("Saving Aztec")
aztec_code.save(
LOCAL_FOLDER + BOARDING_PASSES_URI + fileName, module_size=16)

except InvalidAuth as err:
raise ConfigEntryAuthFailed from err
Expand Down Expand Up @@ -261,16 +257,17 @@ def __init__(self, hass: HomeAssistant, session, data) -> None:
# Name of the data. For logging purposes.
name="Ryanair",
# Polling interval. Will only be polled if there are subscribers.
update_interval=timedelta(seconds=300),
update_interval=timedelta(minutes=1),
)

self.hass = hass
self.session = session
self.config = data

async def _async_update_data(self):
"""Fetch data from API endpoint."""
try:
data = load_json_object(CREDENTIALS)

print("update flights data")
if X_REMEMBER_ME_TOKEN not in data:
rememberMeTokenResp = await rememberMeToken(self, data)

Expand All @@ -291,6 +288,9 @@ async def _async_update_data(self):

body = await getFlights(self, refreshedData)

RyanairBoardingPassCoordinator(
self.hass, self.session, self.config)

except InvalidAuth as err:
raise ConfigEntryAuthFailed from err
except RyanairError as err:
Expand Down Expand Up @@ -321,7 +321,7 @@ def __init__(self, hass: HomeAssistant, session, data) -> None:
# Name of the data. For logging purposes.
name="Ryanair",
# Polling interval. Will only be polled if there are subscribers.
update_interval=timedelta(seconds=300),
update_interval=timedelta(minutes=1),
)

self.session = session
Expand All @@ -330,7 +330,7 @@ async def _async_update_data(self):
"""Fetch data from API endpoint."""
try:
data = load_json_object(CREDENTIALS)

print("update profile data")
if X_REMEMBER_ME_TOKEN not in data:
rememberMeTokenResp = await rememberMeToken(self, data)

Expand Down Expand Up @@ -381,7 +381,7 @@ def __init__(self, hass: HomeAssistant, session, data) -> None:
# Name of the data. For logging purposes.
name="Ryanair",
# Polling interval. Will only be polled if there are subscribers.
update_interval=timedelta(seconds=300),
update_interval=timedelta(minutes=1),
)

self.session = session
Expand Down Expand Up @@ -435,7 +435,7 @@ def __init__(self, hass: HomeAssistant, session, data) -> None:
# Name of the data. For logging purposes.
name="Ryanair",
# Polling interval. Will only be polled if there are subscribers.
update_interval=timedelta(seconds=300),
update_interval=timedelta(minutes=1),
)

self.session = session
Expand Down
Loading

0 comments on commit 89ad2d0

Please sign in to comment.