Skip to content

Commit 27a05f5

Browse files
committed
feat: include calculated arrival hour on buses
1 parent 547fe67 commit 27a05f5

File tree

5 files changed

+48
-26
lines changed

5 files changed

+48
-26
lines changed

sample.env

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ TYPING_SAFE_LIMIT_TIME=30
1515
INLINE_CACHE_TIME=300
1616
STOP_MESSAGES_DEPRECATION_REMINDER_AFTER_SECONDS=300 # 300s = 5 minutes
1717
STOP_MESSAGES_DEPRECATION_REMINDER_LOOP_DELAY_SECONDS=30
18+
STOP_MESSAGES_INCLUDE_ARRIVAL_HOUR_AFTER_MINUTES=10
1819

1920
# Bus API
2021
API_URL=http://localhost:5000

static/messages.yaml

+6-2
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
# Emojis: https://www.webfx.com/tools/emoji-cheat-sheet/
55
start:
66
- |-
7-
¡Hola! :wave: Este bot proporciona información sobre los autobuses urbanos de la ciudad de Vigo en tiempo real y por paradas.
7+
¡Hola! :wave: Este bot proporciona información sobre los :bus:autobuses urbanos de la ciudad de Vigo en :stopwatch:tiempo real y por :bus_stop:paradas.
88
99
Para empezar, envíame el código de la parada que quieras consultar. Podrás encontrar los números de parada en las marquesinas y paradas de autobús.
10+
11+
:megaphone:Te puedes suscribir al canal @vigobus para recibir novedades de este bot y notificaciones de servicio.
1012
1113
:question:¿Dudas? Para más información y ayuda, envía /ayuda
1214
help:
@@ -67,11 +69,13 @@ stop:
6769
bus_line: >-
6870
<pre> {line} ({route}): {time}</pre>
6971
bus_time_remaining: >-
70-
{minutes}m
72+
{minutes}m {arrival_time}
7173
bus_time_now: >-
7274
&lt;&lt;&lt;
7375
time_format: >- # https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior
7476
%d/%m %H:%M:%S
77+
bus_arrival_time_format: >- # https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior
78+
(~%H:%M)
7579
no_buses_found: >-
7680
<pre> ¡No hay buses!</pre>
7781
not_exists:

vigobusbot/entities.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""ENTITIES
22
Custom and imported entities used all over the project
33
"""
4-
4+
import datetime
55
# # Native # #
66
from typing import Optional, List, Dict
77

@@ -21,7 +21,10 @@ class Stop(pydantic.BaseModel):
2121
class Bus(pydantic.BaseModel):
2222
line: str
2323
route: str
24-
time: int
24+
time: int # minutes
25+
26+
def get_calculated_arrival_time(self) -> datetime.datetime:
27+
return datetime.datetime.now() + datetime.timedelta(minutes=self.time)
2528

2629

2730
class File(pydantic.BaseModel):

vigobusbot/settings_handler/__init__.py

+3
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ class TelegramSettings(BaseBotSettings):
3939
If 0, disable this feature."""
4040
stop_messages_deprecation_reminder_loop_delay_seconds: int = 60
4141
"""Delay for the loop that checks for deprecated Stop messages."""
42+
stop_messages_include_arrival_hour_after_minutes: int = -1
43+
"""Buses arriving after this amount of minutes will include the calculated hour of arrival.
44+
Negative values to disable the feature."""
4245

4346
def __init__(self, **kwargs):
4447
super().__init__(**kwargs)

vigobusbot/telegram_bot/services/message_generators/stop_message_text.py

+33-22
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,13 @@
22
Helper to generate the Stop Message text body
33
"""
44

5-
# # Native # #
65
import datetime
7-
from typing import Optional
6+
from typing import Optional, List
87

9-
# # Project # #
108
from vigobusbot.persistence_api import saved_stops
119
from vigobusbot.static_handler import get_messages
12-
from vigobusbot.entities import Stop, BusesResponse
10+
from vigobusbot.entities import Stop, BusesResponse, Bus
11+
from vigobusbot.settings_handler import telegram_settings
1312

1413
__all__ = ("generate_stop_message_text",)
1514

@@ -20,7 +19,6 @@ def generate_stop_message_text(
2019
user_saved_stop: Optional[saved_stops.SavedStop]
2120
) -> str:
2221
messages = get_messages()
23-
buses = buses_response.buses
2422

2523
# Generate Stop Name text
2624
if user_saved_stop and user_saved_stop.stop_name:
@@ -31,23 +29,7 @@ def generate_stop_message_text(
3129
else:
3230
stop_name_text = stop.name
3331

34-
# Generate Buses text
35-
if buses:
36-
buses_text_lines = list()
37-
for bus in buses:
38-
if bus.time == 0:
39-
time_text = messages.stop.bus_time_now
40-
else:
41-
time_text = messages.stop.bus_time_remaining.format(minutes=bus.time)
42-
buses_text_lines.append(messages.stop.bus_line.format(
43-
line=bus.line,
44-
route=bus.route,
45-
time=time_text
46-
))
47-
buses_text = "\n".join(buses_text_lines)
48-
else:
49-
buses_text = messages.stop.no_buses_found
50-
32+
buses_text = "\n".join(_generate_buses_text_lines(buses_response.buses))
5133
last_update_text = datetime.datetime.now().strftime(messages.stop.time_format)
5234

5335
return messages.stop.message.format(
@@ -56,3 +38,32 @@ def generate_stop_message_text(
5638
buses=buses_text,
5739
last_update=last_update_text
5840
)
41+
42+
43+
def _generate_buses_text_lines(buses: List[Bus]) -> List[str]:
44+
if not buses:
45+
return [get_messages().stop.no_buses_found]
46+
47+
return [_generate_bus_text_line(bus) for bus in buses]
48+
49+
50+
def _generate_bus_text_line(bus: Bus) -> str:
51+
messages = get_messages()
52+
if bus.time == 0:
53+
time_text = messages.stop.bus_time_now
54+
else:
55+
if bus.time > telegram_settings.stop_messages_include_arrival_hour_after_minutes:
56+
arrival_time = bus.get_calculated_arrival_time().strftime(messages.stop.bus_arrival_time_format)
57+
else:
58+
arrival_time = ""
59+
60+
time_text = messages.stop.bus_time_remaining.format(
61+
minutes=bus.time,
62+
arrival_time=arrival_time
63+
).strip()
64+
65+
return messages.stop.bus_line.format(
66+
line=bus.line,
67+
route=bus.route,
68+
time=time_text
69+
)

0 commit comments

Comments
 (0)