const api = require("../network/api"); const modelUser = require('../models/user'); exports.getHistoryText = async (history) => { // Функция, генерирующая текст истории просмотров последних 5 аниме let text = `` if (history.length == 0) { text = "отсутствует"; return text; } text += `\n` for (let i = 0; i < history.length; i++) { text += ` \`• ${history[i].title_ru} • ${history[i].last_view_episode.name}\`\n`; // {name}, {last view episode} } return text; } exports.genProfileText = async (profile) => { // Функция, генерирующая всю информацию профиля пользователя let roles = `` if(profile.roles.length != 0) { // Если человек имеет роли (Модератор, Администратор, Даббер) кидаем всё в переменную for (let i = 0; i < profile.roles.length; i++) { roles += profile.roles[i].name + `${i == profile.roles.length-1 ? `` : `, `}` } } let text = `*Anixart Profile Info*\n\n` + `*Никнейм:* ${profile.is_sponsor ? `👑 ` : ``}${profile.login}${profile.is_verified ? ` ✔️` : ``} [[${profile.rating_score}]]\n` + `*Описание:* \`${profile.status == "" ? "Отсутствует" : profile.status}\`\n` + `*Статус:* _${profile.is_online ? "онлайн" : "оффлайн"}_\n` + `${profile.roles.length != 0 ? `*Роли*: ${roles}\n\n` : `\n`}` + `${profile.is_counts_hidden ? `` : `*Комментов:* ${profile.comment_count} | *Видео*: ${profile.video_count}\n*Коллекций:* ${profile.collection_count} | *Друзей:* ${profile.friend_count}\n\n`}` + `*Приватность:* \n • Статистика ${profile.is_stats_hidden ? "_скрыта_" : "_открыта_"}\n • Активность ${profile.is_counts_hidden ? "_скрыта_" : "_открыта_"}\n\n` + `${profile.is_stats_hidden ? `` : `*🟩 Смотрю:* ${profile.watching_count}`}\n` + `${profile.is_stats_hidden ? `` : `*🟪 В планах:* ${profile.plan_count}`}\n` + `${profile.is_stats_hidden ? `` : `*🟦 Просмотрено:* ${profile.completed_count}`}\n` + `${profile.is_stats_hidden ? `` : `*🟨 Отложено:* ${profile.hold_on_count}`}\n` + `${profile.is_stats_hidden ? `` : `*🟥 Брошено:* ${profile.dropped_count}`}\n\n`+ `${profile.is_stats_hidden ? `` : `*Просмотрено недавно:* ` + await exports.getHistoryText(profile.history)}\n\n` return text } exports.genAnimeText = async (anime) => { // Функция, генерирующая всю информацию об аниме let image = anime.image //Просто постер let countrySmile = exports.getCountrySmile(anime.country); //Смайлик страны (Китай, Япония) let date //Дата if (anime.release_date) date = exports.getMounthYear(anime.release_date); //Месяц выпуска аниме (Осень, Зима) let episodes = anime.episodes_total == anime.episodes_released ? `${anime.episodes_total ? anime.episodes_total : `?`} эп.` : `${anime.episodes_released ? anime.episodes_released : `?`} из ${anime.episodes_total ? anime.episodes_total : `?`} эп.` //Кол-во эпизодов if (anime.duration) episodes += ` по ~${anime.duration} мин.` //Текст длительности let studio = `` //Студия, авторы anime.studio ? studio += `Студия \`${anime.studio}\`` : studio += ``; //Если есть студия, добавляем её anime.author ? studio == `` ? studio += `Автор \`${anime.author}\`` : studio += `, автор \`${anime.author}\`,` : studio += `` //Если есть автор, то добавляем его anime.director ? studio += ` режиссёр \`${anime.director}\`` : studio += `` //Добавляем режиссёра при наличии его let rating = `⭐️ Рейтинг: *${(anime.grade).toFixed(1)}* • \`${anime.vote_count} ${exports.declension(anime.vote_count, ["голос", "голоса", "голосов"])}\`\n`; let text = `*${anime.title_ru}*\n` + `${countrySmile} ${anime.country}${date == null ? "" : `, ${date}`}${anime.year ? `, ${anime.year} г.` : ``}\n` + `📺 ${episodes}\n` + `📅 ${anime.category.name}, ${(anime.status.name).toLowerCase()}\n` + `${studio ? `👥 ${studio}\n\n` : `\n`}` + `*• Жанры:* ${anime.genres}\n\n` + `\`${anime.description ? anime.description : `Описание не указано`}\`\n\n` + `${anime.note ? `*${exports.removeTags(anime.note)}*\n\n` : ``}` + `${anime.status.id == 3 ? `` : rating}` + //Рейтинг + склонения `🔸 Избранное: *${anime.favorites_count}*\n\n` + `\`- Постер: \`${image}` return text } exports.getNumberEmoji = number => { //Любое число в смайлики number = number.toString(); return number .replace(/0/g, '0️⃣') .replace(/1/g, '1️⃣') .replace(/2/g, '2️⃣') .replace(/3/g, '3️⃣') .replace(/4/g, '4️⃣') .replace(/5/g, '5️⃣') .replace(/6/g, '6️⃣') .replace(/7/g, '7️⃣') .replace(/8/g, '8️⃣') .replace(/9/g, '9️⃣'); }; exports.declension = (number, words) => { //Склонения return words[(number % 100 > 4 && number % 100 < 20) ? 2 : [2, 0, 1, 1, 1, 2][(number % 10 < 5) ? Math.abs(number) % 10 : 5]]; } exports.getCountrySmile = country => { //Смайлик в зависимости от страны let countrySmile switch(country) { case "Япония": countrySmile = "🇯🇵" break; case "Китай": countrySmile = "🇨🇳" break; default: countrySmile = "🏳️" break; } return countrySmile; } exports.getMounthYear = number => { //Получить месяц. moment.js огромная либа, проще не нагружать и сделать так let mounth let date = number.split(".") switch (parseInt(date[1])) { case 1: case 2: case 12: mounth = "зима" break; case 3: case 4: case 5: mounth = "весна" break; case 6: case 7: case 8: mounth = "лето" break; case 9: case 10: case 11: mounth = "осень" break; default: mounth = "неизвестно" break; } return mounth; }; exports.getAnimeWatchName = (listTypeId, profile) => { //Получаем название и кол-во аниме let animeCount, listName switch (listTypeId) { case 1: animeCount = profile.watching_count; listName = "🟩 Смотрю" break; case 2: animeCount = profile.plan_count; listName = "🟪 В планах" break; case 3: animeCount = profile.completed_count; listName = "🟦 Просмотрено" break; case 4: animeCount = profile.hold_on_count; listName = "🟨 Отложено" break; case 5: animeCount = profile.dropped_count; listName = "🟥 Брошено" break; default: animeCount = 0; listName = "Неизвестно" } return {animeCount: animeCount, listName: listName} } exports.removeTags = html => { let text = html.replace(`
`, `\n`) return text.replace(/<(?:.|\n)*?>/gm, ' '); } exports.genAuthMenuText = async (id) => { let user = await modelUser.findOne({ _id: id }) let profile if(user) profile = await api.getProfileById(user.anixartId); let text = `*Anixart Auth*\n\nДля того, чтобы просматривать свой профиль в *Anixart Info*,\n` + `Вам требуется авторизироваться.\n\n` + `Существует \`два способа\` авторизации:\n` + `1️⃣ - С помощью вашего ника в *Anixart*\n` + `2️⃣ - с помощью вашего *ID*\n\n` + `Выберите понравившийся способ, чтобы получить больше информации:\n\n` + `${user ? `*В данный момент вы уже *\`авторизированы\` *под логином* *${profile.profile.login}*` : ``}` return text } exports.genAuthNicknameText = () => { let text = `*Anixart Nickname Auth*\n\n` + `❓ Авторизация с помощью \`никнейма\`:\n` + `Для того, чтобы авторизироваться, используя свой никнейм из *Anixart*, Вам требуется:\n` + `1️⃣ Прописать команду:\n/account *ваш_ник*` return text } exports.genAuthIdText = () => { let text = `*Anixart Id Auth*\n\n` + `❓ Авторизация с помощью \`айди\`:\n` + `Для того, чтобы авторизироваться, используя свой \`айди\` из *Anixart*, Вам требуется:\n\n` + `1️⃣ Зайти в профиль аниксарта\n` + `2️⃣ Найти и зажать своё имя на пару секунд, после чего\n` + `у Вас скопируется ссылка на Ваш профиль (см. скриншот)\n` + `3️⃣ Прописать команду /account *ссылка_на_профиль*\n\n` + `\`- Скриншот: \`https://imgur.com/a/PzKq6sq` return text } exports.genAuthConfirmText = async (user) => { let text = `*Anixart Confirm*\n\n` + `Пользователь: \`${user.login}\`\n` + `Описание: \`${user.status == "" ? "Отсутствует" : user.status}\`\n\n` + `• Вы подтвержаете, что это Вы?\n\n` + `\`ПРИМЕЧАНИЕ: Вы в любую секунду сможете сменить профиль, если ошиблись.\`` return text } exports.deleteMessage = (bot, message, time) => { setTimeout(() => { try { bot.deleteMessage(message.chat.id, message.message_id); } catch (error) { return } }, time * 1000); } exports.genStartText = async (user) => { let text = `*Anixart Start*\n\n` + `Приветствую, @${user.username}!\n` + `Перед началом работы с ботом вам требуется \`авторизироваться\`, используя команду /account\n\n` + `❓ Доступные команды в боте:\n` + `/start - \`первоначальная настройка и информация\`\n` + `/account - \`авторизация в боте\`\n` + `/profile - \`просмотр своего профиля (требуется авторизация)\`\n` + `/profile (ник пользователя) - \`просмотр профиля человека по нику (вся приватная информация скрыта)\`\n` + `/anime - \`просмотр новых, популярных, случайных тайтлов\`\n` + `/about - \`информация о командах, о разработчике и о самом боте\`\n\n` + `*ПРИМЕЧАНИЕ: авторизация работает через ваш НИК или АЙДИ на Anixart.*\n` + `*Бот не требует от Вас ваших личных данных.*\n\n` + `*В данный момент бот работает для узкого количества лиц.*\n` + `*Разработчик не одобряет подобную деятельность, а потому это вынужденная мера.*\n` + `*Приносим извинения ~*` return text } exports.genAboutText = async () => { let text = `*Anixart About*\n\n` + `❓ Доступные команды в боте:\n` + `/start - \`первоначальная настройка и информация\`\n` + `/account - \`авторизация в боте\`\n` + `/profile - \`просмотр своего профиля (требуется авторизация)\`\n` + `/profile (ник пользователя) - \`просмотр профиля человека по нику (вся приватная информация скрыта)\`\n` + `/anime - \`просмотр новых, популярных, случайных тайтлов\`\n` + `/about - \`информация о командах, о разработчике и о самом боте\`\n\n` + `❓ О самом боте:\n` + `Данный бот является не официальным и некоммерческим продуктом.\n` + `Бот работает с *не публичным* API \`Anixart'a\`, что противоречит принципам создателя \`Anixarta'a\`.\n` + `Накрутка, спам, регистрация новых аккаунтов и всё подобное через данного бота невозможна.\n` + `Бот позволяет лишь показать открытую в профилях информацию, не запуская приложения.\n\n` + `❓ О создателе:\n` + `Привет! Я @reCAPTCHAs, создатель этого бота.\n` + `Если Вы нашли баг, у вас появилось предложение или желание что-то изменить в боте, то cмело пишите в тг.\n` + `Я буду добавлять *новый функционал*, изменять существующий и изменять дизайн интерфейса с течением времени.\n` + `*Моя цель*: добиться того, чтобы бота начал поддерживать разработчик \`Anixart'a\`, посему я постараюсь сделать всё возможное, чтобы это произошло.\n\n` + `*Все права принадлежат Anixart.*` return text } exports.genAnimeMenuText = async () => { let text = `📺 Anixart Anime\n\n` + `Тут вы можете посмотреть аниме из категорий:\n` + `🆕 • Последнее\n` + `📈 • Популярное\n` + // `📣 • Анонсы (В разработке)\n` + `🔥 • Интересное\n` + `❓ • Случайное\n` + `🔎 • По названию\n\n` + `Кнопками ниже выберите интересующую Вас категорию:` return text } exports.getButtonMenu = async (jsonAnime, page) => { let text = `` let animeList = [] //Цикл, который получает 5 аниме для списка из 25 полученных в зависимости от страницы в тг и страницы в api. В рот ебал такую залупу for (let i = (page-1)*5; i < page*5; i++) { // 5 < 10; 10 < 15 и т.д. let animeByCount = i > 24 ? i - Math.floor(i/25)*25 : i //Если число больше 25, то отнимает столько, сколько ненужно (костыль ебучий, похуй) if (jsonAnime.content[animeByCount]) { text += `${exports.getNumberEmoji(i+1)}. *${jsonAnime.content[animeByCount].title_ru}*\n` + `${jsonAnime.content[animeByCount].status ? `\`- Статус: ${jsonAnime.content[animeByCount].status.name}\`\n` : ``}` + `\`- ${jsonAnime.content[animeByCount].genres}\`\n\n` // Добавляем в текст animeList.push({ // Пушим номер аниме по счёту и его айди в аниксарте count: i+1, id: jsonAnime.content[animeByCount].id }) } } return {text: text, animeList: animeList} } exports.deleteSymbols = async (text) => { return text .replace(/_/gi, "") .replace(/;/gi, "") .replace(/\*/gi, "") .replace(/`/gi, "") .replace(/,/gi, "") } exports.searchAnimeMenu = async () => { let text = `🔎 Anixart Search\n\n` + `❓Вы можете найти интересующее Вас аниме по названию.\n` + `Для этого введите:\n\n` + `/anime \`(название тайтла без скобок)\`,\n\n` + `после чего вы должны выбрать нужное аниме.` return text }