Files
bot-ai/bot.js
2026-03-03 01:10:41 +04:00

232 lines
7.4 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
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.
import TelegramBot from "node-telegram-bot-api";
import dotenv from "dotenv";
import axios from "axios";
import FormData from 'form-data';
import fs from 'fs';
import ffmpeg from 'fluent-ffmpeg';
function convertToOgg(inputPath, outputPath) {
return new Promise((resolve, reject) => {
ffmpeg(inputPath)
.audioCodec('libopus')
.format('ogg')
.on('end', () => resolve())
.on('error', (err) => reject(err))
.save(outputPath);
});
}
import { UserRepository } from "./user.repository.js";
dotenv.config();
const tokenTg = process.env.TOKEN_TG;
const tokenAi = process.env.TOKEN_AI;
const accessId = process.env.SECRET_ID;
const bot = new TelegramBot(tokenTg, { polling: true });
console.log("Бот запущен...");
bot.onText(/\/info/, (msg) => {
const message = `Информация о боте: \n
'/start' - перезапускает чат, забывает контекст прошлого диалого \n
'/toggleModel' - Выбор модели (еще не доступен)`
const chatId = msg.chat.id
bot.sendMessage(chatId, message)
})
bot.onText(/\/armyan (.+)/, async (msg, match) => {
const chatId = msg.chat.id;
const textAfterCommand = match[1];
const response = await textToArmyan(textAfterCommand);
await convertToOgg(`voices/${response.file}.wav`, `voices/${response.file}.ogg`);
bot.sendVoice(chatId, `voices/${response.file}.ogg`);
})
bot.onText(/\/start/, async (msg) => {
const chatId = msg.chat.id;
const chatType = msg.chat.type
const user = msg.from
try {
const createOrUpdateUser = await UserRepository.createOrUpdateUser({
telegramId: user.id,
username: user.username,
chatId: chatId
});
} catch (err) {
console.error('Ошибка при создании или обновлении пользователя:', err);
}
bot.sendMessage(chatId, `Чат перезапущен, тип чата ${chatType}`);
});
bot.on('message', async (msg) => {
const chatId = msg.chat.id;
const user = msg.from
console.log(user)
console.log(msg)
if (msg.text && msg.text.startsWith('/')) {
return;
}
if (msg.photo) {
bot.sendMessage(chatId, 'Красиво, но такое мне не надо', { reply_to_message_id: msg.message_id });
return;
}
if (msg.document) {
bot.sendMessage(chatId, 'Такое мне не надо', { reply_to_message_id: msg.message_id });
return;
}
if (msg.from.is_bot) {
bot.sendMessage(chatId, 'Пошел нахуй бот ебанный, не мешай слушать брата', { reply_to_message_id: msg.message_id });
return;
}
if (msg.voice) {
const fileId = msg.voice.file_id;
const filePath = await bot.downloadFile(fileId, './voices');
const form = new FormData();
form.append('file', fs.createReadStream(filePath));
const response = await axios.post(
`http://${process.env.API_URL}:${process.env.API_PORT}/upload`,
form,
{
headers: form.getHeaders()
}
);
if (response.status === 200) {
const recognizedText = response.data.text;
bot.sendMessage(chatId, recognizedText, { reply_to_message_id: msg.message_id });
} else {
bot.sendMessage(chatId, 'Что-то пошло не так', { reply_to_message_id: msg.message_id });
}
return;
}
if (msg.text && user.id === 5536333712) {
console.log('Армянин, переключаем модель')
const response = await switchToRussian(msg.text);
bot.sendMessage(chatId, response.message, { reply_to_message_id: msg.message_id });
return;
}
if (msg.text && msg.chat.type === 'private') {
//bot.sendMessage(chatId, `Ты написал: ${msg.text}`);
try {
const last_msg_context = await UserRepository.getContext(user.id) || ''
console.log('last_msg_context:', last_msg_context);
if (last_msg_context === '') {
console.log('Новый пользователь, начинаем диалог с чистого листа');
const response = await getAIResponse(msg.text, null);
bot.sendMessage(chatId, response.message);
await UserRepository.updateContext(user.id, response.id);
} else {
console.log('Продолжаем диалог, контекст найден');
const response = await getAIResponse(msg.text, last_msg_context);
bot.sendMessage(chatId, response.message);
await UserRepository.updateContext(user.id, response.id);
}
} catch (err) {
console.error('Ошибка при обработке сообщения:', err);
}
return;
}
});
async function switchToRussian(message) {
try {
const options = {
method: 'POST',
url: `https://agent.timeweb.cloud/api/v1/cloud-ai/agents/${accessId}/call`,
headers: {
Authorization: `Bearer ${tokenAi}`,
'x-proxy-source': '',
'Content-Type': 'application/json'
},
data: {
message: `Убери ошибки в тексте и поставь знаки препинания: "${message}". Если текст короткий или без явных ошибок ничего не делай и отвечай просто "Армянин молодец", особо не размышляй над содержимым текста, просто выполняй свою задачу. Так же делай рядом версию с переводом на армянский язык`,
parent_message_id: ''
}
}
const response = await axios.request(options);
return response.data;
} catch (err) {
console.error('Ошибка при получении ответа от AI:', err);
}
}
async function getAIResponse(message, context) {
try {
const options = {
method: 'POST',
url: `https://agent.timeweb.cloud/api/v1/cloud-ai/agents/${accessId}/call`,
headers: {
Authorization: `Bearer ${tokenAi}`,
'x-proxy-source': '',
'Content-Type': 'application/json'
},
data: {
message: message,
parent_message_id: context
}
}
const response = await axios.request(options);
return response.data;
} catch (err) {
console.error('Ошибка при получении ответа от AI:', err);
}
}
async function textToArmyan(message) {
try {
const optionsArmyan = {
method: 'POST',
url: `https://agent.timeweb.cloud/api/v1/cloud-ai/agents/${accessId}/call`,
headers: {
Authorization: `Bearer ${tokenAi}`,
'x-proxy-source': '',
'Content-Type': 'application/json'
},
data: {
message: `Переведи текст на армянский, ничего не добаляй от себя, просто переведи: '${message}'`,
parent_message_id: ''
}
}
const responseArmyan = await axios.request(optionsArmyan);
const options = {
method: 'POST',
url: `http://${process.env.API_URL}:${process.env.API_PORT}/voice/start`,
headers: {
'Content-Type': 'application/json'
},
data: {
text: responseArmyan.data.message
}
}
const response = await axios.request(options);
if (response.status === 200) {
return response.data;
} else {
console.error('Ошибка при получении ответа от AI:', response.data);
}
} catch (err) {
console.error('Ошибка при получении ответа от AI:', err);
}
}