FreelanceBot
171 строка · 6.0 Кб
1package telegramBot.service;
2
3import org.springframework.stereotype.Service;
4import org.telegram.telegrambots.bots.TelegramLongPollingBot;
5import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
6import org.telegram.telegrambots.meta.api.objects.Update;
7import telegramBot.dto.OrderDto;
8import telegramBot.bot.TelegramBot;
9import org.springframework.context.annotation.Lazy;
10import org.springframework.stereotype.Component;
11import telegramBot.entity.Order;
12import telegramBot.enums.Exchange;
13import telegramBot.enums.Language;
14import telegramBot.repository.OrderRepository;
15import telegramBot.util.BotUtil;
16import telegramBot.util.OrderUtil;
17
18import java.util.*;
19import java.util.stream.Collectors;
20
21
22@Service
23public class MessageService {
24
25private final TelegramBot bot;
26
27public MessageService(@Lazy TelegramBot bot){
28this.bot = bot;
29}
30
31public void sendResponse(String userChatId, String message) {
32executeMessage(userChatId, message);
33}
34
35public void sendNotice(String userChatId, List<OrderDto> dtos) {
36executeMessage(userChatId, createNotices(dtos));
37}
38
39
40private String createNotices(List<OrderDto> orderDtos) {
41StringBuilder notice = new StringBuilder();
42Map<Exchange, List<OrderDto>> exchangesDtos = sortByExchange(orderDtos);
43List<StringBuilder> notices = new ArrayList<>();
44StringBuilder output = new StringBuilder();
45for(Exchange exchange : Exchange.getExchanges()){
46if(!exchangesDtos.containsKey(exchange)){ continue; }
47List<OrderDto> eDtos = exchangesDtos.get(exchange);
48String title = "Новые заказы на " + exchange.getName() + ":";
49notice.append(title).append("\n");
50Map<Language, List<OrderDto>> languagesDtos = sortByLanguage(eDtos);
51for(Language language : Language.getLanguages()){
52if(!languagesDtos.containsKey(language)){ continue; }
53List<OrderDto> lDtos = languagesDtos.get(language);
54String subscription = "По запросу " + language.getName() + ":";
55notice.append("\n").append(subscription).append("\n").append(delim());
56for(OrderDto orderDto : lDtos){
57String orderInfo = orderDto.getOrderInfo();
58notice.append("\n")
59.append(orderInfo)
60.append("\n")
61.append(delim())
62.append("\n");
63}
64}
65}
66notices.add(notice);
67
68for(StringBuilder n : notices){
69output.append(n).append("\n");
70}
71
72return output.toString();
73
74}
75
76private Map<Exchange, List<OrderDto>> sortByExchange(List<OrderDto> orderDtos){
77Map<Exchange, List<OrderDto>> result = new HashMap<>();
78for(Exchange e : Exchange.getExchanges()){
79List<OrderDto> dtos = orderDtos.stream()
80.filter((o) -> o.getExchangeName().equals(e.getName()))
81.collect(Collectors.toList());
82
83if(!dtos.isEmpty()) {
84result.put(e, dtos);
85}
86}
87
88return result;
89}
90
91private Map<Language, List<OrderDto>> sortByLanguage(List<OrderDto> orderDtos){
92Map<Language, List<OrderDto>> result = new HashMap<>();
93for(Language l : Language.getLanguages()){
94List<OrderDto> dtos = orderDtos.stream()
95.filter((o) -> o.getSubscription().equals(l.getName()))
96.collect(Collectors.toList());
97
98if(!dtos.isEmpty()) {
99result.put(l, dtos);
100}
101}
102return result;
103}
104
105
106public static String delim() {
107return ".".repeat(70);
108}
109
110private String trimImgTag(String message){
111return message.replaceAll("(<img>)", "");
112}
113
114private SendMessage buildMessage(String chatId, String content){
115org.telegram.telegrambots.meta.api.methods.send.SendMessage sendMessage =
116new org.telegram.telegrambots.meta.api.methods.send.SendMessage();
117sendMessage.setChatId(chatId);
118sendMessage.enableHtml(true);
119sendMessage.setText(trimImgTag(content));
120sendMessage.disableWebPagePreview();
121return sendMessage;
122}
123
124
125private void executeMessage(String userChatId, String message){
126try {
127bot.execute(buildMessage(userChatId, message));
128} catch (Exception e) {
129System.out.println(e.getCause().getMessage());
130}
131}
132
133public String getLatestOrdersMessage(Update update, OrderService service) {
134String input = update.getMessage().getText().
135replaceAll("\\s", "");
136String[] items = extractItems(input);
137Language language = Language.ignoreCaseValueOf(items[0]);
138int count = Integer.parseInt(items[1]);
139List<Order> orders = service.getAllByLanguage(language);
140List<OrderDto> dtos = OrderUtil.toDtos(orders).subList(0,
141getEndIndex(orders.size(), count));
142assert language != null;
143return createMessage(language, dtos);
144}
145
146private String createMessage(Language language, List<OrderDto> dtos){
147StringBuilder sb = new StringBuilder("Последние заказы по запросу " +
148language.getName() + ":\n" );
149dtos.forEach(o -> {
150sb.append(o.getOrderInfo()).append(" (").
151append(o.getExchangeName()).
152append(")").append("\n\n");
153});
154
155return sb.toString();
156}
157
158private int getEndIndex(int collectionSize, int count){
159return Math.min(collectionSize, count);
160}
161
162private String[] extractItems(String input){
163String[] items = input.split(",");
164String language = items[0];
165String count = (items[1].
166matches("\\d+") &&
167!items[1].equals("0")) ? items[1] : "1" ;
168return new String[]{language, count};
169}
170
171}
172