340 lines
17 KiB
JavaScript
340 lines
17 KiB
JavaScript
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
|
||
}
|