Skip to content

Commit e64ab01

Browse files
authored
Merge pull request #3 from vaniii1/balActivity
added MonitoringService
2 parents ed1c0e4 + 69c4617 commit e64ab01

40 files changed

Lines changed: 1026 additions & 317 deletions

.DS_Store

6 KB
Binary file not shown.

.github/workflows/ci.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@ on: [push]
44

55
jobs:
66
build:
7-
runs-on: ubuntu-latest
7+
runs-on: macos-latest
88

99
steps:
1010
- uses: actions/checkout@v4
1111

12-
- name: Set up JDK 21
12+
- name: Set up JDK 17
1313
uses: actions/setup-java@v4
1414
with:
1515
distribution: 'temurin'
16-
java-version: '21'
16+
java-version: '17'
1717
cache: 'maven'
1818

1919
- name: Build with Maven

Dockerfile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
FROM openjdk:17-jdk-slim
2+
ARG JAR_FILE=target/*.jar
3+
COPY ${JAR_FILE} app.jar
4+
ENTRYPOINT ["java", "-jar", "/app.jar"]

docker-compose.yml

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
version: '3.8'
2+
3+
services:
4+
postgres:
5+
image: postgres:15
6+
container_name: postgres
7+
environment:
8+
POSTGRES_DB: $POSTGRES_DATABASE
9+
POSTGRES_USER: $POSTGRES_USERNAME
10+
POSTGRES_PASSWORD: $POSTGRES_PASSWORD
11+
volumes:
12+
- postgres_data:/var/lib/postgresql/data
13+
ports:
14+
- $POSTGRES_LOCAL_PORT:$POSTGRES_DOCKER_PORT
15+
healthcheck:
16+
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USERNAME} -d ${POSTGRES_DATABASE}"]
17+
interval: 5s
18+
timeout: 5s
19+
retries: 5
20+
21+
telegram-bot:
22+
build: .
23+
env_file: .env
24+
restart: unless-stopped
25+
depends_on:
26+
postgres:
27+
condition: service_healthy
28+
ports:
29+
- $SPRING_LOCAL_PORT:$SPRING_DOCKER_PORT
30+
environment:
31+
SPRING_APPLICATION_JSON: '{
32+
"spring.datasource.url": "jdbc:postgresql://postgres:${POSTGRES_DOCKER_PORT}/${POSTGRES_DATABASE}",
33+
"spring.datasource.username": "${POSTGRES_USERNAME}",
34+
"spring.datasource.password": "${POSTGRES_PASSWORD}",
35+
"spring.datasource.driver-class-name": "org.postgresql.Driver",
36+
"spring.jpa.properties.hibernate.dialect": "org.hibernate.dialect.PostgreSQLDialect",
37+
"spring.liquibase.enabled": true,
38+
"spring.liquibase.change-log": "classpath:db/changelog/db.changelog-master.yaml"
39+
}'
40+
JAVA_TOOL_OPTIONS: "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:${DEBUG_PORT}"
41+
42+
volumes:
43+
postgres_data:

pom.xml

Lines changed: 37 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,9 @@
1313
<version>0.0.1-SNAPSHOT</version>
1414
<name>solscanbot</name>
1515
<description>solscanbot</description>
16-
<url/>
17-
<licenses>
18-
<license/>
19-
</licenses>
20-
<developers>
21-
<developer/>
22-
</developers>
23-
<scm>
24-
<connection/>
25-
<developerConnection/>
26-
<tag/>
27-
<url/>
28-
</scm>
2916
<properties>
3017
<maven.checkstyle.plugin.configLocation>checkstyle.xml</maven.checkstyle.plugin.configLocation>
31-
<java.version>21</java.version>
18+
<java.version>17</java.version>
3219
<org.mapstruct.version>1.6.3</org.mapstruct.version>
3320
<lombok.mapstruct.binding.version>0.2.0</lombok.mapstruct.binding.version>
3421
</properties>
@@ -42,14 +29,13 @@
4229
<artifactId>spring-boot-starter-data-jpa</artifactId>
4330
</dependency>
4431
<dependency>
45-
<groupId>org.projectlombok</groupId>
46-
<artifactId>lombok</artifactId>
32+
<groupId>org.springframework.boot</groupId>
33+
<artifactId>spring-boot-starter</artifactId>
4734
</dependency>
48-
4935
<dependency>
50-
<groupId>com.h2database</groupId>
51-
<artifactId>h2</artifactId>
52-
<scope>runtime</scope>
36+
<groupId>org.springframework.boot</groupId>
37+
<artifactId>spring-boot-starter-test</artifactId>
38+
<scope>test</scope>
5339
</dependency>
5440

5541
<dependency>
@@ -62,16 +48,42 @@
6248
<artifactId>mapstruct</artifactId>
6349
<version>${org.mapstruct.version}</version>
6450
</dependency>
51+
<dependency>
52+
<groupId>org.projectlombok</groupId>
53+
<artifactId>lombok</artifactId>
54+
<scope>provided</scope>
55+
</dependency>
56+
57+
<dependency>
58+
<groupId>org.springframework</groupId>
59+
<artifactId>spring-context</artifactId>
60+
</dependency>
6561

62+
<dependency>
63+
<groupId>org.hibernate.validator</groupId>
64+
<artifactId>hibernate-validator</artifactId>
65+
</dependency>
66+
<dependency>
67+
<groupId>jakarta.validation</groupId>
68+
<artifactId>jakarta.validation-api</artifactId>
69+
</dependency>
6670
<dependency>
6771
<groupId>org.springframework.boot</groupId>
68-
<artifactId>spring-boot-starter-test</artifactId>
69-
<scope>test</scope>
72+
<artifactId>spring-boot-starter-jdbc</artifactId>
7073
</dependency>
7174
<dependency>
72-
<groupId>org.projectlombok</groupId>
73-
<artifactId>lombok</artifactId>
74-
<scope>provided</scope>
75+
<groupId>org.postgresql</groupId>
76+
<artifactId>postgresql</artifactId>
77+
<scope>runtime</scope>
78+
</dependency>
79+
<dependency>
80+
<groupId>org.liquibase</groupId>
81+
<artifactId>liquibase-core</artifactId>
82+
</dependency>
83+
<dependency>
84+
<groupId>com.h2database</groupId>
85+
<artifactId>h2</artifactId>
86+
<scope>runtime</scope>
7587
</dependency>
7688
</dependencies>
7789

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package ivan.solscanbot.bot;
2+
3+
import ivan.solscanbot.exception.AddressAlreadyExistsException;
4+
import ivan.solscanbot.exception.AddressNotMonitoredException;
5+
import ivan.solscanbot.exception.ExceedsAmountOfAddressesException;
6+
import ivan.solscanbot.exception.InvalidAddressException;
7+
import ivan.solscanbot.exception.UserNotHaveAnyMonitoredAddressesException;
8+
import ivan.solscanbot.service.TelegramService;
9+
import org.springframework.beans.factory.annotation.Value;
10+
import org.springframework.stereotype.Component;
11+
import org.telegram.telegrambots.bots.TelegramLongPollingBot;
12+
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
13+
import org.telegram.telegrambots.meta.api.objects.Update;
14+
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
15+
16+
@Component
17+
public class TelegramBot extends TelegramLongPollingBot {
18+
private final String token;
19+
private final String username;
20+
private final TelegramService telegramService;
21+
22+
public TelegramBot(
23+
@Value("${telegram.bot.token}") String token,
24+
@Value("${telegram.bot.username}") String username,
25+
TelegramService telegramService
26+
) {
27+
this.token = token;
28+
this.username = username;
29+
this.telegramService = telegramService;
30+
}
31+
32+
@Override
33+
public String getBotUsername() {
34+
return username;
35+
}
36+
37+
@Override
38+
public String getBotToken() {
39+
return token;
40+
}
41+
42+
@Override
43+
public void onUpdateReceived(Update update) {
44+
if (update.hasMessage() && update.getMessage().hasText()) {
45+
String messageText = update.getMessage().getText();
46+
long chatId = update.getMessage().getChatId();
47+
48+
if (messageText.startsWith("/help")) {
49+
handleHelp(chatId);
50+
} else if (messageText.startsWith("/add")) {
51+
handleAddAddresses(chatId, messageText);
52+
} else if (messageText.startsWith("/list")) {
53+
handleListAddresses(chatId);
54+
} else if (messageText.startsWith("/remove")) {
55+
handleRemoveAddress(chatId, messageText);
56+
} else if (messageText.startsWith("/portfolio")) {
57+
handleGetPortfolios(chatId, messageText);
58+
} else {
59+
sendMessage(
60+
chatId, "Unknown command. Use /help to get clarifications");
61+
}
62+
}
63+
}
64+
65+
public void sendNotification(long chatId, String notification) {
66+
sendMessage(chatId, notification);
67+
}
68+
69+
private void handleHelp(long chatId) {
70+
String message = telegramService.getHelp();
71+
sendMessage(chatId, message);
72+
}
73+
74+
private void handleGetPortfolios(long chatId, String messageText) {
75+
try {
76+
String message = telegramService.getPortfolios(chatId, messageText);
77+
sendMessage(chatId, message);
78+
} catch (InvalidAddressException | AddressNotMonitoredException
79+
| ExceedsAmountOfAddressesException e) {
80+
sendMessage(chatId, e.getMessage());
81+
}
82+
}
83+
84+
private void handleAddAddresses(long chatId, String messageText) {
85+
try {
86+
String message = telegramService.addAddresses(chatId, messageText);
87+
sendMessage(chatId, message);
88+
} catch (InvalidAddressException | AddressAlreadyExistsException
89+
| ExceedsAmountOfAddressesException e) {
90+
sendMessage(chatId, e.getMessage());
91+
}
92+
}
93+
94+
private void handleListAddresses(long chatId) {
95+
try {
96+
String message = telegramService.listAddresses(chatId);
97+
sendMessage(chatId, message);
98+
} catch (UserNotHaveAnyMonitoredAddressesException e) {
99+
sendMessage(chatId, e.getMessage());
100+
}
101+
}
102+
103+
private void handleRemoveAddress(long chatId, String messageText) {
104+
try {
105+
String message = telegramService.removeAddresses(chatId, messageText);
106+
sendMessage(chatId, message);
107+
} catch (InvalidAddressException | AddressNotMonitoredException
108+
| ExceedsAmountOfAddressesException e) {
109+
sendMessage(chatId, e.getMessage());
110+
}
111+
}
112+
113+
private void sendMessage(long chatId, String text) {
114+
SendMessage message = new SendMessage();
115+
message.setChatId(String.valueOf(chatId));
116+
message.setText(text);
117+
message.enableMarkdown(true);
118+
message.disableWebPagePreview();
119+
try {
120+
execute(message);
121+
} catch (TelegramApiException e) {
122+
throw new RuntimeException("Error while sending a message.", e);
123+
}
124+
}
125+
}

src/main/java/ivan/solscanbot/config/MapperConfig.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@
77
componentModel = "spring",
88
injectionStrategy = InjectionStrategy.CONSTRUCTOR,
99
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS,
10-
implementationPackage = "<PACKAGE_NAME>.impl"
11-
)public class MapperConfig {
10+
implementationPackage = "<PACKAGE_NAME>.impl")
11+
public class MapperConfig {
1212
}

src/main/java/ivan/solscanbot/config/TelegramBotConfig.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package ivan.solscanbot.config;
22

3-
import ivan.solscanbot.service.DeFiMonitorBot;
3+
import ivan.solscanbot.bot.TelegramBot;
44
import org.springframework.context.annotation.Bean;
55
import org.springframework.context.annotation.Configuration;
66
import org.telegram.telegrambots.meta.TelegramBotsApi;
@@ -10,7 +10,7 @@
1010
@Configuration
1111
public class TelegramBotConfig {
1212
@Bean
13-
public TelegramBotsApi telegramBotsApi(DeFiMonitorBot bot) throws TelegramApiException {
13+
public TelegramBotsApi telegramBotsApi(TelegramBot bot) throws TelegramApiException {
1414
TelegramBotsApi botsApi = new TelegramBotsApi(DefaultBotSession.class);
1515
botsApi.registerBot(bot);
1616
return botsApi;

src/main/java/ivan/solscanbot/dto/external/TokenMetaResponseDto.java

Lines changed: 0 additions & 9 deletions
This file was deleted.

src/main/java/ivan/solscanbot/dto/external/BalanceActivitiesResponseDto.java renamed to src/main/java/ivan/solscanbot/dto/external/activity/BalanceActivitiesResponseDto.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package ivan.solscanbot.dto.external;
1+
package ivan.solscanbot.dto.external.activity;
22

33
import com.fasterxml.jackson.annotation.JsonProperty;
44
import java.util.Set;

0 commit comments

Comments
 (0)