Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .github/workflows/deploy-bot-commands-processing-lambda.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ jobs:
DB_NAME: ${{ secrets.DB_NAME }}
DB_USERNAME: ${{ secrets.DB_USERNAME }}
DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
FLIGHTRADAR_API_LAMBDA_NAME: aviation-telegram-bot-flightradar-api-get-scheduled-flights
run: |
aws lambda update-function-configuration \
--function-name aviation-telegram-bot-bot-commands-processing \
Expand All @@ -69,5 +70,6 @@ jobs:
DB_HOST: env.DB_HOST,
DB_NAME: env.DB_NAME,
DB_USERNAME: env.DB_USERNAME,
DB_PASSWORD: env.DB_PASSWORD
DB_PASSWORD: env.DB_PASSWORD,
FLIGHTRADAR_API_LAMBDA_NAME: env.FLIGHTRADAR_API_LAMBDA_NAME
}}')"
1 change: 1 addition & 0 deletions bot-commands-processing-lambda/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ dependencies {
// AWS
implementation 'com.amazonaws:aws-lambda-java-core:1.2.3'
implementation 'com.amazonaws:aws-lambda-java-events:3.11.4'
implementation 'software.amazon.awssdk:lambda:2.31.0'

compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,10 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import project.vilsoncake.common.clients.TelegramClient;
import project.vilsoncake.common.configurations.AwsConfig;
import project.vilsoncake.common.configurations.BotConfig;
import project.vilsoncake.common.configurations.GeneralConfig;
import project.vilsoncake.common.configurations.MessagesConfig;
import project.vilsoncake.common.messages.BotTemplates;
import project.vilsoncake.common.repositories.AircraftFamilyRepository;
import project.vilsoncake.common.repositories.AirportDatabaseProvider;
Expand All @@ -41,7 +43,12 @@
import project.vilsoncake.common.repositories.UserAircraftFamilyFilterRepository;
import project.vilsoncake.common.repositories.UserDatabaseProvider;
import project.vilsoncake.common.repositories.UserRepository;
import project.vilsoncake.common.repositories.WidebodyAircraftDatabaseProvider;
import project.vilsoncake.common.repositories.WidebodyAircraftRepository;
import project.vilsoncake.common.services.adapters.FlightradarApiLambdaAdapter;
import project.vilsoncake.common.utils.BotTemplatesResolver;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.lambda.LambdaClient;
import tools.jackson.databind.ObjectMapper;

@Configuration
Expand Down Expand Up @@ -148,9 +155,18 @@ public ChoosingAirportPlainTextProcessor choosingAirportPlainTextProcessor(
UserDatabaseProvider userDatabaseProvider,
AirportDatabaseProvider airportDatabaseProvider,
TelegramClient telegramClient,
BotTemplatesResolver botTemplatesResolver) {
BotTemplatesResolver botTemplatesResolver,
FlightradarApiLambdaAdapter flightradarApiLambdaAdapter,
MessagesConfig messagesConfig,
WidebodyAircraftDatabaseProvider widebodyAircraftDatabaseProvider) {
return ChoosingAirportPlainTextProcessor.create(
userDatabaseProvider, airportDatabaseProvider, telegramClient, botTemplatesResolver);
userDatabaseProvider,
airportDatabaseProvider,
widebodyAircraftDatabaseProvider,
flightradarApiLambdaAdapter,
telegramClient,
botTemplatesResolver,
messagesConfig);
}

// Processors - Callbacks
Expand Down Expand Up @@ -243,6 +259,12 @@ public CallbackProcessorsAdapter callbackProcessorsAdapter(
return CallbackProcessorsAdapter.create(callbackProcessors);
}

@Bean
public FlightradarApiLambdaAdapter flightradarApiLambdaAdapter(
LambdaClient lambdaClient, AwsConfig awsConfig, ObjectMapper objectMapper) {
return FlightradarApiLambdaAdapter.create(lambdaClient, awsConfig, objectMapper);
}

// Database
@Bean
public UserDatabaseProvider userDatabaseProvider(
Expand All @@ -263,13 +285,37 @@ public UserAircraftFamilyFilterDatabaseProvider userAircraftFamilyFilterDatabase
filterRepository, aircraftFamilyRepository);
}

