130 lines
3.5 KiB
TypeScript
130 lines
3.5 KiB
TypeScript
import fs from "node:fs";
|
||
import path from "node:path";
|
||
import "dotenv/config";
|
||
import { Client, Collection, GatewayIntentBits } from "discord.js";
|
||
import { PrismaClient } from "@prisma/client";
|
||
import { deployCommands } from "./internal/deploy-commands.ts";
|
||
|
||
const prisma = new PrismaClient();
|
||
|
||
const client = new Client({
|
||
intents: [
|
||
GatewayIntentBits.Guilds,
|
||
GatewayIntentBits.GuildMessages,
|
||
GatewayIntentBits.MessageContent,
|
||
GatewayIntentBits.GuildMembers,
|
||
],
|
||
});
|
||
|
||
client.login(process.env.DSC_TOKEN);
|
||
|
||
client.commands = new Collection();
|
||
|
||
const commandFolderPath = path.join(__dirname, "commands");
|
||
const commandFolders = fs.readdirSync(commandFolderPath);
|
||
|
||
console.log(`\n🔍 | Commands search:`);
|
||
for (const folder of commandFolders) {
|
||
const commandsPath = path.join(commandFolderPath, folder);
|
||
const commandFiles = fs
|
||
.readdirSync(commandsPath)
|
||
.filter((file) => file.endsWith(".js") || file.endsWith(".ts"));
|
||
for (const file of commandFiles) {
|
||
const fullCommandPath = path.join(commandsPath, file);
|
||
try {
|
||
const commandModule = await import(fullCommandPath);
|
||
const command = commandModule.default || commandModule;
|
||
if ("data" in command && "execute" in command) {
|
||
client.commands.set(command.data.name, command);
|
||
console.log(`\t✅ | ${command.data.name}`);
|
||
}
|
||
} catch (err) {
|
||
console.error(`\t⚠️ | Command at ${file}\n\t\t(${err}).`);
|
||
}
|
||
}
|
||
}
|
||
console.log("\n\n");
|
||
|
||
const eventFolderPath = path.join(__dirname, "events");
|
||
const eventFolders = fs.readdirSync(eventFolderPath);
|
||
|
||
console.log(`\n🔍 | Events search:`);
|
||
for (const folder of eventFolders) {
|
||
const eventsPath = path.join(eventFolderPath, folder);
|
||
const eventFiles = fs
|
||
.readdirSync(eventsPath)
|
||
.filter((file) => file.endsWith(".js") || file.endsWith(".ts"));
|
||
for (const file of eventFiles) {
|
||
const fullEventPath = path.join(eventsPath, file);
|
||
try {
|
||
const eventModule = await import(fullEventPath);
|
||
const event = eventModule.default || eventModule;
|
||
if ("name" in event && "execute" in event) {
|
||
if (event.once) {
|
||
client.once(event.name, (...args) => event.execute(...args));
|
||
} else {
|
||
client.on(event.name, (...args) => event.execute(...args));
|
||
}
|
||
console.log(`\t✅ | ${event.name}`);
|
||
}
|
||
} catch (err) {
|
||
console.error(`\t⚠️ | Event at ${file}\n\t\t(${err}).`);
|
||
}
|
||
}
|
||
}
|
||
console.log("\n\n");
|
||
|
||
client.once("ready", async () => {
|
||
console.log(`🤖 | Connecté en tant que ${client.user?.tag}`);
|
||
|
||
await prisma.bot.upsert({
|
||
where: {
|
||
id: 1,
|
||
},
|
||
update: {},
|
||
create: {},
|
||
});
|
||
for (const [guildId, guild] of client.guilds.cache) {
|
||
await prisma.guild.upsert({
|
||
where: {
|
||
id: guildId,
|
||
},
|
||
update: {},
|
||
create: {
|
||
id: guildId,
|
||
},
|
||
});
|
||
|
||
const members = await guild.members.fetch();
|
||
|
||
for (const [memberId, member] of members) {
|
||
await prisma.user.upsert({
|
||
where: {
|
||
id: memberId,
|
||
},
|
||
update: {},
|
||
create: {
|
||
id: memberId,
|
||
},
|
||
});
|
||
|
||
await prisma.guildUser.upsert({
|
||
where: {
|
||
userId_guildId: {
|
||
userId: memberId,
|
||
guildId: guildId,
|
||
},
|
||
},
|
||
update: {},
|
||
create: {
|
||
userId: memberId,
|
||
guildId: guildId,
|
||
},
|
||
});
|
||
}
|
||
|
||
console.log(
|
||
`✅ | Guild ${guild.name} synchronisée avec ${members.size} membres.`,
|
||
);
|
||
}
|
||
});
|