diff --git a/backend/bots/mainBot.js b/backend/bots/mainBot.js index 2ab6685..3a6abe4 100644 --- a/backend/bots/mainBot.js +++ b/backend/bots/mainBot.js @@ -2,6 +2,9 @@ const axios = require('axios'); const config = require('../config'); const { log, logError } = require('../middleware/logger'); const User = require('../models/User'); +const { normalizeUsername } = require('../services/moderationAdmin'); + +const OWNER_USERNAMES = new Set(config.moderationOwnerUsernames || []); const BOT_TOKEN = config.telegramBotToken; const TELEGRAM_API = BOT_TOKEN ? `https://api.telegram.org/bot${BOT_TOKEN}` : null; @@ -58,6 +61,21 @@ const sendMessageToAllUsers = async (messageText) => { } }; +const requireAdmin = async (message) => { + try { + const telegramId = message.from?.id; + if (!telegramId) return false; + + const user = await User.findOne({ telegramId }).select('role'); + const username = normalizeUsername(message.from?.username || ''); + + return user && (user.role === 'admin' || OWNER_USERNAMES.has(username)); + } catch (error) { + logError('Ошибка проверки прав админа', error); + return false; + } +}; + const getStartMessage = () => { return `Добро пожаловать в Nakama! @@ -123,6 +141,41 @@ const handleCommand = async (message) => { return; } + if (command === '/broadcast') { + // Проверка прав + const isAdmin = await requireAdmin(message); + if (!isAdmin) { + await sendMessage(chatId, '❌ Команда доступна только администраторам.'); + return; + } + + // Получить текст сообщения (все после /broadcast) + const messageText = args.slice(1).join(' ').trim(); + + if (!messageText) { + await sendMessage(chatId, 'Использование: /broadcast <сообщение>\n\nПример: /broadcast Всем привет!'); + return; + } + + // Отправить подтверждение + await sendMessage(chatId, '📤 Начинаю рассылку сообщения всем пользователям...'); + + try { + const result = await sendMessageToAllUsers(messageText); + await sendMessage(chatId, + `✅ Рассылка завершена!\n\n` + + `📊 Статистика:\n` + + `• Отправлено: ${result.sent}\n` + + `• Ошибок: ${result.failed}\n` + + `• Всего пользователей: ${result.total}` + ); + } catch (error) { + logError('Ошибка рассылки через команду', error); + await sendMessage(chatId, `❌ Ошибка рассылки: ${error.message}`); + } + return; + } + // Игнорируем неизвестные команды };