diff --git a/src/main/java/ru/ldeloff/servermonitorbot/config/SshConfig.java b/src/main/java/ru/ldeloff/servermonitorbot/config/SshConfig.java index deb3255..bac7aed 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/config/SshConfig.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/config/SshConfig.java @@ -1,5 +1,8 @@ package ru.ldeloff.servermonitorbot.config; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import ru.ldeloff.servermonitorbot.model.SshServer; @@ -8,14 +11,8 @@ import java.util.List; @Configuration @ConfigurationProperties(prefix = "ssh") +@Getter +@Setter public class SshConfig { private List servers; - - public List getServers() { - return servers; - } - - public void setServers(List servers) { - this.servers = servers; - } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java index 1f0b5ce..c589eab 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/controller/TelegramBotController.java @@ -7,9 +7,13 @@ 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.Role; import ru.ldeloff.servermonitorbot.model.TelegramBot; +import ru.ldeloff.servermonitorbot.model.User; import ru.ldeloff.servermonitorbot.repository.SshRepository; import ru.ldeloff.servermonitorbot.service.TelegramBotService; +import ru.ldeloff.servermonitorbot.service.role.RoleService; +import ru.ldeloff.servermonitorbot.service.user.UserService; import ru.ldeloff.servermonitorbot.utils.ui.TelegramBotKeyboard; import ru.ldeloff.servermonitorbot.utils.ui.uname.UnameChatButtonAggregate; @@ -21,32 +25,67 @@ public class TelegramBotController extends TelegramLongPollingBot { final TelegramBot telegramBot; final SshRepository sshRepository; final TelegramBotService telegramBotService; + final UserService userService; + final RoleService roleService; @Override public void onUpdateReceived(Update update) { + Role role = getRole(update); if (update.hasMessage()) { if (update.getMessage().hasText()) { String messageText = update.getMessage().getText(); switch (messageText) { case "/start" -> { - log.info("Получена команда '" + messageText - + "' от " + update.getMessage().getChat().getUserName()); - telegramBotService.firstUse(update, this); + if (role.getId() < 3) { + log.info("Получена команда '" + messageText + + "' от " + update.getMessage().getChat().getUserName() + + " (" + update.getMessage().getChat().getId() + "). OK"); + telegramBotService.firstUse(update, this); + } else { + log.warn("Получена команда '" + messageText + + "' от " + update.getMessage().getChat().getUserName() + + " (" + update.getMessage().getChat().getId() + "). Нет прав"); + telegramBotService.notAuthorization(update, this); + } } case "Статус" -> { - log.info("Получена команда '" + messageText - + "' от " + update.getMessage().getChat().getUserName()); - telegramBotService.getStatusSessions(update, this); + if (role.getId() < 3) { + log.info("Получена команда '" + messageText + + "' от " + update.getMessage().getChat().getUserName() + + " (" + update.getMessage().getChat().getId() + "). OK"); + telegramBotService.getStatusSessions(update, this); + } else { + log.warn("Получена команда '" + messageText + + "' от " + update.getMessage().getChat().getUserName() + + " (" + update.getMessage().getChat().getId() + "). Нет прав"); + telegramBotService.notAuthorization(update, this); + } } case "uname" -> { - log.info("Получена команда '" + messageText - + "' от " + update.getMessage().getChat().getUserName()); - telegramBotService.sendUnameAggregate(update, this); + if (role.getId() < 3) { + log.info("Получена команда '" + messageText + + "' от " + update.getMessage().getChat().getUserName() + + " (" + update.getMessage().getChat().getId() + "). OK"); + telegramBotService.sendUnameAggregate(update, this); + } else { + log.warn("Получена команда '" + messageText + + "' от " + update.getMessage().getChat().getUserName() + + " (" + update.getMessage().getChat().getId() + "). Нет прав"); + telegramBotService.notAuthorization(update, this); + } } default -> { - log.warn("Неизвестная команда '" + messageText - + "' от " + update.getMessage().getChat().getUserName()); - telegramBotService.switchToMainMenu(update, this); + if (role.getId() < 3) { + log.warn("Неизвестная команда '" + messageText + + "' от " + update.getMessage().getChat().getUserName() + + " (" + update.getMessage().getChat().getId() + "). ОК"); + telegramBotService.switchToMainMenu(update, this); + } else { + log.warn("Неизвестная команда '" + messageText + + "' от " + update.getMessage().getChat().getUserName() + + " (" + update.getMessage().getChat().getId() + "). Нет прав"); + telegramBotService.notAuthorization(update, this); + } } } } @@ -56,20 +95,44 @@ public class TelegramBotController extends TelegramLongPollingBot { if (tags.length > 1) { switch (tags[0]) { case "uname": - log.info("Получена команда '" + messageText - + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName()); - telegramBotService.uname(update, this); + if (role.getId() < 3) { + log.info("Получена команда '" + messageText + + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName() + + " (" + update.getCallbackQuery().getMessage().getChat().getId() + "). ОК"); + telegramBotService.uname(update, this); + } else { + log.info("Получена команда '" + messageText + + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName() + + " (" + update.getCallbackQuery().getMessage().getChat().getId() + "). Нет прав"); + telegramBotService.notAuthorization(update, this); + } break; default: - log.warn("Неизвестная команда '" + messageText - + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName()); - telegramBotService.switchToMainMenu(update, this); + if (role.getId() < 3) { + log.warn("Неизвестная команда '" + messageText + + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName() + + " (" + update.getCallbackQuery().getMessage().getChat().getId() + "). ОК"); + telegramBotService.switchToMainMenu(update, this); + } else { + log.warn("Неизвестная команда '" + messageText + + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName() + + " (" + update.getCallbackQuery().getMessage().getChat().getId() + "). Нет прав"); + telegramBotService.notAuthorization(update, this); + } break; } } else { + if (role.getId() < 3) { log.warn("Неверный формат команды '" + messageText - + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName()); + + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName() + + " (" + update.getCallbackQuery().getMessage().getChat().getId() + "). ОК"); telegramBotService.switchToMainMenu(update, this); + } else { + log.warn("Неверный формат команды '" + messageText + + "' от " + update.getCallbackQuery().getMessage().getChat().getUserName() + + " (" + update.getCallbackQuery().getMessage().getChat().getId() + "). Нет прав"); + telegramBotService.notAuthorization(update, this); + } } } } @@ -89,4 +152,19 @@ public class TelegramBotController extends TelegramLongPollingBot { super.onClosing(); sshRepository.disconnectSessions(); } + + private Role getRole(Update update) { + Long id = null; + if (update.hasMessage()) { + id = update.getMessage().getChat().getId(); + } else if (update.hasCallbackQuery()) { + id = update.getCallbackQuery().getMessage().getChat().getId(); + } + User user = userService.getByTelegramId(id); + if (user == null) { + return roleService.findRoleById(3L); + } else { + return user.getRole(); + } + } } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/repository/RoleRepository.java b/src/main/java/ru/ldeloff/servermonitorbot/repository/RoleRepository.java new file mode 100644 index 0000000..4bb81ec --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/repository/RoleRepository.java @@ -0,0 +1,13 @@ +package ru.ldeloff.servermonitorbot.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import ru.ldeloff.servermonitorbot.model.Role; + +import java.util.Optional; + +@Repository +public interface RoleRepository extends JpaRepository { + Optional findRoleByName(String name); + Optional findRoleById(Long id); +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/repository/UserRepository.java b/src/main/java/ru/ldeloff/servermonitorbot/repository/UserRepository.java new file mode 100644 index 0000000..ceaacd3 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/repository/UserRepository.java @@ -0,0 +1,10 @@ +package ru.ldeloff.servermonitorbot.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import ru.ldeloff.servermonitorbot.model.User; + +@Repository +public interface UserRepository extends JpaRepository { + User getByTelegramId(long id); +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java index cf86879..507a7fc 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotService.java @@ -9,5 +9,6 @@ public interface TelegramBotService { void getStatusSessions(Update update, TelegramBotController bot); void sendUnameAggregate(Update update, TelegramBotController bot); void uname(Update update, TelegramBotController bot); - void firstUse(Update update, TelegramBotController telegramBotController); + void firstUse(Update update, TelegramBotController bot); + void notAuthorization(Update update, TelegramBotController bot); } diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java index 53df118..84b24af 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/TelegramBotServiceImpl.java @@ -31,6 +31,28 @@ public class TelegramBotServiceImpl implements TelegramBotService { message.setChatId(chatId); sendMessage(telegramBotKeyboard.uiForm(message), bot); } + + @Override + public void notAuthorization(Update update, TelegramBotController bot) { + long id = 0L; + String login = null; + long chatId = 0L; + if (update.hasMessage()) { + id = update.getMessage().getChat().getId(); + login = update.getMessage().getChat().getUserName(); + chatId = update.getMessage().getChatId(); + } else if (update.hasCallbackQuery()) { + id = update.getCallbackQuery().getMessage().getChat().getId(); + login = update.getCallbackQuery().getMessage().getChat().getUserName(); + chatId = update.getCallbackQuery().getMessage().getChatId(); + } + SendMessage message = new SendMessage(); + message.setText("У пользователя " + login + + " (" + id + ") недостаточно прав для выполнения этой команды"); + message.setChatId(chatId); + sendMessage(message, bot); + } + @Override public void switchToMainMenu(Update update, TelegramBotController bot) { SendMessage message = new SendMessage(); diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/role/RoleService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/role/RoleService.java new file mode 100644 index 0000000..b26d5e1 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/role/RoleService.java @@ -0,0 +1,9 @@ +package ru.ldeloff.servermonitorbot.service.role; + +import ru.ldeloff.servermonitorbot.model.Role; + +public interface RoleService { + Role findRoleByName(String name); + + Role findRoleById(Long id); +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/role/RoleServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/role/RoleServiceImpl.java new file mode 100644 index 0000000..6cf52a8 --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/role/RoleServiceImpl.java @@ -0,0 +1,28 @@ +package ru.ldeloff.servermonitorbot.service.role; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import ru.ldeloff.servermonitorbot.model.Role; +import ru.ldeloff.servermonitorbot.repository.RoleRepository; + +import java.util.Locale; +import java.util.Optional; + +@Service +@RequiredArgsConstructor +public class RoleServiceImpl implements RoleService { + private final RoleRepository roleRepository; + + @Override + public Role findRoleByName(String name) { + Optional role = roleRepository.findRoleByName(name.toUpperCase(Locale.ROOT)); + //noinspection OptionalGetWithoutIsPresent + return role.orElseGet(() -> roleRepository.findRoleByName("ANONYMOUS").get()); + } + + @Override + public Role findRoleById(Long id) { + Optional role = roleRepository.findRoleById(id); + return role.orElseGet(() -> roleRepository.findRoleByName("ANONYMOUS").get()); + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserService.java b/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserService.java new file mode 100644 index 0000000..e7ea1ff --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserService.java @@ -0,0 +1,9 @@ +package ru.ldeloff.servermonitorbot.service.user; + +import ru.ldeloff.servermonitorbot.model.User; + +public interface UserService { + User saveOrUpdateUser(User user); + + User getByTelegramId(Long id); +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserServiceImpl.java b/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserServiceImpl.java new file mode 100644 index 0000000..ff2844a --- /dev/null +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/user/UserServiceImpl.java @@ -0,0 +1,29 @@ +package ru.ldeloff.servermonitorbot.service.user; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import ru.ldeloff.servermonitorbot.model.User; +import ru.ldeloff.servermonitorbot.repository.UserRepository; + +@Service +@RequiredArgsConstructor +@Slf4j +public class UserServiceImpl implements UserService { + + final UserRepository userRepository; + + @Override + public User saveOrUpdateUser(User user) { + User existUser = userRepository.getByTelegramId(user.getTelegramId()); + if (existUser != null) { + user.setId(existUser.getId()); + } + return userRepository.save(user); + } + + @Override + public User getByTelegramId(Long id) { + return userRepository.getByTelegramId(id); + } +} diff --git a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java index 3ab4b9f..a07a478 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/utils/ui/TelegramBotKeyboard.java @@ -17,8 +17,8 @@ public class TelegramBotKeyboard implements UiFormer { @Override public SendMessage uiForm(SendMessage message) { ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup(); - replyKeyboardMarkup.setResizeKeyboard(true); //подгоняем размер - replyKeyboardMarkup.setOneTimeKeyboard(false); //скрываем после использования + replyKeyboardMarkup.setResizeKeyboard(true); + replyKeyboardMarkup.setOneTimeKeyboard(false); ArrayList keyboardRows = new ArrayList<>();