1919 OCADO_SMARTPASS_SUBJECT ,
2020 OCADO_RENEWAL_SUBJECT ,
2121 OCADO_SUBJECT_DICT ,
22+ REGEX_EDIT_UNTIL ,
2223 REGEX_DATE ,
2324 # REGEX_DATE_FULL,
2425 REGEX_DAY_FULL ,
2526 REGEX_MONTH_FULL ,
2627 REGEX_YEAR ,
27- REGEX_TIME ,
28- REGEX_NOT_ISO_TIME ,
28+ REGEX_ISO_TIME ,
29+ REGEX_APM_TIME ,
2930 REGEX_ORDINALS ,
3031 STRING_NO_BBD ,
3132 REGEX_END_INDEX ,
@@ -77,7 +78,7 @@ def get_estimated_total(message: str) -> str:
7778def get_delivery_datetimes (message : str | None ) -> tuple [datetime , datetime ] | tuple [None , None ]:
7879 """Parse and return the delivery datetime."""
7980 if message is None :
80- return None , None
81+ return None , None
8182 pattern = fr"(?:Delivery\sdate:\s)(?P<day>{ REGEX_DATE } )\s(?P<month>{ REGEX_MONTH_FULL } )\s(?P<year>{ REGEX_YEAR } )"
8283 raw = re .search (pattern , message , re .MULTILINE )
8384 if raw :
@@ -103,33 +104,45 @@ def get_delivery_datetimes(message: str | None) -> tuple[datetime, datetime] | t
103104 else :
104105 _LOGGER .error ("Delivery date not found when retrieving delivery datetime from message." )
105106 raise ValueError ("Delivery date not found when retrieving delivery datetime from message." )
106- pattern = fr"(?:Delivery\stime:)(?:\sBetween)?(?:\s{{1,20}})(?P<start>{ REGEX_TIME } )\sand\s(?P<end>{ REGEX_TIME } )"
107+ pattern = fr"(?:Delivery\stime:)(?:\sBetween)?(?:\s{{1,20}})(?P<start>{ REGEX_ISO_TIME } )\sand\s(?P<end>{ REGEX_ISO_TIME } )"
107108 delivery_time_raw = re .search (pattern , message , re .MULTILINE )
108109 if delivery_time_raw :
109- start_time = re .sub (r"pm" ,r"PM" ,re .sub (r"am" ,r"AM" ,delivery_time_raw .group ('start' )))
110- end_time = re .sub (r"pm" ,r"PM" ,re .sub (r"am" ,r"AM" ,delivery_time_raw .group ('end' )))
111- else :
112- _LOGGER .error ("Time not found when retrieving delivery datetime from message." )
113- raise ValueError ("Time not found when retrieving delivery datetime from message." )
114- delivery_datetime_raw = year + '-' + month + '-' + day + ' ' + start_time
115- delivery_datetime = datetime .strptime (delivery_datetime_raw ,'%Y-%B-%d %I:%M%p' )
116- delivery_window_end_raw = year + '-' + month + '-' + day + ' ' + end_time
117- delivery_window_end = datetime .strptime (delivery_window_end_raw ,'%Y-%B-%d %I:%M%p' )
110+ _LOGGER .debug ("ISO time found" )
111+ start_time = delivery_time_raw .group ('start' )
112+ end_time = delivery_time_raw .group ('end' )
113+ delivery_datetime_raw = year + '-' + month + '-' + day + ' ' + start_time
114+ delivery_datetime = datetime .strptime (delivery_datetime_raw ,'%Y-%B-%d %H:%M' )
115+ delivery_window_end_raw = year + '-' + month + '-' + day + ' ' + end_time
116+ delivery_window_end = datetime .strptime (delivery_window_end_raw ,'%Y-%B-%d %H:%M' )
117+ else :
118+ pattern = fr"(?:Delivery\stime:)(?:\sBetween)?(?:\s{{1,20}})(?P<start>{ REGEX_APM_TIME } )\sand\s(?P<end>{ REGEX_APM_TIME } )"
119+ delivery_time_raw = re .search (pattern , message , re .MULTILINE )
120+ if delivery_time_raw :
121+ _LOGGER .debug ("ISO time found" )
122+ start_time = re .sub (r"pm" ,r"PM" ,re .sub (r"am" ,r"AM" ,delivery_time_raw .group ('start' )))
123+ end_time = re .sub (r"pm" ,r"PM" ,re .sub (r"am" ,r"AM" ,delivery_time_raw .group ('end' )))
124+ delivery_datetime_raw = year + '-' + month + '-' + day + ' ' + start_time
125+ delivery_datetime = datetime .strptime (delivery_datetime_raw ,'%Y-%B-%d %I:%M%p' )
126+ delivery_window_end_raw = year + '-' + month + '-' + day + ' ' + end_time
127+ delivery_window_end = datetime .strptime (delivery_window_end_raw ,'%Y-%B-%d %I:%M%p' )
128+ else :
129+ _LOGGER .error ("Time not found when retrieving delivery datetime from message." )
130+ raise ValueError ("Time not found when retrieving delivery datetime from message." )
118131 return delivery_datetime , delivery_window_end
119132
120133
121134def get_edit_datetime (message : str ) -> datetime :
122135 """Parse the edit deadline datetime."""
123- pattern = fr"(?:You\scan\sedit\sthis\sorder\suntil:?\s)(? P<time>{ REGEX_TIME } )(?:\son\s)(?P<day>{ REGEX_DATE } )(?:{ REGEX_ORDINALS } )\s(?P<month>{ REGEX_MONTH_FULL } )\s(?P<year>{ REGEX_YEAR } )"
136+ pattern = fr"{ REGEX_EDIT_UNTIL } (? P<time>{ REGEX_ISO_TIME } )(?:\son\s)(?P<day>{ REGEX_DATE } )(?:{ REGEX_ORDINALS } )\s(?P<month>{ REGEX_MONTH_FULL } )\s(?P<year>{ REGEX_YEAR } )"
124137 raw = re .search (pattern , message )
125138 _LOGGER .debug ("Trying to get edit datetime" )
126139 if raw :
127140 _LOGGER .debug ("First attempt found datetime" )
128141 edit_datetime_raw = raw .group ('year' ) + '-' + raw .group ('month' ) + '-' + raw .group ('day' ) + ' ' + raw .group ('time' )
129142 return datetime .strptime (edit_datetime_raw ,'%Y-%B-%d %H:%M' )
130143 else :
131- _LOGGER .debug ("Trying backup pattern" )
132- pattern = fr"(?:You\scan\sedit\sthis\sorder\suntil:?\s)(? P<time>{ REGEX_NOT_ISO_TIME } )(?:\son\s|,\s)?(?P<day>{ REGEX_DATE } )(?:{ REGEX_ORDINALS } )?\s?(?P<month>{ REGEX_MONTH_FULL } )\s(?P<year>{ REGEX_YEAR } )"
144+ _LOGGER .debug ("Trying backup pattern with non ISO time " )
145+ pattern = fr"{ REGEX_EDIT_UNTIL } (? P<time>{ REGEX_APM_TIME } )(?:\son\s|,\s)?(?P<day>{ REGEX_DATE } )(?:{ REGEX_ORDINALS } )?\s?(?P<month>{ REGEX_MONTH_FULL } )\s(?P<year>{ REGEX_YEAR } )"
133146 raw = re .search (pattern , message , re .MULTILINE )
134147 if raw :
135148 _LOGGER .debug ("Second attempt found datetime" )
0 commit comments