Conversation with Merlin [email protected] · Mon Nov 06 2023

package com.example.telegrambot.service;

import com.vdurmont.emoji.EmojiParser;

import java.io.File; import org.telegram.telegrambots.meta.api.objects.InputFile; import java.sql.*; import java.util.Date; import com.example.telegrambot.config.BotConfig; import com.example.telegrambot.model.User; import com.example.telegrambot.model.UserRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.telegram.telegrambots.bots.TelegramLongPollingBot; import org.telegram.telegrambots.meta.api.methods.commands.SetMyCommands; import org.telegram.telegrambots.meta.api.methods.send.SendDocument; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.methods.updatingmessages.EditMessageText; import org.telegram.telegrambots.meta.api.objects.Message; import org.telegram.telegrambots.meta.api.objects.Update; import org.telegram.telegrambots.meta.api.objects.commands.BotCommand; import org.telegram.telegrambots.meta.api.objects.commands.scope.BotCommandScopeDefault; import org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMarkup; import org.telegram.telegrambots.meta.api.objects.replykeyboard.ReplyKeyboardMarkup; import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.InlineKeyboardButton; import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardRow; import org.telegram.telegrambots.meta.exceptions.TelegramApiException;

import java.util.ArrayList; import java.util.List;

@Slf4j @Component public class TelegramBot extends TelegramLongPollingBot {

private UserRepository userRepository; @Autowired public void YourClassName(UserRepository userRepository) { this.userRepository = userRepository; } final BotConfig config; static final String HELP_TEXT = """ Здравствуй 👋 Я чат-бот Вогу Я помогу тебe: Получить ответы на интересующие вопросы по практике 👍 Получить необходимы документы для прохождения практики 📄 Связать с руководителем по практической подготовке 👨🏻‍💼 Нажми /start для начала работы с ботом. Нажми /Часто задаваемые вопросы для получения списка часто задаваемых вопросов по пратике и ответов на них. Нажми Получить документы для выбора необходмиого документа. """; static final String MEMO = "MEMO"; static final String REPORT = "REPORT"; public TelegramBot(BotConfig config, UserRepository userRepository){ this.config = config; List<BotCommand> listOfCommands = new ArrayList<>(); listOfCommands.add(new BotCommand("/start","get a welcome message")); listOfCommands.add(new BotCommand("/help","info how to use this bot")); try { this.execute(new SetMyCommands(listOfCommands, new BotCommandScopeDefault(), null)); } catch (TelegramApiException e){ log.error("Error setting bot`s command list: " + e.getMessage()); } this.userRepository = userRepository; } @Override public String getBotUsername() { return config.getBotName(); } @Override public String getBotToken() { return config.getToken(); } @Override public void onUpdateReceived(Update update) { if (update.hasMessage() && update.getMessage().hasText()){ String messageText = update.getMessage().getText(); long chatId = update.getMessage().getChatId(); if(messageText.contains("/send")&& config.getOwnerId()== chatId){ var textToSend = EmojiParser.parseToUnicode(messageText.substring(messageText.indexOf(" "))); var users = userRepository.findAll(); for(User user: users){ prepareAndSendMessage(user.getChatId(), textToSend); } } else { switch (messageText) { case "/start": registerUser(update.getMessage()); startCommandReceived(chatId, update.getMessage().getChat().getFirstName()); break; case "/help": prepareAndSendMessage(chatId, HELP_TEXT); break; case "/Часто задаваемые вопросы": getFaqList(chatId); break; case "/Получить документы": documents(chatId); break; default: prepareAndSendMessage(chatId, "Других команд нет"); } } } else if (update.hasCallbackQuery()) { String callbackData = update.getCallbackQuery().getData(); long messageId = update.getCallbackQuery().getMessage().getMessageId(); long chatId = update.getCallbackQuery().getMessage().getChatId(); if(callbackData.equals(MEMO)){ String filePath = "H:\\4 course\\Java\\Kursovaya\\TelegramBot\\Pamyatka_po_oformleniyu.docx"; fileInput(messageId, chatId, filePath); } else if (callbackData.equals(REPORT)) { String filePath = "H:\\4 course\\Java\\Kursovaya\\TelegramBot\\Otchet_po_praktike.docx"; fileInput(messageId, chatId, filePath); } } } private void fileInput(long messageId, long chatId, String filePath) { try { File file = new File(filePath); InputFile inputFile = new InputFile(file); SendDocument sendDocument = new SendDocument(String.valueOf(chatId), inputFile); execute(sendDocument); String text = "Файл успешно отправлен"; executeEditMessageText(text, chatId, messageId); } catch (TelegramApiException e) { e.printStackTrace(); } } public void getFaqList(long chatId) { List<String> faqList = new ArrayList<>(); try { Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/tgbot", "user", "root"); Statement statement = connection.createStatement(); String sqlQuery = "SELECT id, question, answer FROM faq"; ResultSet resultSet = statement.executeQuery(sqlQuery); while (resultSet.next()) { int faqId = resultSet.getInt("id"); String question = resultSet.getString("question"); String answer = resultSet.getString("answer"); String faqItem = faqId+": " + "Вопрос: " + question + "\nОтвет: " + answer; faqList.add(faqItem); } statement.close(); connection.close(); } catch (SQLException e) { e.printStackTrace(); } StringBuilder message = new StringBuilder(); message.append("Вот список вопросов и ответов:\n"); for (String faqItem : faqList) { message.append(faqItem).append("\n"); } SendMessage message1 = new SendMessage(); message1.setChatId(chatId); message1.setText(message.toString()); executeMessage(message1); } private void documents (long chatId){ SendMessage message = new SendMessage(); message.setChatId(chatId); message.setText("Выбери нужный документ"); InlineKeyboardMarkup markupInLine = new InlineKeyboardMarkup(); List<List<InlineKeyboardButton>> rowsInline = getLists(); markupInLine.setKeyboard(rowsInline); message.setReplyMarkup(markupInLine); executeMessage(message); } private static List<List<InlineKeyboardButton>> getLists() { List<List<InlineKeyboardButton>> rowsInline = new ArrayList<>(); List<InlineKeyboardButton> rowInline1 = new ArrayList<>(); var memobutton = new InlineKeyboardButton(); memobutton.setText("Памятка по оформлению"); memobutton.setCallbackData(MEMO); rowInline1.add(memobutton); rowsInline.add(rowInline1); List<InlineKeyboardButton> rowInline2 = new ArrayList<>(); var reportbutton = new InlineKeyboardButton(); reportbutton.setText("Отчет по практике"); reportbutton.setCallbackData(REPORT); rowInline2.add(reportbutton); rowsInline.add(rowInline2); return rowsInline; } private void registerUser(Message message) { if(userRepository.findById(message.getChatId()).isEmpty()){ Long chatId = message.getChatId(); var chat = message.getChat(); User user = new User(); user.setChatId(chatId); user.setFirstName(chat.getFirstName()); user.setLastName(chat.getLastName()); user.setUserName(chat.getUserName()); user.setRegisteredAt(new Date(System.currentTimeMillis())); userRepository.save(user); log.info("user saved: " + user); } } private void startCommandReceived(long chatId, String name){ String answer = EmojiParser.parseToUnicode("Привет, " + name + ", выбери то что тебе нужно!" + " :blush:"); log.info("Replied to user " + name); sendMessage(chatId, answer); } private void sendMessage(long chatId, String textToSend){ SendMessage message = new SendMessage(); message.setChatId(String.valueOf(chatId)); message.setText(textToSend); ReplyKeyboardMarkup keyboardMarkup = getReplyKeyboardMarkup(); message.setReplyMarkup(keyboardMarkup); executeMessage(message); } private static ReplyKeyboardMarkup getReplyKeyboardMarkup() { ReplyKeyboardMarkup keyboardMarkup = new ReplyKeyboardMarkup(); keyboardMarkup.setResizeKeyboard(true); List<KeyboardRow> keyboardRows = new ArrayList<>(); KeyboardRow row = new KeyboardRow(); row.add("Часто задаваемые вопросы"); keyboardRows.add(row); row = new KeyboardRow(); row.add("Задать вопрос самостоятельно"); keyboardRows.add(row); row = new KeyboardRow(); row.add("Получить документы"); keyboardRows.add(row); keyboardMarkup.setKeyboard(keyboardRows); return keyboardMarkup; } private void executeEditMessageText(String text, long chatId, long messageId){ EditMessageText message = new EditMessageText(); message.setChatId(chatId); message.setText(text); message.setMessageId((int) messageId); try { execute(message); } catch (TelegramApiException e) { log.error("Произошла ошибка: " + e.getMessage()); } } private void executeMessage(SendMessage message){ try{ execute(message); } catch (TelegramApiException e) { log.error("Error occurred: " + e.getMessage()); } } private void prepareAndSendMessage(long chatId, String textToSend){ SendMessage message = new SendMessage(); message.setChatId(String.valueOf(chatId)); message.setText(textToSend); executeMessage(message); }

} что нужно изменить чтобы Часто задаваемые вопросы были кликабельны в /help

Чтобы сделать ссылки на команды "Часто задаваемые вопросы" кликабельными в сообщении "/help", необходимо внести следующие изменения:

  1. В методе "getReplyKeyboardMarkup()" замените строку "keyboardMarkup.setResizeKeyboard(true);" на "keyboardMarkup.setResizeKeyboard(true);" для включения автоматической подгонки размера клавиатуры.
  2. Вместо добавления строки "row.add("Часто задаваемые вопросы");" в методе "getReplyKeyboardMarkup()", создайте новый объект класса "KeyboardButton" для этой команды и установите ему значение "callback_data" на "faq". Затем добавьте эту кнопку в список "rowInline1".
  3. Замените строку "keyboardRows.add(row);" в методе "getReplyKeyboardMarkup()" на "keyboardRows.add(rowInline1);" для добавления первой строки с кнопкой "Часто задаваемые вопросы".

После внесения эти изменений, кнопка "Часто задаваемые вопросы" будет кликабельной в сообщенииhelp" и будет иметь callback_data "faq". Вы сможете использовать это значение для обработки нажия кнопки в методе "onUpdateReceived()".