import { getConfig, setConfig, } from "../../modules/mongo-wrappers/mongoConfigWrappers.mjs"; import { ActivityType, PresenceUpdateStatus, Client } from "discord.js"; class PresenceManager { /** * Creates an instance of PresenceManager. * @param {Client} client - The Discord client instance. */ constructor(client) { this.client = client; } /** * Set the bot's presence. * @param {"online"|"idle"|"dnd"} status - The status of the bot (online, idle, dnd). * @param {"PLAYING"|"STREAMING"|"LISTENING"|"WATCHING"|"COMPETING"} activityType - The type of activity. * @param {string} activityName - The name of the activity. * @param {string} [url=null] - The URL for STREAMING activity type (optional). */ async setPresence(status, activityType, activityName, url = null) { const activityOptions = { type: this.convertActivityType(activityType), name: activityName, }; if (activityType.toUpperCase() === "STREAMING" && url) { activityOptions.url = url; } await this.client.user.setPresence({ status: this.convertStatus(status), activities: [activityOptions], }); } /** * Reset the bot's presence to the default state. */ async resetToDefault() { let defaultPresence = await getConfig("presence"); if (!defaultPresence) { defaultPresence = { status: "idle", activities: [ { name: "your commands", type: "LISTENING", }, ], }; await setConfig("presence", defaultPresence); } console.log("Default Presence:", defaultPresence); // Update your bot's presence using this configuration await this.setPresence( defaultPresence.status, defaultPresence.activities[0].type, defaultPresence.activities[0].name, ); } /** * Convert a string activity type to the corresponding ActivityType enum. * @param {string} activityType - The activity type string. * @returns {ActivityType} - The corresponding ActivityType enum. */ convertActivityType(activityType) { switch (activityType.toUpperCase()) { case "PLAYING": return ActivityType.Playing; case "STREAMING": return ActivityType.Streaming; case "LISTENING": return ActivityType.Listening; case "WATCHING": return ActivityType.Watching; case "COMPETING": return ActivityType.Competing; default: throw new Error("Invalid activity type"); } } /** * Convert a string status to the corresponding PresenceUpdateStatus enum. * @param {string} status - The status string. * @returns {PresenceUpdateStatus} - The corresponding PresenceUpdateStatus enum. */ convertStatus(status) { switch (status.toLowerCase()) { case "online": return PresenceUpdateStatus.Online; case "idle": return PresenceUpdateStatus.Idle; case "dnd": return PresenceUpdateStatus.DoNotDisturb; case "invisible": return PresenceUpdateStatus.Invisible; default: throw new Error("Invalid status"); } } } export default PresenceManager;