Governed substrate for autonomous agents: scoped identity (passports), audited actions, MCP workspace. Infra IPs and secrets redacted for public release.
63 lines
4.5 KiB
JavaScript
63 lines
4.5 KiB
JavaScript
// backend/routes/v3/telegram/shared.js
|
||
// Shared utilities, constants, and imports for Telegram bot modules
|
||
|
||
import { apiLogger } from '../../../utils/logger.js';
|
||
import { sendMessage, sendToTopic, parseAgentCommand, getFileUrl, sendChannelPost, sendChannelPhoto, getChannelMemberCount } from '../../../services/TelegramService.js';
|
||
import { dbRun, dbGet, dbAll, isPostgres, safeJsonParse } from '../../../database/connection.js';
|
||
import ChainHandoffService from '../../../services/ChainHandoffService.js';
|
||
|
||
// ===== FORTUNE WHEEL — BREAK ACTIVITIES =====
|
||
// Hardcoded list of break activities for the Fortune Wheel.
|
||
// Each has emoji, name, duration (min), and description.
|
||
// In the future this can be moved to a break_activities DB table.
|
||
const BREAK_ACTIVITIES = [
|
||
{ emoji: '🧘', name: 'Медитация', duration: 5, description: 'Закрой глаза, сфокусируйся на дыхании. Вдох 4 сек — задержка 4 сек — выдох 6 сек.' },
|
||
{ emoji: '🚶', name: 'Прогулка', duration: 10, description: 'Выйди на свежий воздух и пройдись. Не бери телефон!' },
|
||
{ emoji: '💪', name: 'Отжимания', duration: 3, description: 'Сделай 3 подхода отжиманий. Между подходами — 30 сек отдыха.' },
|
||
{ emoji: '☕', name: 'Чай/Кофе пауза', duration: 7, description: 'Завари чай или кофе. Пей медленно, наслаждаясь вкусом.' },
|
||
{ emoji: '👀', name: 'Гимнастика для глаз', duration: 3, description: 'Посмотри вдаль 20 сек, потом на близкий предмет 20 сек. Повтори 5 раз. Поморгай.' },
|
||
{ emoji: '🎵', name: 'Музыкальная пауза', duration: 5, description: 'Включи любимый трек и просто послушай. Можно потанцевать!' },
|
||
{ emoji: '🧊', name: 'Холодное умывание', duration: 2, description: 'Умойся холодной водой. Бодрит и перезагружает мозг.' },
|
||
{ emoji: '📖', name: 'Чтение', duration: 10, description: 'Почитай что-нибудь не по работе. Книга, статья, комикс — что угодно.' },
|
||
{ emoji: '🤸', name: 'Растяжка', duration: 5, description: 'Потянись, разомни шею, плечи, спину. Наклоны, повороты.' },
|
||
{ emoji: '🎨', name: 'Дудлинг', duration: 5, description: 'Возьми ручку и рисуй что попало. Узоры, каракули, лица — не думай.' },
|
||
{ emoji: '💧', name: 'Водный перерыв', duration: 2, description: 'Выпей стакан воды. Медленно, маленькими глотками.' },
|
||
{ emoji: '🌬️', name: 'Дыхательная практика', duration: 4, description: 'Техника 4-7-8: вдох 4 сек, задержка 7 сек, выдох 8 сек. 4 цикла.' },
|
||
{ emoji: '🐾', name: 'Погладь кота/собаку', duration: 5, description: 'Если рядом есть питомец — удели ему внимание. Нет питомца? Посмотри смешные видео с животными.' },
|
||
{ emoji: '🧹', name: 'Мини-уборка', duration: 5, description: 'Протри стол, разложи вещи, выброси мусор. Чистое пространство = чистый ум.' },
|
||
{ emoji: '🎮', name: 'Мини-игра', duration: 5, description: 'Сыграй в быструю мобильную игру или головоломку. Только 5 минут!' },
|
||
];
|
||
|
||
/**
|
||
* Select a random break activity and format a Fortune Wheel message.
|
||
* @returns {{ activity: Object, message: string }}
|
||
*/
|
||
function spinFortuneWheel() {
|
||
const activity = BREAK_ACTIVITIES[Math.floor(Math.random() * BREAK_ACTIVITIES.length)];
|
||
const message =
|
||
`🎡 *КОЛЕСО ФОРТУНЫ!*\n\n` +
|
||
`Выпало: ${activity.emoji} *${activity.name}*\n` +
|
||
`⏱ Время: ${activity.duration} мин\n\n` +
|
||
`${activity.description}\n\n` +
|
||
`_Следующий перерыв через 40 минут!_`;
|
||
return { activity, message };
|
||
}
|
||
|
||
export {
|
||
apiLogger,
|
||
sendMessage,
|
||
sendToTopic,
|
||
parseAgentCommand,
|
||
getFileUrl,
|
||
sendChannelPost,
|
||
sendChannelPhoto,
|
||
getChannelMemberCount,
|
||
dbRun,
|
||
dbGet,
|
||
dbAll,
|
||
isPostgres,
|
||
safeJsonParse,
|
||
ChainHandoffService,
|
||
BREAK_ACTIVITIES,
|
||
spinFortuneWheel,
|
||
};
|