172 lines
7.1 KiB
SQL
172 lines
7.1 KiB
SQL
-- =====================================================
|
|
-- 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; |