Skip to content

Commit 2e902aa

Browse files
committed
Fix italic formatting for Telegram Client
1 parent 47d2026 commit 2e902aa

5 files changed

Lines changed: 107 additions & 66 deletions

File tree

common-library/src/main/java/project/vilsoncake/common/utils/BotMessagesUtils.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ public static String getValueOrUnknown(String value) {
1111
return value == null || value.isBlank() ? "Unknown" : value;
1212
}
1313

14+
/** Escapes MarkdownV2 formatting characters that appear in dynamic data values. */
15+
public static String escapeMarkdownV2(String value) {
16+
return value.replace("\\", "\\\\").replace("_", "\\_").replace("*", "\\*");
17+
}
18+
1419
public static String formatOriginAirport(String name, String icao) {
1520
String resolvedName = getValueOrUnknown(name);
1621
String resolvedIcao = getValueOrUnknown(icao);

flights-notification-lambda/src/main/java/project/vilsoncake/flightsnotificationlambda/processors/FlightStatusChangeNotificationTypeProcessor.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.stream.Collectors;
99
import lombok.RequiredArgsConstructor;
1010
import lombok.extern.slf4j.Slf4j;
11+
import project.vilsoncake.common.clients.TelegramClient;
1112
import project.vilsoncake.common.entities.ScheduledFlightNotificationEntity;
1213
import project.vilsoncake.common.entities.UserEntity;
1314
import project.vilsoncake.common.entities.WideBodyAircraftEntity;
@@ -115,8 +116,16 @@ public void process() {
115116
continue;
116117
}
117118

118-
flightStatusChangeNotificationSender.sendStatusChangeNotificationsIfNeeded(
119-
notification, currentFlight);
119+
try {
120+
flightStatusChangeNotificationSender.sendStatusChangeNotificationsIfNeeded(
121+
notification, currentFlight);
122+
} catch (TelegramClient.TelegramClientException e) {
123+
log.error(
124+
"Failed to send status change notification for flight {} to user {}: {}",
125+
notification.getScheduledFlight().getRowId(),
126+
notification.getUser().getUsername(),
127+
e.getMessage());
128+
}
120129
}
121130

122131
log.info("Finished flight status change notifications processing");

flights-notification-lambda/src/main/java/project/vilsoncake/flightsnotificationlambda/processors/ScheduledFlightsNotificationTypeProcessor.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.util.stream.Collectors;
1010
import lombok.RequiredArgsConstructor;
1111
import lombok.extern.slf4j.Slf4j;
12+
import project.vilsoncake.common.clients.TelegramClient;
1213
import project.vilsoncake.common.entities.UserEntity;
1314
import project.vilsoncake.common.entities.WideBodyAircraftEntity;
1415
import project.vilsoncake.common.models.AirportRequest;
@@ -109,7 +110,14 @@ private void notifyUsers(
109110
AirportResponse airportResponse = filteredFlightsForAirports.get(userAirportIcao);
110111
AirportResponse userFilteredResponse = filterResponseForUser(user, airportResponse);
111112

112-
scheduledFlightsNotificationSender.notifyScheduledFlights(user, userFilteredResponse);
113+
try {
114+
scheduledFlightsNotificationSender.notifyScheduledFlights(user, userFilteredResponse);
115+
} catch (TelegramClient.TelegramClientException e) {
116+
log.error(
117+
"Failed to send scheduled flights notification to user {}: {}",
118+
user.getUsername(),
119+
e.getMessage());
120+
}
113121
}
114122
}
115123

flights-notification-lambda/src/main/java/project/vilsoncake/flightsnotificationlambda/services/FlightStatusChangeNotificationSender.java

Lines changed: 63 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package project.vilsoncake.flightsnotificationlambda.services;
22

