const errorHandler = require('../utils/error-handler'); const keyboards = require('../utils/keyboards'); const functions = require('../utils/functions'); const api = require('../network/api'); const commands = require('../commands'); const modelUser = require('../models/user'); module.exports = bot => async callbackQuery => { try { let action = callbackQuery.data; let msg = callbackQuery.message; let user = callbackQuery.from; action = action.split(";"); let userClickedId = action[0] if (userClickedId != parseInt(user.id)) { return bot.answerCallbackQuery(callbackQuery.id, {text: 'Вы не являетесь отправителем сообщения', show_alert: false}); } switch(action[1]) { //Меню выбора истории просмотра аниме case "userAnimeMenu": var body = await api.getProfileById(action[2]) var profile = body.profile if (profile.is_stats_hidden) return bot.answerCallbackQuery(callbackQuery.id, {text: 'У данного пользователя скрыта история просмотра аниме', show_alert: false}); var opts = { chat_id: msg.chat.id, message_id: msg.message_id, parse_mode: 'Markdown', //Форматирование текста reply_markup: await keyboards.userAnimeMenuKeyboard(user.id, profile) }; bot.editMessageText(`*Списки аниме пользователя* \`${profile.login}\`\n\nТут вы можете просмотреть все списки аниме пользователя.\nКнопками ниже выберите интересующую Вас категорию:`, opts); break; //Профиль аниксарта case "profile": var body = await api.getProfileById(action[2]) var profile = body.profile if (body.code == 2 || body == null) return bot.sendMessage(chatId, "Данного профиля не существует"); var opts = { //Опции (клавиатура и т.д.) chat_id: msg.chat.id, message_id: msg.message_id, parse_mode: 'Markdown', //Форматирование текста reply_markup: await keyboards.profileKeyboard(user.id, profile) }; bot.editMessageText(await functions.genProfileText(profile), opts); break; //Список аниме из истории какого-то типа case "userAnimeList": var body = await api.getProfileById(action[5]) var profile = body.profile var listTypeId = parseInt(action[2]) var animeWatchAndName = await functions.getAnimeWatchName(listTypeId, profile) if (animeWatchAndName.animeCount < 1) return bot.answerCallbackQuery(callbackQuery.id, {text: 'Данная категория пуста.', show_alert: false}); var page = parseInt(action[3]) var maxPage = Math.ceil(animeWatchAndName.animeCount/5); var sitePage = Math.floor((page-1)*5/25); if (page < 1) { return bot.answerCallbackQuery(callbackQuery.id, {text: 'Вы уже находитесь на первой странице.', show_alert: false}); } if (action[3] == action[4]) { return bot.answerCallbackQuery(callbackQuery.id, {text: 'Вы не можете этого сделать.', show_alert: false}); } if (page > maxPage) { return bot.answerCallbackQuery(callbackQuery.id, {text: 'Вы уже на последней странице', show_alert: false}); } var jsonAnime = await api.getUserAnimeList(action[5], action[2], sitePage); var getButtonMenu = await functions.getButtonMenu(jsonAnime, page); var text = `*Anixart Anime Lists*\n\n*Список аниме пользователя* \`${profile.login}\`\n- Тип: ${animeWatchAndName.listName}\n- Всего аниме в списке: ${animeWatchAndName.animeCount}\n- Страница: ${page}/${maxPage}\n\n~~~~~~~~~~~~~~~~~~\n` text += getButtonMenu.text var opts = { //Опции (клавиатура и т.д.) chat_id: msg.chat.id, message_id: msg.message_id, parse_mode: 'Markdown', //Форматирование текста reply_markup: await keyboards.userAnimePages(user.id, listTypeId, page, maxPage, getButtonMenu.animeList, profile) }; bot.editMessageText(text, opts); break; //Просмотреть аниме у пользователя case "userCheckAnime": if (action[4] == "none") return bot.answerCallbackQuery(callbackQuery.id, {text: 'Это пустой слот', show_alert: false}); var body = await api.getProfileById(action[5]) var profile = body.profile var listType = action[2]; var page = action[3]; var animeId = action[4]; var animeInfo = await api.getAnimeInfo(animeId) var opts = { //Опции (клавиатура и т.д.) chat_id: msg.chat.id, message_id: msg.message_id, parse_mode: 'Markdown', //Форматирование текста reply_markup: await keyboards.animeCheckHistory(user.id, listType, page, animeId, profile) }; var text = await functions.genAnimeText(animeInfo.release); bot.editMessageText(text, opts); break; case "auth": var text var opts = { //Опции (клавиатура и т.д.) chat_id: msg.chat.id, message_id: msg.message_id, parse_mode: 'Markdown', //Форматирование текста reply_markup: await keyboards.authBack(user.id) }; if(action[2] == "nickname") { text = functions.genAuthNicknameText() } else { text = functions.genAuthIdText() } bot.editMessageText(text, opts); break; case "authMenu": var opts = { //Опции (клавиатура и т.д.) chat_id: msg.chat.id, message_id: msg.message_id, parse_mode: 'Markdown', //Форматирование текста reply_markup: await keyboards.authMenu(user.id) }; var text = await functions.genAuthMenuText(user.id) bot.editMessageText(text, opts); break; case "authConfirm": var anixartId = parseInt(action[2]); var anixartLogin = action[3]; var userDB = await modelUser.findOne({ _id: user.id }); if(!userDB) { await modelUser.firstOrCreate(user, anixartId); } else { await modelUser.updateOne({_id: user.id}, {$set: {anixartId : anixartId}}) await userDB.save() } var opts = { //Опции (клавиатура и т.д.) chat_id: msg.chat.id, message_id: msg.message_id, parse_mode: 'Markdown', //Форматирование текста }; var scfMsg = await bot.editMessageText(`*Anixart Auth Confirm*\n\n✅ Вы *успешно* авторизировались в аккаунт *${anixartLogin}*!\n\nТеперь вам доступно:\nКоманда: /profile \`- просмотр своего профиля\``, opts); functions.deleteMessage(bot, scfMsg, 10) break; case "deleteMessage": try { bot.deleteMessage(msg.chat.id, msg.message_id) } catch (error) { return } break; case "animeMenu": var opts = { //Опции (клавиатура и т.д.) chat_id: msg.chat.id, message_id: msg.message_id, parse_mode: 'Markdown', //Форматирование текста reply_markup: await keyboards.animeMenu(user.id) }; bot.editMessageText(await functions.genAnimeMenuText(), opts); break; case "animeList": //Листы аниме популярное и последнее var animeType = parseInt(action[2]); var newPage = parseInt(action[3]); var page = parseInt(action[4]); var maxPage = 500; var sitePage = Math.floor((newPage-1)*5/25); var category switch(animeType) { case 0: category = "🆕 Последнее" break; case 1: category = "📈 Популярное" break; default: return bot.answerCallbackQuery(callbackQuery.id, {text: 'Произошла ошибка', show_alert: false}); } if (newPage < 1) { return bot.answerCallbackQuery(callbackQuery.id, {text: 'Вы уже находитесь на первой странице.', show_alert: false}); } if (newPage == page) { return bot.answerCallbackQuery(callbackQuery.id, {text: 'Вы не можете этого сделать.', show_alert: false}); } if (newPage > maxPage) { return bot.answerCallbackQuery(callbackQuery.id, {text: 'Вы уже на последней странице', show_alert: false}); } var jsonAnime = await api.getAnimeList(sitePage, animeType); var getButtonMenu = await functions.getButtonMenu(jsonAnime, newPage); var text = `*Anixart Anime Lists*\n\n*Список аниме*\n- Тип: ${category}\n- Всего аниме в списке: 2500\n- Страница: ${newPage}/${maxPage}\n\n~~~~~~~~~~~~~~~~~~\n` text += getButtonMenu.text var opts = { //Опции (клавиатура и т.д.) chat_id: msg.chat.id, message_id: msg.message_id, parse_mode: 'markdown', //Форматирование текста reply_markup: await keyboards.animePages(user.id, animeType, maxPage, newPage, getButtonMenu.animeList) }; bot.editMessageText(text, opts); break; case "checkAnime": //Посмотреть аниме в /anime if (action[4] == "none") return bot.answerCallbackQuery(callbackQuery.id, {text: 'Это пустой слот', show_alert: false}); var animeType = action[2]; var page = action[3]; var animeId = parseInt(action[4]); var animeInfo = await api.getAnimeInfo(animeId) var opts = { //Опции (клавиатура и т.д.) chat_id: msg.chat.id, message_id: msg.message_id, parse_mode: 'Markdown', //Форматирование текста reply_markup: await keyboards.animeCheck(user.id, animeType, page, animeId) }; var text = await functions.genAnimeText(animeInfo.release); bot.editMessageText(text, opts); break; case "animeRandom": var animeInfo = await api.getRandomAnime() if(animeInfo == null || !animeInfo || animeInfo.code == 2 || !animeInfo.release) return bot.answerCallbackQuery(callbackQuery.id, {text: 'Произошла ошибка', show_alert: false}); var opts = { //Опции (клавиатура и т.д.) chat_id: msg.chat.id, message_id: msg.message_id, parse_mode: 'Markdown', //Форматирование текста reply_markup: await keyboards.animeRandom(user.id, animeInfo.release.id) }; var text = await functions.genAnimeText(animeInfo.release); bot.editMessageText(text, opts); break; case "interesting": var newPage = parseInt(action[2]) var page = parseInt(action[3]) var jsonAnime = await api.getInterestingAnime() var maxPage = parseInt(jsonAnime.content.length) if (jsonAnime == null || !jsonAnime || jsonAnime.code == 2 || !jsonAnime.content) return bot.answerCallbackQuery(callbackQuery.id, {text: 'Произошла ошибка', show_alert: false}); if (newPage < 1) { return bot.answerCallbackQuery(callbackQuery.id, {text: 'Вы уже находитесь на первой странице.', show_alert: false}); } if (newPage == page) { return bot.answerCallbackQuery(callbackQuery.id, {text: 'Вы не можете этого сделать.', show_alert: false}); } if (newPage > maxPage) { return bot.answerCallbackQuery(callbackQuery.id, {text: 'Вы уже на последней странице', show_alert: false}); } var text = `*• ${jsonAnime.content[newPage-1].title}*\n${jsonAnime.content[newPage-1].description}\n\n• Аниме: *${newPage}/${maxPage}*\n\`Постер: \`${jsonAnime.content[newPage-1].image}` var opts = { //Опции (клавиатура и т.д.) chat_id: msg.chat.id, message_id: msg.message_id, parse_mode: 'Markdown', //Форматирование текста reply_markup: await keyboards.interestingPages(user.id, newPage, maxPage, parseInt(jsonAnime.content[newPage-1].action)) }; bot.editMessageText(text, opts); break; case "checkInteresting": var newPage = parseInt(action[2]); var animeId = parseInt(action[3]); var animeInfo = await api.getAnimeInfo(animeId); var opts = { //Опции (клавиатура и т.д.) chat_id: msg.chat.id, message_id: msg.message_id, parse_mode: 'Markdown', //Форматирование текста reply_markup: await keyboards.checkInterestingAnime(user.id, animeId, newPage) }; var text = await functions.genAnimeText(animeInfo.release); bot.editMessageText(text, opts); break; case "searchAnimeMenu": var opts = { //Опции (клавиатура и т.д.) chat_id: msg.chat.id, message_id: msg.message_id, parse_mode: 'Markdown', //Форматирование текста reply_markup: await keyboards.searchAnimeMenu(user.id) }; var text = await functions.searchAnimeMenu(); bot.editMessageText(text, opts); break; case "searchAnime": var newPage = parseInt(action[2]) var page = parseInt(action[3]) var animeName = action[4] var jsonAnime = await api.getAnimeByName(animeName) var maxPage = parseInt(Math.ceil(jsonAnime.total_count/5)) if (jsonAnime == null || !jsonAnime || jsonAnime.code == 2 || !jsonAnime.content) return bot.answerCallbackQuery(callbackQuery.id, {text: 'Произошла ошибка', show_alert: false}); if (newPage < 1) { return bot.answerCallbackQuery(callbackQuery.id, {text: 'Вы уже находитесь на первой странице.', show_alert: false}); } if (newPage == page) { return bot.answerCallbackQuery(callbackQuery.id, {text: 'Вы не можете этого сделать.', show_alert: false}); } if (newPage > maxPage) { return bot.answerCallbackQuery(callbackQuery.id, {text: 'Вы уже на последней странице', show_alert: false}); } var getButtonMenu = await functions.getButtonMenu(jsonAnime, newPage) var text = `*🔎 Anixart Anime Lists*\n\n*Список аниме:*\n- По запросу: \`${animeName}\`\n- Всего аниме в списке: ${jsonAnime.total_count}\n- Страница: ${newPage}/${maxPage}\n\n~~~~~~~~~~~~~~~~~~\n` text += getButtonMenu.text var opts = { //Опции (клавиатура и т.д.) chat_id: msg.chat.id, message_id: msg.message_id, parse_mode: 'markdown', //Форматирование текста reply_markup: await keyboards.searchAnime(user.id, maxPage, newPage, getButtonMenu.animeList, animeName) }; bot.editMessageText(text, opts); break; case "searchResult": if (action[4] == "none") return bot.answerCallbackQuery(callbackQuery.id, {text: 'Это пустой слот', show_alert: false}); var newPage = parseInt(action[2]); var animeName = action[3]; var animeId = parseInt(action[4]); var jsonAnime = await api.getAnimeInfo(animeId); var opts = { //Опции (клавиатура и т.д.) chat_id: msg.chat.id, message_id: msg.message_id, parse_mode: 'Markdown', //Форматирование текста reply_markup: await keyboards.searchAnimeBack(user.id, newPage, animeName, animeId) }; var text = await functions.genAnimeText(jsonAnime.release); bot.editMessageText(text, opts); break; default: return; } } catch (error) { errorHandler(bot, callbackQuery.message.chat.id, error) } };