diff --git a/src/main/java/ru/ldeloff/servermonitorbot/init/SshConnect.java b/src/main/java/ru/ldeloff/servermonitorbot/init/SshConnect.java index 8cc1a6f..7aae5d7 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/init/SshConnect.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/init/SshConnect.java @@ -15,6 +15,6 @@ public class SshConnect implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { - sshService.ConnectToAllServer(); + sshService.connectToAllServer(); } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java b/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java index 2a9ca6c..c97bc49 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/init/StartBot.java @@ -10,15 +10,16 @@ import org.telegram.telegrambots.meta.TelegramBotsApi; import org.telegram.telegrambots.meta.exceptions.TelegramApiException; import org.telegram.telegrambots.updatesreceivers.DefaultBotSession; import ru.ldeloff.servermonitorbot.model.TelegramBot; +import ru.ldeloff.servermonitorbot.service.TelegramBotService; @Slf4j @Component @NoArgsConstructor public class StartBot implements ApplicationRunner { - private TelegramBot telegramBot; + private TelegramBotService telegramBot; @Autowired - public StartBot(TelegramBot telegramBot) { + public StartBot(TelegramBotService telegramBot) { this.telegramBot = telegramBot; } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/model/SshServer.java b/src/main/java/ru/ldeloff/servermonitorbot/model/SshServer.java index f06f154..9600225 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/model/SshServer.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/model/SshServer.java @@ -1,5 +1,7 @@ package ru.ldeloff.servermonitorbot.model; +import com.jcraft.jsch.Session; +import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; import org.springframework.stereotype.Component; @@ -8,8 +10,15 @@ import org.springframework.stereotype.Component; @Getter @Component public class SshServer { + @NotNull + private String name; + @NotNull private String host; + @NotNull private int port; + @NotNull private String user; + @NotNull private String password; + private Session session; } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/model/TelegramBot.java b/src/main/java/ru/ldeloff/servermonitorbot/model/TelegramBot.java index 14f6c4e..8e32ffe 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/model/TelegramBot.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/model/TelegramBot.java @@ -1,47 +1,17 @@ package ru.ldeloff.servermonitorbot.model; -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; +import lombok.Getter; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import org.telegram.telegrambots.bots.TelegramLongPollingBot; -import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import org.telegram.telegrambots.meta.api.objects.Update; -import org.telegram.telegrambots.meta.exceptions.TelegramApiException; +@Getter @Component -@NoArgsConstructor -@AllArgsConstructor -public class TelegramBot extends TelegramLongPollingBot { - @Value("${bot.name}") - private String botUsername; +public class TelegramBot{ + private final String botUsername; + private final String botToken; - @Value("${bot.token}") - private String botToken; - - @Override - public void onUpdateReceived(Update update) { - // We check if the update has a message and the message has text - if (update.hasMessage() && update.getMessage().hasText()) { - SendMessage message = new SendMessage(); // Create a SendMessage object with mandatory fields - message.setChatId(update.getMessage().getChatId().toString()); - message.setText(update.getMessage().getText()); - - try { - execute(message); // Call method to send the message - } catch (TelegramApiException e) { - e.printStackTrace(); - } - } - } - - @Override - public String getBotUsername() { - return botUsername; - } - - @Override - public String getBotToken() { - return botToken; + public TelegramBot(@Value("${bot.name}") String botUsername, @Value("${bot.token}") String botToken) { + this.botUsername = botUsername; + this.botToken = botToken; } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/SshService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/SshService.java index 75dac30..32c11dd 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/SshService.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/SshService.java @@ -2,10 +2,15 @@ package ru.ldeloff.servermonitorbot.service; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import ru.ldeloff.servermonitorbot.model.SshServer; +import java.util.List; + public interface SshService { - void ConnectToAllServer(); - Session ConnectToServer(SshServer sshServer) throws JSchException; + void connectToAllServer(); + Session connectToServer(SshServer sshServer) throws JSchException; + void disconnectSessions(); + SendMessage getStatusSessions(Long chatId); } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/SshServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/SshServiceImpl.java index 2b41c02..0580f9f 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/SshServiceImpl.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/SshServiceImpl.java @@ -6,6 +6,7 @@ import com.jcraft.jsch.Session; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import ru.ldeloff.servermonitorbot.config.SshConfig; import ru.ldeloff.servermonitorbot.model.SshServer; @@ -26,10 +27,11 @@ public class SshServiceImpl implements SshService{ private List sessions = new ArrayList<>(); @Override - public void ConnectToAllServer() { + public void connectToAllServer() { sshServers.forEach(sshServer -> { try { - Session session = ConnectToServer(sshServer); + Session session = connectToServer(sshServer); + sshServer.setSession(session); log.info("Успешно подключён к " + sshServer.getHost()); sessions.add(session); } catch (JSchException e) { @@ -39,7 +41,7 @@ public class SshServiceImpl implements SshService{ } @Override - public Session ConnectToServer(SshServer sshServer) throws JSchException { + public Session connectToServer(SshServer sshServer) throws JSchException { Session session = new JSch().getSession(sshServer.getUser(), sshServer.getHost(), sshServer.getPort()); @@ -48,4 +50,27 @@ public class SshServiceImpl implements SshService{ session.connect(); return session; } + + @Override + public void disconnectSessions() { + if (!sessions.isEmpty()) { + sessions.forEach(Session::disconnect); + sessions.forEach(sessions::remove); + } + } + + @Override + public SendMessage getStatusSessions(Long chatId) { + StringBuilder text = new StringBuilder("Статус соединения: \n"); + sshServers.forEach(server -> { + text.append(server.getName()) + .append(": ") + .append(server.getSession().isConnected() ? "OK" : "отключён") + .append("\n"); + }); + SendMessage message = new SendMessage(); + message.setText(String.valueOf(text)); + message.setChatId(chatId); + return message; + } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java new file mode 100644 index 0000000..5837580 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java @@ -0,0 +1,92 @@ +package ru.ldeloff.servermonitorbot.service; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.telegram.telegrambots.bots.TelegramLongPollingBot; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import org.telegram.telegrambots.meta.api.objects.Update; +import org.telegram.telegrambots.meta.exceptions.TelegramApiException; +import ru.ldeloff.servermonitorbot.model.TelegramBot; +import ru.ldeloff.servermonitorbot.util.TelegramBotMenu; + +@Service +@Slf4j +public class TelegramBotService extends TelegramLongPollingBot { + + final TelegramBot telegramBot; + final SshService sshService; + final TelegramBotMenu telegramBotMenu; + + + @Autowired + public TelegramBotService(TelegramBot telegramBot, SshService sshService, TelegramBotMenu telegramBotMenu) { + this.telegramBot = telegramBot; + this.sshService = sshService; + this.telegramBotMenu = telegramBotMenu; + } + + @Override + public void onUpdateReceived(Update update) { + if (update.hasMessage()) { + if (update.getMessage().hasText()) { + SendMessage message = new SendMessage(); + String messageText = update.getMessage().getText(); + long chatId = update.getMessage().getChatId(); + switch (messageText) { + case "/start": + message.setText("Привет: " + update.getMessage().getChat().getUserName()); + message.setChatId(chatId); + message.setReplyMarkup(telegramBotMenu.initKeyboard()); + sendMessage(message); + log.info("Получена команда /start"); + break; + case "Статус": + sendMessage(sshService.getStatusSessions(chatId)); + log.info("Получена команда 'Статус'"); + break; + default: + message.setText("unknown command:" + messageText); + message.setChatId(chatId); + message.setReplyMarkup(telegramBotMenu.initKeyboard()); + sendMessage(message); + log.warn("Неизвестная команда:" + messageText); + } + } + } else if (update.hasCallbackQuery()) { + try { + SendMessage message = new SendMessage(); + message.setText(update.getCallbackQuery().getData()); + message.setChatId(update.getCallbackQuery().getMessage().getChatId()); + execute(message); + } catch (TelegramApiException e) { + e.printStackTrace(); + } + } + } + + private void sendMessage(SendMessage message) { + try { + execute(message); + } catch (TelegramApiException e) { + e.printStackTrace(); + log.warn(e.getMessage()); + } + } + + @Override + public String getBotUsername() { + return telegramBot.getBotUsername(); + } + + @Override + public String getBotToken() { + return telegramBot.getBotToken(); + } + + @Override + public void onClosing() { + super.onClosing(); + sshService.disconnectSessions(); + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/util/TelegramBotMenu.java b/src/main/java/ru/ldeloff/servermonitorbot/util/TelegramBotMenu.java new file mode 100644 index 0000000..e853a4f --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/util/TelegramBotMenu.java @@ -0,0 +1,61 @@ +package ru.ldeloff.servermonitorbot.util; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +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.KeyboardButton; +import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardRow; + + +import java.util.ArrayList; +import java.util.List; + +@Slf4j +@Component +public class TelegramBotMenu { + private final String STATUS = "Статус"; + public ReplyKeyboardMarkup initKeyboard() + { + //Создаем объект будущей клавиатуры и выставляем нужные настройки + ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup(); + replyKeyboardMarkup.setResizeKeyboard(true); //подгоняем размер + replyKeyboardMarkup.setOneTimeKeyboard(false); //скрываем после использования + + //Создаем список с рядами кнопок + ArrayList keyboardRows = new ArrayList<>(); + //Создаем один ряд кнопок и добавляем его в список + KeyboardRow keyboardRow = new KeyboardRow(); + keyboardRows.add(keyboardRow); + //Добавляем одну кнопку с текстом "Просвяти" наш ряд + keyboardRow.add(new KeyboardButton(STATUS)); + //добавляем лист с одним рядом кнопок в главный объект + replyKeyboardMarkup.setKeyboard(keyboardRows); + return replyKeyboardMarkup; + } + + public SendMessage mainMenu(long chatId) { + SendMessage message = new SendMessage(); + message.setChatId(chatId); + message.setText("Choose an option:"); + + InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup(); + List keyboardRow = new ArrayList<>(); + + InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton(); + inlineKeyboardButton.setText(STATUS); + inlineKeyboardButton.setCallbackData("Button \"" + STATUS + "\" has been pressed"); + + keyboardRow.add(inlineKeyboardButton); + + List> keyboard = new ArrayList<>(); + keyboard.add(keyboardRow); + + inlineKeyboardMarkup.setKeyboard(keyboard); + message.setReplyMarkup(inlineKeyboardMarkup); + + return message; + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 84ef8e2..e1b733b 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -4,6 +4,7 @@ bot: ssh: servers: - + name: "Server Name" host: "url" port: 22 user: "user"