From 6c727e43ac508659a3394b448e5309416bf618b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D0=B0=20?= =?UTF-8?q?=D0=9A=D1=80=D0=BE=D1=82=D0=BA=D0=B0=D1=8F?= Date: Tue, 17 Dec 2024 23:57:54 +0500 Subject: [PATCH] =?UTF-8?q?=D0=92=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C=20=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B8=20?= =?UTF-8?q?=D0=B8=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Возможность получения username через команду /start и поиск пользователей в базе данных через /searchUser --- src/main/java/ru/oop/Main.java | 18 ++++--- .../commands/SearchUserByNameCommand.java | 53 +++++++++++++++++++ .../ru/oop/logic/commands/StartCommand.java | 46 ++++++++++++++++ .../logic/repositories/UserRepository.java | 2 + .../repositories/UserRepositoryImpl.java | 22 +++++--- .../ru/oop/logic/services/UserService.java | 51 ++++++++++++++++++ 6 files changed, 177 insertions(+), 15 deletions(-) create mode 100644 src/main/java/ru/oop/logic/commands/SearchUserByNameCommand.java create mode 100644 src/main/java/ru/oop/logic/commands/StartCommand.java diff --git a/src/main/java/ru/oop/Main.java b/src/main/java/ru/oop/Main.java index 2d40343..d42e85f 100644 --- a/src/main/java/ru/oop/Main.java +++ b/src/main/java/ru/oop/Main.java @@ -37,7 +37,9 @@ public static void main(String[] args) { new DeleteWishFromWishlistCommand(wishlistService), new DeleteWishlistCommand(wishlistService), new SetReminderCommand(reminderService), - new ViewWishlistsCommand(wishlistService, userService) + new ViewWishlistsCommand(wishlistService, userService), + new SearchUserByNameCommand(userService), + new StartCommand(userService) }; @@ -56,13 +58,13 @@ public static void main(String[] args) { e.printStackTrace(); } -// ConsoleRequestHandler consoleRequestHandler = new ConsoleRequestHandler(); -// consoleRequestHandler.setCommands(commands); -// -// ConsoleOutputWriter consoleOutputWriter = new ConsoleOutputWriter(); -// ConsoleBot consoleBot = new ConsoleBot(new ConsoleInputReader(), consoleOutputWriter, consoleRequestHandler, userService); -// reminderService.setOutputWriter(consoleOutputWriter); -// consoleBot.startBot(); + ConsoleRequestHandler consoleRequestHandler = new ConsoleRequestHandler(); + consoleRequestHandler.setCommands(commands); + + ConsoleOutputWriter consoleOutputWriter = new ConsoleOutputWriter(); + ConsoleBot consoleBot = new ConsoleBot(new ConsoleInputReader(), consoleOutputWriter, consoleRequestHandler, userService); + reminderService.setOutputWriter(consoleOutputWriter); + consoleBot.startBot(); } } diff --git a/src/main/java/ru/oop/logic/commands/SearchUserByNameCommand.java b/src/main/java/ru/oop/logic/commands/SearchUserByNameCommand.java new file mode 100644 index 0000000..999b501 --- /dev/null +++ b/src/main/java/ru/oop/logic/commands/SearchUserByNameCommand.java @@ -0,0 +1,53 @@ +package ru.oop.logic.commands; + +import ru.oop.logic.Request; +import ru.oop.logic.Response; +import ru.oop.logic.services.UserService; +import ru.oop.logic.models.User; + +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class SearchUserByNameCommand implements Command { + private final UserService userService; + + public SearchUserByNameCommand(UserService userService) { + this.userService = userService; + } + + @Override + public Pattern getCommandPattern() { + return Pattern.compile("/searchUser (.+)"); + } + + @Override + public Response executeCommand(Request request, Matcher matched, User currentUser) { + try { + if (currentUser == null) { + return new Response("Пользователь не найден. Пожалуйста, зарегистрируйтесь."); + } + + String usernamePart = matched.group(1).trim(); + + if (usernamePart.isEmpty()) { + return new Response("Имя для поиска не может быть пустым."); + } + + List matchingUsers = userService.findUsersByUsername(usernamePart); + + if (matchingUsers.isEmpty()) { + return new Response("Пользователи с именем, содержащим '" + usernamePart + "', не найдены."); + } + + StringBuilder responseMessage = new StringBuilder("Найдены следующие пользователи:\n"); + for (User user : matchingUsers) { + responseMessage.append("- ").append(user.getUsername()).append("\n"); + } + + return new Response(responseMessage.toString()); + } catch (Exception e) { + return new Response("Произошла ошибка при поиске пользователей: " + e.getMessage()); + } + } +} diff --git a/src/main/java/ru/oop/logic/commands/StartCommand.java b/src/main/java/ru/oop/logic/commands/StartCommand.java new file mode 100644 index 0000000..17dced4 --- /dev/null +++ b/src/main/java/ru/oop/logic/commands/StartCommand.java @@ -0,0 +1,46 @@ +package ru.oop.logic.commands; + +import ru.oop.logic.Request; +import ru.oop.logic.Response; +import ru.oop.logic.services.UserService; +import ru.oop.logic.models.User; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class StartCommand implements Command { + private final UserService userService; + + public StartCommand(UserService userService) { + this.userService = userService; + } + + @Override + public Pattern getCommandPattern() { + return Pattern.compile("/start(?:\\s+(\\w+))?"); + } + + @Override + public Response executeCommand(Request request, Matcher matched, User currentUser) { + try { + Long telegramId = currentUser.getTelegramId(); + String argument = matched.group(1); + + if (argument != null) { + userService.updateUsernameIfChanged(telegramId, argument); + return new Response("Имя пользователя обновлено на: " + argument); + } else if (currentUser != null) { + String actualUsername = currentUser.getUsername(); + if (actualUsername != null && !actualUsername.isEmpty()) { + userService.updateUsernameIfChanged(telegramId, actualUsername); + } + return new Response("Добро пожаловать, @" + currentUser.getUsername() + "!"); + } + + + return new Response("Добро пожаловать, @" + (currentUser != null ? currentUser.getUsername() : "новый пользователь") + "!"); + } catch (Exception e) { + return new Response("Произошла ошибка: " + e.getMessage()); + } + } +} diff --git a/src/main/java/ru/oop/logic/repositories/UserRepository.java b/src/main/java/ru/oop/logic/repositories/UserRepository.java index 62b4966..46b7932 100644 --- a/src/main/java/ru/oop/logic/repositories/UserRepository.java +++ b/src/main/java/ru/oop/logic/repositories/UserRepository.java @@ -1,6 +1,7 @@ package ru.oop.logic.repositories; import ru.oop.logic.models.User; +import java.util.List; public interface UserRepository { User save(User user); @@ -9,4 +10,5 @@ public interface UserRepository { User findByTelegramId(Long id); void deleteById(Long id); User findByUsername(String username); + List findByUsernameLike(String usernamePart); } \ No newline at end of file diff --git a/src/main/java/ru/oop/logic/repositories/UserRepositoryImpl.java b/src/main/java/ru/oop/logic/repositories/UserRepositoryImpl.java index 89ebf5a..d331ff5 100644 --- a/src/main/java/ru/oop/logic/repositories/UserRepositoryImpl.java +++ b/src/main/java/ru/oop/logic/repositories/UserRepositoryImpl.java @@ -7,6 +7,8 @@ import org.hibernate.query.Query; import ru.oop.logic.models.User; +import java.util.List; + public class UserRepositoryImpl implements UserRepository { private final SessionFactory sessionFactory; @@ -37,7 +39,7 @@ public User update(User user) { Transaction transaction = null; try (Session session = sessionFactory.openSession()) { transaction = session.beginTransaction(); - User updatedUser = (User) session.merge(user); + User updatedUser = session.merge(user); transaction.commit(); return updatedUser; } catch (Exception e) { @@ -62,8 +64,7 @@ public User findByTelegramId(Long id) { try (Session session = sessionFactory.openSession()) { String hql = "FROM User u WHERE u.telegramId = :telegramId"; Query query = session.createQuery(hql, User.class); - query.setParameter("telegramId", id); // Замените "name" на имя, которое ищете - // Возвращает единственного пользователя или null + query.setParameter("telegramId", id); return query.uniqueResult(); } catch (Exception e) { throw new RuntimeException("Ошибка при поиске User с ID: " + id, e); @@ -81,6 +82,17 @@ public User findByUsername(String username) { } } + public List findByUsernameLike(String usernamePart) { + try (Session session = sessionFactory.openSession()) { + String hql = "FROM User u WHERE u.username LIKE :usernamePart"; + Query query = session.createQuery(hql, User.class); + query.setParameter("usernamePart", "%" + usernamePart + "%"); + return query.list(); + } catch (Exception e) { + throw new RuntimeException("Ошибка при поиске пользователей по имени, содержащему: " + usernamePart, e); + } + } + @Override public void deleteById(Long id) { Transaction transaction = null; @@ -98,8 +110,4 @@ public void deleteById(Long id) { throw new RuntimeException("Ошибка при удалении User с ID: " + id, e); } } - - public void close() { - sessionFactory.close(); - } } \ No newline at end of file diff --git a/src/main/java/ru/oop/logic/services/UserService.java b/src/main/java/ru/oop/logic/services/UserService.java index 36cbcb3..173ec94 100644 --- a/src/main/java/ru/oop/logic/services/UserService.java +++ b/src/main/java/ru/oop/logic/services/UserService.java @@ -4,6 +4,8 @@ import ru.oop.logic.models.Wishlist; import ru.oop.logic.repositories.UserRepository; +import java.util.List; + public class UserService { private final UserRepository userRepository; @@ -36,7 +38,56 @@ public void addWishlistToUser(User user, Wishlist wishlist) { userRepository.update(user); } + public void updateUsernameIfChanged(Long telegramId, String newUsername) { + try { + User user = userRepository.findByTelegramId(telegramId); + + if (user == null) { + User newUser = new User(); + newUser.setTelegramId(telegramId); + newUser.setUsername(newUsername); + userRepository.save(newUser); + } else { + if (!user.getUsername().equals(newUsername)) { + user.setUsername(newUsername); + userRepository.update(user); + } + } + } catch (Exception e) { + // Логирование ошибки + System.err.println("Ошибка при обновлении имени пользователя: " + e.getMessage()); + } + } + + + + public User processTelegramUser(Long telegramId, String username) { + if (telegramId == null) { + throw new IllegalArgumentException("Telegram ID не может быть null."); + } + + updateUsernameIfChanged(telegramId, username); + + // Возвращаем обновленного или существующего пользователя + return userRepository.findByTelegramId(telegramId); + } + public User findByUsername(String username) { return userRepository.findByUsername(username); } + + public User registerUser(Long telegramId, String username) { + User existingUser = userRepository.findByTelegramId(telegramId); + if (existingUser == null) { + User newUser = new User(); + newUser.setTelegramId(telegramId); + newUser.setUsername(username); + return userRepository.save(newUser); + } + return existingUser; // Пользователь уже существует. + } + + public List findUsersByUsername(String usernamePart) { + return userRepository.findByUsernameLike(usernamePart); + } }