Skip to content

Commit bd4d1ef

Browse files
committed
added opportunity to select period for invest plot
1 parent 49434e7 commit bd4d1ef

12 files changed

+224
-21
lines changed

src/main/java/org/example/project/configuration/BotKeyboardConfig.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public ReplyKeyboardMarkup mainMenuKeyboard() {
2626

2727
KeyboardRow row3 = new KeyboardRow();
2828
row3.add(new KeyboardButton("/leetcode"));
29-
row3.add(new KeyboardButton("/investplot"));
29+
row3.add(new KeyboardButton("/invest"));
3030

3131
keyboard.add(row1);
3232
keyboard.add(row2);
@@ -152,4 +152,40 @@ public ReplyKeyboardMarkup difficultyMenuKeyboard() {
152152

153153
return keyboardMarkup;
154154
}
155+
156+
@Bean
157+
public ReplyKeyboardMarkup investMenuKeyboard() {
158+
ReplyKeyboardMarkup keyboardMarkup = new ReplyKeyboardMarkup();
159+
List<KeyboardRow> keyboard = new ArrayList<>();
160+
161+
KeyboardRow row1 = new KeyboardRow();
162+
row1.add(new KeyboardButton("15min"));
163+
row1.add(new KeyboardButton("30min"));
164+
row1.add(new KeyboardButton("1h"));
165+
166+
KeyboardRow row2 = new KeyboardRow();
167+
row2.add(new KeyboardButton("3h"));
168+
row2.add(new KeyboardButton("6h"));
169+
row2.add(new KeyboardButton("12h"));
170+
171+
KeyboardRow row3 = new KeyboardRow();
172+
row3.add(new KeyboardButton("day"));
173+
row3.add(new KeyboardButton("week"));
174+
row3.add(new KeyboardButton("month"));
175+
176+
KeyboardRow row4 = new KeyboardRow();
177+
row4.add(new KeyboardButton("year"));
178+
row4.add(new KeyboardButton("/back"));
179+
180+
keyboard.add(row1);
181+
keyboard.add(row2);
182+
keyboard.add(row3);
183+
keyboard.add(row4);
184+
185+
keyboardMarkup.setKeyboard(keyboard);
186+
keyboardMarkup.setResizeKeyboard(true);
187+
keyboardMarkup.setOneTimeKeyboard(true);
188+
189+
return keyboardMarkup;
190+
}
155191
}

src/main/java/org/example/project/service/LeetcodeService.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
import org.example.project.data.leetcode.Question;
1010
import org.springframework.stereotype.Service;
1111

