diff options
author | mavlonerkinboev <mavlonbek.ibragimov007@gmail.com> | 2021-08-26 10:32:29 +0500 |
---|---|---|
committer | mavlonerkinboev <mavlonbek.ibragimov007@gmail.com> | 2021-08-26 10:32:29 +0500 |
commit | eea88e5f236638862c94ce3e8cc958309a8a7d8b (patch) | |
tree | f26c76f224673ce07d334f73a908ff575e119cb1 /src/main/java/com/mavlushechka/animarfo/telegram | |
parent | 59f54892f90eda23bcca45cc07d466c105db75ef (diff) |
Change path
Diffstat (limited to 'src/main/java/com/mavlushechka/animarfo/telegram')
5 files changed, 423 insertions, 0 deletions
diff --git a/src/main/java/com/mavlushechka/animarfo/telegram/bot/Bot.java b/src/main/java/com/mavlushechka/animarfo/telegram/bot/Bot.java new file mode 100644 index 0000000..c891716 --- /dev/null +++ b/src/main/java/com/mavlushechka/animarfo/telegram/bot/Bot.java @@ -0,0 +1,97 @@ +package com.mavlushechka.animarfo.telegram.bot; + +import com.mavlushechka.animarfo.App; +import com.mavlushechka.animarfo.anime.Anime; +import com.mavlushechka.animarfo.parser.Parser; +import com.mavlushechka.animarfo.telegram.user.TelegramUser; +import com.mavlushechka.animarfo.telegram.user.callbackquery.UserCallbackQuery; +import com.mavlushechka.animarfo.telegram.user.keyboard.UserKeyboard; +import com.mavlushechka.animarfo.telegram.user.message.UserMessage; +import com.pengrad.telegrambot.TelegramBot; +import com.pengrad.telegrambot.UpdatesListener; +import com.pengrad.telegrambot.model.User; +import com.pengrad.telegrambot.model.request.ParseMode; +import com.pengrad.telegrambot.request.SendMessage; +import com.pengrad.telegrambot.request.SendPhoto; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.logging.Level; +import java.util.logging.Logger; + +// TODO: 7/25/21 Добавить Аниме OVA, аниме по жанру, Дорамы, случайное аниме + +public class Bot { + public final static TelegramBot TELEGRAM_BOT = new TelegramBot(App.PROPERTIES.getProperty("BOT_TOKEN")); + public static TelegramUser telegramUser = new TelegramUser(); + private static final Logger LOGGER = Logger.getLogger(Bot.class.getName()); + static { + LOGGER.setLevel(Level.ALL); + } + + public static void start() { + LOGGER.fine("Bot is started"); + TELEGRAM_BOT.setUpdatesListener(updates -> { + updates.forEach(update -> { + if (update.callbackQuery() != null) { + try { + UserCallbackQuery.execute(update.callbackQuery()); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (update.message() != null) { + User user = update.message().from(); + SimpleDateFormat simpleDateFormat = new java.text.SimpleDateFormat("dd.MM.yyyy HH:mm:ss z"); + simpleDateFormat.setTimeZone(java.util.TimeZone.getTimeZone("GMT+5")); + String formattedDate = simpleDateFormat.format(new java.util.Date(update.message().date() * 1000L)); + telegramUser = new TelegramUser(user.id(), user.isBot(), user.firstName(), user.lastName(), user.username(), formattedDate); + try { + UserMessage.execute(update.message()); + } catch (IOException e) { + e.printStackTrace(); + } + } + }); + return UpdatesListener.CONFIRMED_UPDATES_ALL; + }); + } + + public static void sendAnime(String url) { + Anime[] anime = new Anime[28]; + byte index = Anime.index; + try { + anime = Parser.getAnime(url); + } catch (IOException e) { + e.printStackTrace(); + } + Anime.setList(anime); + TELEGRAM_BOT.execute(new SendPhoto(UserMessage.chatId, anime[index].getImage()).caption(anime[index].showInfo()).parseMode(ParseMode.HTML).replyMarkup(UserKeyboard.getCarousel())); + } + + public static void sendAnimeByCallBackQuery() { + Anime[] anime = Anime.list; + byte index = Anime.index; + TELEGRAM_BOT.execute(new SendPhoto(UserCallbackQuery.chatId, anime[index].getImage()).caption(anime[index].showInfo()).parseMode(ParseMode.HTML).replyMarkup(UserKeyboard.getCarousel())); + } + + public static void sendSearchedAnime() throws IOException { + String searchedAnime = Anime.searched; + byte index = Anime.index; + byte animeAtSearchSize = Parser.getSizeOfSearchedAnime("https://anime.anidub.life/?do=search&mode=advanced&subaction=search&titleonly=3&story=" + searchedAnime); + if (animeAtSearchSize > 0) { + Anime[] anime = new Anime[animeAtSearchSize]; + try { + anime = Parser.getAnime("https://anime.anidub.life/?do=search&mode=advanced&subaction=search&titleonly=3&story=" + searchedAnime); + } catch (IOException e) { + e.printStackTrace(); + } + Anime.size = animeAtSearchSize; + Anime.setList(anime); + TELEGRAM_BOT.execute(new SendPhoto(UserMessage.chatId, anime[index].getImage()).caption(anime[index].showInfo()).parseMode(ParseMode.HTML).replyMarkup(UserKeyboard.getCarousel())); + } else { + TELEGRAM_BOT.execute(new SendMessage(UserMessage.chatId, "Прости, но я не смог найти аниме с таким названием...\nДавай поищем другое аниме!")); + Anime.isSearching = true; + } + } +} diff --git a/src/main/java/com/mavlushechka/animarfo/telegram/user/TelegramUser.java b/src/main/java/com/mavlushechka/animarfo/telegram/user/TelegramUser.java new file mode 100644 index 0000000..f30042c --- /dev/null +++ b/src/main/java/com/mavlushechka/animarfo/telegram/user/TelegramUser.java @@ -0,0 +1,69 @@ +package com.mavlushechka.animarfo.telegram.user; + +public class TelegramUser { + private long id; + private Boolean isBot; + private String firstName; + private String lastName; + private String username; + private String date; + + public TelegramUser(long id, boolean isBot, String firstName, String lastName, String username, String date) { + this.id = id; + this.isBot = isBot; + this.firstName = firstName; + this.lastName = lastName; + this.username = username; + this.date = date; + } + + public TelegramUser() { } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Boolean getIsBot() { + return isBot; + } + + public void setIsBot(Boolean bot) { + isBot = bot; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } +} diff --git a/src/main/java/com/mavlushechka/animarfo/telegram/user/callbackquery/UserCallbackQuery.java b/src/main/java/com/mavlushechka/animarfo/telegram/user/callbackquery/UserCallbackQuery.java new file mode 100644 index 0000000..1169ec0 --- /dev/null +++ b/src/main/java/com/mavlushechka/animarfo/telegram/user/callbackquery/UserCallbackQuery.java @@ -0,0 +1,95 @@ +package com.mavlushechka.animarfo.telegram.user.callbackquery; + +import com.mavlushechka.animarfo.anime.Anime; +import com.mavlushechka.animarfo.telegram.bot.Bot; +import com.mavlushechka.animarfo.telegram.user.keyboard.UserKeyboard; +import com.mavlushechka.animarfo.telegram.user.message.UserMessage; +import com.pengrad.telegrambot.model.CallbackQuery; +import com.pengrad.telegrambot.model.User; +import com.pengrad.telegrambot.model.request.Keyboard; +import com.pengrad.telegrambot.model.request.ParseMode; +import com.pengrad.telegrambot.request.DeleteMessage; +import com.pengrad.telegrambot.request.SendMessage; +import com.pengrad.telegrambot.request.SendPhoto; + +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class UserCallbackQuery extends com.pengrad.telegrambot.model.CallbackQuery { + public static CallbackQuery callbackQuery; + public static String data; + public static User user; + public static long userId; + public static int messageId; + public static long chatId; + private static final Logger LOGGER = Logger.getLogger(UserCallbackQuery.class.getName()); + + static { + LOGGER.setLevel(Level.ALL); + } + + public static void setInformation(CallbackQuery _callbackQuery) { + callbackQuery = _callbackQuery; + data = _callbackQuery.data(); + user = _callbackQuery.from(); + userId = _callbackQuery.from().id(); + messageId = _callbackQuery.message().messageId(); + chatId = _callbackQuery.message().chat().id(); + } + + public static void execute(CallbackQuery callbackQuery) throws IOException { + UserCallbackQuery.setInformation(callbackQuery); + + switch (data) { + case "previous" -> { + if (Anime.index == 0) { + Anime.setIndex((byte) (Anime.size-1)); + } else { + Anime.decreaseIndexOfAnime(); + } + Bot.sendAnimeByCallBackQuery(); + } + case "next" -> { + if (Anime.index == Anime.size-1) { + Anime.setIndex((byte) 0); + } else { + Anime.increaseIndexOfAnime(); + } + Bot.sendAnimeByCallBackQuery(); + } + case "watchOrDownload" -> { + Anime[] anime = Anime.list; + byte index = Anime.index; + Keyboard anidub = UserKeyboard.getAnidub(); + if (UserKeyboard.seriesSize > 0) { + Bot.TELEGRAM_BOT.execute(new SendPhoto(UserMessage.chatId, anime[index].getImage()).caption(anime[index].showInfo()).parseMode(ParseMode.HTML).replyMarkup(anidub)); + } else { + Bot.TELEGRAM_BOT.execute(new SendMessage(UserMessage.chatId, "Прости, но я не смог найти серии для этого аниме... :(")); + } + } + case "anidub" -> { + Anime.dub = "Anidub"; + String url = null; + if (Anime.type != null) { + switch (Anime.type) { + case "Ongoing" -> url = "https://online.anidub.com/anime/anime_ongoing/"; + case "Serials" -> url = "https://online.anidub.com/anime/full/"; + case "Films" -> url = "https://online.anidub.com/anime_movie/"; + } + } + Anime.setIndex((byte) 0); + if (!Anime.isSearching) { + Bot.sendAnime(url); + } else { + Bot.TELEGRAM_BOT.execute(new SendMessage(UserMessage.chatId, "Введи название аниме")); + } + Anime.type = null; + } + } + + DeleteMessage deleteMessage = new DeleteMessage(chatId, messageId); + Bot.TELEGRAM_BOT.execute(deleteMessage); + LOGGER.fine("CallbackQuery is executed"); + } +} diff --git a/src/main/java/com/mavlushechka/animarfo/telegram/user/keyboard/UserKeyboard.java b/src/main/java/com/mavlushechka/animarfo/telegram/user/keyboard/UserKeyboard.java new file mode 100644 index 0000000..5b43f25 --- /dev/null +++ b/src/main/java/com/mavlushechka/animarfo/telegram/user/keyboard/UserKeyboard.java @@ -0,0 +1,88 @@ +package com.mavlushechka.animarfo.telegram.user.keyboard; + +import com.mavlushechka.animarfo.anime.Anime; +import com.mavlushechka.animarfo.parser.Parser; +import com.pengrad.telegrambot.model.request.Keyboard; +import com.pengrad.telegrambot.model.request.InlineKeyboardButton; +import com.pengrad.telegrambot.model.request.InlineKeyboardMarkup; +import com.pengrad.telegrambot.model.request.ReplyKeyboardMarkup; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import java.io.IOException; +import java.util.ArrayList; + +public class UserKeyboard { + public static short seriesSize; + + public static Keyboard getMain() { + return new ReplyKeyboardMarkup( + new String[]{"Поиск", "Онгоинги"}, + new String[]{"Сериалы", "Фильмы"}, + new String[]{"Помощь", "Информация"}) + .oneTimeKeyboard(true) + .resizeKeyboard(true) + .selective(true); + } + + public static Keyboard getCarousel() { + InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup(); + + inlineKeyboardMarkup.addRow(new InlineKeyboardButton("Смотреть / Скачать").callbackData("watchOrDownload")); + inlineKeyboardMarkup.addRow(new InlineKeyboardButton("Пред.").callbackData("previous"), new InlineKeyboardButton("След.").callbackData("next")); + + return inlineKeyboardMarkup; + } + + public static Keyboard getDub() { + return new InlineKeyboardMarkup(new InlineKeyboardButton("Anidub").callbackData("anidub")); + } + + public static Keyboard getAnidub() throws IOException { + Anime[] anime = Anime.list; + Anime thisAnime = anime[Anime.index]; + + Elements seriesList = Parser.getPage(thisAnime.getUrl()).select("div[class=tabs-b video-box]").next().select("span"); + ArrayList<String> series = new ArrayList<>(); + ArrayList<String> seriesUrls = new ArrayList<>(); + + for (Element seriesTemp : seriesList) { + series.add(Jsoup.parse(String.valueOf(seriesTemp)).text()); + } + + for (Element seriesTemp : seriesList) { + String text = seriesTemp.toString(); + int start = text.indexOf("=\"") + 2; + int end = text.indexOf("\" "); + char[] dst = new char[end - start]; + text.getChars(start, end, dst, 0); + seriesUrls.add(String.valueOf(dst)); + } + + InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup(); + seriesSize = (short) series.size(); + for (int i = 0; i < seriesSize; i++) { + if (i+2 < seriesSize) { + inlineKeyboardMarkup.addRow( + new InlineKeyboardButton(series.get(i)).url(seriesUrls.get(i)), + new InlineKeyboardButton(series.get(i+1)).url(seriesUrls.get(i+1)), + new InlineKeyboardButton(series.get(i+2)).url(seriesUrls.get(i+2)) + ); + i += 2; + } else if (i+1 < seriesSize) { + inlineKeyboardMarkup.addRow( + new InlineKeyboardButton(series.get(i)).url(seriesUrls.get(i)), + new InlineKeyboardButton(series.get(i+1)).url(seriesUrls.get(i+1)) + ); + i++; + } else { + inlineKeyboardMarkup.addRow( + new InlineKeyboardButton(series.get(i)).url(seriesUrls.get(i)) + ); + } + } + + return inlineKeyboardMarkup; + } +} diff --git a/src/main/java/com/mavlushechka/animarfo/telegram/user/message/UserMessage.java b/src/main/java/com/mavlushechka/animarfo/telegram/user/message/UserMessage.java new file mode 100644 index 0000000..423103f --- /dev/null +++ b/src/main/java/com/mavlushechka/animarfo/telegram/user/message/UserMessage.java @@ -0,0 +1,74 @@ +package com.mavlushechka.animarfo.telegram.user.message; + +import com.mavlushechka.animarfo.anime.Anime; +import com.mavlushechka.animarfo.telegram.user.keyboard.UserKeyboard; +import com.mavlushechka.animarfo.database.Database; +import com.mavlushechka.animarfo.telegram.bot.Bot; +import com.pengrad.telegrambot.model.Message; +import com.pengrad.telegrambot.model.request.ParseMode; +import com.pengrad.telegrambot.request.SendMessage; + +import java.io.IOException; +import java.util.HashMap; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class UserMessage { + public static Message message; + public static String text; + public static long chatId; + private static final HashMap<String, String> animeTypes = new HashMap<>(); + private static final Logger LOGGER = Logger.getLogger(UserMessage.class.getName()); + + static { + LOGGER.setLevel(Level.ALL); + } + + static { + animeTypes.put("Онгоинги", "Ongoing"); + animeTypes.put("Сериалы", "Serials"); + animeTypes.put("Фильмы", "Films"); + } + + public static void setInformation(Message message) { + UserMessage.message = message; + UserMessage.text = message.text(); + UserMessage.chatId = message.chat().id(); + } + + public static void execute(Message message) throws IOException { + UserMessage.setInformation(message); + + if (animeTypes.get(UserMessage.text) != null || UserMessage.text.equals("Поиск")) { + if (UserMessage.text.equals("Поиск")) { + Anime.isSearching = true; + } else { + Anime.isSearching = false; + Anime.type = animeTypes.get(UserMessage.text); + } + Bot.TELEGRAM_BOT.execute(new SendMessage(UserMessage.chatId, "В какой озвучке будем смотреть?").replyMarkup(UserKeyboard.getDub())); + } else if (UserMessage.text.equals("/start") || UserMessage.text.equals("Информация")) { + Anime.isSearching = false; + Bot.TELEGRAM_BOT.execute(new SendMessage(UserMessage.chatId, ("Приветик, меня звать AniMarfo. Благодаря мне тебе не надо будет самому искать в интернете аниме-тайтлы и подходящую тебе озвучку или же субтитры. \n\nНа данный момент я умею искать аниме по названию, а также находить недавние онгоинги, сериалы и фильмы.\nДоступные озвучки: Anidub.\n\nВыбери одну из команд на твоей клавиатуре, для того чтобы начать увлекательное путешествие в мир аниме :3")).replyMarkup(UserKeyboard.getMain())); + } else if (UserMessage.text.equals("Помощь")) { + Anime.isSearching = false; + Bot.TELEGRAM_BOT.execute(new SendMessage(UserMessage.chatId, ("<b>Вопрос</b>: Как скачать аниме с телефона?\n<b>Ответ</b>: Воспроизведи видео, удерживай палец на видео и после появления окна с действиями, нажми на кнопку \"Сохранить файл на устройстве\".\n\n<b>Вопрос</b>: Как скачать аниме с компьютера?\n<b>Ответ</b>: Воспроизведи видео, нажми на правую кнопку мышки по видео и после появления окна с действиями, нажми левой кнопкой мышки на кнопку \"Сохранить Видео как...\", после чего тебе необходимо будет указать путь для загрузки.")).parseMode(ParseMode.HTML).replyMarkup(UserKeyboard.getMain())); + } else { + if (Anime.isSearching && Anime.dub != null) { + Anime.setSearched(UserMessage.text); + try { + Bot.sendSearchedAnime(); + } catch (IOException e) { + e.printStackTrace(); + } + Anime.isSearching = false; + } else { + Anime.isSearching = false; + Bot.TELEGRAM_BOT.execute(new SendMessage(UserMessage.chatId, "Прости, но я тебя не понимаю, воспользуйся командами на твоей клавиатуре.").replyMarkup(UserKeyboard.getMain())); + } + } + LOGGER.fine("Message is executed"); + + Database.saveUser(Bot.telegramUser); + } +} |