const express = require("express");
const app = express();
const port = 3000;
const {
Collection,
Client,
GatewayIntentBits,
Partials,
} = require("[Link]");
const cfg = require("./config");
const fs = require("fs");
const path = require("path");
const { glob } = require("glob");
const { promisify } = require("util");
const chalk = require("chalk");
const moment = require("moment");
const globPromise = promisify(glob);
const dbDir = [Link](__dirname, "database");
const logsDir = [Link](__dirname, "logs");
[dbDir, logsDir].forEach((dir) => {
if () {
[Link](dir, { recursive: true });
[Link]([Link](`Created directory: ${dir}`));
}
});
const {
Guilds,
GuildMembers,
GuildMessages,
MessageContent,
GuildVoiceStates,
GuildMessageReactions,
DirectMessages,
} = GatewayIntentBits;
const { User, Message, GuildMember, ThreadMember, Channel } = Partials;
const dataFilePath = [Link](dbDir, "[Link]");
const logsFilePath = [Link](logsDir, "[Link]");
let savedData = {};
try {
if ([Link](dataFilePath)) {
const dataFileContent = [Link](dataFilePath, "utf-8").trim();
if (dataFileContent) {
savedData = [Link](dataFileContent);
} else {
[Link]([Link]("[Link] kosong. Menginisialisasi data
kosong."));
}
}
} catch (error) {
[Link]([Link]("Terjadi kesalahan saat membaca atau mem-parsing
[Link]:"), [Link]);
}
// Express API ENDPOINT - JANGAN DIHAPUS
[Link]("/api/katalog", (req, res) => {
const katalogPath = [Link](__dirname, "data", "[Link]");
[Link](katalogPath, "utf-8", (err, data) => {
if (err) {
[Link]("Error reading [Link]:", err);
return [Link](500).json({ error: "Failed to read [Link]" });
}
try {
const katalog = [Link](data);
[Link](katalog);
} catch (parseErr) {
[Link]("Error parsing [Link]:", parseErr);
[Link](500).json({ error: "Failed to parse [Link]" });
}
});
});
[Link]("/api/ratings", (req, res) => {
const ratingsPath = [Link](__dirname, "database", "[Link]");
[Link](ratingsPath, "utf-8", (err, data) => {
if (err) {
[Link]("Error reading [Link]:", err);
return [Link](500).json({ error: "Failed to read [Link]" });
}
try {
const ratings = [Link](data);
[Link](ratings);
} catch (parseErr) {
[Link]("Error parsing [Link]:", parseErr);
[Link](500).json({ error: "Failed to parse [Link]" });
}
});
});
const os = require("os");
[Link](port, () => {
const networkInterfaces = [Link]();
let localIp = "localhost";
for (const interfaceDetails of [Link](networkInterfaces)) {
for (const details of interfaceDetails) {
if ([Link] === "IPv4" && ![Link]) {
localIp = [Link];
break;
}
}
if (localIp !== "localhost") break;
}
[Link](`Express API server listening at [Link]
});
// END API EXPRESS
const DiscordClient = new Client({
intents: [
Guilds,
GuildMembers,
GuildMessages,
MessageContent,
GuildVoiceStates,
GuildMessageReactions,
DirectMessages,
],
partials: [User, Message, GuildMember, ThreadMember, Channel],
});
[Link] = new Collection();
[Link] = DiscordClient;
require("./deploySlash");
const handlerFiles = fs
.readdirSync("./handlers")
.filter((file) => [Link](".js"));
for (const handlerFile of handlerFiles) {
try {
const handlerPath = `./handlers/${handlerFile}`;
const stat = [Link](handlerPath);
if ([Link]()) {
const handler = require(handlerPath);
if (typeof handler === "function") {
handler(DiscordClient);
logToConsoleAndFile([Link](`Handler '${handlerFile}' Berhasil
Terbaca.`));
} else {
logToConsoleAndFile([Link](`Handler '${handlerFile}' Tidak Terbaca.`));
}
} else {
logToConsoleAndFile([Link](`Handler '${handlerFile}' Bukan file.`));
}
} catch (error) {
logToConsoleAndFile([Link](`Error loading handler '${handlerFile}': $
{error}`), [Link]);
}
}
async function loadSlashCommands() {
const slashCommandFiles = await globPromise("./SlashCommand/**/*.js");
[Link]((file) => {
const slashCommand = require([Link](file));
[Link]([Link], slashCommand);
});
const testimoniCommand = require("./SlashCommand/admin/[Link]");
[Link]("testimoni", testimoniCommand);
}
loadSlashCommands();
[Link]("guildMemberAdd", (member) => {
const memberData = savedData[[Link]];
if (memberData) {
[Link]([Link]);
[Link]([Link]);
}
});
[Link]("guildMemberRemove", (member) => {
savedData[[Link]] = {
roles: [Link]((role) => [Link]),
nickname: [Link],
};
writeDataToFile();
});
[Link]("ready", () => {
logToConsoleAndFile([Link]("Bot sudah siap pakai"));
writeDataToFile();
});
[Link]("disconnect", () => {
logToConsoleAndFile([Link]("Bot is now disconnected. Saving data..."));
writeDataToFile();
});
[Link]([Link]).catch((error) => {
logToConsoleAndFile([Link]("Error during login: " + [Link]));
});
[Link]("unhandledRejection", (reason, promise) => {
logToConsoleAndFile([Link]("[ANTI-CRASH] Unhandled Rejection: " + reason));
logToConsoleAndFile([Link]("Promise:" + [Link](promise, null, 2)));
});
[Link]("error", (error) => {
logToConsoleAndFile([Link]("[DISCORD ERROR]: " + error));
});
function writeDataToFile() {
try {
[Link](dataFilePath, [Link](savedData, null, 2), "utf-8");
} catch (error) {
[Link]([Link]("Terjadi kesalahan saat menulis ke [Link]:"),
[Link]);
}
}
function logToConsoleAndFile(message) {
const logMessage = `[${moment().format("YYYY-MM-DD HH:mm:ss")}] ${message}`;
writeLogToFile(logMessage);
[Link](logMessage);
}
function writeLogToFile(logMessage) {
try {
[Link](logsFilePath, logMessage + "\n", "utf-8");
} catch (error) {
[Link]([Link]("Terjadi kesalahan saat menulis log:"), [Link]);
}
}
const messageCreateHandler = require("./events/[Link]");
[Link]("messageCreate", [Link]);
const sayCommand = require("./SlashCommand/admin/[Link]");
[Link]("say", sayCommand);
const ticketCommand = require("./SlashCommand/admin/[Link]");
[Link]("setup-tiket", ticketCommand);
[Link]("interactionCreate", async (interaction) => {
if (![Link]()) return;
const ticketCommand = require("./SlashCommand/admin/[Link]");
await [Link](interaction);
});