12+
import java.io.IOException;
1213
import java.net.URI;
14+
import java.net.URISyntaxException;
1315
import java.net.http.HttpClient;
1416
import java.net.http.HttpRequest;
1517
import java.net.http.HttpResponse;
@@ -19,16 +21,16 @@
1921
@Service
2022
public class LeetcodeService {
2123

22-
public String getProblemWithTagAndDifficulty(String difficulty, String userTag) {
23-
var problems = getProblemsWithTagAndDifficulty(difficulty, userTag);
24-
if (problems == null)
25-
return "Sorry, command did not performed";
24+
public String getProblemWithTagAndDifficulty(String difficulty, String userTag) throws URISyntaxException, IOException, InterruptedException {
25+
List<Problem> problems = getProblemsWithTagAndDifficulty(difficulty, userTag);
26+
if (problems.isEmpty())
27+
throw new IOException();
2628
int randomNumber = new Random().nextInt(problems.size());
2729
var randomProblem = problems.get(randomNumber);
2830
return "Title: " + randomProblem.title + "\nLink: https://leetcode.com/problems/" + randomProblem.titleSlug;
2931
}
3032

31-
private List<Problem> getProblemsWithTagAndDifficulty(String difficulty, String userTag) {
33+
private List<Problem> getProblemsWithTagAndDifficulty(String difficulty, String userTag) throws URISyntaxException, IOException, InterruptedException {
3234
try {
3335
HttpClient client = HttpClient.newHttpClient();
3436
HttpRequest request = HttpRequest.newBuilder()
@@ -50,7 +52,7 @@ private List<Problem> getProblemsWithTagAndDifficulty(String difficulty, String
5052
return problems;
5153
} catch (Exception e) {
5254
log.error("Exception: {}", e.getMessage());
53-
return null;
55+
throw e;
5456
}
5557
}
5658

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.example.project.service.command.invest;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.example.project.service.TelegramMessageSender;
5+
import org.example.project.service.UserSessionService;
6+
import org.example.project.service.command.CommandHandler;
7+
import org.example.project.service.state.DialogMode;
8+
import org.springframework.stereotype.Component;
9+
import org.telegram.telegrambots.meta.api.objects.Update;
10+
import org.telegram.telegrambots.meta.api.objects.replykeyboard.ReplyKeyboardMarkup;
11+
12+
@Component
13+
@RequiredArgsConstructor
14+
public class BackCommandHandlerInvest implements InvestCommandHandler, CommandHandler {
15+
16+
private final TelegramMessageSender messageSender;
17+
private final UserSessionService userSessionService;
18+
private final ReplyKeyboardMarkup mainMenuKeyboard;
19+
20+
@Override
21+
public void handleCommand(long chatId, Update update) {
22+
messageSender.sendMessageWithKeyboard(chatId, "You returned to main state", mainMenuKeyboard);
23+
userSessionService.setDialogMode(chatId, DialogMode.MAIN);
24+
}
25+
26+
@Override
27+
public boolean canHandle(String command) {
28+
return command.equals("/back");
29+
}
30+
}
31+
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package org.example.project.service.command.invest;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.example.project.service.StoncksPlotService;
5+
import org.example.project.service.TelegramMessageSender;
6+
import org.example.project.service.command.CommandHandler;
7+
import org.springframework.stereotype.Component;
8+
import org.telegram.telegrambots.meta.api.objects.Update;
9+
import org.telegram.telegrambots.meta.api.objects.replykeyboard.ReplyKeyboardMarkup;
10+
11+
import java.util.HashSet;
12+
import java.util.Set;
13+
14+
@Component
15+
@RequiredArgsConstructor
16+
public class GotPeriodHandler implements InvestCommandHandler, CommandHandler {
17+
private final TelegramMessageSender messageSender;
18+
private final StoncksPlotService stoncksPlotService;
19+
private final ReplyKeyboardMarkup investMenuKeyboard;
20+
21+
@Override
22+
public void handleCommand(long chatId, Update update) {
23+
String plot = stoncksPlotService.getPlotImage(update.getMessage().getText());
24+
messageSender.sendPlotToUserWithKeyboard(chatId, plot, investMenuKeyboard);
25+
}
26+
27+
@Override
28+
public boolean canHandle(String command) {
29+
Set<String> set = new HashSet<>();
30+
set.add("15min");
31+
set.add("30min");
32+
set.add("1h");
33+
set.add("3h");
34+
set.add("6h");
35+
set.add("12h");
36+
set.add("day");
37+
set.add("week");
38+
set.add("month");
39+
set.add("year");
40+
return set.contains(command);
41+
}
42+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.example.project.service.command.invest;
2+
3+
public interface InvestCommandHandler {
4+
boolean canHandle(String command);
5+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.example.project.service.command.invest;
2+
3+
import jakarta.annotation.PostConstruct;
4+
import lombok.RequiredArgsConstructor;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.example.project.service.command.CommandHandler;
7+
import org.example.project.service.command.WrongMessageHandler;
8+
import org.springframework.stereotype.Component;
9+
10+
import java.util.List;
11+
import java.util.stream.Collectors;
12+
13+
@Slf4j
14+
@Component
15+
@RequiredArgsConstructor
16+
public class InvestCommandHandlerFactory {
17+
private final List<InvestCommandHandler> handlers;
18+
private final WrongMessageHandler wrongHandler;
19+
20+
public CommandHandler getHandler(String command) {
21+
for (var handler: handlers)
22+
if (handler.canHandle(command))
23+
return (CommandHandler) handler;
24+
return wrongHandler;
25+
}
26+
27+
@PostConstruct
28+
public void init() {
29+
log.info("Registered handlers: {}",
30+
handlers.stream()
31+
.map(h -> h.getClass().getSimpleName())
32+
.collect(Collectors.joining(", ")));
33+
}
34+
}

src/main/java/org/example/project/service/command/leetcode/BackCommandHandler.java renamed to src/main/java/org/example/project/service/command/leetcode/BackCommandHandlerLeetcode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
@Component
1313
@RequiredArgsConstructor
14-
public class BackCommandHandler implements LeetcodeCommandHandler, CommandHandler {
14+
public class BackCommandHandlerLeetcode implements LeetcodeCommandHandler, CommandHandler {
1515

1616
private final TelegramMessageSender messageSender;
1717
private final UserSessionService userSessionService;

src/main/java/org/example/project/service/command/leetcode/GotTagHandler.java

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@
44
import org.example.project.service.LeetcodeService;
55
import org.example.project.service.TelegramMessageSender;
66
import org.example.project.service.command.CommandHandler;
7+
import org.example.project.service.job.LeetcodeTags;
78
import org.springframework.stereotype.Component;
89
import org.telegram.telegrambots.meta.api.objects.Update;
910
import org.telegram.telegrambots.meta.api.objects.replykeyboard.ReplyKeyboardMarkup;
1011

12+
import java.io.IOException;
13+
import java.net.URISyntaxException;
14+
1115
@Component
1216
@RequiredArgsConstructor
1317
public class GotTagHandler implements CommandHandler, LeetcodeCommandHandler{
@@ -18,12 +22,33 @@ public class GotTagHandler implements CommandHandler, LeetcodeCommandHandler{
1822

1923
@Override
2024
public void handleCommand(long chatId, Update update) {
21-
LeetcodeCommandHandlerFactory.setTag(update.getMessage().getText());
22-
String link = leetcodeService.getProblemWithTagAndDifficulty(
23-
LeetcodeCommandHandlerFactory.getDifficulty(),
24-
LeetcodeCommandHandlerFactory.getTag()
25+
String tag = update.getMessage().getText();
26+
if (!LeetcodeTags.getTags().contains(tag)) {
27+
messageSender.sendPlotToUserWithKeyboard(
28+
chatId,
29+
"Sorry, you sent wrong tag",
30+
leetcodeMenuKeyboard
31+
);
32+
return;
33+
}
34+
String link = "";
35+
try {
36+
link = leetcodeService.getProblemWithTagAndDifficulty(
37+
LeetcodeCommandHandlerFactory.getDifficulty(),
38+
tag
39+
);
40+
} catch (URISyntaxException | IOException | InterruptedException e) {
41+
messageSender.sendMessageWithKeyboard(
42+
chatId,
43+
"Internal server error!",
44+
leetcodeMenuKeyboard
45+
);
46+
}
47+
messageSender.sendMessageWithKeyboard(
48+
chatId,
49+
"Here is your task:\n" + link,
50+
leetcodeMenuKeyboard
2551
);
26-
messageSender.sendMessageWithKeyboard(chatId,"Here is your task:\n" + link, leetcodeMenuKeyboard);
2752
}
2853

2954
@Override

src/main/java/org/example/project/service/command/main/InvestPlotHandler.java renamed to src/main/java/org/example/project/service/command/main/SwitchToInvestPlotHandler.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,30 @@
22

33
import lombok.RequiredArgsConstructor;
44
import lombok.extern.slf4j.Slf4j;
5-
import org.example.project.service.StoncksPlotService;
65
import org.example.project.service.TelegramMessageSender;
6+
import org.example.project.service.UserSessionService;
77
import org.example.project.service.command.CommandHandler;
8+
import org.example.project.service.state.DialogMode;
89
import org.springframework.stereotype.Component;
910
import org.telegram.telegrambots.meta.api.objects.Update;
1011
import org.telegram.telegrambots.meta.api.objects.replykeyboard.ReplyKeyboardMarkup;
1112

1213
@Slf4j
1314
@Component
1415
@RequiredArgsConstructor
15-
public class InvestPlotHandler implements MainCommandHandler, CommandHandler {
16-
private final ReplyKeyboardMarkup mainMenuKeyboard;
16+
public class SwitchToInvestPlotHandler implements MainCommandHandler, CommandHandler {
17+
private final ReplyKeyboardMarkup investMenuKeyboard;
1718
private final TelegramMessageSender messageSender;
18-
private final StoncksPlotService stoncksPlotService;
19+
private final UserSessionService userSessionService;
1920

2021
@Override
2122
public boolean canHandle(String command) {
22-
return command.equals("/investplot");
23+
return command.equals("/invest");
2324
}
2425

2526
@Override
2627
public void handleCommand(long chatId, Update update) {
27-
String plot = stoncksPlotService.getPlotImage("week");
28-
messageSender.sendPlotToUserWithKeyboard(chatId, plot, mainMenuKeyboard);
28+
messageSender.sendMessageWithKeyboard(chatId, "Choose period", investMenuKeyboard);
29+
userSessionService.setDialogMode(chatId, DialogMode.INVEST);
2930
}
3031
}

src/main/java/org/example/project/service/state/DialogMode.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ public enum DialogMode {
44
MAIN,
55
NOTE,
66
GPT,
7-
LEETCODE
7+
LEETCODE,
8+
INVEST
89
}

0 commit comments

Comments
 (0)