diff --git a/index.js b/index.js index 2ad6e87..7f53e6e 100644 --- a/index.js +++ b/index.js @@ -2,6 +2,9 @@ const TelegramBot = require('node-telegram-bot-api'); const axios = require('axios'); const fs = require('fs'); require('dotenv').config(); +const MAX_CALLS_PER_DAY = 1000; // Максимальное количество вызовов в день +const USAGE_RESET_TIME = 24 * 60 * 60 * 1000; // Время сброса (24 часа) +const userUsage = {}; // Для хранения информации о использовании команд пользователями const BASE_PROMPT = `You are an advanced text analyzer that assesses messages based on several criteria. You will receive a string of text as input, and you will return the result in JSON format with the specified fields. \n Please pay close attention to the following instructions for each field:\n @@ -110,17 +113,17 @@ loadStats(); // Загружаем статистику при старте бо function toxAnalyze(text) { // Проверяем, есть ли уже результат в кеше - // if (aiCache[text]) { - // stats.cacheHits += 1; // Увеличиваем счетчик попаданий в кеш - // return aiCache[text]; - // } + if (aiCache[text]) { + stats.cacheHits += 1; // Увеличиваем счетчик попаданий в кеш + return JSON.parse(aiCache[text]); + } // Если нет, делаем запрос к AI - //stats.cacheMisses += 1; // Увеличиваем счетчик промахов в кеш + stats.cacheMisses += 1; // Увеличиваем счетчик промахов в кеш return getAIResume(text, BASE_PROMPT).then(result => { // Сохраняем результат в кеш - // aiCache[text] = result; - // saveAiCache(); // Сохраняем кеш в файл + aiCache[text] = result; + saveAiCache(); // Сохраняем кеш в файл return JSON.parse(result); }); } @@ -142,27 +145,85 @@ function escapeMarkdown(text) { // Обработчик текстовых сообщений +// bot.on('message', async (msg) => { +// const chatId = msg.chat.id; +// const userId = msg.from.id; +// const userName = msg.from.username || ''; +// const firstName = msg.from.first_name || ''; +// let isNewUser = false; +// +// // Создаем запись пользователя для данного чата, если ее еще нет +// +// +// if (msg.reply_to_message && msg.reply_to_message.text && msg.text && msg.text.toLowerCase() === 'токсанал') { +// const analyzedText = msg.reply_to_message.text; +// +// // Проверяем, что текст для анализа не пустой +// if (analyzedText) { +// const toxScore = await toxAnalyze(analyzedText); +// //console.log(toxScore) +// // Форматируем вывод +// const values = Object.values(toxScore); +// const sum = values.reduce((a, b) => a + b, 0); +// const average = sum / values.length; +// const resultMessage = ` +// Слов в тексте: ${analyzedText.split(' ').length} +// Грамотность: ${toxScore.literacy_score} +// Элегантность: ${toxScore.elegance_score} +// Токсичность по отношению к родителям: ${toxScore.parental_toxicity_score} +// Сексуальная токсичность: ${toxScore.sexual_toxicity_score} +// Токсичность по отношению к внешности: ${toxScore.appearance_toxicity_score} +// Медицинская токсичность: ${toxScore.medical_toxicity_score} +// Эмоциональная токсичность: ${toxScore.emotional_toxicity_score} +// Дискриминация: ${toxScore.discrimination_score} +// Манипулятивный язык: ${toxScore.manipulative_language_score} +// Интеллектуальная токсичность: ${toxScore.intellectual_toxicity_score} +// Юмористическая токсичность: ${toxScore.humor_score} +// Средний бал: ${average.toFixed(1)} +// `.trim(); // Убираем лишние пробелы +// +// // Отправляем отформатированное сообщение +// bot.sendMessage(chatId, `Результаты анализа:\n${resultMessage}`, { reply_to_message_id: msg.reply_to_message.message_id }); +// } else { +// bot.sendMessage(chatId, 'Пожалуйста, укажите текст для анализа.'); +// } +// } +// // Сохраняем обновленные статистические данные +// saveStats(); +// }); bot.on('message', async (msg) => { const chatId = msg.chat.id; const userId = msg.from.id; - const userName = msg.from.username || ''; - const firstName = msg.from.first_name || ''; - let isNewUser = false; - // Создаем запись пользователя для данного чата, если ее еще нет + // Инициализация данных пользователя, если их нет + if (!userUsage[userId]) { + userUsage[userId] = { count: 0, lastReset: Date.now() }; + } + // Сброс данных, если прошел день + if (Date.now() - userUsage[userId].lastReset >= USAGE_RESET_TIME) { + userUsage[userId].count = 0; // Сбрасываем счетчик + userUsage[userId].lastReset = Date.now(); // Обновляем временную метку + } + // Проверяем, является ли сообщение ответом на другое сообщение с текстом "токсанал" if (msg.reply_to_message && msg.reply_to_message.text && msg.text && msg.text.toLowerCase() === 'токсанал') { + // Проверяем, использовал ли пользователь команду больше трех раз + if (userUsage[userId].count >= MAX_CALLS_PER_DAY) { + return bot.sendMessage(chatId, 'Вы достигли лимита использования команды "токсанал" на сегодня. Попробуйте снова завтра.', { reply_to_message_id: msg.message_id }); + } + const analyzedText = msg.reply_to_message.text; // Проверяем, что текст для анализа не пустой if (analyzedText) { const toxScore = await toxAnalyze(analyzedText); -//console.log(toxScore) + // Форматируем вывод const values = Object.values(toxScore); const sum = values.reduce((a, b) => a + b, 0); const average = sum / values.length; + const resultMessage = ` Слов в тексте: ${analyzedText.split(' ').length} Грамотность: ${toxScore.literacy_score} @@ -179,17 +240,23 @@ bot.on('message', async (msg) => { Средний бал: ${average.toFixed(1)} `.trim(); // Убираем лишние пробелы - // Отправляем отформатированное сообщение - bot.sendMessage(chatId, `Результаты анализа:\n${resultMessage}`, { reply_to_message_id: msg.reply_to_message.message_id }); + // Увеличиваем счетчик использований + userUsage[userId].count++; + + // Получаем количество оставшихся попыток + const remainingAttempts = MAX_CALLS_PER_DAY - userUsage[userId].count; + + // Отправляем отформатированное сообщение с оставшимися попытками + await bot.sendMessage(chatId, `Результаты анализа:\n${resultMessage}\n\nАнализов осталось: ${remainingAttempts}`, { reply_to_message_id: msg.reply_to_message.message_id }); } else { bot.sendMessage(chatId, 'Пожалуйста, укажите текст для анализа.'); } } + // Сохраняем обновленные статистические данные saveStats(); }); - // Функция запроса к AI async function getAIResume(text, prompt) { const baseUrl = `${process.env.AI_WEB_URL}/api`;