clashroyale-bot/schema.sql
2025-10-18 08:14:08 +02:00

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;