From 5d5f6c63dab537f7ae15e0e9ae492c23c2b3ad31 Mon Sep 17 00:00:00 2001 From: Anna Khairillina Date: Sun, 1 Dec 2024 23:38:46 +0500 Subject: [PATCH] new package for sevices --- src/main/java/org/oopproject/TelegramBot.java | 125 +----------------- .../services/BroadcastingService.java | 72 ++++++++++ .../org/oopproject/services/MovieService.java | 83 ++++++++++++ 3 files changed, 158 insertions(+), 122 deletions(-) create mode 100644 src/main/java/org/oopproject/services/BroadcastingService.java create mode 100644 src/main/java/org/oopproject/services/MovieService.java diff --git a/src/main/java/org/oopproject/TelegramBot.java b/src/main/java/org/oopproject/TelegramBot.java index 5852d29..9cb8ecb 100644 --- a/src/main/java/org/oopproject/TelegramBot.java +++ b/src/main/java/org/oopproject/TelegramBot.java @@ -2,13 +2,8 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; -import feign.Feign; -import feign.Logger; -import feign.gson.GsonDecoder; -import feign.gson.GsonEncoder; import org.oopproject.deserializers.ListDeserializer; -import org.oopproject.deserializers.MovieVideosResponse; -import org.oopproject.deserializers.VideoDeserializer; +import org.oopproject.services.BroadcastingService; import org.oopproject.utils.CommandWaiter; import org.oopproject.utils.Genres; import org.oopproject.parameters.MovieParameters; @@ -21,12 +16,8 @@ import static org.oopproject.utils.Validators.isCommand; import static org.oopproject.utils.Replies.getReply; import java.lang.reflect.Type; -import java.sql.SQLException; -import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.*; -import java.util.stream.Collectors; import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardRow; import org.telegram.telegrambots.meta.generics.TelegramClient; @@ -51,9 +42,9 @@ public class TelegramBot implements LongPollingSingleThreadUpdateConsumer { private final HashMap genreMovieIndexMap = new HashMap<>(); private final Map commandWaiter = new ConcurrentHashMap<>(); - public TelegramBot(String botToken) throws SQLException { + public TelegramBot(String botToken) { telegramClient = new OkHttpTelegramClient(botToken); - BroadcastingService broadcastingService = new BroadcastingService(); // Initialize BroadcastingService + BroadcastingService broadcastingService = new BroadcastingService(database, telegramClient); broadcastingService.startBroadcasting(); } @Override @@ -328,117 +319,7 @@ public Integer getUserAge(long chatId) { return database.getUserAge(chatId); } - public class MovieService { - private SiteRequests siteRequests; - private int currentPage; - - public MovieService() { - siteRequests = Feign.builder() - .encoder(new GsonEncoder()) - .decoder(new GsonDecoder()) - .logLevel(Logger.Level.FULL) - .target(SiteRequests.class, "https://api.themoviedb.org/3"); - this.currentPage = 1; - } - - private boolean isUpcoming(String releaseDate) { - try { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - Date release = sdf.parse(releaseDate); - Date now = new Date(); - return release.after(now); - } catch (ParseException e) { - e.printStackTrace(); - } - return false; - } - public List getUpcomingMovies() { - try { - ListDeserializer upcomingMovies = siteRequests.findUpcomingMovies( - "240e7fef369901fb314c80d53d1532d1", - "ru", - currentPage - ); - - if (upcomingMovies != null && upcomingMovies.results != null) { - List resultList = upcomingMovies.results.stream() - .filter(movie -> isUpcoming(movie.release_date)) - .limit(10) // Ограничиваем до 10 фильмов - .collect(Collectors.toList()); - for (FilmDeserializer movie : resultList) { - MovieVideosResponse videoResponse = siteRequests.getMovieVideos( - "240e7fef369901fb314c80d53d1532d1", - String.valueOf(movie.id), - "ru" - ); - - if (videoResponse != null && videoResponse.results != null && !videoResponse.results.isEmpty()) { - // Найдем первый трейлер (если он есть) - VideoDeserializer trailer = videoResponse.results.stream() - .filter(v -> v.site.equals("YouTube")) - .findFirst() - .orElse(null); - - if (trailer != null) { - // Формируем ссылку на трейлер - movie.trailerUrl = "https://www.youtube.com/watch?v=" + trailer.key; - } - } - } - currentPage++; - return resultList; - } - } catch (Exception e) { - e.printStackTrace(); - } - return Collections.emptyList(); - } - } - - public class BroadcastingService { - - private MovieService movieService; - - public BroadcastingService() { - this.movieService = new MovieService(); - } - - public void startBroadcasting() { - scheduler.scheduleAtFixedRate(() -> { - List subscribedUsers = database.getSubscribedUsers(); - List upcomingMovies = movieService.getUpcomingMovies(); - - for (Long chatId : subscribedUsers) { - StringBuilder messageText = new StringBuilder("🎬 Фильмы, которые скоро выйдут:\n"); - - if (upcomingMovies.isEmpty()) { - messageText.append("К сожалению, нет новых фильмов на данный момент."); - } else { - for (int i = 0; i < upcomingMovies.size(); i++) { - FilmDeserializer movie = upcomingMovies.get(i); - messageText.append(i + 1) - .append(". ") - .append(movie.title) - .append("\n") - .append("Дата выхода: ") - .append(movie.release_date) - .append("\n") - .append("Описание: ") - .append(movie.overview != null && !movie.overview.isEmpty() ? movie.overview : "Нет описания") - .append("\n"); - if (movie.trailerUrl != null) { - messageText.append("Ссылка на трейлер: ").append(movie.trailerUrl).append("\n"); - } - - messageText.append("\n"); - } - } - sendMessage(chatId, messageText.toString()); - } - }, 0, 1, TimeUnit.MINUTES); - } - } private void sendMessage(long chatId, String text) { SendMessage message=SendMessage.builder() diff --git a/src/main/java/org/oopproject/services/BroadcastingService.java b/src/main/java/org/oopproject/services/BroadcastingService.java new file mode 100644 index 0000000..2b68fa3 --- /dev/null +++ b/src/main/java/org/oopproject/services/BroadcastingService.java @@ -0,0 +1,72 @@ +package org.oopproject.services; + +import org.oopproject.Database; +import org.oopproject.deserializers.FilmDeserializer; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import org.telegram.telegrambots.meta.exceptions.TelegramApiException; +import org.telegram.telegrambots.meta.generics.TelegramClient; + +import java.util.List; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +public class BroadcastingService { + private final Database database; + private final MovieService movieService; + private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); + private final TelegramClient telegramClient; + + public BroadcastingService(Database database, TelegramClient telegramClient) { + this.database = database; + this.telegramClient = telegramClient; + this.movieService = new MovieService(); + } + + public void startBroadcasting() { + scheduler.scheduleAtFixedRate(() -> { + List subscribedUsers = database.getSubscribedUsers(); + List upcomingMovies = movieService.getUpcomingMovies(); + + for (Long chatId : subscribedUsers) { + StringBuilder messageText = new StringBuilder("🎬 Фильмы, которые скоро выйдут:\n"); + + if (upcomingMovies.isEmpty()) { + messageText.append("К сожалению, нет новых фильмов на данный момент."); + } else { + for (int i = 0; i < upcomingMovies.size(); i++) { + FilmDeserializer movie = upcomingMovies.get(i); + messageText.append(i + 1) + .append(". ") + .append(movie.title) + .append("\n") + .append("Дата выхода: ") + .append(movie.release_date) + .append("\n") + .append("Описание: ") + .append(movie.overview != null && !movie.overview.isEmpty() ? movie.overview : "Нет описания") + .append("\n"); + if (movie.trailerUrl != null) { + messageText.append("Ссылка на трейлер: ").append(movie.trailerUrl).append("\n"); + } + + messageText.append("\n"); + } + } + sendMessage(chatId, messageText.toString()); + } + }, 0, 3, TimeUnit.DAYS); + } + + private void sendMessage(long chatId, String text) { + SendMessage message = SendMessage.builder() + .chatId(chatId) + .text(text) + .build(); + try { + telegramClient.execute(message); + } catch (TelegramApiException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/org/oopproject/services/MovieService.java b/src/main/java/org/oopproject/services/MovieService.java new file mode 100644 index 0000000..682d6d1 --- /dev/null +++ b/src/main/java/org/oopproject/services/MovieService.java @@ -0,0 +1,83 @@ +package org.oopproject.services; + +import feign.Feign; +import feign.Logger; +import feign.gson.GsonDecoder; +import feign.gson.GsonEncoder; +import org.oopproject.SiteRequests; +import org.oopproject.deserializers.FilmDeserializer; +import org.oopproject.deserializers.ListDeserializer; +import org.oopproject.deserializers.MovieVideosResponse; +import org.oopproject.deserializers.VideoDeserializer; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +public class MovieService { + private SiteRequests siteRequests; + private int currentPage; + + public MovieService() { + siteRequests = Feign.builder() + .encoder(new GsonEncoder()) + .decoder(new GsonDecoder()) + .logLevel(Logger.Level.FULL) + .target(SiteRequests.class, "https://api.themoviedb.org/3"); + this.currentPage = 1; + } + + private boolean isUpcoming(String releaseDate) { + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Date release = sdf.parse(releaseDate); + Date now = new Date(); + return release.after(now); + } catch (ParseException e) { + e.printStackTrace(); + } + return false; + } + public List getUpcomingMovies() { + try { + ListDeserializer upcomingMovies = siteRequests.findUpcomingMovies( + "240e7fef369901fb314c80d53d1532d1", + "ru", + currentPage + ); + + if (upcomingMovies != null && upcomingMovies.results != null) { + List resultList = upcomingMovies.results.stream() + .filter(movie -> isUpcoming(movie.release_date)) + .limit(10) // Ограничиваем до 10 фильмов + .collect(Collectors.toList()); + for (FilmDeserializer movie : resultList) { + MovieVideosResponse videoResponse = siteRequests.getMovieVideos( + "240e7fef369901fb314c80d53d1532d1", + String.valueOf(movie.id), + "ru" + ); + + if (videoResponse != null && videoResponse.results != null && !videoResponse.results.isEmpty()) { + VideoDeserializer trailer = videoResponse.results.stream() + .filter(v -> v.site.equals("YouTube")) + .findFirst() + .orElse(null); + + if (trailer != null) { + movie.trailerUrl = "https://www.youtube.com/watch?v=" + trailer.key; + } + } + } + currentPage++; + return resultList; + } + } catch (Exception e) { + e.printStackTrace(); + } + return Collections.emptyList(); + } +}