-- ===================================================== -- SCHEMA BASE DE DONNÉES - CLASH ROYALE DISCORD BOT -- ===================================================== -- Créé pour gérer les associations utilisateurs Discord <-> Clash Royale -- et le suivi des trophées pour les félicitations automatiques -- Suppression des tables existantes (si elles existent) DROP TABLE IF EXISTS trophy_history; DROP TABLE IF EXISTS user_profiles; DROP TABLE IF EXISTS bot_settings; -- ===================================================== -- TABLE: user_profiles -- ===================================================== -- Stocke les associations entre utilisateurs Discord et profils Clash Royale CREATE TABLE user_profiles ( id INTEGER PRIMARY KEY AUTOINCREMENT, discord_id TEXT UNIQUE NOT NULL, -- ID Discord de l'utilisateur clash_tag TEXT UNIQUE NOT NULL, -- Tag Clash Royale (ex: #ABC123DEF) clash_name TEXT NOT NULL, -- Nom du joueur Clash Royale current_trophies INTEGER DEFAULT 0, -- Trophées actuels highest_trophies INTEGER DEFAULT 0, -- Record de trophées level INTEGER DEFAULT 1, -- Niveau du joueur clan_name TEXT, -- Nom du clan (si dans un clan) clan_tag TEXT, -- Tag du clan (si dans un clan) clan_role TEXT, -- Rôle dans le clan verified BOOLEAN DEFAULT FALSE, -- Profil vérifié sync_date DATETIME DEFAULT CURRENT_TIMESTAMP, -- Date de synchronisation last_update DATETIME DEFAULT CURRENT_TIMESTAMP, -- Dernière mise à jour created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); -- ===================================================== -- TABLE: trophy_history -- ===================================================== -- Historique des trophées pour détecter les gains et féliciter CREATE TABLE trophy_history ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_profile_id INTEGER NOT NULL, -- Référence vers user_profiles old_trophies INTEGER NOT NULL, -- Ancien nombre de trophées new_trophies INTEGER NOT NULL, -- Nouveau nombre de trophées trophy_gain INTEGER NOT NULL, -- Gain de trophées milestone_reached INTEGER, -- Palier atteint (1000, 2000, etc.) congratulated BOOLEAN DEFAULT FALSE, -- Si félicitations envoyées recorded_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_profile_id) REFERENCES user_profiles(id) ON DELETE CASCADE ); -- ===================================================== -- TABLE: bot_settings -- ===================================================== -- Paramètres et configuration du bot CREATE TABLE bot_settings ( id INTEGER PRIMARY KEY AUTOINCREMENT, setting_key TEXT UNIQUE NOT NULL, -- Clé du paramètre setting_value TEXT NOT NULL, -- Valeur du paramètre description TEXT, -- Description du paramètre updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ); -- ===================================================== -- INDEX pour optimiser les performances -- ===================================================== CREATE INDEX idx_user_profiles_discord_id ON user_profiles(discord_id); CREATE INDEX idx_user_profiles_clash_tag ON user_profiles(clash_tag); CREATE INDEX idx_trophy_history_user_profile ON trophy_history(user_profile_id); CREATE INDEX idx_trophy_history_recorded_at ON trophy_history(recorded_at); CREATE INDEX idx_trophy_history_milestone ON trophy_history(milestone_reached); CREATE INDEX idx_bot_settings_key ON bot_settings(setting_key); -- ===================================================== -- DONNÉES INITIALES -- ===================================================== -- Paramètres par défaut du bot INSERT INTO bot_settings (setting_key, setting_value, description) VALUES ('last_ranking_update', '0', 'Timestamp de la derniere mise a jour du classement'), ('total_users_synced', '0', 'Nombre total utilisateurs synchronises'), ('trophy_check_enabled', 'true', 'Active/desactive la verification des trophees'), ('ranking_update_enabled', 'true', 'Active/desactive les mises a jour du classement'), ('congratulations_enabled', 'true', 'Active/desactive les felicitations automatiques'), ('bot_version', '1.0.0', 'Version actuelle du bot'), ('maintenance_mode', 'false', 'Mode maintenance du bot'); -- ===================================================== -- VUES UTILES -- ===================================================== -- Vue pour le classement des utilisateurs CREATE VIEW ranking_view AS SELECT up.discord_id, up.clash_name, up.current_trophies, up.highest_trophies, up.level, up.clan_name, up.clan_role, ROW_NUMBER() OVER (ORDER BY up.current_trophies DESC) as rank_position FROM user_profiles up WHERE up.verified = TRUE ORDER BY up.current_trophies DESC; -- Vue pour les gains de trophées récents (24h) CREATE VIEW recent_trophy_gains AS SELECT up.discord_id, up.clash_name, th.old_trophies, th.new_trophies, th.trophy_gain, th.milestone_reached, th.congratulated, th.recorded_at FROM trophy_history th JOIN user_profiles up ON th.user_profile_id = up.id WHERE th.recorded_at >= datetime('now', '-1 day') AND th.trophy_gain > 0 ORDER BY th.recorded_at DESC; -- ===================================================== -- TRIGGERS -- ===================================================== -- Trigger pour mettre à jour last_update automatiquement CREATE TRIGGER update_user_profiles_timestamp AFTER UPDATE ON user_profiles BEGIN UPDATE user_profiles SET last_update = CURRENT_TIMESTAMP WHERE id = NEW.id; END; -- Trigger pour mettre à jour updated_at dans bot_settings CREATE TRIGGER update_bot_settings_timestamp AFTER UPDATE ON bot_settings BEGIN UPDATE bot_settings SET updated_at = CURRENT_TIMESTAMP WHERE id = NEW.id; END; -- ===================================================== -- FONCTIONS UTILES (commentées pour référence) -- ===================================================== /* -- Exemple de requête pour obtenir le top 10 SELECT * FROM ranking_view LIMIT 10; -- Exemple pour obtenir les utilisateurs ayant gagné plus de 1000 trophées SELECT * FROM recent_trophy_gains WHERE trophy_gain >= 1000; -- Exemple pour obtenir les statistiques d'un utilisateur SELECT up.*, COUNT(th.id) as total_records, SUM(CASE WHEN th.trophy_gain > 0 THEN th.trophy_gain ELSE 0 END) as total_gains, SUM(CASE WHEN th.trophy_gain < 0 THEN ABS(th.trophy_gain) ELSE 0 END) as total_losses FROM user_profiles up LEFT JOIN trophy_history th ON up.id = th.user_profile_id WHERE up.discord_id = 'DISCORD_USER_ID' GROUP BY up.id; */ -- ===================================================== -- VALIDATION DU SCHÉMA -- ===================================================== -- Vérification que toutes les tables sont créées correctement SELECT name as table_name, type FROM sqlite_master WHERE type IN ('table', 'view', 'index', 'trigger') ORDER BY type, name;