Skip to content

Commit 1486cfc

Browse files
authored
Merge pull request #83 from JavaZenTeam/feature/help
Implement help for the IgorBot.
2 parents 3a109bc + 9fe6597 commit 1486cfc

11 files changed

Lines changed: 320 additions & 0 deletions

File tree

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,12 @@
116116
<artifactId>commons-lang3</artifactId>
117117
</dependency>
118118

119+
<dependency>
120+
<groupId>org.yaml</groupId>
121+
<artifactId>snakeyaml</artifactId>
122+
<version>1.23</version>
123+
</dependency>
124+
119125
<dependency>
120126
<groupId>org.projectlombok</groupId>
121127
<artifactId>lombok</artifactId>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package ru.javazen.telegram.bot.filter;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.telegram.telegrambots.meta.api.objects.Update;
5+
6+
@RequiredArgsConstructor
7+
public class CallbackQueryFilter implements Filter {
8+
9+
private final String callbackPrefix;
10+
11+
@Override
12+
public boolean check(Update update) {
13+
return update.hasCallbackQuery() && update.getCallbackQuery().getData().startsWith(callbackPrefix);
14+
}
15+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package ru.javazen.telegram.bot.handler.base;
2+
3+
import org.telegram.telegrambots.meta.api.objects.CallbackQuery;
4+
import org.telegram.telegrambots.meta.api.objects.Update;
5+
import org.telegram.telegrambots.meta.bots.AbsSender;
6+
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
7+
8+
public interface CallbackQueryHandler extends UpdateHandler {
9+
10+
@Override
11+
default boolean handle(Update update, AbsSender sender) throws TelegramApiException {
12+
return update.hasCallbackQuery() && handle(update.getCallbackQuery(), sender);
13+
}
14+
15+
boolean handle(CallbackQuery callbackQuery, AbsSender sender) throws TelegramApiException;
16+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package ru.javazen.telegram.bot.help;
2+
3+
import lombok.Data;
4+
5+
import java.util.List;
6+
7+
@Data
8+
public class Help {
9+
10+
private String welcome;
11+
private List<Feature> features;
12+
13+
@Data
14+
public static class Feature {
15+
16+
private String title;
17+
private String description;
18+
private String details;
19+
}
20+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package ru.javazen.telegram.bot.help;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.telegram.telegrambots.meta.api.methods.updatingmessages.EditMessageText;
5+
import org.telegram.telegrambots.meta.api.objects.CallbackQuery;
6+
import org.telegram.telegrambots.meta.bots.AbsSender;
7+
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
8+
import ru.javazen.telegram.bot.handler.base.CallbackQueryHandler;
9+
import ru.javazen.telegram.bot.util.MessageData;
10+
11+
@RequiredArgsConstructor
12+
public class HelpFeatureCallbackHandler implements CallbackQueryHandler {
13+
14+
private final HelpInfoProvider helpInfoProvider;
15+
private final String callbackPrefix;
16+
17+
@Override
18+
public boolean handle(CallbackQuery callbackQuery, AbsSender sender) throws TelegramApiException {
19+
20+
String featureName = callbackQuery.getData().substring(callbackPrefix.length());
21+
22+
MessageData messageData = helpInfoProvider.getFeatureInformation(featureName);
23+
if (messageData != null) {
24+
EditMessageText editedMessage = new EditMessageText()
25+
.setParseMode("MARKDOWN")
26+
.setChatId(callbackQuery.getMessage().getChatId())
27+
.setMessageId(callbackQuery.getMessage().getMessageId())
28+
.setText(messageData.getMessageText())
29+
.setReplyMarkup(messageData.getInlineKeyboardMarkup());
30+
31+
sender.execute(editedMessage);
32+
return true;
33+
}
34+
return false;
35+
}
36+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package ru.javazen.telegram.bot.help;
2+
3+
import org.springframework.stereotype.Component;
4+
import org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMarkup;
5+
import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.InlineKeyboardButton;
6+
import org.yaml.snakeyaml.Yaml;
7+
import ru.javazen.telegram.bot.util.MessageData;
8+
9+
import javax.annotation.PostConstruct;
10+
import java.io.IOException;
11+
import java.io.InputStream;
12+
import java.util.ArrayList;
13+
import java.util.Collections;
14+
import java.util.List;
15+
16+
@Component
17+
public class HelpInfoProvider {
18+
19+
private static final String HELP_FILE = "help/help.yml";
20+
21+
private Help help;
22+
23+
public MessageData getHelpMessage() {
24+
StringBuilder responseText = new StringBuilder(help.getWelcome());
25+
responseText.append("\n");
26+
27+
List<List<InlineKeyboardButton>> buttonsLines = new ArrayList<>();
28+
List<InlineKeyboardButton> buttons = new ArrayList<>();
29+
30+
for (Help.Feature feature : help.getFeatures()) {
31+
responseText.append(" *").append(feature.getTitle()).append("*")
32+
.append(" - ").append(feature.getDescription()).append("\n");
33+
34+
InlineKeyboardButton button = new InlineKeyboardButton();
35+
button.setText(feature.getTitle());
36+
button.setCallbackData("help:feature:" + feature.getTitle());
37+
buttons.add(button);
38+
if (buttons.size() >= 3) {
39+
buttonsLines.add(buttons);
40+
buttons = new ArrayList<>();
41+
}
42+
}
43+
if (buttons.size() > 0) {
44+
buttonsLines.add(buttons);
45+
}
46+
47+
48+
InlineKeyboardMarkup inlineKeyboard = new InlineKeyboardMarkup();
49+
inlineKeyboard.setKeyboard(buttonsLines);
50+
51+
return new MessageData(responseText.toString(), inlineKeyboard);
52+
}
53+
54+
public MessageData getFeatureInformation(String featureName) {
55+
for (Help.Feature feature : help.getFeatures()) {
56+
if (feature.getTitle().equals(featureName)) {
57+
String text = "`" + feature.getTitle() + "` - " + feature.getDescription();
58+
text += "\n";
59+
text += "\n";
60+
text += feature.getDetails();
61+
62+
InlineKeyboardMarkup inlineKeyboard = new InlineKeyboardMarkup();
63+
InlineKeyboardButton button = new InlineKeyboardButton();
64+
button.setText("<< Вернуться к списку");
65+
button.setCallbackData("help:list");
66+
inlineKeyboard.setKeyboard(Collections.singletonList(Collections.singletonList(button)));
67+
68+
return new MessageData(text, inlineKeyboard);
69+
}
70+
}
71+
return null;
72+
}
73+
74+
@PostConstruct
75+
protected void loadHelp() throws IOException {
76+
Yaml yaml = new Yaml();
77+
78+
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
79+
try (InputStream in = classloader.getResourceAsStream(HELP_FILE)) {
80+
help = yaml.loadAs(in, Help.class);
81+
82+
}
83+
}
84+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package ru.javazen.telegram.bot.help;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.springframework.stereotype.Component;
5+
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
6+
import org.telegram.telegrambots.meta.api.objects.Message;
7+
import org.telegram.telegrambots.meta.bots.AbsSender;
8+
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
9+
import ru.javazen.telegram.bot.handler.base.MessageHandler;
10+
import ru.javazen.telegram.bot.util.MessageData;
11+
12+
@RequiredArgsConstructor
13+
@Component("helpMainPostCommandHandler")
14+
public class HelpMainPostCommandHandler implements MessageHandler {
15+
16+
private final HelpInfoProvider helpInfoProvider;
17+
18+
@Override
19+
public boolean handle(Message message, AbsSender sender) throws TelegramApiException {
20+
MessageData helpMessage = helpInfoProvider.getHelpMessage();
21+
22+
SendMessage response = new SendMessage(message.getChatId(),
23+
helpMessage.getMessageText()).setParseMode("MARKDOWN");
24+
response.setReplyMarkup(helpMessage.getInlineKeyboardMarkup());
25+
26+
sender.execute(response);
27+
28+
return true;
29+
}
30+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package ru.javazen.telegram.bot.help;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.springframework.stereotype.Component;
5+
import org.telegram.telegrambots.meta.api.methods.updatingmessages.EditMessageText;
6+
import org.telegram.telegrambots.meta.api.objects.CallbackQuery;
7+
import org.telegram.telegrambots.meta.bots.AbsSender;
8+
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
9+
import ru.javazen.telegram.bot.handler.base.CallbackQueryHandler;
10+
import ru.javazen.telegram.bot.util.MessageData;
11+
12+
@RequiredArgsConstructor
13+
@Component("helpMainPostQueryHandler")
14+
public class HelpMainPostQueryHandler implements CallbackQueryHandler {
15+
16+
private final HelpInfoProvider helpInfoProvider;
17+
18+
@Override
19+
public boolean handle(CallbackQuery callbackQuery, AbsSender sender) throws TelegramApiException {
20+
21+
MessageData helpMessage = helpInfoProvider.getHelpMessage();
22+
23+
EditMessageText editedMessage = new EditMessageText()
24+
.setParseMode("MARKDOWN")
25+
.setChatId(callbackQuery.getMessage().getChatId())
26+
.setMessageId(callbackQuery.getMessage().getMessageId())
27+
.setText(helpMessage.getMessageText())
28+
.setReplyMarkup(helpMessage.getInlineKeyboardMarkup());
29+
30+
sender.execute(editedMessage);
31+
return true;
32+
}
33+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package ru.javazen.telegram.bot.util;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
import org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMarkup;
7+
8+
@Data
9+
@NoArgsConstructor
10+
@AllArgsConstructor
11+
public class MessageData {
12+
private String messageText;
13+
private InlineKeyboardMarkup inlineKeyboardMarkup;
14+
}

src/main/resources/help/help.yml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
welcome: "Привет! Я Игорь. Я много всего умею, вот кое-что:"
2+
features:
3+
- title: Task Scheduler
4+
description: Планируйте прямо в чате
5+
details: "Я напомню тебе о всём, о чём ты попросишь! Примеры использования:\n
6+
- `Игорь, скажи через 3 часа 15 минут забери посылку`\n
7+
- `Игорь, скажи в 07:00 возьми еду из холодильника`\n
8+
- `Игорь, скажи 11.11.2019 в 14:00 поздравь Егора с днем рождения`\n
9+
\n
10+
Если ваша таймзона отличается от +4, то вы можете изменить её, написав `таймзона +3`, указав актуальную для себя."
11+
- title: Chat Stats
12+
description: Различная статистика для чата
13+
details: "Для просмотра выполните /chat\\_stats\n\n
14+
- В групповом чате вы сможете получить статистику собранную Игорем за время его время нахождения в чате.\n
15+
- В личном чате с Игорем, выполнив эту команду, вы получите личную статистику по всем вашим совместным чатам с Игорем."
16+
- title: Dolbo.b Mode
17+
description: Плохие шутки
18+
details: "Если вы любите шутки за 300, то это для вас\n
19+
/dolboeb\\_mode\\_on - включить\n
20+
/dolboeb\\_mode\\_off - передумать\n"
21+
- title: Info
22+
description: Получение технической информации
23+
details: "Если вам необходимо получить техническую информацию телеграма о каком-либо сообщении,
24+
то отправьте команду /info в ответ на необходимое сообщение. Можно отправить и отдельно, тогда получите информацию о вашем сообщении.\n\n
25+
Если вам нужна информация о чем-то конкретном, то вы можете указать путь к полю в json, к примеру, `/info from`. В этом примере вы получите только информацию об отправителе."
26+
- title: Subscriptions
27+
description: Подписка на сообщения
28+
details: "Если вы хотите, чтобы Игорь отвечал на сообщения содержащие определенные фразы, то попросите об этом Игоря: \n
29+
- `Игорь, когда скоро банька говори возьмите запасные трусы` - если в чате встретится фраза 'скоро банька', то Игорь напомнит вам взять запасные трусы\n
30+
- `Игорь, когда я пошел в магазин говори купи молока` - в этом случае Игорь напомнит ТОЛЬКО вам, если вы напишите 'пошел в магазин'"

0 commit comments

Comments
 (0)