add privacy & tos

This commit is contained in:
Arthur Puechberty
2026-01-17 22:32:14 +01:00
parent 95cd796839
commit 6997254a3f
6 changed files with 680 additions and 2 deletions
+128
View File
@@ -404,3 +404,131 @@ p {
.flex-between { justify-content: space-between; }
.gap-sm { gap: var(--spacing-sm); }
.gap-md { gap: var(--spacing-md); }
/* ===== Navigation ===== */
.navbar {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 1000;
background-color: rgba(22, 27, 34, 0.95);
backdrop-filter: blur(10px);
border-bottom: 1px solid var(--border-color);
padding: var(--spacing-md) 0;
}
.navbar-container {
display: flex;
align-items: center;
justify-content: space-between;
max-width: 1200px;
margin: 0 auto;
padding: 0 var(--spacing-md);
}
.navbar-brand {
display: flex;
align-items: center;
gap: var(--spacing-sm);
font-size: 1.25rem;
font-weight: 700;
color: var(--text-primary);
text-decoration: none;
}
.navbar-brand:hover {
color: var(--text-primary);
text-decoration: none;
}
.navbar-brand img {
width: 32px;
height: 32px;
border-radius: 50%;
}
.navbar-nav {
display: flex;
align-items: center;
gap: var(--spacing-lg);
}
.navbar-link {
color: var(--text-secondary);
font-weight: 500;
text-decoration: none;
transition: color var(--transition-fast);
}
.navbar-link:hover {
color: var(--text-primary);
text-decoration: none;
}
.navbar-user {
display: flex;
align-items: center;
gap: var(--spacing-sm);
padding: var(--spacing-xs) var(--spacing-sm);
background-color: var(--bg-card);
border-radius: var(--border-radius);
border: 1px solid var(--border-color);
}
.navbar-user img {
width: 28px;
height: 28px;
border-radius: 50%;
}
.navbar-user span {
color: var(--text-primary);
font-weight: 500;
}
.navbar-actions {
display: flex;
align-items: center;
gap: var(--spacing-sm);
}
/* ===== Footer ===== */
.footer {
padding: var(--spacing-xl) var(--spacing-md);
border-top: 1px solid var(--border-color);
text-align: center;
background-color: var(--bg-card);
}
.footer-content {
max-width: 1200px;
margin: 0 auto;
display: flex;
flex-direction: column;
align-items: center;
gap: var(--spacing-md);
}
.footer-links {
display: flex;
gap: var(--spacing-lg);
flex-wrap: wrap;
justify-content: center;
}
.footer-links a {
color: var(--text-secondary);
text-decoration: none;
transition: color var(--transition-fast);
}
.footer-links a:hover {
color: var(--primary);
text-decoration: none;
}
.footer-copyright {
color: var(--text-muted);
font-size: 0.9rem;
}
+4 -2
View File
@@ -120,10 +120,12 @@
<div class="footer-content">
<div class="footer-links">
<a href="/dashboard">Dashboard</a>
<a href="https://discord.com" target="_blank">Support</a>
<a href="/tos">Conditions d'utilisation</a>
<a href="/privacy">Politique de confidentialité</a>
<a href="https://links.serverarthur.duckdns.org/" target="_blank">Support</a>
</div>
<p class="footer-copyright">
© 2024 LazyBot. Fait avec ❤️ pour Discord.
© 2026 LazyBot. Fait avec ❤️ pour Discord.
</p>
</div>
</footer>
+227
View File
@@ -0,0 +1,227 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<title>Politique de confidentialité - LazyBot</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Politique de confidentialité de LazyBot - Bot Discord">
<link rel="stylesheet" href="/global.css">
<link rel="stylesheet" href="/tos.css">
</head>
<body>
<!-- Navigation -->
<nav class="navbar">
<div class="navbar-container">
<a href="/" class="navbar-brand">
<img id="bot-avatar" src="" alt="LazyBot">
<span>LazyBot</span>
</a>
<div class="navbar-nav">
<a href="/" class="navbar-link">Accueil</a>
<a href="/dashboard" class="navbar-link">Dashboard</a>
<div id="auth-section">
<a href="/auth/login" class="btn btn-primary btn-sm">Connexion</a>
</div>
</div>
</div>
</nav>
<!-- Content -->
<main class="tos-container">
<div class="tos-content">
<h1>🔒 Politique de confidentialité</h1>
<p class="tos-updated">Dernière mise à jour : 17 janvier 2026</p>
<section class="tos-section">
<h2>1. Introduction</h2>
<p>
Cette politique de confidentialité explique comment LazyBot ("le Bot", "nous") collecte,
utilise et protège vos informations lorsque vous utilisez nos services.
Nous nous engageons à protéger votre vie privée et à traiter vos données de manière transparente.
</p>
</section>
<section class="tos-section">
<h2>2. Données collectées</h2>
<p>Nous collectons uniquement les données nécessaires au fonctionnement du Bot :</p>
<h3>2.1 Données de serveur</h3>
<ul>
<li><strong>ID du serveur</strong> : Pour identifier et stocker les configurations</li>
<li><strong>ID des salons</strong> : Pour les fonctionnalités de messages automatiques</li>
<li><strong>ID des rôles</strong> : Pour les fonctionnalités d'attribution de rôles</li>
</ul>
<h3>2.2 Données utilisateur</h3>
<ul>
<li><strong>ID Discord</strong> : Pour identifier les utilisateurs dans les systèmes de niveaux et d'économie</li>
<li><strong>Nom d'utilisateur</strong> : Affiché temporairement dans les messages (non stocké)</li>
<li><strong>Avatar</strong> : Utilisé dans le dashboard (récupéré via Discord, non stocké)</li>
</ul>
<h3>2.3 Données de progression</h3>
<ul>
<li><strong>Niveau et XP</strong> : Pour le système de niveaux</li>
<li><strong>Solde et banque</strong> : Pour le système d'économie virtuelle</li>
<li><strong>Horodatages</strong> : Pour gérer les cooldowns des commandes</li>
</ul>
</section>
<section class="tos-section">
<h2>3. Utilisation des données</h2>
<p>Vos données sont utilisées exclusivement pour :</p>
<ul>
<li>Fournir les fonctionnalités du Bot (niveaux, économie, messages automatiques)</li>
<li>Sauvegarder vos configurations de serveur</li>
<li>Authentifier les administrateurs sur le dashboard</li>
<li>Améliorer nos services</li>
</ul>
<p>
<strong>Nous ne vendons jamais vos données.</strong> Nous ne partageons pas vos données avec des tiers
à des fins commerciales ou publicitaires.
</p>
</section>
<section class="tos-section">
<h2>4. Stockage et sécurité</h2>
<ul>
<li>Les données sont stockées dans une base de données SQLite sécurisée</li>
<li>L'accès aux données est limité et protégé</li>
<li>Les sessions du dashboard utilisent des cookies sécurisés</li>
<li>L'authentification passe par OAuth2 de Discord (nous ne stockons pas votre mot de passe)</li>
</ul>
</section>
<section class="tos-section">
<h2>5. Conservation des données</h2>
<p>Les données sont conservées tant que :</p>
<ul>
<li><strong>Données de serveur</strong> : Tant que le Bot est présent sur le serveur</li>
<li><strong>Données utilisateur</strong> : Tant que l'utilisateur est membre d'un serveur utilisant le Bot</li>
<li><strong>Sessions dashboard</strong> : Jusqu'à déconnexion ou expiration (24 heures)</li>
</ul>
</section>
<section class="tos-section">
<h2>6. Vos droits</h2>
<p>Conformément aux réglementations en vigueur (notamment le RGPD), vous avez le droit de :</p>
<ul>
<li><strong>Accès</strong> : Demander quelles données nous avons sur vous</li>
<li><strong>Rectification</strong> : Demander la correction de données inexactes</li>
<li><strong>Suppression</strong> : Demander la suppression de vos données</li>
<li><strong>Portabilité</strong> : Recevoir vos données dans un format lisible</li>
<li><strong>Opposition</strong> : Vous opposer au traitement de vos données</li>
</ul>
</section>
<section class="tos-section">
<h2>7. Suppression des données</h2>
<p>Pour supprimer vos données :</p>
<ul>
<li><strong>Données de serveur</strong> : Retirez le Bot de votre serveur - les données seront automatiquement supprimées</li>
<li><strong>Données personnelles</strong> : Contactez-nous via le serveur Discord de support</li>
</ul>
<p>
La suppression est effectuée dans un délai de 30 jours maximum après la demande.
</p>
</section>
<section class="tos-section">
<h2>8. Cookies</h2>
<p>Le dashboard utilise des cookies essentiels pour :</p>
<ul>
<li>Maintenir votre session de connexion</li>
<li>Assurer la sécurité de votre compte</li>
</ul>
<p>
Nous n'utilisons pas de cookies de tracking ou publicitaires.
</p>
</section>
<section class="tos-section">
<h2>9. Services tiers</h2>
<p>Le Bot interagit avec les services suivants :</p>
<ul>
<li><strong>Discord API</strong> : Pour toutes les fonctionnalités du Bot - <a href="https://discord.com/privacy" target="_blank">Politique de Discord</a></li>
</ul>
</section>
<section class="tos-section">
<h2>10. Mineurs</h2>
<p>
Le Bot respecte les conditions d'utilisation de Discord concernant l'âge minimum (13 ans, ou plus selon les pays).
Nous ne collectons pas sciemment de données sur des enfants en dessous de l'âge requis.
</p>
</section>
<section class="tos-section">
<h2>11. Modifications</h2>
<p>
Cette politique peut être mise à jour occasionnellement. Les modifications seront publiées sur cette page
avec une date de mise à jour. Nous vous encourageons à consulter régulièrement cette page.
</p>
</section>
<section class="tos-section">
<h2>12. Contact</h2>
<p>
Pour toute question concernant cette politique de confidentialité ou pour exercer vos droits,
contactez-nous via notre serveur Discord de support.
</p>
</section>
<div class="tos-back">
<a href="/" class="btn btn-secondary">← Retour à l'accueil</a>
</div>
</div>
</main>
<!-- Footer -->
<footer class="footer">
<div class="footer-content">
<div class="footer-links">
<a href="/dashboard">Dashboard</a>
<a href="/tos">Conditions d'utilisation</a>
<a href="/privacy">Politique de confidentialité</a>
<a href="https://links.serverarthur.duckdns.org/" target="_blank">Support</a>
</div>
<p class="footer-copyright">
© 2024 LazyBot. Fait avec ❤️ pour Discord.
</p>
</div>
</footer>
<script>
// Charger les infos du bot (avatar)
fetch("/api/bot-info")
.then(res => res.json())
.then(bot => {
const avatarUrl = `https://cdn.discordapp.com/avatars/${bot.id}/${bot.avatar}.png`;
document.getElementById("bot-avatar").src = avatarUrl;
})
.catch(() => {
document.getElementById("bot-avatar").src = "https://cdn.discordapp.com/embed/avatars/0.png";
});
// Vérifier si l'utilisateur est connecté
fetch("/api/user")
.then(res => {
if (!res.ok) throw new Error("Non connecté");
return res.json();
})
.then(user => {
const authSection = document.getElementById("auth-section");
authSection.innerHTML = `
<div class="navbar-actions">
<div class="navbar-user">
<img src="https://cdn.discordapp.com/avatars/${user.id}/${user.avatar}.png" alt="Avatar">
<span>${user.username}</span>
</div>
<a href="/auth/logout" class="btn btn-secondary btn-sm">Déconnexion</a>
</div>
`;
})
.catch(() => {});
</script>
</body>
</html>
+121
View File
@@ -0,0 +1,121 @@
/* ===== TOS Page Styles ===== */
body {
padding-top: 80px; /* Espace pour la navbar fixed */
}
.tos-container {
max-width: 900px;
margin: 0 auto;
padding: 2rem;
min-height: calc(100vh - 200px);
}
.tos-content {
background: var(--bg-secondary);
border-radius: var(--radius-lg);
padding: 3rem;
border: 1px solid var(--border-color);
}
.tos-content h1 {
font-size: 2.5rem;
margin-bottom: 0.5rem;
color: var(--text-primary);
}
.tos-updated {
color: var(--text-muted);
font-size: 0.9rem;
margin-bottom: 2.5rem;
padding-bottom: 1.5rem;
border-bottom: 1px solid var(--border-color);
}
.tos-section {
margin-bottom: 2rem;
}
.tos-section h2 {
font-size: 1.4rem;
color: var(--text-primary);
margin-bottom: 1rem;
padding-bottom: 0.5rem;
border-bottom: 2px solid var(--accent-primary);
display: inline-block;
}
.tos-section h3 {
font-size: 1.1rem;
color: var(--text-primary);
margin-top: 1.5rem;
margin-bottom: 0.75rem;
}
.tos-section p {
color: var(--text-secondary);
line-height: 1.7;
margin-bottom: 1rem;
}
.tos-section ul {
list-style: none;
padding: 0;
margin: 1rem 0;
}
.tos-section ul li {
position: relative;
padding-left: 1.5rem;
margin-bottom: 0.75rem;
color: var(--text-secondary);
line-height: 1.6;
}
.tos-section ul li::before {
content: "•";
position: absolute;
left: 0;
color: var(--accent-primary);
font-weight: bold;
}
.tos-section ul li strong {
color: var(--text-primary);
}
.tos-section a {
color: var(--accent-primary);
text-decoration: none;
transition: color var(--transition-fast);
}
.tos-section a:hover {
color: var(--accent-secondary);
}
.tos-back {
margin-top: 3rem;
padding-top: 2rem;
border-top: 1px solid var(--border-color);
text-align: center;
}
/* ===== Responsive ===== */
@media (max-width: 768px) {
.tos-container {
padding: 1rem;
}
.tos-content {
padding: 1.5rem;
}
.tos-content h1 {
font-size: 1.8rem;
}
.tos-section h2 {
font-size: 1.2rem;
}
}
+192
View File
@@ -0,0 +1,192 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<title>Conditions d'utilisation - LazyBot</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Conditions d'utilisation de LazyBot - Bot Discord">
<link rel="stylesheet" href="/global.css">
<link rel="stylesheet" href="/tos.css">
</head>
<body>
<!-- Navigation -->
<nav class="navbar">
<div class="navbar-container">
<a href="/" class="navbar-brand">
<img id="bot-avatar" src="" alt="LazyBot">
<span>LazyBot</span>
</a>
<div class="navbar-nav">
<a href="/" class="navbar-link">Accueil</a>
<a href="/dashboard" class="navbar-link">Dashboard</a>
<div id="auth-section">
<a href="/auth/login" class="btn btn-primary btn-sm">Connexion</a>
</div>
</div>
</div>
</nav>
<!-- Content -->
<main class="tos-container">
<div class="tos-content">
<h1>📜 Conditions d'utilisation</h1>
<p class="tos-updated">Dernière mise à jour : 17 janvier 2026</p>
<section class="tos-section">
<h2>1. Acceptation des conditions</h2>
<p>
En utilisant LazyBot ("le Bot"), vous acceptez d'être lié par ces conditions d'utilisation.
Si vous n'acceptez pas ces conditions, veuillez ne pas utiliser le Bot.
</p>
</section>
<section class="tos-section">
<h2>2. Description du service</h2>
<p>
LazyBot est un bot Discord offrant diverses fonctionnalités incluant, mais sans s'y limiter :
</p>
<ul>
<li>Système de niveaux et d'expérience</li>
<li>Système d'économie virtuelle</li>
<li>Messages de bienvenue et d'au revoir personnalisés</li>
<li>Attribution automatique de rôles</li>
<li>Dashboard de configuration web</li>
</ul>
</section>
<section class="tos-section">
<h2>3. Utilisation acceptable</h2>
<p>En utilisant le Bot, vous vous engagez à :</p>
<ul>
<li>Respecter les <a href="https://discord.com/terms" target="_blank">Conditions d'utilisation de Discord</a></li>
<li>Ne pas utiliser le Bot à des fins illégales ou nuisibles</li>
<li>Ne pas tenter de contourner, désactiver ou interférer avec les fonctionnalités de sécurité du Bot</li>
<li>Ne pas abuser des fonctionnalités du Bot (spam, exploitation de bugs, etc.)</li>
<li>Ne pas utiliser le Bot pour harceler d'autres utilisateurs</li>
</ul>
</section>
<section class="tos-section">
<h2>4. Données collectées</h2>
<p>
Le Bot collecte et stocke certaines données nécessaires à son fonctionnement :
</p>
<ul>
<li><strong>Identifiants Discord</strong> : ID de serveur, ID d'utilisateur, ID de salon</li>
<li><strong>Données de configuration</strong> : Paramètres configurés via le dashboard</li>
<li><strong>Données de progression</strong> : Niveaux, XP, solde d'économie virtuelle</li>
<li><strong>Horodatages</strong> : Pour gérer les cooldowns et fonctionnalités temporelles</li>
</ul>
<p>
Ces données sont stockées de manière sécurisée et ne sont jamais partagées avec des tiers.
Elles sont utilisées uniquement pour le fonctionnement du Bot.
</p>
</section>
<section class="tos-section">
<h2>5. Suppression des données</h2>
<p>
Vous pouvez demander la suppression de vos données à tout moment en :
</p>
<ul>
<li>Retirant le Bot de votre serveur (supprime les données du serveur)</li>
<li>Contactant l'équipe de support pour une suppression manuelle</li>
</ul>
</section>
<section class="tos-section">
<h2>6. Disponibilité du service</h2>
<p>
Le Bot est fourni "tel quel" sans garantie de disponibilité permanente. Nous nous réservons le droit de :
</p>
<ul>
<li>Modifier ou interrompre le service à tout moment</li>
<li>Effectuer des maintenances sans préavis</li>
<li>Limiter ou révoquer l'accès au Bot en cas d'abus</li>
</ul>
</section>
<section class="tos-section">
<h2>7. Limitation de responsabilité</h2>
<p>
En aucun cas, les développeurs de LazyBot ne pourront être tenus responsables de :
</p>
<ul>
<li>Dommages directs ou indirects résultant de l'utilisation du Bot</li>
<li>Perte de données ou interruption de service</li>
<li>Actions d'utilisateurs tiers utilisant le Bot</li>
</ul>
</section>
<section class="tos-section">
<h2>8. Modifications des conditions</h2>
<p>
Nous nous réservons le droit de modifier ces conditions à tout moment.
Les modifications entreront en vigueur dès leur publication.
L'utilisation continue du Bot après modification constitue une acceptation des nouvelles conditions.
</p>
</section>
<section class="tos-section">
<h2>9. Contact</h2>
<p>
Pour toute question concernant ces conditions d'utilisation, vous pouvez nous contacter via
notre serveur Discord de support.
</p>
</section>
<div class="tos-back">
<a href="/" class="btn btn-secondary">← Retour à l'accueil</a>
</div>
</div>
</main>
<!-- Footer -->
<footer class="footer">
<div class="footer-content">
<div class="footer-links">
<a href="/dashboard">Dashboard</a>
<a href="/tos">Conditions d'utilisation</a>
<a href="/privacy">Politique de confidentialité</a>
<a href="https://links.serverarthur.duckdns.org/" target="_blank">Support</a>
</div>
<p class="footer-copyright">
© 2026 LazyBot. Fait avec ❤️ pour Discord.
</p>
</div>
</footer>
<script>
// Charger les infos du bot (avatar)
fetch("/api/bot-info")
.then(res => res.json())
.then(bot => {
const avatarUrl = `https://cdn.discordapp.com/avatars/${bot.id}/${bot.avatar}.png`;
document.getElementById("bot-avatar").src = avatarUrl;
})
.catch(() => {
document.getElementById("bot-avatar").src = "https://cdn.discordapp.com/embed/avatars/0.png";
});
// Vérifier si l'utilisateur est connecté
fetch("/api/user")
.then(res => {
if (!res.ok) throw new Error("Non connecté");
return res.json();
})
.then(user => {
const authSection = document.getElementById("auth-section");
authSection.innerHTML = `
<div class="navbar-actions">
<div class="navbar-user">
<img src="https://cdn.discordapp.com/avatars/${user.id}/${user.avatar}.png" alt="Avatar">
<span>${user.username}</span>
</div>
<a href="/auth/logout" class="btn btn-secondary btn-sm">Déconnexion</a>
</div>
`;
})
.catch(() => {});
</script>
</body>
</html>
+8
View File
@@ -81,6 +81,14 @@ app.get("/dashboard", (req, res) => {
res.sendFile(path.join(__dirname, "public", "dashboard.html"));
});
app.get("/tos", (req, res) => {
res.sendFile(path.join(__dirname, "public", "tos.html"));
});
app.get("/privacy", (req, res) => {
res.sendFile(path.join(__dirname, "public", "privacy.html"));
});
// --- Lancement du serveur ---
app.listen(PORT, () => console.log(`Serveur lancé sur http://localhost:${PORT}`));