From 339997f8af6dd82dff09cb4162af3dc754265f7c Mon Sep 17 00:00:00 2001 From: danil Date: Sun, 8 Sep 2024 20:53:58 +0500 Subject: [PATCH] neurocalls fix --- docs/neurocoder07.md | 268 +++++++++++++++++ docs/neurocoder08.md | 102 +++++++ .../functions/_shared/supabase/passport.ts | 4 +- supabase/functions/neuro-calls/index.ts | 278 +++++++++--------- supabase/functions/neuro-coder/index.ts | 28 ++ 5 files changed, 543 insertions(+), 137 deletions(-) create mode 100644 docs/neurocoder07.md create mode 100644 docs/neurocoder08.md diff --git a/docs/neurocoder07.md b/docs/neurocoder07.md new file mode 100644 index 0000000..6797a8e --- /dev/null +++ b/docs/neurocoder07.md @@ -0,0 +1,268 @@ +# Создание Telegram-бота для управления списком задач с использованием Supabase и grammY + +В этой статье мы рассмотрим, как создать Telegram-бота для управления списком задач (CRUD: Create, Read, Update, Delete) с использованием Supabase и библиотеки grammY. Мы будем использовать два файла: `index.ts` и `todo-list.ts`. + +## Установка и настройка + +### Установка зависимостей +Для начала установим необходимые зависимости: +``` +npm install grammy @grammyjs/storage-free supabase +``` +### Настройка Supabase + +Создайте проект в [Supabase](https://supabase.com/) и настройте таблицу `todo_list` со следующими полями: + +- `id` (integer, primary key) +- `telegram_id` (text) +- `task` (text) + +### Настройка grammY + +Создайте бота в Telegram с помощью [BotFather](https://t.me/BotFather) и получите токен. + +## Файл `todo-list.ts` + +Этот файл содержит функции для работы с базой данных Supabase. + +```typescript:supabase/functions/_shared/supabase/todo-list.ts +import { supabase } from "./index.ts"; + +export async function readTask(id: number) { + const { data, error } = await supabase + .from('todo_list') + .select('*') + .eq('id', id) + + if (error) { + throw error + } + return data +} + +export async function createTask(telegram_id: string, task: string) { + const { data, error } = await supabase + .from('todo_list') + .insert({ + telegram_id, + task, + }) + + if (error) { + throw error + } + return data +} + +export async function updateTask(id: number, task: string) { + const { data, error } = await supabase + .from('todo_list') + .update({ task }) + .eq('id', id) + + if (error) { + throw error + } + return data +} + +export async function deleteTask(id: number) { + const { data, error } = await supabase + .from('todo_list') + .delete() + .eq('id', id) + + if (error) { + throw error + } + return data +} + +export async function readTasks(telegram_id: string) { + const { data, error } = await supabase + .from('todo_list') + .select('*') + .eq('telegram_id', telegram_id) + + if (error) { + throw error + } + return data +} +``` + +## Файл `index.ts` + +Этот файл содержит логику бота на основе библиотеки grammY. + +```typescript:supabase/functions/todo-list/index.ts +import { createTask, readTask, readTasks, updateTask, deleteTask } from "../_shared/supabase/todo-list.ts"; +import { botNeuroCoder, handleUpdateNeuroCoder } from "../_shared/telegram/bots.ts"; + +console.log(`Function "telegram-bot" up and running!`) + +botNeuroCoder.command('start', async (ctx) => { + await ctx.reply("Welcome! Вы попали в ToDo List Bot.", { + reply_markup: { + inline_keyboard: [ + [{ text: 'Открыть меню', callback_data: 'open_menu' }] + ] + } + }) + return +}) + +botNeuroCoder.on('message:text', async (ctx) => { + const message = ctx.message.text + const telegram_id = ctx.from?.id.toString() + + if (message.startsWith('/')) return + console.log(message) + + if (ctx.message.reply_to_message) { + if (ctx.message.reply_to_message.text?.includes('Отправьте задачу.')) { + await createTask(telegram_id, message) + await ctx.reply('Задача создана') + return + } + if (ctx.message.reply_to_message.text?.includes('Напишите новую задачу.')) { + const tasks = await readTasks(telegram_id) + console.log(tasks) + await ctx.reply("Выберите задачу для изменения", { + reply_markup: { + inline_keyboard: tasks.map((task: any) => [ + { text: task.task, callback_data: `task_update_${task.id}_${message}` + } + ]) + } + }) + return + } + } +}) + +botNeuroCoder.on('callback_query:data', async (ctx) => { +const callbackData = ctx.callbackQuery.data + +console.log(callbackData, "callbackData") +const telegram_id = ctx.from?.id.toString() + + if (callbackData === 'open_menu') { + await ctx.reply("Вы открыли меню", { + reply_markup: { + inline_keyboard: [ + [{ text: 'Create', callback_data: 'create_task' }], + [{ text: 'Read', callback_data: 'read_tasks' }], + [{ text: 'Update', callback_data: 'update_task' }], + ] + } + }) + return + } + if (callbackData.includes('task')) { + if (callbackData.includes('create')) { + try { + await ctx.reply("Отправьте задачу.", { + reply_markup: { + force_reply: true + } + }) + return + } catch (e) { + await ctx.reply('Ошибка при создании задачи') + throw new Error('Ошибка при создании задачи', e) + } + } + if (callbackData.includes('read')) { + try { + if (callbackData.split("_").length === 3) { + const task_id = callbackData.split("_")[2] + const task = await readTask(Number(task_id)) + await ctx.reply(task[0].task, { + reply_markup: { + inline_keyboard: [ + [{ text: 'Delete', callback_data: `delete_task_${task_id}` }] + ] + } + }) + return + } else { + const tasks = await readTasks(telegram_id) + console.log(tasks) + await ctx.reply("Выберите задачу", { + reply_markup: { + inline_keyboard: tasks.map((task: any) => [ + { text: task.task, callback_data: `task_read_${task.id}` + } + ]) + } + }) + } + return + } catch (e) { + await ctx.reply('Ошибка при чтении задач') + throw new Error('Ошибка при чтении задач', e) + } + } + if (callbackData.includes('update')) { + if (callbackData.split("_").length > 3) { + const task_id = callbackData.split("_")[2] + const new_task = callbackData.split("_")[3] + await updateTask(Number(task_id), new_task) + await ctx.reply("Задача обновлена") + return + } + await ctx.reply("Напишите новую задачу.", { + reply_markup: { + force_reply: true + } + }) + return + } + if (callbackData.includes('delete')) { + const task_id = callbackData.split("_")[2] + await deleteTask(Number(task_id)) + await ctx.reply("Задача удалена.") + return + } + } + return +}) + +Deno.serve(async (req) => { + try { + const url = new URL(req.url) + if (url.searchParams.get('secret') !== Deno.env.get('FUNCTION_SECRET')) { + return new Response('not allowed', { status: 405 }) + } + + return await handleUpdateNeuroCoder(req) + } catch (err) { + console.error(err) + } +}) +``` + +## Объяснение кода + +### Функции для работы с базой данных + +В файле `todo-list.ts` определены функции для работы с таблицей `todo_list` в Supabase: + +- `createTask`: Создает новую задачу. +- `readTask`: Читает задачу по ID. +- `readTasks`: Читает все задачи для конкретного пользователя. +- `updateTask`: Обновляет задачу по ID. +- `deleteTask`: Удаляет задачу по ID. + +### Логика бота + +В файле `index.ts` реализована логика бота с использованием библиотеки grammY: + +- Команда `/start` отправляет приветственное сообщение и предлагает открыть меню. +- Обработчик текстовых сообщений создает или обновляет задачи в зависимости от контекста. +- Обработчик `callback_query` обрабатывает нажатия на кнопки меню и выполняет соответствующие действия (создание, чтение, обновление, удаление задач). + +## Заключение + +В этой статье мы рассмотрели, как создать Telegram-бота для управления списком задач с использованием Supabase и библиотеки grammY. Мы определили функции для работы с базой данных и реализовали логику бота для выполнения операций CRUD. \ No newline at end of file diff --git a/docs/neurocoder08.md b/docs/neurocoder08.md new file mode 100644 index 0000000..492d603 --- /dev/null +++ b/docs/neurocoder08.md @@ -0,0 +1,102 @@ +# Добавление команды для склейки нескольких видео в одно в Telegram-боте + +В этом руководстве мы рассмотрим, как добавить команду в Telegram-бота для склейки нескольких видео в одно с использованием библиотеки `grammy` и `ffmpeg`. Мы будем использовать файл `index.ts` в качестве примера. + +## Шаг 1: Установка зависимостей + +Для начала установим необходимые зависимости: + +```bash +npm install grammy fluent-ffmpeg @ffmpeg-installer/ffmpeg +``` + +## Шаг 2: Импорт необходимых модулей + +В файле `index.ts` импортируем необходимые модули: + +```typescript +import { Context } from "grammy"; +import ffmpeg from "fluent-ffmpeg"; +import ffmpegInstaller from "@ffmpeg-installer/ffmpeg"; +import path from "path"; +import fs from "fs"; + +ffmpeg.setFfmpegPath(ffmpegInstaller.path); +``` + +## Шаг 3: Проверка доступа к файлам + +Создадим функцию для проверки доступа к файлам: + +```typescript +const checkAccess = (filePath: string, mode: number) => { + return new Promise((resolve, reject) => { + fs.access(filePath, mode, (err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); +}; +``` + +## Шаг 4: Создание команды для склейки видео + +Создадим асинхронную функцию `short`, которая будет обрабатывать команду для склейки видео: + +```typescript +const short = async (ctx: Context): Promise => { + try { + await ctx.reply("Video creation started"); + + const inputFilePath = path.resolve(__dirname, "./assets/input/"); + const outputFilePath = path.resolve(__dirname, "./assets/output/output.mp4"); + + try { + await checkAccess(inputFilePath, fs.constants.R_OK); // Проверка прав на чтение + await checkAccess(path.dirname(outputFilePath), fs.constants.W_OK); // Проверка прав на запись в директорию + console.log("Access check passed"); + } catch (err) { + console.error("Access check failed:", err); + throw err; + } + + const createShortVideo = async () => { + console.log(inputFilePath, outputFilePath); + console.log("Merging started"); + return new Promise((resolve, reject) => { + ffmpeg() + .input(`${inputFilePath}/input.txt`) + .output(outputFilePath) + .inputOptions(["-f concat", "-safe 0"]) + .outputOptions(["-c copy"]) + .on("end", () => { + console.log("Merging complete!"); + resolve(); + }) + .on("error", (err) => { + console.error("Error:", err); + reject(err); + }) + .on("progress", (progress) => { + console.log("Progress:", progress.percent); + }) + .run(); + }); + }; + + await createShortVideo(); + return; + } catch (error) { + throw error; + } +}; + +export default short; +``` + +## Заключение + +Теперь у вас есть команда для склейки нескольких видео в одно в вашем Telegram-боте. Эта команда проверяет доступ к файлам, а затем использует `ffmpeg` для объединения видео. Не забудьте настроить пути к входным и выходным файлам в соответствии с вашими требованиями. diff --git a/supabase/functions/_shared/supabase/passport.ts b/supabase/functions/_shared/supabase/passport.ts index 33651e7..79465ca 100644 --- a/supabase/functions/_shared/supabase/passport.ts +++ b/supabase/functions/_shared/supabase/passport.ts @@ -6,6 +6,7 @@ import { UserPassport, } from "../types/index.ts"; import { supabase } from "./index.ts"; +import { getUid } from "./users.ts"; export async function setPassport( passport: PassportUser, @@ -181,9 +182,10 @@ export async function getPassportsTasksByUsername( username: string, ): Promise { try { + const uid = await getUid(username); const { data, error } = await supabase.from("user_passport") .select("*") - .eq("username", username) + .eq("user_id", uid) .eq("type", "task"); if (error) { diff --git a/supabase/functions/neuro-calls/index.ts b/supabase/functions/neuro-calls/index.ts index 9fa9ff5..53908d5 100644 --- a/supabase/functions/neuro-calls/index.ts +++ b/supabase/functions/neuro-calls/index.ts @@ -128,8 +128,8 @@ const welcomeMenu = async (ctx: Context) => { if (!ctx.from) throw new Error("User not found"); const lang = await isRu(ctx) const text = lang - ? `🏰 Добро пожаловать в NeuroCalls, ${ctx.from?.first_name}!\n\nВыберите одну из доступных команд, чтобы начать:\n\n🚀 /start - Начать общение с NeuroCalls\n🌐 /language - Выбрать язык\n🆔 /soul - Наполнить аватара душой\n📳 /mode - Выбрать режим общения с ИИ\n🧠 /model - Добавить модель аватара\n🔊 /text_to_speech - Преобразовать текст в речь\n🔊 /reset_voice - Сбросить голос аватара\n🎤 /voice - Добавить голос аватара\n🛒 /buy - Купить подписку\n🆔 /getchatid - Получить ID чата` - : `🏰 Welcome to NeuroCalls, ${ctx.from?.first_name}!\n\nChoose one of the available commands to get started:\n\n🚀 /start - Start chatting with NeuroCalls\n🌐 /language - Select language\n🆔 /soul - Fill your avatar's soul\n📳 /mode - Select AI communication mode\n🧠 /model - Add avatar's model\n🔊 /text_to_speech - Convert text to speech\n🔊 /reset_voice - Reset avatar's voice\n🎤 /voice - Add avatar's voice\n🛒 /buy - Buy subscription\n🆔 /getchatid - Get chat ID`; + ? `🏰 Добро пожаловать в NeuroCalls, ${ctx.from?.first_name}!\n\nВыберите одну из доступных команд, чтобы начать:\n\n🚀 /start - Начать общение с NeuroCalls\n🌐 /language - Выбрать язык\n📳 /mode - Выбрать режим общения с ИИ\n🧠 /model - Выбрать модель ИИ\n🛒 /buy - Купить подписку\n🆔 /getchatid - Получить ID чата` + : `🏰 Welcome to NeuroCalls, ${ctx.from?.first_name}!\n\nChoose one of the available commands to get started:\n\n🚀 /start - Start chatting with NeuroCalls\n🌐 /language - Select language\n📳 /mode - Select AI communication mode\n🧠 /model - Choose AI model\n🛒 /buy - Buy subscription\n🆔 /getchatid - Get chat ID`; await ctx.replyWithVideo(videoUrl(lang), { caption: text, @@ -140,15 +140,19 @@ const welcomeMenu = async (ctx: Context) => { text: `${lang ? "🚀 Мои комнаты" : "🚀 My rooms"}`, callback_data: "neurostart", }, + ], + [ { text: `${lang ? "🏢 В гостях" : "🏢 On a visit"}`, callback_data: "neurobasic", }, - { - text: `${lang ? "💼 Обучение" : "💼 Learning"}`, - callback_data: "neurooffice", - }, - ], + ], + // [ + // { + // text: `${lang ? "💼 Обучение" : "💼 Learning"}`, + // callback_data: "neurooffice", + // }, + // ] ], }, }); @@ -274,22 +278,22 @@ botNeuroCalls.command("getchatid", async (ctx) => { return }); -botNeuroCalls.command("soul", async (ctx) => { - await checkAndUpdate(ctx) - await ctx.replyWithChatAction("typing"); - if (!ctx.from) throw new Error("User not found"); - const lang = await isRu(ctx) - console.log("soul"); - await ctx.reply(lang ? "Чтобы наполнить вашего аватара душой, нажмите кнопку ниже" : "To fill your avatar's soul, click the button below", { - reply_markup: { - inline_keyboard: [[{ - text: lang ? "Создать душу" : "Create soul", - callback_data: "create_soul", - }]], - }, - }); - return; -}); +// botNeuroCalls.command("soul", async (ctx) => { +// await checkAndUpdate(ctx) +// await ctx.replyWithChatAction("typing"); +// if (!ctx.from) throw new Error("User not found"); +// const lang = await isRu(ctx) +// console.log("soul"); +// await ctx.reply(lang ? "Чтобы наполнить вашего аватара душой, нажмите кнопку ниже" : "To fill your avatar's soul, click the button below", { +// reply_markup: { +// inline_keyboard: [[{ +// text: lang ? "Создать душу" : "Create soul", +// callback_data: "create_soul", +// }]], +// }, +// }); +// return; +// }); // Обработчик команды "start" botNeuroCalls.command("start", async (ctx) => { @@ -580,106 +584,106 @@ botNeuroCalls.command("language", async (ctx) => { }) }); -botNeuroCalls.command("digital_avatar", async (ctx) => { - await checkAndUpdate(ctx) - await ctx.replyWithChatAction("typing"); - if (!ctx.from) throw new Error("User not found"); - const lang = await isRu(ctx) - - await ctx.reply( - lang ? "Создать цифрового аватара" : "Create digital avatar", - { - reply_markup: { - inline_keyboard: [[{ - text: lang ? "Создать цифрового аватара" : "Create digital avatar", - callback_data: "create_digital_avatar", - }]], - }, - }, - ); - return; -}); +// botNeuroCalls.command("digital_avatar", async (ctx) => { +// await checkAndUpdate(ctx) +// await ctx.replyWithChatAction("typing"); +// if (!ctx.from) throw new Error("User not found"); +// const lang = await isRu(ctx) -botNeuroCalls.command("text_to_speech", async (ctx) => { - await checkAndUpdate(ctx) - await ctx.replyWithChatAction("typing"); - const lang = await isRu(ctx) - if (!ctx.from?.id) throw new Error("No user id"); - const isHaveVoiceId = await isVoiceId(ctx.from?.id.toString()) - console.log(isHaveVoiceId, "isHaveVoiceId") - if (!isHaveVoiceId) { - await ctx.reply(lang ? "🔮 Пожалуйста, для использованием /text_to_speech, введите /voice." : "🔮 Please enter /voice to use /text_to_speech.") - return - } - const text = lang - ? "🔮 Пожалуйста, отправьте текст, который вы хотите преобразовать в голосовое сообщение." - : "🔮 Please send the text you want to convert to a voice message."; +// await ctx.reply( +// lang ? "Создать цифрового аватара" : "Create digital avatar", +// { +// reply_markup: { +// inline_keyboard: [[{ +// text: lang ? "Создать цифрового аватара" : "Create digital avatar", +// callback_data: "create_digital_avatar", +// }]], +// }, +// }, +// ); +// return; +// }); - await ctx.reply(text, { - reply_markup: { - force_reply: true, - }, - }); - return; -}); +// botNeuroCalls.command("text_to_speech", async (ctx) => { +// await checkAndUpdate(ctx) +// await ctx.replyWithChatAction("typing"); +// const lang = await isRu(ctx) +// if (!ctx.from?.id) throw new Error("No user id"); +// const isHaveVoiceId = await isVoiceId(ctx.from?.id.toString()) +// console.log(isHaveVoiceId, "isHaveVoiceId") +// if (!isHaveVoiceId) { +// await ctx.reply(lang ? "🔮 Пожалуйста, для использованием /text_to_speech, введите /voice." : "🔮 Please enter /voice to use /text_to_speech.") +// return +// } +// const text = lang +// ? "🔮 Пожалуйста, отправьте текст, который вы хотите преобразовать в голосовое сообщение." +// : "🔮 Please send the text you want to convert to a voice message."; + +// await ctx.reply(text, { +// reply_markup: { +// force_reply: true, +// }, +// }); +// return; +// }); -botNeuroCalls.command("reset_voice", async (ctx) => { - await checkAndUpdate(ctx) - await ctx.replyWithChatAction("typing"); - const lang = await isRu(ctx) - const telegram_id = ctx.from?.id.toString(); +// botNeuroCalls.command("reset_voice", async (ctx) => { +// await checkAndUpdate(ctx) +// await ctx.replyWithChatAction("typing"); +// const lang = await isRu(ctx) +// const telegram_id = ctx.from?.id.toString(); - if (!telegram_id) throw new Error("No telegram_id"); +// if (!telegram_id) throw new Error("No telegram_id"); - const text = lang - ? "🔮 Голос твоего цифрового аватара был успешно сброшен, и теперь ты можешь создать новый." - : "🔮 The voice of your digital avatar has been successfully reset, and now you can create a new one."; - try { - // Сбрасываем голос цифрового аватара - await updateUser(telegram_id, { voice_id_synclabs: null }); - await ctx.reply(text) - } catch (error) { - await ctx.reply( - lang - ? "🤔 Ошибка при сбросе голоса цифрового аватара." - : "🤔 Error resetting digital avatar voice.", - ); - await bugCatcherRequest( - "neuro_calls_bot (reset_voice)", - JSON.stringify(error), - ); - throw new Error("Error resetting digital avatar voice."); - } -}); - -botNeuroCalls.command("voice", async (ctx) => { - await checkAndUpdate(ctx) - console.log("voice"); - await ctx.replyWithChatAction("typing"); - if (!ctx.from) throw new Error("User not found"); - const lang = await isRu(ctx) - const text = lang - ? "🔮 Отправьте боту голосовое сообщение, чтобы создать цифрового аватара, который будет говорить вашим голосом." - : "🔮 Please send me a voice message, and I will use it to create a voice avatar that speaks in your own voice."; +// const text = lang +// ? "🔮 Голос твоего цифрового аватара был успешно сброшен, и теперь ты можешь создать новый." +// : "🔮 The voice of your digital avatar has been successfully reset, and now you can create a new one."; +// try { +// // Сбрасываем голос цифрового аватара +// await updateUser(telegram_id, { voice_id_synclabs: null }); +// await ctx.reply(text) +// } catch (error) { +// await ctx.reply( +// lang +// ? "🤔 Ошибка при сбросе голоса цифрового аватара." +// : "🤔 Error resetting digital avatar voice.", +// ); +// await bugCatcherRequest( +// "neuro_calls_bot (reset_voice)", +// JSON.stringify(error), +// ); +// throw new Error("Error resetting digital avatar voice."); +// } +// }); - await ctx.reply(text, { - reply_markup: { - force_reply: true - } - }); - // await ctx.reply(lang ? "Чтобы использовать данную функцию, необходимо приобрести уровень НейроБаза 🏢" : "To use this function, you need to purchase the NeuroBasic level 🏢") - return -}); +// botNeuroCalls.command("voice", async (ctx) => { +// await checkAndUpdate(ctx) +// console.log("voice"); +// await ctx.replyWithChatAction("typing"); +// if (!ctx.from) throw new Error("User not found"); +// const lang = await isRu(ctx) +// const text = lang +// ? "🔮 Отправьте боту голосовое сообщение, чтобы создать цифрового аватара, который будет говорить вашим голосом." +// : "🔮 Please send me a voice message, and I will use it to create a voice avatar that speaks in your own voice."; + +// await ctx.reply(text, { +// reply_markup: { +// force_reply: true +// } +// }); +// // await ctx.reply(lang ? "Чтобы использовать данную функцию, необходимо приобрести уровень НейроБаза 🏢" : "To use this function, you need to purchase the NeuroBasic level 🏢") +// return +// }); -botNeuroCalls.command("face", async (ctx) => { - await checkAndUpdate(ctx) - console.log("face"); - await ctx.replyWithChatAction("typing"); - if (!ctx.from) throw new Error("User not found"); - const lang = await isRu(ctx) - await ctx.reply(lang ? "Чтобы использовать данную функцию, необходимо приобрести уровень НейроБаза 🏢" : "To use this function, you need to purchase the NeuroBasic level 🏢") - return -}) +// botNeuroCalls.command("face", async (ctx) => { +// await checkAndUpdate(ctx) +// console.log("face"); +// await ctx.replyWithChatAction("typing"); +// if (!ctx.from) throw new Error("User not found"); +// const lang = await isRu(ctx) +// await ctx.reply(lang ? "Чтобы использовать данную функцию, необходимо приобрести уровень НейроБаза 🏢" : "To use this function, you need to purchase the NeuroBasic level 🏢") +// return +// }) botNeuroCalls.command("model", async (ctx) => { await checkAndUpdate(ctx) @@ -726,14 +730,16 @@ botNeuroCalls.command("mode", async (ctx) => { inline_keyboard: [ [ { - text: `🔥 ${lang ? "Чат с воспоминаниями" : "Chat with memories"}`, + text: `💬 ${lang ? "Чат с воспоминаниями" : "Chat with memories"}`, callback_data: "mode_memories", }, + ], + [ { - text: `🔥 ${lang ? "Чистый GPT" : "Clean GPT"}`, + text: `🔍 ${lang ? "Чистый GPT" : "Clean GPT"}`, callback_data: "mode_clean", }, - ], + ] ], }, }); @@ -1389,10 +1395,10 @@ await botNeuroCalls.api.setMyCommands([ command: "/language", description: "🌐 Select language", }, - { - command: "/soul", - description: "🆔 Fill your avatar's soul", - }, + // { + // command: "/soul", + // description: "🆔 Fill your avatar's soul", + // }, // { // command: "/face", // description: "🤓 Add avatar's face", @@ -1403,20 +1409,20 @@ await botNeuroCalls.api.setMyCommands([ }, { command: "/model", - description: "🧠 Add avatar's model", - }, - { - command: "/text_to_speech", - description: "🔊 Convert text to speech", - }, - { - command: "/reset_voice", - description: "🔊 Reset avatar's voice", - }, - { - command: "/voice", - description: "🎤 Add avatar's voice", + description: "🧠 Add AI model", }, + // { + // command: "/text_to_speech", + // description: "🔊 Convert text to speech", + // }, + // { + // command: "/reset_voice", + // description: "🔊 Reset avatar's voice", + // }, + // { + // command: "/voice", + // description: "🎤 Add avatar's voice", + // }, { command: "/buy", description: "🛒 Buy subscription", diff --git a/supabase/functions/neuro-coder/index.ts b/supabase/functions/neuro-coder/index.ts index 42a687b..b01546c 100644 --- a/supabase/functions/neuro-coder/index.ts +++ b/supabase/functions/neuro-coder/index.ts @@ -171,6 +171,20 @@ const menuButton = async (ctx: Context) => { return menuButton; }; +botNeuroCoder.command("neurocodertoarticle", async (ctx) => { + console.log("neurocodertoarticle"); + await checkAndUpdate(ctx) + await ctx.replyWithChatAction("typing"); + if (!ctx.from) throw new Error("User not found"); + + await ctx.reply("Напишите текст для статьи.", { + reply_markup: { + force_reply: true, + } + }) + return +}); + botNeuroCoder.command("neuro", async (ctx) => { console.log("neuro"); await checkAndUpdate(ctx) @@ -802,6 +816,20 @@ botNeuroCoder.on("message:text", async (ctx: Context) => { : ctx?.message?.reply_to_message?.text; console.log(originalMessageText, "originalMessageText"); + if (originalMessageText === "Напишите текст для статьи.") { + const responseArticle = "test" + // await answerAi(`Сделай из этого текста обучающую статью: ${ctx.message.text}`, "ru", "gpt-4o") + const responseMusicText = "test" + // await answerAi(`Сделай из этого текста текст для музыки: ${ctx.message.text}`, "ru", "gpt-4o") + if (responseArticle && responseMusicText) { + await ctx.reply(responseArticle) + await ctx.reply(responseMusicText) + } + if (!responseArticle && !responseMusicText) { + await ctx.reply("Не удалось сделать статью и музыку из этого текста.") + } + return + } if ( originalMessageText || originalMessageText && (originalMessageText.includes("🏰 Добро пожаловать") ||