-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathaddTestBot.js
More file actions
92 lines (73 loc) · 3.17 KB
/
addTestBot.js
File metadata and controls
92 lines (73 loc) · 3.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// addTestBot.js (Versão 2.0 - com Criptografia)
const sqlite3 = require('sqlite3');
const { open } = require('sqlite');
const crypto = require('node:crypto');
const readline = require('node:readline');
require('dotenv').config();
/**
* Criptografa um token usando o mesmo método do PHP (AES-256-CBC).
* @param {string} token O token em texto puro.
* @param {string} key A chave de criptografia de 32 caracteres.
* @returns {string} O token criptografado e codificado em base64.
*/
function encryptToken(token, key) {
const algorithm = 'aes-256-cbc';
// O IV (Vetor de Inicialização) deve ter 16 bytes para AES-256
const iv = crypto.randomBytes(16);
// A chave deve ser um Buffer de 32 bytes
const keyBuffer = Buffer.from(key, 'utf-8');
const cipher = crypto.createCipheriv(algorithm, keyBuffer, iv);
let encrypted = cipher.update(token, 'utf8', 'base64');
encrypted += cipher.final('base64');
// Combinamos o IV (em formato binário) e o token criptografado, separados por '::'
const combined = iv.toString('binary') + '::' + encrypted;
// Retornamos a string final codificada em base64, exatamente como o PHP faz.
return Buffer.from(combined).toString('base64');
}
// Helper para fazer perguntas no terminal usando async/await
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const askQuestion = (query) => new Promise(resolve => rl.question(query, resolve));
// Função principal assíncrona
async function main() {
console.log('--- Adicionando Novo Bot via Linha de Comando ---');
const key = process.env.ENCRYPTION_KEY;
if (!key || key.length !== 32) {
console.error('❌ Erro: ENCRYPTION_KEY não encontrada ou inválida no seu arquivo .env.');
console.error(' A chave deve ter exatamente 32 caracteres.');
rl.close();
return;
}
let db;
try {
const ownerId = await askQuestion('Qual é o seu ID de usuário do Discord? ');
const botName = await askQuestion('Digite um nome para o bot: ');
const botToken = await askQuestion('Cole o token do bot aqui: ');
if (!ownerId.trim() || !botName.trim() || !botToken.trim()) {
console.error('\n❌ Todos os campos são obrigatórios. Operação cancelada.');
return;
}
console.log('\nCriptografando o token...');
const encryptedToken = encryptToken(botToken.trim(), key);
console.log('Conectando ao banco de dados...');
db = await open({
filename: './bots.db',
driver: sqlite3.Database
});
console.log('Inserindo bot no banco de dados...');
await db.run(
"INSERT INTO bots_filhos (owner_id, bot_name, bot_token, is_active) VALUES (?, ?, ?, ?)",
[ownerId.trim(), botName.trim(), encryptedToken, 1]
);
console.log('\n✅ Sucesso! Bot adicionado e pronto para ser iniciado pelo gerenciador.');
} catch (error) {
console.error('\n❌ Ocorreu um erro durante o processo:', error.message);
} finally {
if (db) await db.close();
rl.close();
}
}
// Executa a função principal
main();