Update Bot

This commit is contained in:
2026-03-15 11:58:43 +01:00
parent b67c111ffc
commit cd99275933
560 changed files with 23173 additions and 55113 deletions

View File

@@ -1,10 +1,10 @@
const mysql = require('mysql2/promise');
const pool = mysql.createPool({
host: process.env.DB_HOST || '192.168.1.6',
user: process.env.DB_USER || 'bot',
password: process.env.DB_PASSWORD || 'NxKr63LJB65pHv%t7E$JqgxKRsZMw%VIHEZAjq%^O0KYKjW#cRc^ebIH@%S9kaTh*GIg^D3ai4KBjMeXEh6xwv#9afQIR2$!2UB8C3ToXjnYFmzR%$lfpshnf8g@8229',
database: process.env.DB_NAME || 'bot',
host: process.env.DB_HOST || '192.168.1.6',
user: process.env.DB_USER || 'bot',
password: process.env.DB_PASSWORD || 'NxKr63LJB65pHv%t7E$JqgxKRsZMw%VIHEZAjq%^O0KYKjW#cRc^ebIH@%S9kaTh*GIg^D3ai4KBjMeXEh6xwv#9afQIR2$!2UB8C3ToXjnYFmzR%$lfpshnf8g@8229',
database: process.env.DB_NAME || 'bot',
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
@@ -13,20 +13,28 @@ const pool = mysql.createPool({
async function initDB() {
const conn = await pool.getConnection();
try {
// Tables de modération
await conn.query(`
CREATE TABLE IF NOT EXISTS bans (
userId VARCHAR(32),
guildId VARCHAR(32),
userId VARCHAR(32),
guildId VARCHAR(32),
reason TEXT,
modId VARCHAR(32),
timestamp BIGINT,
type VARCHAR(20) NOT NULL,
unbanDate BIGINT,
PRIMARY KEY (userId, guildId)
)
unbanDate BIGINT,
PRIMARY KEY (userId, guildId)
)
`);
// Ajouter la colonne guildId si elle n'existe pas (migration)
try {
await conn.query('ALTER TABLE bans ADD COLUMN guildId VARCHAR(32)');
await conn.query('ALTER TABLE bans DROP PRIMARY KEY');
await conn.query('ALTER TABLE bans ADD PRIMARY KEY (userId, guildId)');
} catch {
// La colonne existe déjà, on continue
}
await conn.query(`
CREATE TABLE IF NOT EXISTS logs (
id INT AUTO_INCREMENT PRIMARY KEY,
@@ -34,203 +42,231 @@ async function initDB() {
userTag VARCHAR(100),
modId VARCHAR(32),
modTag VARCHAR(100),
action VARCHAR(50),
action VARCHAR(50),
reason TEXT,
type ENUM('Permanent','Temporary') DEFAULT 'Permanent',
guildId VARCHAR(32),
guildId VARCHAR(32),
timestamp BIGINT
)
`);
// Ajouter la colonne guildId si elle n'existe pas (migration)
try {
await conn.query('ALTER TABLE logs ADD COLUMN guildId VARCHAR(32)');
} catch {
// La colonne existe déjà, on continue
}
// Agrandir la colonne action si elle est trop petite (migration)
try {
await conn.query('ALTER TABLE logs MODIFY COLUMN action VARCHAR(50)');
} catch {
// La colonne est déjà de la bonne taille ou n'existe pas, on continue
}
// Table pour les mutes
await conn.query(`
CREATE TABLE IF NOT EXISTS mutes (
userId VARCHAR(32),
guildId VARCHAR(32),
reason TEXT,
modId VARCHAR(32),
modTag VARCHAR(100),
timestamp BIGINT,
unmuteDate BIGINT,
type VARCHAR(20) NOT NULL,
PRIMARY KEY (userId, guildId)
)
`);
// Table pour les messages de ban personnalisés
await conn.query(`
CREATE TABLE IF NOT EXISTS staffbanmessages (
userId VARCHAR(32) PRIMARY KEY,
userTag VARCHAR(100),
message TEXT,
timestamp BIGINT
)
)
`);
await conn.query(`
CREATE TABLE IF NOT EXISTS mutes (
userId VARCHAR(32),
guildId VARCHAR(32),
reason TEXT,
modId VARCHAR(32),
modTag VARCHAR(100),
timestamp BIGINT,
unmuteDate BIGINT,
type VARCHAR(20) NOT NULL,
PRIMARY KEY (userId, guildId)
)
`);
// Table pour les tickets
await conn.query(`
CREATE TABLE IF NOT EXISTS tickets (
id INT AUTO_INCREMENT PRIMARY KEY,
ticketId VARCHAR(20) UNIQUE NOT NULL,
channelId VARCHAR(32) UNIQUE NOT NULL,
userId VARCHAR(32) NOT NULL,
userTag VARCHAR(100),
guildId VARCHAR(32) NOT NULL,
type ENUM('Support', 'Plainte', 'Plainte Staff', 'Candidature', 'Problème Technique') NOT NULL,
status ENUM('Ouvert', 'Fermé', 'En attente', 'Supprimé') DEFAULT 'Ouvert',
createdAt BIGINT NOT NULL,
closedAt BIGINT,
closedBy VARCHAR(32),
transcript TEXT,
transcriptPath VARCHAR(255),
INDEX idx_userId (userId),
INDEX idx_guildId (guildId),
INDEX idx_status (status)
)
`);
await conn.query(`
CREATE TABLE IF NOT EXISTS staffbanmessages (
userId VARCHAR(32) PRIMARY KEY,
userTag VARCHAR(100),
message TEXT,
timestamp BIGINT
)
`);
// Ajouter la colonne transcriptPath si elle n'existe pas (migration)
try {
await conn.query('ALTER TABLE tickets ADD COLUMN transcriptPath VARCHAR(255)');
} catch {
// La colonne existe déjà, on continue
}
// Tables de tickets
await conn.query(`
CREATE TABLE IF NOT EXISTS tickets (
id INT AUTO_INCREMENT PRIMARY KEY,
ticketId VARCHAR(20) UNIQUE NOT NULL,
channelId VARCHAR(32) UNIQUE NOT NULL,
userId VARCHAR(32) NOT NULL,
userTag VARCHAR(100),
guildId VARCHAR(32) NOT NULL,
type ENUM('Support', 'Plainte', 'Plainte Staff', 'Candidature', 'Problème Technique') NOT NULL,
status ENUM('Ouvert', 'Fermé', 'En attente', 'Supprimé') DEFAULT 'Ouvert',
createdAt BIGINT NOT NULL,
closedAt BIGINT,
closedBy VARCHAR(32),
transcript TEXT,
transcriptPath VARCHAR(255),
claimedBy VARCHAR(32),
claimedAt BIGINT,
claimedByTag VARCHAR(100),
INDEX idx_userId (userId),
INDEX idx_guildId (guildId),
INDEX idx_status (status),
INDEX idx_claimedBy (claimedBy)
)
`);
// Ajouter la colonne claimedBy si elle n'existe pas (migration)
try {
await conn.query('ALTER TABLE tickets ADD COLUMN claimedBy VARCHAR(32)');
} catch {
// La colonne existe déjà, on continue
}
await conn.query(`
CREATE TABLE IF NOT EXISTS ticket_messages (
id INT AUTO_INCREMENT PRIMARY KEY,
ticketId VARCHAR(20) NOT NULL,
messageId VARCHAR(32) NOT NULL,
userId VARCHAR(32) NOT NULL,
userTag VARCHAR(100),
content TEXT,
attachments TEXT,
timestamp BIGINT NOT NULL,
INDEX idx_ticketId (ticketId),
INDEX idx_messageId (messageId)
)
`);
// Ajouter la colonne claimedAt si elle n'existe pas (migration)
try {
await conn.query('ALTER TABLE tickets ADD COLUMN claimedAt BIGINT');
} catch {
// La colonne existe déjà, on continue
}
await conn.query(`
CREATE TABLE IF NOT EXISTS candidature_responses (
id INT AUTO_INCREMENT PRIMARY KEY,
ticketId VARCHAR(20) NOT NULL,
questionNumber INT NOT NULL,
question TEXT NOT NULL,
response TEXT,
timestamp BIGINT NOT NULL,
INDEX idx_ticketId (ticketId)
)
`);
// Ajouter la colonne claimedByTag si elle n'existe pas (migration)
try {
await conn.query('ALTER TABLE tickets ADD COLUMN claimedByTag VARCHAR(100)');
} catch {
// La colonne existe déjà, on continue
}
// Tables XP
await conn.query(`
CREATE TABLE IF NOT EXISTS user_xp (
userId VARCHAR(32) NOT NULL,
guildId VARCHAR(32) NOT NULL,
xp INT DEFAULT 0,
level INT DEFAULT 0,
lastMessageTime BIGINT DEFAULT 0,
totalMessages INT DEFAULT 0,
totalVoiceTime INT DEFAULT 0,
lastVoiceJoin BIGINT DEFAULT 0,
lastBumpTime BIGINT DEFAULT 0,
PRIMARY KEY (userId, guildId),
INDEX idx_guildId (guildId),
INDEX idx_xp (xp),
INDEX idx_level (level)
)
`);
// Ajouter l'index pour claimedBy si elle n'existe pas (migration)
try {
await conn.query('CREATE INDEX idx_claimedBy ON tickets(claimedBy)');
} catch {
// L'index existe déjà, on continue
}
await conn.query(`
CREATE TABLE IF NOT EXISTS xp_excluded_channels (
channelId VARCHAR(32) NOT NULL,
guildId VARCHAR(32) NOT NULL,
reason VARCHAR(255),
addedBy VARCHAR(32),
addedAt BIGINT,
PRIMARY KEY (channelId, guildId),
INDEX idx_guildId (guildId)
)
`);
// Table pour les messages des tickets (pour transcription)
await conn.query(`
CREATE TABLE IF NOT EXISTS ticket_messages (
id INT AUTO_INCREMENT PRIMARY KEY,
ticketId VARCHAR(20) NOT NULL,
messageId VARCHAR(32) NOT NULL,
userId VARCHAR(32) NOT NULL,
userTag VARCHAR(100),
content TEXT,
attachments TEXT,
timestamp BIGINT NOT NULL,
INDEX idx_ticketId (ticketId),
INDEX idx_messageId (messageId)
)
`);
await conn.query(`
CREATE TABLE IF NOT EXISTS xp_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
userId VARCHAR(32) NOT NULL,
guildId VARCHAR(32) NOT NULL,
xpGained INT NOT NULL,
source VARCHAR(50) NOT NULL,
multiplier DECIMAL(3,2) DEFAULT 1.00,
timestamp BIGINT NOT NULL,
INDEX idx_userId (userId),
INDEX idx_guildId (guildId),
INDEX idx_timestamp (timestamp)
)
`);
// Table pour les réponses aux questions de candidature
await conn.query(`
CREATE TABLE IF NOT EXISTS candidature_responses (
id INT AUTO_INCREMENT PRIMARY KEY,
ticketId VARCHAR(20) NOT NULL,
questionNumber INT NOT NULL,
question TEXT NOT NULL,
response TEXT,
timestamp BIGINT NOT NULL,
INDEX idx_ticketId (ticketId)
)
`);
// Tables Bump
await conn.query(`
CREATE TABLE IF NOT EXISTS bumps (
id INT AUTO_INCREMENT PRIMARY KEY,
userId VARCHAR(32) NOT NULL,
guildId VARCHAR(32) NOT NULL,
bumpTime BIGINT NOT NULL,
reminderSent BOOLEAN DEFAULT FALSE,
INDEX idx_userId (userId),
INDEX idx_guildId (guildId),
INDEX idx_bumpTime (bumpTime)
)
`);
// Table pour les niveaux/XP des utilisateurs
await conn.query(`
CREATE TABLE IF NOT EXISTS user_xp (
userId VARCHAR(32) NOT NULL,
guildId VARCHAR(32) NOT NULL,
xp INT DEFAULT 0,
level INT DEFAULT 0,
lastMessageTime BIGINT DEFAULT 0,
totalMessages INT DEFAULT 0,
totalVoiceTime INT DEFAULT 0,
lastVoiceJoin BIGINT DEFAULT 0,
lastBumpTime BIGINT DEFAULT 0,
PRIMARY KEY (userId, guildId),
INDEX idx_guildId (guildId),
INDEX idx_xp (xp),
INDEX idx_level (level)
)
`);
await conn.query(`
CREATE TABLE IF NOT EXISTS bump_channels (
channelId VARCHAR(32) NOT NULL,
guildId VARCHAR(32) NOT NULL,
bumpBotId VARCHAR(32),
addedBy VARCHAR(32),
addedAt BIGINT,
PRIMARY KEY (channelId, guildId),
INDEX idx_guildId (guildId)
)
`);
// Table pour les salons exclus de l'XP
await conn.query(`
CREATE TABLE IF NOT EXISTS xp_excluded_channels (
channelId VARCHAR(32) NOT NULL,
guildId VARCHAR(32) NOT NULL,
reason VARCHAR(255),
addedBy VARCHAR(32),
addedAt BIGINT,
PRIMARY KEY (channelId, guildId),
INDEX idx_guildId (guildId)
)
`);
// Tables Profils
await conn.query(`
CREATE TABLE IF NOT EXISTS user_profiles (
userId VARCHAR(32) NOT NULL,
guildId VARCHAR(32) NOT NULL,
signature TEXT,
birthday DATE,
color VARCHAR(7),
gender VARCHAR(50),
location VARCHAR(100),
updatedAt BIGINT,
PRIMARY KEY (userId, guildId),
INDEX idx_guildId (guildId)
)
`);
// Table pour les logs de gain d'XP (optionnel, pour debugging)
await conn.query(`
CREATE TABLE IF NOT EXISTS xp_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
userId VARCHAR(32) NOT NULL,
guildId VARCHAR(32) NOT NULL,
xpGained INT NOT NULL,
source VARCHAR(50) NOT NULL,
multiplier DECIMAL(3,2) DEFAULT 1.00,
timestamp BIGINT NOT NULL,
INDEX idx_userId (userId),
INDEX idx_guildId (guildId),
INDEX idx_timestamp (timestamp)
)
`);
// Migrations (pour compatibilité existante)
// On utilise la syntaxe standard sans IF NOT EXISTS pour compatibilité maximale
try {
await conn.query('ALTER TABLE bans ADD COLUMN guildId VARCHAR(32)');
await conn.query('ALTER TABLE bans DROP PRIMARY KEY');
await conn.query('ALTER TABLE bans ADD PRIMARY KEY (userId, guildId)');
} catch {}
try { await conn.query('ALTER TABLE logs ADD COLUMN guildId VARCHAR(32)'); } catch {}
try { await conn.query('ALTER TABLE logs MODIFY COLUMN action VARCHAR(50)'); } catch {}
try { await conn.query('ALTER TABLE tickets ADD COLUMN transcriptPath VARCHAR(255)'); } catch {}
try { await conn.query('ALTER TABLE tickets ADD COLUMN claimedBy VARCHAR(32)'); } catch {}
try { await conn.query('ALTER TABLE tickets ADD COLUMN claimedAt BIGINT'); } catch {}
try { await conn.query('ALTER TABLE tickets ADD COLUMN claimedByTag VARCHAR(100)'); } catch {}
// Migrations Profils (Sans IF NOT EXISTS)
try { await conn.query('ALTER TABLE user_profiles ADD COLUMN color VARCHAR(7)'); } catch {}
try { await conn.query('ALTER TABLE user_profiles ADD COLUMN gender VARCHAR(50)'); } catch {}
try { await conn.query('ALTER TABLE user_profiles ADD COLUMN location VARCHAR(100)'); } catch {}
// Table pour stocker les bumps (pour reminder et XP)
await conn.query(`
CREATE TABLE IF NOT EXISTS bumps (
id INT AUTO_INCREMENT PRIMARY KEY,
userId VARCHAR(32) NOT NULL,
guildId VARCHAR(32) NOT NULL,
bumpTime BIGINT NOT NULL,
reminderSent BOOLEAN DEFAULT FALSE,
INDEX idx_userId (userId),
INDEX idx_guildId (guildId),
INDEX idx_bumpTime (bumpTime)
)
`);
} finally {
conn.release();
}
// Table pour stocker les salons de bump (configuration)
await conn.query(`
CREATE TABLE IF NOT EXISTS bump_channels (
channelId VARCHAR(32) NOT NULL,
guildId VARCHAR(32) NOT NULL,
bumpBotId VARCHAR(32),
addedBy VARCHAR(32),
addedAt BIGINT,
PRIMARY KEY (channelId, guildId),
INDEX idx_guildId (guildId)
)
`);
// Table pour les profils utilisateurs (signatures, etc.)
await conn.query(`
CREATE TABLE IF NOT EXISTS user_profiles (
userId VARCHAR(32) NOT NULL,
guildId VARCHAR(32) NOT NULL,
signature TEXT,
birthday DATE,
updatedAt BIGINT,
PRIMARY KEY (userId, guildId),
INDEX idx_guildId (guildId)
)
`);
} finally {
conn.release();
}
}
initDB().catch(console.error);
module.exports = pool;
module.exports = pool;