Files
LazyBot/app/db.js
T
2026-01-18 16:32:53 +01:00

416 lines
14 KiB
JavaScript

const sqlite3 = require("sqlite3").verbose();
const path = require("path");
const db = new sqlite3.Database(
path.join(__dirname, process.env.DB_PATH || "database.sqlite"),
err => {
if (err) console.error("Erreur DB:", err);
else console.log("DB SQLite connectée");
}
);
db.getAsync = (sql, params = []) => {
return new Promise((resolve, reject) => {
db.get(sql, params, (err, row) => {
if (err) reject(err);
else resolve(row);
});
});
};
db.allAsync = (sql, params = []) => {
return new Promise((resolve, reject) => {
db.all(sql, params, (err, rows) => {
if (err) reject(err);
else resolve(rows);
});
});
};
// Création de la table si elle n'existe pas
db.exec(`
CREATE TABLE IF NOT EXISTS welcome_config (
guild_id TEXT PRIMARY KEY,
channel_id TEXT,
enabled INTEGER NOT NULL,
message TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS goodbye_config (
guild_id TEXT PRIMARY KEY,
channel_id TEXT,
enabled INTEGER NOT NULL,
message TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS autorole_newuser_config (
guild_id TEXT PRIMARY KEY,
role_id TEXT,
enabled INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS autorole_vocal_config (
guild_id TEXT PRIMARY KEY,
role_id TEXT,
exclude_channel_ids TEXT,
enabled INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS levels_config (
guild_id TEXT PRIMARY KEY,
enabled INTEGER NOT NULL,
level_announcements_enabled INTEGER NOT NULL,
level_announcements_channel_id TEXT,
level_announcements_message TEXT NOT NULL,
xp_courbe_type TEXT NOT NULL,
multiplier_courbe_for_level INTEGER NOT NULL,
level_annoncement_every_level INTEGER NOT NULL,
level_max INTEGER NOT NULL,
role_with_without_type TEXT NOT NULL,
role_with_without_xp TEXT NOT NULL,
salon_with_without_type TEXT NOT NULL,
salon_with_without_xp TEXT NOT NULL,
gain_xp_on_message INTEGER NOT NULL,
gain_xp_message_lower_bound INTEGER NOT NULL,
gain_xp_message_upper_bound INTEGER NOT NULL,
cooldown_xp_message_seconds INTEGER NOT NULL,
gain_xp_on_voice INTEGER NOT NULL,
gain_voice_xp_lower_bound INTEGER NOT NULL,
gain_voice_xp_upper_bound INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS user_levels (
guild_id TEXT NOT NULL,
user_id TEXT NOT NULL,
xp INTEGER NOT NULL,
level INTEGER NOT NULL,
last_xp_message_timestamp INTEGER,
PRIMARY KEY (guild_id, user_id)
);
CREATE TABLE IF NOT EXISTS prefix (
guildId TEXT NOT NULL,
prefix TEXT NOT NULL DEFAULT '!',
PRIMARY KEY (guildId)
);
CREATE TABLE IF NOT EXISTS economy_config (
guild_id TEXT PRIMARY KEY,
enabled INTEGER NOT NULL DEFAULT 0,
currency_name TEXT NOT NULL DEFAULT 'coins',
currency_symbol TEXT NOT NULL DEFAULT '💰',
daily_enabled INTEGER NOT NULL DEFAULT 1,
daily_amount INTEGER NOT NULL DEFAULT 100,
daily_cooldown_hours INTEGER NOT NULL DEFAULT 24,
work_enabled INTEGER NOT NULL DEFAULT 1,
work_min_amount INTEGER NOT NULL DEFAULT 50,
work_max_amount INTEGER NOT NULL DEFAULT 150,
work_cooldown_minutes INTEGER NOT NULL DEFAULT 60,
crime_enabled INTEGER NOT NULL DEFAULT 1,
crime_min_amount INTEGER NOT NULL DEFAULT 100,
crime_max_amount INTEGER NOT NULL DEFAULT 500,
crime_success_rate INTEGER NOT NULL DEFAULT 50,
crime_fine_percent INTEGER NOT NULL DEFAULT 30,
crime_cooldown_minutes INTEGER NOT NULL DEFAULT 120,
steal_enabled INTEGER NOT NULL DEFAULT 1,
steal_success_rate INTEGER NOT NULL DEFAULT 40,
steal_max_percent INTEGER NOT NULL DEFAULT 50,
steal_fine_percent INTEGER NOT NULL DEFAULT 25,
steal_cooldown_minutes INTEGER NOT NULL DEFAULT 180,
message_money_enabled INTEGER NOT NULL DEFAULT 0,
message_money_min INTEGER NOT NULL DEFAULT 1,
message_money_max INTEGER NOT NULL DEFAULT 5,
message_money_cooldown_seconds INTEGER NOT NULL DEFAULT 60,
voice_money_enabled INTEGER NOT NULL DEFAULT 0,
voice_money_min INTEGER NOT NULL DEFAULT 5,
voice_money_max INTEGER NOT NULL DEFAULT 15,
voice_money_interval_minutes INTEGER NOT NULL DEFAULT 5,
starting_balance INTEGER NOT NULL DEFAULT 0
);
CREATE TABLE IF NOT EXISTS user_economy (
guild_id TEXT NOT NULL,
user_id TEXT NOT NULL,
balance INTEGER NOT NULL DEFAULT 0,
bank INTEGER NOT NULL DEFAULT 0,
last_daily_timestamp INTEGER,
last_work_timestamp INTEGER,
last_crime_timestamp INTEGER,
last_steal_timestamp INTEGER,
last_message_money_timestamp INTEGER,
PRIMARY KEY (guild_id, user_id)
);
CREATE TABLE IF NOT EXISTS shop_items (
id INTEGER PRIMARY KEY AUTOINCREMENT,
guild_id TEXT NOT NULL,
name TEXT NOT NULL,
description TEXT,
price INTEGER NOT NULL,
role_id TEXT,
stock INTEGER DEFAULT -1,
created_at INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS user_inventory (
id INTEGER PRIMARY KEY AUTOINCREMENT,
guild_id TEXT NOT NULL,
user_id TEXT NOT NULL,
item_id INTEGER NOT NULL,
quantity INTEGER NOT NULL DEFAULT 1,
purchased_at INTEGER NOT NULL,
FOREIGN KEY (item_id) REFERENCES shop_items(id)
);
CREATE TABLE IF NOT EXISTS privateroom_config (
guild_id TEXT PRIMARY KEY,
enabled INTEGER NOT NULL DEFAULT 0,
creator_channel_id TEXT,
category_id TEXT,
channel_name_format TEXT NOT NULL DEFAULT '🔊 Salon de {user}'
);
CREATE TABLE IF NOT EXISTS temp_voice_channels (
channel_id TEXT PRIMARY KEY,
guild_id TEXT NOT NULL,
owner_id TEXT NOT NULL,
created_at INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS counting_config (
guild_id TEXT PRIMARY KEY,
enabled INTEGER NOT NULL DEFAULT 0,
channel_id TEXT,
current_count INTEGER NOT NULL DEFAULT 0,
last_user_id TEXT
);
CREATE TABLE IF NOT EXISTS stats_channels (
id INTEGER PRIMARY KEY AUTOINCREMENT,
guild_id TEXT NOT NULL,
channel_id TEXT NOT NULL,
stat_type TEXT NOT NULL,
role_id TEXT,
format TEXT NOT NULL DEFAULT '{stat}',
UNIQUE(guild_id, channel_id)
);
CREATE TABLE IF NOT EXISTS user_activity_stats (
id INTEGER PRIMARY KEY AUTOINCREMENT,
guild_id TEXT NOT NULL,
user_id TEXT NOT NULL,
stat_type TEXT NOT NULL,
value INTEGER NOT NULL DEFAULT 0,
date TEXT NOT NULL,
UNIQUE(guild_id, user_id, stat_type, date)
);
CREATE TABLE IF NOT EXISTS voice_sessions (
guild_id TEXT NOT NULL,
user_id TEXT NOT NULL,
join_timestamp INTEGER NOT NULL,
PRIMARY KEY(guild_id, user_id)
);
CREATE INDEX IF NOT EXISTS idx_user_activity_stats_date ON user_activity_stats(guild_id, user_id, date);
CREATE TABLE IF NOT EXISTS logs_config (
guild_id TEXT PRIMARY KEY,
enabled INTEGER NOT NULL DEFAULT 0,
category_id TEXT,
moderation_enabled INTEGER NOT NULL DEFAULT 0,
moderation_channel_id TEXT,
voice_enabled INTEGER NOT NULL DEFAULT 0,
voice_channel_id TEXT,
messages_enabled INTEGER NOT NULL DEFAULT 0,
messages_channel_id TEXT,
members_enabled INTEGER NOT NULL DEFAULT 0,
members_channel_id TEXT,
channels_enabled INTEGER NOT NULL DEFAULT 0,
channels_channel_id TEXT,
roles_enabled INTEGER NOT NULL DEFAULT 0,
roles_channel_id TEXT,
invites_enabled INTEGER NOT NULL DEFAULT 0,
invites_channel_id TEXT,
server_enabled INTEGER NOT NULL DEFAULT 0,
server_channel_id TEXT
);
CREATE TABLE IF NOT EXISTS username_history (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id TEXT NOT NULL,
username TEXT NOT NULL,
display_name TEXT,
changed_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
);
CREATE INDEX IF NOT EXISTS idx_username_history_user ON username_history(user_id, changed_at DESC);
CREATE TABLE IF NOT EXISTS nickname_history (
id INTEGER PRIMARY KEY AUTOINCREMENT,
guild_id TEXT NOT NULL,
user_id TEXT NOT NULL,
nickname TEXT,
changed_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
);
CREATE INDEX IF NOT EXISTS idx_nickname_history_user ON nickname_history(guild_id, user_id, changed_at DESC);
CREATE TABLE IF NOT EXISTS antiraid_config (
guild_id TEXT PRIMARY KEY,
enabled INTEGER NOT NULL DEFAULT 0,
log_channel_id TEXT,
-- Anti-link
antilink_enabled INTEGER NOT NULL DEFAULT 0,
antilink_action TEXT NOT NULL DEFAULT 'delete',
antilink_whitelist_domains TEXT DEFAULT '[]',
antilink_exclude_channels TEXT DEFAULT '[]',
antilink_exclude_roles TEXT DEFAULT '[]',
antilink_warn_message TEXT DEFAULT '⚠️ Les liens ne sont pas autorisés ici.',
-- Anti-invite (liens Discord)
antiinvite_enabled INTEGER NOT NULL DEFAULT 0,
antiinvite_action TEXT NOT NULL DEFAULT 'delete',
antiinvite_allow_own_server INTEGER NOT NULL DEFAULT 1,
antiinvite_exclude_channels TEXT DEFAULT '[]',
antiinvite_exclude_roles TEXT DEFAULT '[]',
-- Anti-spam
antispam_enabled INTEGER NOT NULL DEFAULT 0,
antispam_action TEXT NOT NULL DEFAULT 'mute',
antispam_max_messages INTEGER NOT NULL DEFAULT 5,
antispam_interval_seconds INTEGER NOT NULL DEFAULT 5,
antispam_mute_duration_minutes INTEGER NOT NULL DEFAULT 10,
antispam_exclude_channels TEXT DEFAULT '[]',
antispam_exclude_roles TEXT DEFAULT '[]',
-- Anti-duplicate (messages identiques)
antidupe_enabled INTEGER NOT NULL DEFAULT 0,
antidupe_action TEXT NOT NULL DEFAULT 'delete',
antidupe_max_duplicates INTEGER NOT NULL DEFAULT 3,
antidupe_interval_seconds INTEGER NOT NULL DEFAULT 60,
antidupe_exclude_channels TEXT DEFAULT '[]',
antidupe_exclude_roles TEXT DEFAULT '[]',
-- Anti-mass mention
antimention_enabled INTEGER NOT NULL DEFAULT 0,
antimention_action TEXT NOT NULL DEFAULT 'delete',
antimention_max_mentions INTEGER NOT NULL DEFAULT 5,
antimention_exclude_channels TEXT DEFAULT '[]',
antimention_exclude_roles TEXT DEFAULT '[]',
-- Anti-mass emoji
antiemoji_enabled INTEGER NOT NULL DEFAULT 0,
antiemoji_action TEXT NOT NULL DEFAULT 'delete',
antiemoji_max_emojis INTEGER NOT NULL DEFAULT 10,
antiemoji_exclude_channels TEXT DEFAULT '[]',
antiemoji_exclude_roles TEXT DEFAULT '[]',
-- Anti-caps (majuscules)
anticaps_enabled INTEGER NOT NULL DEFAULT 0,
anticaps_action TEXT NOT NULL DEFAULT 'delete',
anticaps_max_percent INTEGER NOT NULL DEFAULT 70,
anticaps_min_length INTEGER NOT NULL DEFAULT 10,
anticaps_exclude_channels TEXT DEFAULT '[]',
anticaps_exclude_roles TEXT DEFAULT '[]',
-- Anti-bot join
antibot_enabled INTEGER NOT NULL DEFAULT 0,
antibot_action TEXT NOT NULL DEFAULT 'kick',
antibot_min_account_age_days INTEGER NOT NULL DEFAULT 7,
antibot_no_avatar_action INTEGER NOT NULL DEFAULT 0,
antibot_suspicious_name_action INTEGER NOT NULL DEFAULT 0,
-- Anti-mass join (raid de comptes)
antimassj_enabled INTEGER NOT NULL DEFAULT 0,
antimassj_action TEXT NOT NULL DEFAULT 'kick',
antimassj_max_joins INTEGER NOT NULL DEFAULT 10,
antimassj_interval_seconds INTEGER NOT NULL DEFAULT 10,
antimassj_lockdown_duration_minutes INTEGER NOT NULL DEFAULT 5,
-- Anti-newline spam
antinewline_enabled INTEGER NOT NULL DEFAULT 0,
antinewline_action TEXT NOT NULL DEFAULT 'delete',
antinewline_max_lines INTEGER NOT NULL DEFAULT 15,
antinewline_exclude_channels TEXT DEFAULT '[]',
antinewline_exclude_roles TEXT DEFAULT '[]',
-- Anti-badwords (gros mots)
antibadwords_enabled INTEGER NOT NULL DEFAULT 0,
antibadwords_action TEXT NOT NULL DEFAULT 'delete',
antibadwords_words TEXT DEFAULT '[]',
antibadwords_exclude_channels TEXT DEFAULT '[]',
antibadwords_exclude_roles TEXT DEFAULT '[]',
antibadwords_warn_message TEXT DEFAULT '⚠️ Les insultes et gros mots ne sont pas autorisés.'
);
CREATE TABLE IF NOT EXISTS antiraid_warnings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
guild_id TEXT NOT NULL,
user_id TEXT NOT NULL,
warning_type TEXT NOT NULL,
warned_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
);
CREATE INDEX IF NOT EXISTS idx_antiraid_warnings ON antiraid_warnings(guild_id, user_id, warning_type, warned_at);
-- Table des warns utilisateurs
CREATE TABLE IF NOT EXISTS warnings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
guild_id TEXT NOT NULL,
user_id TEXT NOT NULL,
moderator_id TEXT NOT NULL,
reason TEXT NOT NULL,
source TEXT DEFAULT 'manual',
created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
);
CREATE INDEX IF NOT EXISTS idx_warnings ON warnings(guild_id, user_id, created_at DESC);
-- Configuration des sanctions automatiques par warns
CREATE TABLE IF NOT EXISTS warnings_config (
guild_id TEXT PRIMARY KEY,
enabled INTEGER NOT NULL DEFAULT 0,
warn1_action TEXT DEFAULT 'none',
warn1_duration INTEGER DEFAULT 10,
warn2_action TEXT DEFAULT 'none',
warn2_duration INTEGER DEFAULT 30,
warn3_action TEXT DEFAULT 'mute',
warn3_duration INTEGER DEFAULT 60,
warn4_action TEXT DEFAULT 'kick',
warn4_duration INTEGER DEFAULT 0,
warn5_action TEXT DEFAULT 'ban',
warn5_duration INTEGER DEFAULT 0,
decay_enabled INTEGER NOT NULL DEFAULT 0,
decay_days INTEGER DEFAULT 30,
notify_user INTEGER NOT NULL DEFAULT 1,
notify_channel_id TEXT
);
CREATE TABLE IF NOT EXISTS scheduled_messages (
id INTEGER PRIMARY KEY AUTOINCREMENT,
guild_id TEXT NOT NULL,
channel_id TEXT NOT NULL,
message_content TEXT NOT NULL,
embed_enabled INTEGER NOT NULL DEFAULT 0,
embed_title TEXT,
embed_description TEXT,
embed_color TEXT DEFAULT '#5865F2',
schedule_type TEXT NOT NULL DEFAULT 'weekly',
days_of_week TEXT DEFAULT '[]',
times_of_day TEXT DEFAULT '[]',
interval_value INTEGER DEFAULT 60,
interval_unit TEXT DEFAULT 'minutes',
force_send INTEGER NOT NULL DEFAULT 1,
delete_previous INTEGER NOT NULL DEFAULT 0,
enabled INTEGER NOT NULL DEFAULT 1,
last_sent_at INTEGER,
last_message_id TEXT,
last_channel_activity INTEGER,
created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
);
`);
module.exports = db;