const TelegramBot = require('node-telegram-bot-api'); const env = require('./.env'); const fs = require('fs'); const bot = new TelegramBot(env.token, { polling: true }); const jsonFilePathUsers = 'db/usernameIdMap.json'; const jsonFilePathWarnings = 'db/warningsIdMap.json'; const jsonFilePathMenu = 'db/menuIdMap.json'; const MAX_WARNINGS = env.MAX_WARNINGS; let customCommands = {}; let usernameToUserIdMap = []; let warnings = {}; const welcomeMessages = [ 'Esperamos que você se divirta por aqui!', 'Estamos felizes em tê-lo(a) no grupo.', 'Sinta-se à vontade para participar das conversas.' ]; const allowedGroupIds = [ '-1001576734558', '-1002005067008', //DTunnel Mod (ConfigMods) '-1002016594807', //Grupo de testes '-1001591216081' //Grupo do shaka ]; if (fs.existsSync(jsonFilePathUsers)) { const jsonDataUsers = fs.readFileSync(jsonFilePathUsers); usernameToUserIdMap = JSON.parse(jsonDataUsers); } if (fs.existsSync(jsonFilePathWarnings)) { const jsonDataWarnings = fs.readFileSync(jsonFilePathWarnings); warnings = JSON.parse(jsonDataWarnings); } if (fs.existsSync(jsonFilePathMenu)) { const jsonDataMenu = fs.readFileSync(jsonFilePathMenu); customCommands = JSON.parse(jsonDataMenu); } bot.on('message', (msg) => { const chatId = msg.chat.id; const { username, id } = msg.from; if (username) { const userIndex = usernameToUserIdMap.findIndex(user => user.id === id); if (userIndex !== -1) { const firstName = msg.from.first_name || ''; const lastName = msg.from.last_name || ''; const usernameOld = usernameToUserIdMap[userIndex].username; if (usernameOld != username) { const message = `🧐 Mudança Detectada\n\n👤 Usuário: ${firstName + ' ' + lastName} [ID: ${id}]\n\n✏️ Mudou @${usernameOld} Para @${username}`; bot.sendMessage(chatId, message); } usernameToUserIdMap[userIndex].username = username; } else { usernameToUserIdMap.push({ id, username }); } fs.writeFileSync(jsonFilePathUsers, JSON.stringify(usernameToUserIdMap, null, 4)); } }); bot.on('message', async (msg) => { const chatId = msg.chat.id; const msgUserId = msg.message_id; if (msg.entities && msg.entities[0].type === 'bot_command') { const command = msg.text.split(' ')[0]; if (msg.chat.type === 'private') { switch (command) { case '/start': bot.sendMessage(chatId, 'Olá! Eu sou Amy gerenciadora de grupos.'); break; } } else { if (command == '/id') { bot.sendMessage(chatId, `ID do Grupo: ${chatId}`); return; } if (!isChatAllowed(chatId)) { bot.sendMessage(chatId, `O bot não está autorizado a ser usado neste grupo.`); return; } switch (command) { case '/start': bot.sendMessage(chatId, 'Olá! Eu sou Amy gerenciadora de grupos.'); break; case '/ban': checkAdminPermission(msg, () => { let userId; let userName; const commandParams = msg.text.split(' '); if (msg.reply_to_message) { userId = msg.reply_to_message.from.id; userName = msg.reply_to_message.from.first_name + (msg.reply_to_message.from.last_name ? ' ' + msg.reply_to_message.from.last_name : ''); } else if (commandParams.length > 1 && /^\d+$/.test(commandParams[1])) { userId = commandParams[1]; userName = userId; } else if (commandParams.length > 1 && commandParams[1].startsWith('@')) { const username = commandParams[1].substring(1); const user = usernameToUserIdMap.find(user => user.username === username); if (user) { const user_Id = user.id; bot.banChatMember(chatId, user_Id); sendMessageWithUndoButton(chatId, `Usuário banido: @${username} (${user_Id})`, JSON.stringify({ command: 'undo_ban', userId: user_Id })); } else { bot.sendMessage(chatId, 'O usuário não foi encontrado.'); } return; } else { bot.sendMessage(chatId, 'Você precisa fornecer o ID do usuário ou o username para banir.'); return; } bot.banChatMember(chatId, userId); sendMessageWithUndoButton(chatId, `Usuário banido: ${userName} (${userId})`, JSON.stringify({ command: 'undo_ban', userId: userId })); }); break; case '/warn': checkAdminPermission(msg, () => { const reasonWarn = msg.text.split(' ').slice(1).join(' '); if (!reasonWarn) { const warnedUserId = msg.reply_to_message.from.id; const groupId = msg.chat.id; if (!warnings[groupId]) { warnings[groupId] = {}; } const username = msg.reply_to_message.from.username; warnings[groupId][warnedUserId] = warnings[groupId][warnedUserId] ? warnings[groupId][warnedUserId] + 1 : 1; const warnMessage = `Usuário @${username} advertido: ${warnings[groupId][warnedUserId]}/3`; sendMessageWithUndoButton(chatId, warnMessage, JSON.stringify({ command: 'undo_warn', userId: warnedUserId })); if (warnings[groupId][warnedUserId] > MAX_WARNINGS) { bot.banChatMember(chatId, warnedUserId); bot.sendMessage(chatId, `Usuário banido por exceder o limite de advertências.`); delete warnings[groupId][warnedUserId]; } saveWarnings(); } else { const warnedUserId = msg.reply_to_message.from.id; const groupId = msg.chat.id; if (!warnings[groupId]) { warnings[groupId] = {}; } const username = msg.reply_to_message.from.username; warnings[groupId][warnedUserId] = warnings[groupId][warnedUserId] ? warnings[groupId][warnedUserId] + 1 : 1; const warnMessage = `Usuário @${username} advertido: ${warnings[groupId][warnedUserId]}/3\nMotivo: ${reasonDWarn}.`; sendMessageWithUndoButton(chatId, warnMessage, JSON.stringify({ command: 'undo_warn', userId: warnedUserId })); if (warnings[groupId][warnedUserId] > MAX_WARNINGS) { bot.banChatMember(chatId, warnedUserId); bot.sendMessage(chatId, `Usuário banido por exceder o limite de advertências.`); delete warnings[groupId][warnedUserId]; } saveWarnings(); } }); break; case '/mute': checkAdminPermission(msg, () => { let userId; let userName; if (msg.reply_to_message) { userId = msg.reply_to_message.from.id; userName = msg.reply_to_message.from.username; } else { const commandParams = msg.text.split(' ').slice(1).join(' '); if (!commandParams) { bot.sendMessage(chatId, 'Você precisa fornecer o ID do usuário, o username ou usar o comando em resposta a uma mensagem.'); return; } if (/^\d+$/.test(commandParams)) { userId = commandParams; userName = userId; bot.getChatMember(chatId, userId).then((user) => { userName = user.user.username || 'não disponível'; const options = { until_date: Math.floor(Date.now() / 1000) + 3600, can_send_messages: false }; bot.restrictChatMember(chatId, userId, options); sendMessageWithUndoButton(chatId, `@${userName} (${userId}) mutado por 1h.`, JSON.stringify({ command: 'undo_mute', userId: userId })); }).catch((error) => { console.error('Erro ao obter informações do usuário:', error.message); bot.sendMessage(chatId, 'Erro ao obter informações do usuário.'); }); return; } else if (commandParams.startsWith('@')) { const usernameParam = commandParams.substring(1); const user = usernameToUserIdMap.find(user => user.username === usernameParam); if (user) { userId = user.id; userName = usernameParam; const options = { until_date: Math.floor(Date.now() / 1000) + 3600, can_send_messages: false }; bot.restrictChatMember(chatId, userId, options); sendMessageWithUndoButton(chatId, `@${userName} (${userId}) mutado por 1h.`, JSON.stringify({ command: 'undo_mute', userId: userId })); return; } else { bot.sendMessage(chatId, 'Usuário não encontrado.'); return; } } else { bot.sendMessage(chatId, 'Formato de entrada inválido. Use /mute @username ou /mute user_id.'); return; } } const options = { until_date: Math.floor(Date.now() / 1000) + 3600, can_send_messages: false }; bot.restrictChatMember(chatId, userId, options); sendMessageWithUndoButton(chatId, `@${userName} (${userId}) mutado por 1h.`, JSON.stringify({ command: 'undo_mute', userId: userId })); }); break; case '/unmute': checkAdminPermission(msg, () => { let userId; let userName; if (msg.reply_to_message) { userId = msg.reply_to_message.from.id; userName = msg.reply_to_message.from.username; } else { const commandParams = msg.text.split(' ').slice(1).join(' '); if (!commandParams) { bot.sendMessage(chatId, 'Você precisa fornecer o ID do usuário, o username ou usar o comando em resposta a uma mensagem.'); return; } if (/^\d+$/.test(commandParams)) { userId = commandParams; userName = userId; bot.getChatMember(chatId, userId).then((user) => { userName = user.user.username || 'não disponível'; const options = { can_send_messages: true }; bot.restrictChatMember(chatId, userId, options); bot.sendMessage(chatId, `@${userName} foi desmutado.`); }).catch((error) => { console.error('Erro ao obter informações do usuário:', error.message); bot.sendMessage(chatId, 'Erro ao obter informações do usuário.'); }); return; } else if (commandParams.startsWith('@')) { const usernameParam = commandParams.substring(1); const user = usernameToUserIdMap.find(user => user.username === usernameParam); if (user) { userId = user.id; userName = usernameParam; const options = { can_send_messages: true }; bot.restrictChatMember(chatId, userId, options); bot.sendMessage(chatId, `@${userName} foi desmutado.`); return; } else { bot.sendMessage(chatId, 'Usuário não encontrado.'); return; } } else { bot.sendMessage(chatId, 'Formato de entrada inválido. Use /unmute @username ou /unmute user_id.'); return; } } const options = { can_send_messages: true }; bot.restrictChatMember(chatId, userId, options); bot.sendMessage(chatId, `@${userName} foi desmutado.`); }); break; case '/info': checkAdminPermission(msg, () => { let userId; let username; let user_id; const commandParams = msg.text.split(' '); if (msg.reply_to_message) { userId = msg.reply_to_message.from.id; username = msg.reply_to_message.from.username || 'não disponível'; user_id = userId; } else { const firstParam = commandParams[1]; if (commandParams[1] != null) { if (/^\d+$/.test(firstParam)) { userId = firstParam; bot.getChatMember(chatId, userId).then((user) => { user_id = user.user.id; username = user.user.username || 'não disponível'; const userWarnings = warnings[userId] || 0; bot.sendMessage(chatId, `Informações sobre o usuário:\nUser: @${username}\nID: ${user_id}\nNúmero de advertências: ${userWarnings}`); }).catch((error) => { console.error('Erro ao obter informações do usuário:', error.message); bot.sendMessage(chatId, 'Erro ao obter informações do usuário.'); }); return; } else if (firstParam.startsWith('@')) { const usernameParam = firstParam.substring(1); const user = usernameToUserIdMap.find(user => user.username === usernameParam); if (user) { user_id = user.id; username = usernameParam; } else { bot.sendMessage(chatId, 'O usuário não foi encontrado.'); return; } } } else { bot.sendMessage(chatId, 'Você precisa fornecer o ID do usuário, o username ou usar o comando em resposta a uma mensagem.'); return; } } const userWarnings = warnings[userId] || 0; bot.sendMessage(chatId, `Informações sobre o usuário:\nUser: @${username}\nID: ${user_id}\nNúmero de advertências: ${userWarnings}`); }); break; case '/dwarn': checkAdminPermission(msg, () => { const reasonDWarn = msg.text.split(' ').slice(1).join(' '); if (!reasonDWarn) { const warnedUserId = msg.reply_to_message.from.id; const groupId = msg.chat.id; if (!warnings[groupId]) { warnings[groupId] = {}; } const username = msg.reply_to_message.from.username; warnings[groupId][warnedUserId] = warnings[groupId][warnedUserId] ? warnings[groupId][warnedUserId] + 1 : 1; bot.deleteMessage(chatId, msg.reply_to_message.message_id); const warnMessage = `Usuário @${username} advertido: ${warnings[groupId][warnedUserId]}/3`; sendMessageWithUndoButton(chatId, warnMessage, JSON.stringify({ command: 'undo_warn', userId: warnedUserId })); if (warnings[groupId][warnedUserId] > MAX_WARNINGS) { bot.banChatMember(chatId, warnedUserId); bot.sendMessage(chatId, `Usuário banido por exceder o limite de advertências.`); delete warnings[groupId][warnedUserId]; } saveWarnings(); } else { const warnedUserId = msg.reply_to_message.from.id; const groupId = msg.chat.id; if (!warnings[groupId]) { warnings[groupId] = {}; } const username = msg.reply_to_message.from.username; warnings[groupId][warnedUserId] = warnings[groupId][warnedUserId] ? warnings[groupId][warnedUserId] + 1 : 1; bot.deleteMessage(chatId, msg.reply_to_message.message_id); const warnMessage = `Usuário @${username} adivertido: ${warnings[groupId][warnedUserId]}/3\nMotivo: ${reasonDWarn}.`; sendMessageWithUndoButton(chatId, warnMessage, JSON.stringify({ command: 'undo_warn', userId: warnedUserId })); if (warnings[groupId][warnedUserId] > MAX_WARNINGS) { bot.banChatMember(chatId, warnedUserId); bot.sendMessage(chatId, `Usuário banido por exceder o limite de advertências.`); delete warnings[groupId][warnedUserId]; } saveWarnings(); } }); break; case '/dmute': checkAdminPermission(msg, () => { const messageId = msg.reply_to_message.message_id; bot.deleteMessage(chatId, messageId).then(() => { const userId = msg.reply_to_message.from.id; const options = { until_date: Math.floor(Date.now() / 1000) + 3600, can_send_messages: false }; bot.restrictChatMember(chatId, userId, options).then(() => { sendMessageWithUndoButton(chatId, 'Mensagem apagada e usuário mutado por 1 hora.', JSON.stringify({ command: 'undo_mute', userId: userId })); }).catch((error) => { console.error('Erro ao mutar usuário:', error.message); bot.sendMessage(chatId, 'Erro ao mutar usuário.'); }); }).catch((error) => { console.error('Erro ao apagar mensagem:', error.message); bot.sendMessage(chatId, 'Erro ao apagar mensagem.'); }); }); break; case '/dban': checkAdminPermission(msg, () => { const messageId = msg.reply_to_message.message_id; bot.deleteMessage(chatId, messageId).then(() => { const userId = msg.reply_to_message.from.id; bot.banChatMember(chatId, userId).then(() => { sendMessageWithUndoButton(chatId, 'Mensagem apagada e usuário banido.', JSON.stringify({ command: 'undo_ban', userId: userId })); }).catch((error) => { console.error('Erro ao banir usuário:', error.message); bot.sendMessage(chatId, 'Erro ao banir usuário.'); }); }).catch((error) => { console.error('Erro ao apagar mensagem:', error.message); bot.sendMessage(chatId, 'Erro ao apagar mensagem.'); }); }); break; case '/promote': checkCreatorPermission(msg, async () => { const commandParams = msg.text.split(' '); let userId; let userName; let user_name; if (msg.reply_to_message) { userId = msg.reply_to_message.from.id; userName = msg.reply_to_message.from.first_name + (msg.reply_to_message.from.last_name ? ' ' + msg.reply_to_message.from.last_name : ''); user_name = msg.reply_to_message.from.username; } if (!userId && commandParams.length > 1 && /^\d+$/.test(commandParams[1])) { userId = commandParams[1]; userName = userId; user_name = msg.reply_to_message.from.username; } if (!userId && commandParams.length > 1 && commandParams[1].startsWith('@')) { const username = commandParams[1].substring(1); // Procurar o usuário no usernameToUserIdMap const user = usernameToUserIdMap.find(user => user.username === username); if (user) { const user_Id = user.id; await bot.promoteChatMember(chatId, user_Id, { can_change_info: false, can_delete_messages: true, can_invite_users: true, can_restrict_members: true, can_pin_messages: true, can_promote_members: false }); bot.sendMessage(chatId, `Usuário @${username} promovido a administrador.`); return; } else { bot.sendMessage(chatId, 'O usuário não foi encontrado.'); return; } } if (!userId) { bot.sendMessage(chatId, 'Você precisa fornecer o ID do usuário, o username ou usar o comando em resposta a uma mensagem.'); return; } try { await bot.promoteChatMember(chatId, userId, { can_change_info: false, can_delete_messages: true, can_invite_users: true, can_restrict_members: true, can_pin_messages: true, can_promote_members: false }); bot.sendMessage(chatId, `Usuário @${user_name} promovido a administrador.`); } catch (error) { console.error('Erro ao promover usuário a administrador:', error.message); bot.sendMessage(chatId, 'Erro ao promover usuário a administrador.'); } }); break; case '/send': const commandParams = msg.text.split(' ').slice(1).join(' '); console.log(commandParams) bot.deleteMessage(chatId, msg.message_id); bot.sendMessage(chatId, commandParams); break; case '/comandos': const message = await fs.readFileSync('db/comandos.txt', 'utf-8'); bot.sendMessage(chatId, message, { parse_mode: 'HTML' }); break; case '/create': checkAdminPermission(msg, async () => { const commandData = msg.text.split(' ').slice(1).join(' ').split(':') || []; const commandName = commandData[0] ? commandData[0].trim() : false; const commandOrder = commandData[1] ? parseInt(commandData[1].trim()) : false; const groupId = msg.chat.id; if (!customCommands[groupId]) { customCommands[groupId] = {}; } if (!commandData || commandData.length !== 2) { bot.sendMessage(chatId, 'Formato inválido. Use /create nome:ordem'); return; } if (!commandName) { bot.sendMessage(chatId, 'Necessário adicionar um nome para o comando.'); return; } if (!commandOrder || isNaN(commandOrder) || commandOrder <= 0) { bot.sendMessage(chatId, 'Necessário adicionar uma ordem válida para o comando.'); return; } if (customCommands[groupId][commandName]) { bot.sendMessage(chatId, `O comando '${commandName}' já existe.`); return; } if (!msg.reply_to_message || !msg.reply_to_message.text) { bot.sendMessage(chatId, 'Você precisa responder a uma mensagem para criar um comando personalizado.'); return; } const messageText = msg.reply_to_message.text; customCommands[groupId][commandName] = { text: messageText, order: commandOrder }; bot.sendMessage(chatId, `Comando personalizado '${commandName}' criado com número de ordem '${commandOrder}'.`); // Ordena os comandos personalizados por número de ordem const sortedCommands = Object.entries(customCommands[groupId]).sort((a, b) => a[1].order - b[1].order); customCommands[groupId] = Object.fromEntries(sortedCommands); fs.writeFileSync(jsonFilePathMenu, JSON.stringify(customCommands, null, 4)); menuOptions = createMenuButtons(groupId); }); break; case '/menu': menuOptions = createMenuButtons(chatId); const commands = customCommands[chatId]; bot.getChatMember(chatId, msg.from.id) .then(chatMember => { let username = ''; if (chatMember.user.username) { username = '@' + chatMember.user.username; } else if (chatMember.user.first_name) { username = `${chatMember.user.first_name} (ID: ${chatMember.user.id.toString()})`; } setTimeout(() => { bot.deleteMessage(chatId, msgUserId) .catch(error => { console.error('Erro ao excluir mensagem:', error); }); }, 2 * 1000); if (commands && Object.keys(commands).length > 0) { bot.sendPhoto(chatId, 'bot.png', { caption: `Solicitado por: ${username}\n\nSelecione uma ação:`, reply_markup: menuOptions.reply_markup, }).then(sentMessage => { const messageId = sentMessage.message_id; const delaySeconds = 90; setTimeout(() => { bot.deleteMessage(chatId, messageId) .catch(error => { console.error('Erro ao excluir mensagem:', error); }); }, delaySeconds * 1000); }).catch(error => { console.error('Erro ao enviar mensagem:', error); }); } else { bot.sendMessage(chatId, 'Nenhum comando personalizado foi criado ainda'); } }) .catch(error => { console.error('Erro ao obter informações do membro do chat:', error); }); break; case '/delete': checkAdminPermission(msg, async () => { const commandToDelete = msg.text.split(' ').slice(1).join(' '); const groupIdToDelete = msg.chat.id; if (customCommands.hasOwnProperty(groupIdToDelete) && customCommands[groupIdToDelete].hasOwnProperty(commandToDelete)) { delete customCommands[groupIdToDelete][commandToDelete]; bot.sendMessage(msg.chat.id, `Comando "${commandToDelete}" deletado com sucesso.`) .then(sentMessage => { menuOptions = createMenuButtons(groupIdToDelete); fs.writeFileSync(jsonFilePathMenu, JSON.stringify(customCommands, null, 4)); // bot.editMessageReplyMarkup(menuOptions.reply_markup, { // chat_id: sentMessage.chat.id, // message_id: sentMessage.message_id // }); }) .catch(error => { console.error('Erro ao enviar mensagem:', error); }); } else { bot.sendMessage(msg.chat.id, `O comando "${commandToDelete}" não existe.`); } }); break; case '/unban': checkAdminPermission(msg, async () => { let userId; let user_name const commandParams = msg.text.split(' '); if (msg.reply_to_message) { userId = msg.reply_to_message.from.id; } if (!userId && commandParams.length > 1 && /^\d+$/.test(commandParams[1])) { userId = commandParams[1]; } if (!userId && commandParams.length > 1 && commandParams[1].startsWith('@')) { const usernameParam = commandParams[1].substring(1); const user = usernameToUserIdMap.find(user => user.username === usernameParam); if (user) { userId = user.id; user_name = usernameParam; } else { bot.sendMessage(chatId, 'O usuário não foi encontrado.'); return; } } if (!userId) { bot.sendMessage(chatId, 'Você precisa fornecer o ID do usuário, o username ou usar o comando em resposta a uma mensagem.'); return; } bot.getChatMember(msg.chat.id, userId) .then(chatMember => { user_name = chatMember.user.username; }) .catch(error => { console.error('Erro ao obter informações do membro do chat:', error); }); try { await bot.unbanChatMember(chatId, userId); bot.sendMessage(chatId, `Usuário @${user_name} (ID: ${userId}) foi desbanido.`); } catch (error) { console.error('Erro ao desbanir usuário:', error.message); bot.sendMessage(chatId, 'Erro ao desbanir usuário.'); } }); break; case '/pin': checkAdminPermission(msg, async () => { const messageId = msg.reply_to_message.message_id; if (!messageId) { bot.sendMessage(chatId, 'Por favor, responda à mensagem que deseja fixar com o comando /pin.') .then(sentMessage => { const messageId = sentMessage.message_id; const delaySeconds = 30; setTimeout(() => { bot.deleteMessage(chatId, messageId) .catch(error => { console.error('Erro ao excluir mensagem:', error); }); }, delaySeconds * 1000); }).catch(error => { console.error('Erro ao enviar mensagem:', error); }); return; } bot.pinChatMessage(chatId, messageId) .then(() => { bot.sendMessage(chatId, 'A mensagem foi fixada com sucesso.') .then(sentMessage => { const messageId = sentMessage.message_id; const delaySeconds = 30; setTimeout(() => { bot.deleteMessage(chatId, messageId) .catch(error => { console.error('Erro ao excluir mensagem:', error); }); }, delaySeconds * 1000); }).catch(error => { console.error('Erro ao enviar mensagem:', error); }); }) .catch((error) => { console.error('Erro ao fixar mensagem:', error); bot.sendMessage(chatId, 'Ocorreu um erro ao fixar a mensagem. Por favor, tente novamente mais tarde.') .then(sentMessage => { const messageId = sentMessage.message_id; const delaySeconds = 30; setTimeout(() => { bot.deleteMessage(chatId, messageId) .catch(error => { console.error('Erro ao excluir mensagem:', error); }); }, delaySeconds * 1000); }).catch(error => { console.error('Erro ao enviar mensagem:', error); }); }); }); break; case '/editar_ordem': checkAdminPermission(msg, async () => { const commandData = msg.text.split(' ').slice(1).join(' ').split(':'); const commandName = commandData[0].trim(); const newPosition = parseInt(commandData[1].trim()); const groupId = msg.chat.id; if (!customCommands[groupId]) { customCommands[groupId] = {}; } if (isNaN(newPosition) || newPosition <= 0) { bot.sendMessage(chatId, 'A nova posição do comando deve ser um valor numérico maior que zero.'); return; } if (!customCommands[groupId][commandName]) { bot.sendMessage(chatId, `O comando '${commandName}' não existe.`); return; } customCommands[groupId][commandName].order = newPosition; const sortedCommands = Object.entries(customCommands[groupId]).sort((a, b) => a[1].order - b[1].order); customCommands[groupId] = Object.fromEntries(sortedCommands); fs.writeFileSync(jsonFilePathMenu, JSON.stringify(customCommands, null, 4)); bot.sendMessage(chatId, `Posição do comando '${commandName}' atualizada para '${newPosition}'.`); menuOptions = createMenuButtons(groupId); }); break; case '/editar_texto': checkAdminPermission(msg, async () => { const commandName = msg.text.split(' ').slice(1).join(' '); const groupId = msg.chat.id; if (!customCommands[groupId]) { customCommands[groupId] = {}; } if (!customCommands[groupId][commandName]) { bot.sendMessage(chatId, `O comando '${commandName}' não existe.`); return; } if (!msg.reply_to_message || !msg.reply_to_message.text) { bot.sendMessage(chatId, 'Você precisa responder a uma mensagem para editar o texto do comando.'); return; } const newMessageText = msg.reply_to_message.text; customCommands[groupId][commandName].text = newMessageText; fs.writeFileSync(jsonFilePathMenu, JSON.stringify(customCommands, null, 4)); bot.sendMessage(chatId, `Texto do comando '${commandName}' atualizado.`); menuOptions = createMenuButtons(groupId); }); break; case '/editar_comando': checkAdminPermission(msg, async () => { const commandData = msg.text.split(' ').slice(1).join(' ').split(':'); const currentCommandName = commandData[0].trim(); const newCommandName = commandData[1].trim(); const groupId = msg.chat.id; if (!customCommands[groupId]) { customCommands[groupId] = {}; } if (!customCommands[groupId][currentCommandName]) { bot.sendMessage(chatId, `O comando '${currentCommandName}' não existe.`); return; } if (customCommands[groupId][newCommandName]) { bot.sendMessage(chatId, `O novo nome '${newCommandName}' já está em uso.`); return; } customCommands[groupId][newCommandName] = customCommands[groupId][currentCommandName]; delete customCommands[groupId][currentCommandName]; fs.writeFileSync(jsonFilePathMenu, JSON.stringify(customCommands, null, 4)); bot.sendMessage(chatId, `Nome do comando '${currentCommandName}' atualizado para '${newCommandName}'.`); menuOptions = createMenuButtons(groupId); }); break; } } } }); bot.on('callback_query', (callbackQuery) => { const msg = callbackQuery.message; const data = JSON.parse(callbackQuery.data); const user_callbackId = callbackQuery.from.id; const userId = data.userId; const groupId = msg.chat.id; if (!isChatAllowed(groupId)) { bot.sendMessage(groupId, `O bot não está autorizado a ser usado neste grupo.`); return; } switch (data.command) { case 'undo_warn': bot.getChatMember(groupId, user_callbackId) .then(chatMember => { const memberStatus = chatMember.status; if (memberStatus === 'member' || memberStatus === 'administrator' || memberStatus === 'creator') { const status = chatMember.status; if (status === 'administrator' || status === 'creator') { if (warnings[groupId][userId] && warnings[groupId][userId] > 0) { warnings[groupId][userId]--; bot.editMessageText('Aviso removido.', { chat_id: groupId, message_id: msg.message_id }); saveWarnings(); } else { bot.sendMessage(groupId, 'Este usuário não possui advertências.'); } } else { bot.answerCallbackQuery(callbackQuery.id, 'Você não tem permissão para executar este comando.'); } } }) .catch(error => { console.error('Erro ao obter informações do membro do chat:', error.message); }); break; case 'undo_ban': bot.getChatMember(groupId, user_callbackId) .then(chatMember => { const memberStatus = chatMember.status; if (memberStatus === 'member' || memberStatus === 'administrator' || memberStatus === 'creator') { const status = chatMember.status; if (status === 'administrator' || status === 'creator') { bot.unbanChatMember(groupId, userId); bot.editMessageText('Banimento removido.', { chat_id: groupId, message_id: msg.message_id }); } else { bot.answerCallbackQuery(callbackQuery.id, 'Você não tem permissão para executar este comando.'); } } }) .catch(error => { console.error('Erro ao obter informações do membro do chat:', error.message); }); break; case 'undo_mute': bot.getChatMember(groupId, user_callbackId) .then(chatMember => { const memberStatus = chatMember.status; if (memberStatus === 'member' || memberStatus === 'administrator' || memberStatus === 'creator') { const status = chatMember.status; if (status === 'administrator' || status === 'creator') { const options = { can_send_messages: true }; bot.restrictChatMember(groupId, userId, options); bot.editMessageText('Ação de mutar desfeita com sucesso.', { chat_id: groupId, message_id: msg.message_id }); } else { bot.answerCallbackQuery(callbackQuery.id, 'Você não tem permissão para executar este comando.'); } } }) .catch(error => { console.error('Erro ao obter informações do membro do chat:', error.message); }); break; case 'callback_menu': menuOptions = createMenuButtons(groupId); const commands = customCommands[groupId]; if (commands && Object.keys(commands).length > 0) { bot.getChatMember(groupId, user_callbackId) .then(chatMember => { const memberStatus = chatMember.status; if (memberStatus === 'member' || memberStatus === 'administrator' || memberStatus === 'creator') { let username = ''; if (chatMember.user.username) { username = '@' + chatMember.user.username; } else if (chatMember.user.first_name) { username = `${chatMember.user.first_name} (ID: ${chatMember.user.id.toString()})`; } bot.sendPhoto(groupId, 'bot.png', { caption: `Solicitado por: ${username}\n\nSelecione uma ação:`, reply_markup: menuOptions.reply_markup, }).then(sentMessage => { const messageId = sentMessage.message_id; const delaySeconds = 90; setTimeout(() => { bot.deleteMessage(groupId, messageId) .catch(error => { console.error('Erro ao excluir mensagem:', error.message); }); }, delaySeconds * 1000); }).catch(error => { console.error('Erro ao enviar mensagem:', error.message); }); } }) .catch(error => { console.error('Erro ao obter informações do membro do chat:', error.message); }); } else { bot.sendMessage(groupId, 'Nenhum comando personalizado foi criado ainda'); } break; default: const command = data.command.replace('action_', ''); if (customCommands[groupId] && customCommands[groupId][command]) { bot.getChatMember(groupId, user_callbackId) .then(chatMember => { const memberStatus = chatMember.status; if (memberStatus === 'member' || memberStatus === 'administrator' || memberStatus === 'creator') { let username = ''; if (chatMember.user.username) { username = '@' + chatMember.user.username; } else if (chatMember.user.first_name) { username = `${chatMember.user.first_name} (ID: ${chatMember.user.id.toString()})`; } bot.sendMessage(groupId, `${customCommands[groupId][command].text}\n\nSolicitado por: ${username}`, { parse_mode: 'HTML' }).then(sentMessage => { const messageId = sentMessage.message_id; const delaySeconds = 90; setTimeout(() => { bot.deleteMessage(groupId, messageId) .catch(error => { console.error('Erro ao excluir mensagem:', error.message); }); }, delaySeconds * 1000); }).catch(error => { if (error.message.includes(`can't parse entities: Can't find end tag corresponding to start tag code`)) { bot.sendMessage(groupId, `Erro: Alguma tag foi utilizada de forma incorreta neste comando.`); } else { bot.sendMessage(groupId, `Erro: ${error.message}`); } }); } }) .catch(error => { console.error('Erro ao obter informações do membro do chat:', error.message); }); } else { bot.sendMessage(groupId, 'Este comando personalizado não está disponível.'); } break; } }); bot.on('new_chat_members', (msg) => { const chatId = msg.chat.id; const newMembers = msg.new_chat_members; if (!isChatAllowed(chatId)) { bot.sendMessage(chatId, `O bot não está autorizado a ser usado neste grupo.`); return; } newMembers.forEach((member) => { const welcomeMessage = welcomeMessages[Math.floor(Math.random() * welcomeMessages.length)]; let username = ''; if (member.username) { username = '@' + member.username; } else if (member.first_name) { username = `${member.first_name} (ID: ${member.id.toString()})`; } const text = `Bem-vindo(a) ${username}\n${welcomeMessage}\n\nAperte no botão a baixo para ver as opções do grupo.`; const keyboard = { inline_keyboard: [ [ { text: 'menu', callback_data: JSON.stringify({ command: 'callback_menu', userId: member.id.toString() }) } ] ] }; bot.sendMessage(chatId, text, { reply_markup: JSON.stringify(keyboard) }) .then(sentMessage => { const messageId = sentMessage.message_id; const delaySeconds = 90; setTimeout(() => { bot.deleteMessage(chatId, messageId) .catch(error => { console.error('Erro ao excluir mensagem:', error.message); }); }, delaySeconds * 1000); }).catch(error => { console.error('Erro ao enviar mensagem:', error.message); }); }); }); bot.on('left_chat_member', (msg) => { const chatId = msg.chat.id; const userName = msg.left_chat_member.username; const firstName = msg.left_chat_member.first_name; const lastName = msg.left_chat_member.last_name || ''; const message = `O usuário ${firstName} ${lastName} (@${userName}) saiu do grupo.`; if (!isChatAllowed(chatId)) { bot.sendMessage(chatId, `O bot não está autorizado a ser usado neste grupo.`); return; } bot.sendMessage(chatId, message) .then(sentMessage => { const messageId = sentMessage.message_id; const delaySeconds = 60; setTimeout(() => { bot.deleteMessage(chatId, messageId) .catch(error => { console.error('Erro ao excluir mensagem:', error.message); }); }, delaySeconds * 1000); }).catch(error => { console.error('Erro ao enviar mensagem:', error.message); }); }); bot.on('polling_error', (error) => { console.error(error.message); }); function checkAdminPermission(msg, callback) { const chatId = msg.chat.id; bot.getChatMember(chatId, msg.from.id).then((chatMember) => { if (chatMember.status === 'administrator' || chatMember.status === 'creator') { callback(); } else { bot.answerCallbackQuery(chatId, 'Você não tem permissão para usar este comando.'); } }); } function checkCreatorPermission(msg, callback) { const chatId = msg.chat.id; bot.getChatMember(chatId, msg.from.id).then((chatMember) => { if (chatMember.status === 'creator') { callback(); } else { bot.answerCallbackQuery(chatId, 'Você não tem permissão para usar este comando.'); } }); } function sendMessageWithUndoButton(chatId, text, undoCallbackData) { const keyboard = { inline_keyboard: [ [ { text: 'Desfazer', callback_data: undoCallbackData } ] ] }; bot.sendMessage(chatId, text, { reply_markup: JSON.stringify(keyboard) }); } function createMenuButtons(groupId) { let commands = customCommands[groupId] ? Object.entries(customCommands[groupId]) : []; commands.sort((a, b) => a[1].order - b[1].order); const buttons = commands.map(command => ({ text: command[0], callback_data: JSON.stringify({ command: `action_${command[0]}` }) })); const buttonsInRows = []; for (let i = 0; i < buttons.length; i += 2) { buttonsInRows.push(buttons.slice(i, i + 2)); } return { reply_markup: { inline_keyboard: buttonsInRows } }; } function isChatAllowed(chatId) { return allowedGroupIds.includes(chatId.toString()); } function saveWarnings() { try { fs.writeFileSync(jsonFilePathWarnings, JSON.stringify(warnings, null, 4)); console.log('Warnings salvos com sucesso.'); } catch (error) { console.error('Erro ao salvar os warnings no arquivo JSON:', error); } }