AnixartBot/utils/functions.js
2022-08-10 13:06:23 +02:00

340 lines
17 KiB
JavaScript
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 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(`<br>`, `\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
}