работоспособная версия

This commit is contained in:
Vufer 2024-11-09 23:41:58 +03:00
parent a04119574b
commit 1dfd6b3cd3

View File

@ -2,6 +2,9 @@ const TelegramBot = require('node-telegram-bot-api');
const axios = require('axios'); const axios = require('axios');
const fs = require('fs'); const fs = require('fs');
require('dotenv').config(); 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 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 Please pay close attention to the following instructions for each field:\n
@ -110,17 +113,17 @@ loadStats(); // Загружаем статистику при старте бо
function toxAnalyze(text) { function toxAnalyze(text) {
// Проверяем, есть ли уже результат в кеше // Проверяем, есть ли уже результат в кеше
// if (aiCache[text]) { if (aiCache[text]) {
// stats.cacheHits += 1; // Увеличиваем счетчик попаданий в кеш stats.cacheHits += 1; // Увеличиваем счетчик попаданий в кеш
// return aiCache[text]; return JSON.parse(aiCache[text]);
// } }
// Если нет, делаем запрос к AI // Если нет, делаем запрос к AI
//stats.cacheMisses += 1; // Увеличиваем счетчик промахов в кеш stats.cacheMisses += 1; // Увеличиваем счетчик промахов в кеш
return getAIResume(text, BASE_PROMPT).then(result => { return getAIResume(text, BASE_PROMPT).then(result => {
// Сохраняем результат в кеш // Сохраняем результат в кеш
// aiCache[text] = result; aiCache[text] = result;
// saveAiCache(); // Сохраняем кеш в файл saveAiCache(); // Сохраняем кеш в файл
return JSON.parse(result); 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) => { bot.on('message', async (msg) => {
const chatId = msg.chat.id; const chatId = msg.chat.id;
const userId = msg.from.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 (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; const analyzedText = msg.reply_to_message.text;
// Проверяем, что текст для анализа не пустой // Проверяем, что текст для анализа не пустой
if (analyzedText) { if (analyzedText) {
const toxScore = await toxAnalyze(analyzedText); const toxScore = await toxAnalyze(analyzedText);
//console.log(toxScore)
// Форматируем вывод // Форматируем вывод
const values = Object.values(toxScore); const values = Object.values(toxScore);
const sum = values.reduce((a, b) => a + b, 0); const sum = values.reduce((a, b) => a + b, 0);
const average = sum / values.length; const average = sum / values.length;
const resultMessage = ` const resultMessage = `
Слов в тексте: ${analyzedText.split(' ').length} Слов в тексте: ${analyzedText.split(' ').length}
Грамотность: ${toxScore.literacy_score} Грамотность: ${toxScore.literacy_score}
@ -179,17 +240,23 @@ bot.on('message', async (msg) => {
Средний бал: ${average.toFixed(1)} Средний бал: ${average.toFixed(1)}
`.trim(); // Убираем лишние пробелы `.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 { } else {
bot.sendMessage(chatId, 'Пожалуйста, укажите текст для анализа.'); bot.sendMessage(chatId, 'Пожалуйста, укажите текст для анализа.');
} }
} }
// Сохраняем обновленные статистические данные // Сохраняем обновленные статистические данные
saveStats(); saveStats();
}); });
// Функция запроса к AI // Функция запроса к AI
async function getAIResume(text, prompt) { async function getAIResume(text, prompt) {
const baseUrl = `${process.env.AI_WEB_URL}/api`; const baseUrl = `${process.env.AI_WEB_URL}/api`;