diff --git a/pom.xml b/pom.xml index 1a628a1..622e8ef 100644 --- a/pom.xml +++ b/pom.xml @@ -1,51 +1,43 @@ - + 4.0.0 + + org.springframework.boot spring-boot-starter-parent - 3.3.4 + 2.7.15 + umg.TelegramBot TelegramBot 0.0.1-SNAPSHOT TelegramBot Proyecto para Crear un Bot de Telegram y conectarlo con la API de ChatGpt - - - - - - - - - - - - - + 17 - + + org.springframework.boot spring-boot-starter-web - + org.telegram telegrambots-spring-boot-starter 6.1.0 - - - + org.springframework.boot spring-boot-devtools @@ -53,20 +45,55 @@ true + org.projectlombok lombok true + + org.springframework.boot spring-boot-starter-test test + org.springframework.boot - spring-boot-starter-webflux + spring-boot-starter-data-jpa + + + + + mysql + mysql-connector-java + runtime + + + + + javax.xml.bind + jaxb-api + 2.3.1 + + + com.sun.xml.bind + jaxb-impl + 2.3.1 + + + javax.activation + activation + 1.1.1 + + + + + org.springdoc + springdoc-openapi-ui + 1.6.15 diff --git a/src/main/java/umg/TelegramBot/ClienteService.java b/src/main/java/umg/TelegramBot/ClienteService.java new file mode 100644 index 0000000..efc47e9 --- /dev/null +++ b/src/main/java/umg/TelegramBot/ClienteService.java @@ -0,0 +1,17 @@ +package umg.TelegramBot.Service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +@Service +public class ClienteService { + + @Autowired + private JdbcTemplate jdbcTemplate; + + public void guardarCliente(String nombre) { + String sql = "INSERT INTO clientes (nombre) VALUES (?)"; + jdbcTemplate.update(sql, nombre); + } +} diff --git a/src/main/java/umg/TelegramBot/Controller/TelegramBotController.java b/src/main/java/umg/TelegramBot/Controller/TelegramBotController.java new file mode 100644 index 0000000..44d2dc4 --- /dev/null +++ b/src/main/java/umg/TelegramBot/Controller/TelegramBotController.java @@ -0,0 +1,28 @@ +package umg.TelegramBot.Controller; + +import org.springframework.web.bind.annotation.*; +import umg.TelegramBot.Model.Request; +import umg.TelegramBot.Repository.RequestRepository; + +import java.util.List; + +@RestController +@RequestMapping("/api/requests") +public class TelegramBotController { + + private final RequestRepository requestRepository; + + public TelegramBotController(RequestRepository requestRepository) { + this.requestRepository = requestRepository; + } + + @GetMapping + public List getAllRequests() { + return requestRepository.findAll(); + } + + @GetMapping("/{id}") + public Request getRequestById(@PathVariable Integer id) { + return requestRepository.findById(id).orElse(null); + } +} diff --git a/src/main/java/umg/TelegramBot/Model/Client.java b/src/main/java/umg/TelegramBot/Model/Client.java new file mode 100644 index 0000000..c1e82d7 --- /dev/null +++ b/src/main/java/umg/TelegramBot/Model/Client.java @@ -0,0 +1,20 @@ +package umg.TelegramBot.Model; + +import jakarta.persistence.*; +import lombok.Data; + +@Data +@Entity +@Table(name = "clients") +public class Client { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer client; + + @Column(nullable = false) + private Long chatId; // ID único del usuario en Telegram + + @Column(nullable = false) + private String name; +} diff --git a/src/main/java/umg/TelegramBot/Model/Request.java b/src/main/java/umg/TelegramBot/Model/Request.java new file mode 100644 index 0000000..a862926 --- /dev/null +++ b/src/main/java/umg/TelegramBot/Model/Request.java @@ -0,0 +1,25 @@ +package umg.TelegramBot.Model; + +import jakarta.persistence.*; +import lombok.Data; + +@Data +@Entity +@Table(name = "requests") +public class Request { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer request; + + @Column(nullable = false, length = 2000) + private String question; + + @Lob + @Column(nullable = false) + private String response; + + @ManyToOne + @JoinColumn(name = "cliente", nullable = false) + private Client cliente; +} diff --git a/src/main/java/umg/TelegramBot/Repository/ClientRepository.java b/src/main/java/umg/TelegramBot/Repository/ClientRepository.java new file mode 100644 index 0000000..95b6a22 --- /dev/null +++ b/src/main/java/umg/TelegramBot/Repository/ClientRepository.java @@ -0,0 +1,12 @@ +package umg.TelegramBot.Repository; + +import org.springframework.stereotype.Repository; +import umg.TelegramBot.Model.Client; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; +@Repository +public interface ClientRepository extends JpaRepository { + Optional findByName(String name); +} diff --git a/src/main/java/umg/TelegramBot/Repository/RequestRepository.java b/src/main/java/umg/TelegramBot/Repository/RequestRepository.java new file mode 100644 index 0000000..959a84a --- /dev/null +++ b/src/main/java/umg/TelegramBot/Repository/RequestRepository.java @@ -0,0 +1,11 @@ +package umg.TelegramBot.Repository; + +import org.springframework.stereotype.Repository; +import umg.TelegramBot.Model.Request; +import org.springframework.data.jpa.repository.JpaRepository; + +@Repository +public interface RequestRepository extends JpaRepository { + // Métodos personalizados si son necesarios +} + diff --git a/src/main/java/umg/TelegramBot/Service/TelegramBotService.java b/src/main/java/umg/TelegramBot/Service/TelegramBotService.java index 0cebdbc..5df905b 100644 --- a/src/main/java/umg/TelegramBot/Service/TelegramBotService.java +++ b/src/main/java/umg/TelegramBot/Service/TelegramBotService.java @@ -7,6 +7,11 @@ 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 umg.TelegramBot.Model.Client; +import umg.TelegramBot.Model.Request; +import umg.TelegramBot.Repository.ClientRepository; +import umg.TelegramBot.Repository.RequestRepository; +import java.util.Optional; @Service public class TelegramBotService extends TelegramLongPollingBot { @@ -20,42 +25,75 @@ public class TelegramBotService extends TelegramLongPollingBot { @Autowired private OpenAIService openAIService; + @Autowired + private ClientRepository clientRepository; + + @Autowired + private RequestRepository requestRepository; + @Override public void onUpdateReceived(Update update) { - // Verificar que el mensaje sea de texto if (update.hasMessage() && update.getMessage().hasText()) { String messageTextReceived = update.getMessage().getText(); - long chatId = update.getMessage().getChatId(); - - System.out.println("Mensaje recibido: " + messageTextReceived); - - // Obtener la respuesta de OpenAI - String botResponse = openAIService.getChatResponse(messageTextReceived); - - // Enviar la respuesta al usuario - SendMessage message = new SendMessage(); - message.setChatId(String.valueOf(chatId)); - message.setText(botResponse); - - try { - execute(message); - } catch (TelegramApiException e) { - e.printStackTrace(); + Long chatId = update.getMessage().getChatId(); + String userName = update.getMessage().getChat().getFirstName(); + + // Buscamos si el usuario ya está registrado por su chatId + Optional optionalClient = clientRepository.findById(chatId.intValue()); + + if (optionalClient.isEmpty()) { + // Si no está registrado, le pedimos su nombre + if (messageTextReceived.equalsIgnoreCase("/start")) { + sendMessage(chatId, "Hola, ¿cómo te llamas?"); + } else { + // Registramos al usuario + Client client = new Client(); + client.setClient(chatId.intValue()); + client.setName(messageTextReceived); + clientRepository.save(client); + + sendMessage(chatId, "Hola " + messageTextReceived + ", ¿cuál es tu pregunta?"); + } + } else { + // Usuario registrado, procedemos con ChatGPT + Client client = optionalClient.get(); + + // Obtenemos la respuesta de OpenAI + String botResponse = openAIService.getChatResponse(messageTextReceived); + + // Guardamos la interacción en la base de datos + Request request = new Request(); + request.setQuestion(messageTextReceived); + request.setResponse(botResponse); + request.setCliente(client); + requestRepository.save(request); + + // Enviamos la respuesta al usuario + sendMessage(chatId, botResponse); } } } + private void sendMessage(Long chatId, String text) { + SendMessage message = new SendMessage(); + message.setChatId(chatId.toString()); + message.setText(text); + + try { + execute(message); + } catch (TelegramApiException e) { + e.printStackTrace(); + } + } @Override public String getBotUsername() { - - return botUsername; + return botUsername; // Define el nombre de usuario de tu bot } @Override public String getBotToken() { - - return botToken; + return botToken; // Define el token de tu bot } diff --git a/src/main/java/umg/TelegramBot/TelegramBotApplication.java b/src/main/java/umg/TelegramBot/TelegramBotApplication.java index 94922b3..52bac19 100644 --- a/src/main/java/umg/TelegramBot/TelegramBotApplication.java +++ b/src/main/java/umg/TelegramBot/TelegramBotApplication.java @@ -9,6 +9,7 @@ import umg.TelegramBot.Service.TelegramBotService; @SpringBootApplication + public class TelegramBotApplication implements CommandLineRunner { @Autowired diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 0db57f0..6af9abc 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -5,4 +5,21 @@ telegram.bot.username=G4Proga2_bot telegram.bot.token=7632187479:AAHy2vvL_cyZKs36X_8u5NTYuyZjROWlRJU # ApiKey de OpenAI -openai.api.key=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 \ No newline at end of file +openai.api.key=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 + + +#Configuración JPA +spring.datasource.url=jdbc:mysql://localhost:3306/telegram_bot?useSSL=false&serverTimezone=UTC +spring.datasource.username=root +spring.datasource.password= + + + +# Para poder visualizar las consultas +spring.jpa.show-sql=true + +# Actualizar el esquema cada vez que se ejecute +spring.jpa.hibernate.ddl-auto=update + + +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect \ No newline at end of file