@Bean
public WidebodyAircraftDatabaseProvider widebodyAircraftDatabaseProvider(
WidebodyAircraftRepository widebodyAircraftRepository) {
return WidebodyAircraftDatabaseProvider.create(widebodyAircraftRepository);
}

// AWS
@Bean
@ConfigurationProperties(prefix = "aws")
public AwsConfig awsConfig() {
return new AwsConfig();
}

@Bean
public LambdaClient lambdaClient(AwsConfig awsConfig) {
return LambdaClient.builder().region(Region.of(awsConfig.getRegion())).build();
}

// Other required beans
@Bean
@ConfigurationProperties(prefix = "general")
public GeneralConfig generalConfig() {
return new GeneralConfig();
}

@Bean
@ConfigurationProperties(prefix = "messages")
public MessagesConfig messagesConfig() {
return new MessagesConfig();
}

@Bean
public HttpClient httpClient() {
return HttpClient.newHttpClient();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,38 @@
package aviation.bot.service.services.processors.userstates;

import aviation.bot.service.services.processors.PlainTextProcessor;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import project.vilsoncake.common.clients.TelegramClient;
import project.vilsoncake.common.configurations.MessagesConfig;
import project.vilsoncake.common.entities.AirportEntity;
import project.vilsoncake.common.entities.UserEntity;
import project.vilsoncake.common.entities.WideBodyAircraftEntity;
import project.vilsoncake.common.entities.enums.UserState;
import project.vilsoncake.common.models.AirportRequest;
import project.vilsoncake.common.models.AirportResponse;
import project.vilsoncake.common.models.BotCommand;
import project.vilsoncake.common.models.UserStateResponseTemplate;
import project.vilsoncake.common.repositories.AirportDatabaseProvider;
import project.vilsoncake.common.repositories.UserDatabaseProvider;
import project.vilsoncake.common.repositories.WidebodyAircraftDatabaseProvider;
import project.vilsoncake.common.services.adapters.FlightradarApiLambdaAdapter;
import project.vilsoncake.common.utils.BotTemplatesResolver;

@Slf4j
@RequiredArgsConstructor(staticName = "create")
public class ChoosingAirportPlainTextProcessor implements PlainTextProcessor {

private final UserDatabaseProvider userDatabaseProvider;
private final AirportDatabaseProvider airportDatabaseProvider;
private final WidebodyAircraftDatabaseProvider widebodyAircraftDatabaseProvider;
private final FlightradarApiLambdaAdapter flightradarApiLambdaAdapter;
private final TelegramClient telegramClient;
private final BotTemplatesResolver botTemplatesResolver;
private final MessagesConfig messagesConfig;

@Override
public UserState getUserState() {
Expand Down Expand Up @@ -53,15 +67,57 @@ public void process(String username, long chatId, String airportCode) {
AirportEntity airport = airportByCode.get();

userDatabaseProvider.updateAirportAndState(user, airport, UserState.ALL_SET);
telegramClient.sendMessage(
chatId,

String message =
String.format(
botTemplatesResolver.getTemplate(
getUserState(), UserStateResponseTemplate.VALID_AIRPORT_SELECTED),
airport.getName(),
airport.getIcao(),
airport.getIata(),
airport.getCity(),
airport.getCountry()));
airport.getCountry());

String updatedMessage = includeAircraftFilterRecommendationIfNeeded(airport, message, username);

telegramClient.sendMessage(chatId, updatedMessage);
}

private String includeAircraftFilterRecommendationIfNeeded(
AirportEntity airport, String message, String username) {
try {
List<WideBodyAircraftEntity> allWideBodyAircraft =
widebodyAircraftDatabaseProvider.getAllWideBodyAircraft();
AirportRequest airportRequest =
AirportRequest.builder()
.withAirportCode(airport.getIcao())
.withAircraftFilterCodes(
allWideBodyAircraft.stream().map(WideBodyAircraftEntity::getCode).toList())
.build();

Map<String, AirportResponse> airportResponse =
flightradarApiLambdaAdapter.getFilteredFlightsForAirports(List.of(airportRequest));

if (airportResponse.containsKey(airport.getIcao())) {
AirportResponse response = airportResponse.get(airport.getIcao());
int filteredArrivalsCount = response.getFilteredArrivalsCount();

if (filteredArrivalsCount > messagesConfig.getAircraftFilterRecommendationThreshold()) {
String aircraftFilterRecommendation =
String.format(
botTemplatesResolver.getTemplate(
getUserState(), UserStateResponseTemplate.AIRCRAFT_FILTER_RECOMMENDATION),
BotCommand.AIRCRAFT.getCommand());
message += "\n\n" + aircraftFilterRecommendation;

log.info("Added aircraft filter recommendation for the message to user {}", username);
}
}

return message;
} catch (Exception e) {
log.error("Error while retrieving wide-body flights from flightradar API", e);
return message;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,7 @@ bot:
telegram-api-media-group-url: https://api.telegram.org/bot${BOT_TOKEN}/sendMediaGroup

general:
timezone: Europe/Warsaw
timezone: Europe/Warsaw

messages:
aircraft-filter-recommendation-threshold: 5
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,12 @@ templates:
*IATA*: _%s_
*City*: _%s_
*Country*: _%s_
AIRCRAFT_FILTER_RECOMMENDATION: |-
Looks like you have selected a busy airport with a lot of Wide-body aircraft arrivals.

To reduce the noise, consider changing the *Aircraft Filter* to include only aircraft families you are interested in.

Use the %s command for that.

callbacks:
CHANGE_AIRPORT:
Expand Down
2 changes: 2 additions & 0 deletions common-library/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ dependencies {
compileOnly 'org.springframework.boot:spring-boot-starter-data-jpa:4.0.5'
compileOnly 'tools.jackson.core:jackson-databind:3.1.0'

compileOnly 'software.amazon.awssdk:lambda:2.31.0'

compileOnly 'org.projectlombok:lombok:1.18.38'
annotationProcessor 'org.projectlombok:lombok:1.18.38'
testCompileOnly 'org.projectlombok:lombok:1.18.38'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package project.vilsoncake.flightsnotificationlambda.configurations;
package project.vilsoncake.common.configurations;

import lombok.AllArgsConstructor;
import lombok.Data;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package project.vilsoncake.common.configurations;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class MessagesConfig {
private Integer aircraftFilterRecommendationThreshold;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package project.vilsoncake.flightsnotificationlambda.models;
package project.vilsoncake.common.models;

import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package project.vilsoncake.flightsnotificationlambda.models;
package project.vilsoncake.common.models;

import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import project.vilsoncake.common.models.ScheduledFlight;

@Data
@AllArgsConstructor
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@

public enum UserStateResponseTemplate {
AIRPORT_NOT_FOUND,
VALID_AIRPORT_SELECTED
VALID_AIRPORT_SELECTED,
AIRCRAFT_FILTER_RECOMMENDATION
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package project.vilsoncake.flightsnotificationlambda.services.adapters;
package project.vilsoncake.common.services.adapters;

import java.util.List;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import project.vilsoncake.flightsnotificationlambda.configurations.AwsConfig;
import project.vilsoncake.flightsnotificationlambda.models.AirportRequest;
import project.vilsoncake.flightsnotificationlambda.models.AirportResponse;
import project.vilsoncake.common.configurations.AwsConfig;
import project.vilsoncake.common.models.AirportRequest;
import project.vilsoncake.common.models.AirportResponse;
import software.amazon.awssdk.core.SdkBytes;
import software.amazon.awssdk.services.lambda.LambdaClient;
import software.amazon.awssdk.services.lambda.model.InvocationType;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import project.vilsoncake.common.clients.TelegramClient;
import project.vilsoncake.common.configurations.AwsConfig;
import project.vilsoncake.common.configurations.BotConfig;
import project.vilsoncake.common.configurations.GeneralConfig;
import project.vilsoncake.common.configurations.NotificationsConfig;
Expand All @@ -22,6 +23,7 @@
import project.vilsoncake.common.repositories.UserRepository;
import project.vilsoncake.common.repositories.WidebodyAircraftDatabaseProvider;
import project.vilsoncake.common.repositories.WidebodyAircraftRepository;
import project.vilsoncake.common.services.adapters.FlightradarApiLambdaAdapter;
import project.vilsoncake.flightsnotificationlambda.handlers.FlightsNotificationTriggerHandler;
import project.vilsoncake.flightsnotificationlambda.models.BotTemplates;
import project.vilsoncake.flightsnotificationlambda.processors.FlightStatusChangeNotificationTypeProcessor;
Expand All @@ -32,7 +34,6 @@
import project.vilsoncake.flightsnotificationlambda.services.FlightStatusChangeNotificationSender;
import project.vilsoncake.flightsnotificationlambda.services.ScheduledFlightNotificationFlagsResolver;
import project.vilsoncake.flightsnotificationlambda.services.ScheduledFlightsNotificationSender;
import project.vilsoncake.flightsnotificationlambda.services.adapters.FlightradarApiLambdaAdapter;
import project.vilsoncake.flightsnotificationlambda.services.adapters.NotificationTypeAdapter;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.lambda.LambdaClient;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@
import lombok.extern.slf4j.Slf4j;
import project.vilsoncake.common.entities.ScheduledFlightNotificationEntity;
import project.vilsoncake.common.entities.WideBodyAircraftEntity;
import project.vilsoncake.common.models.AirportRequest;
import project.vilsoncake.common.models.AirportResponse;
import project.vilsoncake.common.models.ScheduledFlight;
import project.vilsoncake.common.repositories.ScheduledFlightNotificationDatabaseProvider;
import project.vilsoncake.common.repositories.WidebodyAircraftDatabaseProvider;
import project.vilsoncake.flightsnotificationlambda.models.AirportRequest;
import project.vilsoncake.flightsnotificationlambda.models.AirportResponse;
import project.vilsoncake.common.services.adapters.FlightradarApiLambdaAdapter;
import project.vilsoncake.flightsnotificationlambda.models.FlightsNotificationType;
import project.vilsoncake.flightsnotificationlambda.services.FlightStatusChangeNotificationSender;
import project.vilsoncake.flightsnotificationlambda.services.adapters.FlightradarApiLambdaAdapter;

@Slf4j
@RequiredArgsConstructor(staticName = "create")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@
import lombok.extern.slf4j.Slf4j;
import project.vilsoncake.common.entities.UserEntity;
import project.vilsoncake.common.entities.WideBodyAircraftEntity;
import project.vilsoncake.common.models.AirportRequest;
import project.vilsoncake.common.models.AirportResponse;
import project.vilsoncake.common.models.ScheduledFlight;
import project.vilsoncake.common.repositories.UserAircraftFamilyFilterDatabaseProvider;
import project.vilsoncake.common.repositories.UserDatabaseProvider;
import project.vilsoncake.common.repositories.WidebodyAircraftDatabaseProvider;
import project.vilsoncake.flightsnotificationlambda.models.AirportRequest;
import project.vilsoncake.flightsnotificationlambda.models.AirportResponse;
import project.vilsoncake.common.services.adapters.FlightradarApiLambdaAdapter;
import project.vilsoncake.flightsnotificationlambda.models.FlightsNotificationType;
import project.vilsoncake.flightsnotificationlambda.services.ScheduledFlightsNotificationSender;
import project.vilsoncake.flightsnotificationlambda.services.adapters.FlightradarApiLambdaAdapter;

@Slf4j
@RequiredArgsConstructor(staticName = "create")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@
import project.vilsoncake.common.clients.TelegramClient;
import project.vilsoncake.common.entities.ScheduledFlightEntity;
import project.vilsoncake.common.entities.UserEntity;
import project.vilsoncake.common.models.AirportResponse;
import project.vilsoncake.common.models.ScheduledFlight;
import project.vilsoncake.common.models.ScheduledFlightNotificationFlags;
import project.vilsoncake.common.repositories.ScheduledFlightDatabaseProvider;
import project.vilsoncake.common.repositories.ScheduledFlightNotificationDatabaseProvider;
import project.vilsoncake.flightsnotificationlambda.models.AirportResponse;
import project.vilsoncake.flightsnotificationlambda.models.MessageType;

@Slf4j
Expand Down
Loading