3+
import static project.vilsoncake.common.utils.BotMessagesUtils.escapeMarkdownV2;
34
import static project.vilsoncake.common.utils.BotMessagesUtils.formatDuration;
45
import static project.vilsoncake.common.utils.BotMessagesUtils.formatOriginAirport;
56
import static project.vilsoncake.common.utils.BotMessagesUtils.formatTimeWithDay;
@@ -61,13 +62,15 @@ public void sendStatusChangeNotificationsIfNeeded(
6162
+ "\n\n"
6263
+ String.format(
6364
botTemplatesResolver.getTemplate(MessageType.FLIGHT_LIVE_NOTIFICATION_DETAILS),
64-
aircraftName,
65-
getValueOrUnknown(currentFlight.getCallsign()),
66-
getValueOrUnknown(currentFlight.getRegistration()),
67-
getValueOrUnknown(currentFlight.getAirlineName()),
68-
formatOriginAirport(
69-
currentFlight.getOriginAirportName(), currentFlight.getOriginAirportIata()),
70-
eta,
65+
escapeMarkdownV2(aircraftName),
66+
escapeMarkdownV2(getValueOrUnknown(currentFlight.getCallsign())),
67+
escapeMarkdownV2(getValueOrUnknown(currentFlight.getRegistration())),
68+
escapeMarkdownV2(getValueOrUnknown(currentFlight.getAirlineName())),
69+
escapeMarkdownV2(
70+
formatOriginAirport(
71+
currentFlight.getOriginAirportName(),
72+
currentFlight.getOriginAirportIata())),
73+
escapeMarkdownV2(eta),
7174
currentFlight.getRegistration(),
7275
currentFlight.getCallsign(),
7376
currentFlight.getId());
@@ -101,12 +104,14 @@ public void sendStatusChangeNotificationsIfNeeded(
101104
+ "\n\n"
102105
+ String.format(
103106
botTemplatesResolver.getTemplate(MessageType.FLIGHT_DELAYED_NOTIFICATION_DETAILS),
104-
aircraftName,
105-
getValueOrUnknown(currentFlight.getCallsign()),
106-
getValueOrUnknown(currentFlight.getAirlineName()),
107-
formatOriginAirport(
108-
currentFlight.getOriginAirportName(), currentFlight.getOriginAirportIata()),
109-
eta);
107+
escapeMarkdownV2(aircraftName),
108+
escapeMarkdownV2(getValueOrUnknown(currentFlight.getCallsign())),
109+
escapeMarkdownV2(getValueOrUnknown(currentFlight.getAirlineName())),
110+
escapeMarkdownV2(
111+
formatOriginAirport(
112+
currentFlight.getOriginAirportName(),
113+
currentFlight.getOriginAirportIata())),
114+
escapeMarkdownV2(eta));
110115
telegramClient.sendMessages(chatId, List.of(message));
111116
notificationEntity.setNotifiedDelayed(true);
112117
changed = true;
@@ -124,11 +129,13 @@ public void sendStatusChangeNotificationsIfNeeded(
124129
+ String.format(
125130
botTemplatesResolver.getTemplate(
126131
MessageType.FLIGHT_CANCELLED_NOTIFICATION_DETAILS),
127-
aircraftName,
128-
getValueOrUnknown(currentFlight.getCallsign()),
129-
getValueOrUnknown(currentFlight.getAirlineName()),
130-
formatOriginAirport(
131-
currentFlight.getOriginAirportName(), currentFlight.getOriginAirportIata()));
132+
escapeMarkdownV2(aircraftName),
133+
escapeMarkdownV2(getValueOrUnknown(currentFlight.getCallsign())),
134+
escapeMarkdownV2(getValueOrUnknown(currentFlight.getAirlineName())),
135+
escapeMarkdownV2(
136+
formatOriginAirport(
137+
currentFlight.getOriginAirportName(),
138+
currentFlight.getOriginAirportIata())));
132139
telegramClient.sendMessages(chatId, List.of(message));
133140
notificationEntity.setNotifiedCancelled(true);
134141
changed = true;
@@ -153,19 +160,22 @@ public void sendStatusChangeNotificationsIfNeeded(
153160
String message =
154161
String.format(
155162
botTemplatesResolver.getTemplate(MessageType.FLIGHT_DIVERTED_NOTIFICATION),
156-
divertedAirportName,
157-
getValueOrUnknown(divertedIata.isBlank() ? null : divertedIata))
163+
escapeMarkdownV2(divertedAirportName),
164+
escapeMarkdownV2(getValueOrUnknown(divertedIata.isBlank() ? null : divertedIata)))
158165
+ "\n\n"
159166
+ String.format(
160167
botTemplatesResolver.getTemplate(
161168
MessageType.FLIGHT_DIVERTED_NOTIFICATION_DETAILS),
162-
aircraftName,
163-
getValueOrUnknown(currentFlight.getCallsign()),
164-
formatOriginAirport(
165-
currentFlight.getOriginAirportName(), currentFlight.getOriginAirportIata()),
166-
formatTimeWithDay(scheduledArrivalTime),
167-
formatOriginAirport(
168-
divertedAirportName, divertedIata.isBlank() ? null : divertedIata),
169+
escapeMarkdownV2(aircraftName),
170+
escapeMarkdownV2(getValueOrUnknown(currentFlight.getCallsign())),
171+
escapeMarkdownV2(
172+
formatOriginAirport(
173+
currentFlight.getOriginAirportName(),
174+
currentFlight.getOriginAirportIata())),
175+
escapeMarkdownV2(formatTimeWithDay(scheduledArrivalTime)),
176+
escapeMarkdownV2(
177+
formatOriginAirport(
178+
divertedAirportName, divertedIata.isBlank() ? null : divertedIata)),
169179
currentFlight.getRegistration(),
170180
currentFlight.getCallsign(),
171181
currentFlight.getId());
@@ -198,13 +208,15 @@ public void sendStatusChangeNotificationsIfNeeded(
198208
+ "\n\n"
199209
+ String.format(
200210
botTemplatesResolver.getTemplate(MessageType.FLIGHT_LANDED_NOTIFICATION_DETAILS),
201-
aircraftName,
202-
getValueOrUnknown(currentFlight.getCallsign()),
203-
getValueOrUnknown(currentFlight.getAirlineName()),
204-
formatOriginAirport(
205-
currentFlight.getOriginAirportName(), currentFlight.getOriginAirportIata()),
206-
formatTimeWithDay(scheduledArrivalTime),
207-
estimatedArrival,
211+
escapeMarkdownV2(aircraftName),
212+
escapeMarkdownV2(getValueOrUnknown(currentFlight.getCallsign())),
213+
escapeMarkdownV2(getValueOrUnknown(currentFlight.getAirlineName())),
214+
escapeMarkdownV2(
215+
formatOriginAirport(
216+
currentFlight.getOriginAirportName(),
217+
currentFlight.getOriginAirportIata())),
218+
escapeMarkdownV2(formatTimeWithDay(scheduledArrivalTime)),
219+
escapeMarkdownV2(estimatedArrival),
208220
currentFlight.getRegistration(),
209221
currentFlight.getRegistration(),
210222
currentFlight.getId());
@@ -245,12 +257,14 @@ public void sendStatusChangeNotificationsIfNeeded(
245257
+ String.format(
246258
botTemplatesResolver.getTemplate(
247259
MessageType.FLIGHT_ETA_CHANGED_NOTIFICATION_DETAILS),
248-
aircraftName,
249-
getValueOrUnknown(currentFlight.getCallsign()),
250-
formatOriginAirport(
251-
currentFlight.getOriginAirportName(), currentFlight.getOriginAirportIata()),
252-
formatTimeWithDay(scheduledArrivalTime),
253-
formatTimeWithDay(currentEta),
260+
escapeMarkdownV2(aircraftName),
261+
escapeMarkdownV2(getValueOrUnknown(currentFlight.getCallsign())),
262+
escapeMarkdownV2(
263+
formatOriginAirport(
264+
currentFlight.getOriginAirportName(),
265+
currentFlight.getOriginAirportIata())),
266+
escapeMarkdownV2(formatTimeWithDay(scheduledArrivalTime)),
267+
escapeMarkdownV2(formatTimeWithDay(currentEta)),
254268
currentFlight.getRegistration(),
255269
currentFlight.getCallsign(),
256270
currentFlight.getId());
@@ -287,13 +301,15 @@ public void sendStatusChangeNotificationsIfNeeded(
287301
+ String.format(
288302
botTemplatesResolver.getTemplate(
289303
MessageType.FLIGHT_ARRIVING_SOON_NOTIFICATION_DETAILS),
290-
aircraftName,
291-
getValueOrUnknown(currentFlight.getCallsign()),
292-
getValueOrUnknown(currentFlight.getAirlineName()),
293-
formatOriginAirport(
294-
currentFlight.getOriginAirportName(), currentFlight.getOriginAirportIata()),
295-
formatTimeWithDay(scheduledArrivalTime),
296-
formatTimeWithDay(currentEta),
304+
escapeMarkdownV2(aircraftName),
305+
escapeMarkdownV2(getValueOrUnknown(currentFlight.getCallsign())),
306+
escapeMarkdownV2(getValueOrUnknown(currentFlight.getAirlineName())),
307+
escapeMarkdownV2(
308+
formatOriginAirport(
309+
currentFlight.getOriginAirportName(),
310+
currentFlight.getOriginAirportIata())),
311+
escapeMarkdownV2(formatTimeWithDay(scheduledArrivalTime)),
312+
escapeMarkdownV2(formatTimeWithDay(currentEta)),
297313
currentFlight.getRegistration(),
298314
currentFlight.getCallsign(),
299315
currentFlight.getId());

flights-notification-lambda/src/main/java/project/vilsoncake/flightsnotificationlambda/services/ScheduledFlightsNotificationSender.java

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package project.vilsoncake.flightsnotificationlambda.services;
22

3+
import static project.vilsoncake.common.utils.BotMessagesUtils.escapeMarkdownV2;
34
import static project.vilsoncake.common.utils.BotMessagesUtils.formatOriginAirport;
45
import static project.vilsoncake.common.utils.BotMessagesUtils.formatTimeWithDay;
56
import static project.vilsoncake.common.utils.BotMessagesUtils.getValueOrUnknown;
@@ -132,14 +133,15 @@ private String buildScheduledFlightMessage(
132133
String formattedScheduledArrivalTime = formatTimeWithDay(arrivalDateTime);
133134
return String.format(
134135
scheduledFlightTemplate,
135-
aircraftName,
136-
getValueOrUnknown(scheduledFlight.getCallsign()),
137-
getValueOrUnknown(scheduledFlight.getRegistration()),
138-
getValueOrUnknown(scheduledFlight.getAirlineName()),
139-
formatOriginAirport(
140-
scheduledFlight.getOriginAirportName(), scheduledFlight.getOriginAirportIata()),
141-
getValueOrUnknown(scheduledFlight.getStatus()),
142-
getValueOrUnknown(formattedScheduledArrivalTime));
136+
escapeMarkdownV2(aircraftName),
137+
escapeMarkdownV2(getValueOrUnknown(scheduledFlight.getCallsign())),
138+
escapeMarkdownV2(getValueOrUnknown(scheduledFlight.getRegistration())),
139+
escapeMarkdownV2(getValueOrUnknown(scheduledFlight.getAirlineName())),
140+
escapeMarkdownV2(
141+
formatOriginAirport(
142+
scheduledFlight.getOriginAirportName(), scheduledFlight.getOriginAirportIata())),
143+
escapeMarkdownV2(getValueOrUnknown(scheduledFlight.getStatus())),
144+
escapeMarkdownV2(getValueOrUnknown(formattedScheduledArrivalTime)));
143145
}
144146

145147
private String buildScheduledFlightMessage(
@@ -157,14 +159,15 @@ private String buildScheduledFlightMessage(
157159
return String.format(
158160
scheduledFlightTemplate,
159161
listNumber,
160-
aircraftName,
161-
getValueOrUnknown(scheduledFlight.getCallsign()),
162-
getValueOrUnknown(scheduledFlight.getRegistration()),
163-
getValueOrUnknown(scheduledFlight.getAirlineName()),
164-
formatOriginAirport(
165-
scheduledFlight.getOriginAirportName(), scheduledFlight.getOriginAirportIata()),
166-
getValueOrUnknown(scheduledFlight.getStatus()),
167-
getValueOrUnknown(formattedScheduledArrivalTime));
162+
escapeMarkdownV2(aircraftName),
163+
escapeMarkdownV2(getValueOrUnknown(scheduledFlight.getCallsign())),
164+
escapeMarkdownV2(getValueOrUnknown(scheduledFlight.getRegistration())),
165+
escapeMarkdownV2(getValueOrUnknown(scheduledFlight.getAirlineName())),
166+
escapeMarkdownV2(
167+
formatOriginAirport(
168+
scheduledFlight.getOriginAirportName(), scheduledFlight.getOriginAirportIata())),
169+
escapeMarkdownV2(getValueOrUnknown(scheduledFlight.getStatus())),
170+
escapeMarkdownV2(getValueOrUnknown(formattedScheduledArrivalTime)));
168171
}
169172

170173
private List<ScheduledFlight> getUnnotifiedScheduledFlights(

0 commit comments

Comments
 (0)