AnixartBot/handlers/callback-query.js
2022-08-10 13:06:23 +02:00

366 lines
19 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
}
};