add guildMemberAdd config

This commit is contained in:
Arthur Puechberty
2026-01-15 02:31:11 +01:00
parent 0a0c419c6b
commit 12fde58b93
9 changed files with 1571 additions and 374 deletions
+22 -6
View File
@@ -1,6 +1,8 @@
const loadSlashCommands = require('./slash_commands.js');
loadSlashCommands();
const db = require("./db");
const { Client, GatewayIntentBits, ActivityType, Events } = require("discord.js");
const client = new Client({ intents: Object.values(GatewayIntentBits) });
@@ -20,12 +22,26 @@ client.on(Events.InteractionCreate, async interaction => {
});
client.on(Events.MessageCreate, message => {
if (message.author.bot) return;
const config = global.guildConfigs?.[message.guild.id];
if (config?.autoMessage) {
message.channel.send(config.autoMessage);
}
client.on(Events.GuildMemberAdd, member => {
db.get(
"SELECT enabled, channel_id, message FROM welcome_config WHERE guild_id = ?",
[member.guild.id],
(err, row) => {
if (err || !row || !row.enabled) return;
let msg = row.message;
msg = msg
.replace("{user}", member.user.username)
.replace("{mention}", `<@${member.id}>`)
.replace("{server}", member.guild.name);
const channel = member.guild.channels.cache.get(row.channel_id);
if (channel) {
channel.send(msg);
}
}
);
});
+22
View File
@@ -0,0 +1,22 @@
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");
}
);
// Création de la table si elle n'existe pas
db.run(`
CREATE TABLE IF NOT EXISTS welcome_config (
guild_id TEXT PRIMARY KEY,
channel_id TEXT,
enabled INTEGER NOT NULL,
message TEXT NOT NULL
)
`);
module.exports = db;
+1344 -1
View File
File diff suppressed because it is too large Load Diff
+2 -1
View File
@@ -27,6 +27,7 @@
"discord.js": "^14.25.1",
"dotenv": "^17.2.3",
"express": "^5.2.1",
"express-session": "^1.18.2"
"express-session": "^1.18.2",
"sqlite3": "^5.1.7"
}
}
+107 -39
View File
@@ -1,49 +1,117 @@
<!DOCTYPE html>
<html>
<head>
<title>Dashboard du serveur</title>
</head>
<body>
<h1 id="guild-name">Chargement...</h1>
<head>
<title>Dashboard du serveur</title>
</head>
<body>
<h1 id="guild-name">Chargement...</h1>
<form id="event-form">
<label>Message automatique :</label>
<input type="text" id="auto-message" placeholder="Ex: Bonjour à tous !">
<button type="submit">Sauvegarder</button>
</form>
<form id="welcome-form">
<label>
<input type="checkbox" id="welcome-enabled" />
Activer le message de bienvenue
</label>
<div id="status"></div>
<br /><br />
<script>
const guildId = window.location.pathname.split("/")[2]; // récupère l'ID du serveur
<label>
Canal de bienvenue :
<br />
<select id="welcome-channel">
</select>
</label>
// Afficher le nom du serveur
fetch("/api/guilds")
.then(res => res.json())
.then(guilds => {
const guild = guilds.find(g => g.id === guildId);
if (!guild) {
document.getElementById("guild-name").textContent = "Serveur introuvable ou accès refusé";
return;
}
document.getElementById("guild-name").textContent = `Dashboard : ${guild.name}`;
});
<br /><br />
// Envoyer la config du formulaire au serveur
const form = document.getElementById("event-form");
form.addEventListener("submit", async (e) => {
e.preventDefault();
const message = document.getElementById("auto-message").value;
<label>
Message :
<br />
<textarea
id="welcome-message"
rows="4"
cols="50"
placeholder="Ex : Bienvenue {user} sur {server} 🎉"
></textarea>
</label>
const res = await fetch("/api/bot/save-config", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ guildId, autoMessage: message })
});
<br /><br />
const data = await res.json();
document.getElementById("status").textContent = data.success ? "Config sauvegardée ✅" : "Erreur ❌";
});
</script>
</body>
<small>
Variables disponibles :
<ul>
<li><code>{user}</code> → nom de l'utilisateur</li>
<li><code>{mention}</code> → mention de l'utilisateur</li>
<li><code>{server}</code> → nom du serveur</li>
</ul>
</small>
<button type="submit">Sauvegarder</button>
</form>
<div id="status"></div>
<script>
const guildId = window.location.pathname.split("/")[2]; // récupère l'ID du serveur
// Afficher le nom du serveur
fetch("/api/guilds")
.then((res) => res.json())
.then((guilds) => {
const guild = guilds.find((g) => g.id === guildId);
if (!guild) {
document.getElementById("guild-name").textContent =
"Serveur introuvable ou accès refusé";
return;
}
document.getElementById(
"guild-name"
).textContent = `Dashboard : ${guild.name}`;
});
const welcomeForm = document.getElementById("welcome-form");
welcomeForm.addEventListener("submit", async (e) => {
e.preventDefault();
const enabled = document.getElementById("welcome-enabled").checked;
const channelId = document.getElementById("welcome-channel").value;
const message = document.getElementById("welcome-message").value;
const res = await fetch("/api/bot/save-welcome-config", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
guildId,
channelId,
welcomeMessage: message,
welcomeEnabled: enabled,
}),
});
const data = await res.json();
document.getElementById("status").textContent = data.success
? "Config de bienvenue sauvegardée ✅"
: "Erreur ❌";
});
fetch(`/api/bot/get-text-channels/${guildId}`)
.then(res => res.json())
.then(channels => {
const select = document.getElementById("welcome-channel");
channels.forEach(channel => {
const option = document.createElement("option");
option.value = channel.id;
option.textContent = `#${channel.name}`;
select.appendChild(option);
});
});
fetch(`/api/bot/get-welcome-config/${guildId}`)
.then(res => res.json())
.then(cfg => {
document.getElementById("welcome-enabled").checked = cfg.enabled;
document.getElementById("welcome-channel").value = cfg.channelId;
document.getElementById("welcome-message").value = cfg.message;
});
</script>
</body>
</html>
+72 -11
View File
@@ -5,6 +5,9 @@ const session = require("express-session");
const fetch = require("cross-fetch"); // fetch compatible Node
const path = require("path");
// importer la DB
const db = require("./db");
// importer le bot
const client = require("./bot");
@@ -130,25 +133,83 @@ app.get("/api/guilds", (req, res) => {
res.sendFile(path.join(__dirname, "public", "guild.html"));
});
// Exemple : sauvegarde config d'un serveur
app.post("/api/bot/save-config", express.json(), (req, res) => {
const { guildId, autoMessage } = req.body;
const userGuilds = req.session.guilds;
// API pour sauvegarder la configuration de bienvenue
app.post("/api/bot/save-welcome-config", express.json(), (req, res) => {
const { guildId, channelId, welcomeEnabled, welcomeMessage } = req.body;
// Vérifie admin + bot présent
const guildValid = userGuilds.find(
if (!req.session.guilds) {
return res.status(401).json({ success: false });
}
const isAdmin = req.session.guilds.find(
g => g.id === guildId && (BigInt(g.permissions) & 0x8n) === 0x8n
);
if (!guildValid) return res.status(403).json({ error: "Accès interdit" });
// Sauvegarde dans un objet serveur côté serveur (ou DB)
if (!global.guildConfigs) global.guildConfigs = {};
global.guildConfigs[guildId] = { autoMessage };
if (!isAdmin) {
return res.status(403).json({ success: false });
}
res.json({ success: true });
db.run(
`
INSERT INTO welcome_config (guild_id, channel_id, enabled, message)
VALUES (?, ?, ?, ?)
ON CONFLICT(guild_id)
DO UPDATE SET channel_id = ?, enabled = ?, message = ?
`,
[
guildId,
channelId,
welcomeEnabled ? 1 : 0,
welcomeMessage,
channelId,
welcomeEnabled ? 1 : 0,
welcomeMessage
],
err => {
if (err) {
console.error(err);
return res.status(500).json({ success: false });
}
res.json({ success: true });
}
);
});
app.get("/api/bot/get-welcome-config/:guildId", (req, res) => {
const { guildId } = req.params;
db.get(
"SELECT enabled, channel_id, message FROM welcome_config WHERE guild_id = ?",
[guildId],
(err, row) => {
if (err || !row) {
return res.json({ enabled: false, channelId: null, message: "" });
}
res.json({
enabled: !!row.enabled,
channelId: row.channel_id,
message: row.message
});
}
);
});
app.get("/api/bot/get-text-channels/:guildId", (req, res) => {
const { guildId } = req.params;
const guild = client.guilds.cache.get(guildId);
if (!guild) {
return res.status(404).json({ error: "Serveur non trouvé" });
}
const channels = guild.channels.cache
.filter(channel => channel.isTextBased())
.map(channel => ({
id: channel.id,
name: channel.name
}));
res.json(channels);
});
res.json(validGuilds);
});