HiddenPhox/src/index.js

258 lines
6.9 KiB
JavaScript
Raw Normal View History

2023-01-22 04:45:57 +00:00
const Dysnomia = require("@projectdysnomia/dysnomia");
const logger = require("./lib/logger.js");
2024-05-16 20:43:51 +00:00
const fs = require("node:fs");
const {resolve} = require("node:path");
2021-07-23 23:21:50 +00:00
const sqlite3 = require("sqlite3");
2023-09-25 20:00:36 +00:00
const {instead, before} = require("spitroast");
2021-03-15 01:41:40 +00:00
const config = require("../config.json");
2021-06-11 03:54:38 +00:00
const apikeys = require("../apikeys.json");
2024-05-17 20:33:01 +00:00
2021-05-17 22:35:18 +00:00
const events = require("./lib/events.js");
const timer = require("./lib/timer.js");
2024-05-17 20:33:01 +00:00
const Command = require("./lib/command.js");
const InteractionCommand = require("./lib/interactionCommand.js");
2021-03-15 01:41:40 +00:00
2023-01-22 04:45:57 +00:00
const bot = new Dysnomia.Client(config.token, {
2021-03-15 01:41:40 +00:00
defaultImageFormat: "png",
defaultImageSize: 1024,
gateway: {
2023-01-22 04:45:57 +00:00
intents: Object.values(Dysnomia.Constants.Intents),
},
2024-05-16 20:43:51 +00:00
restMode: true,
2021-03-15 01:41:40 +00:00
});
2023-01-22 04:45:57 +00:00
const commands = new Dysnomia.Collection();
2024-05-17 20:33:01 +00:00
const interactionCommands = new Dysnomia.Collection();
2021-03-15 01:41:40 +00:00
2021-07-24 00:39:34 +00:00
const database = new sqlite3.Database(resolve(__dirname, "..", "database.db"));
2021-03-15 01:41:40 +00:00
function registerCommand(cmdObj) {
if (cmdObj instanceof Command) {
commands.set(cmdObj.name, cmdObj);
const aliases = cmdObj.getAliases();
logger.info(
"hf:cmd",
`Registered command '${cmdObj.name}'${
aliases.length > 0 ? ` (aliases: ${aliases.join(", ")})` : ""
}`
2021-03-15 01:41:40 +00:00
);
2024-05-17 20:33:01 +00:00
} else if (cmdObj instanceof InteractionCommand) {
interactionCommands.set(cmdObj.name, cmdObj);
logger.info("hf:cmd", `Registered interaction command '${cmdObj.name}'`);
2021-03-15 01:41:40 +00:00
}
}
global.hf = {
bot,
config,
2021-06-11 03:54:38 +00:00
apikeys,
2021-03-15 01:41:40 +00:00
commands,
2024-05-17 20:33:01 +00:00
interactionCommands,
2021-03-15 01:41:40 +00:00
registerCommand,
2021-05-17 22:35:18 +00:00
events,
timer,
2021-07-24 00:39:34 +00:00
database,
2021-03-15 01:41:40 +00:00
};
2024-05-17 20:36:52 +00:00
const {formatUsername} = require("./lib/utils.js");
const CommandDispatcher = require("./lib/commandDispatcher.js");
const {InteractionDispatcher} = require("./lib/interactionDispatcher.js");
2021-03-15 01:41:40 +00:00
for (const file of fs.readdirSync(resolve(__dirname, "modules"))) {
require(resolve(__dirname, "modules", file));
logger.info("hf:modules", `Loaded module: '${file}'`);
2021-03-15 01:41:40 +00:00
}
bot.on("messageCreate", async (msg) => {
2024-05-16 20:43:51 +00:00
try {
// fix DMs cause of gateway v8 changes
if (
!(msg.channel instanceof Dysnomia.Channel) &&
msg.author.id != bot.user.id &&
!msg.guildID
) {
const newChannel = await bot.getDMChannel(msg.author.id);
if (msg.channel.id == newChannel.id) msg.channel = newChannel;
}
2023-01-24 05:50:55 +00:00
2024-05-16 20:43:51 +00:00
if (!(msg.channel instanceof Dysnomia.Channel)) return;
2023-01-24 05:50:55 +00:00
2024-05-16 20:43:51 +00:00
await CommandDispatcher(msg);
} catch (err) {
const stack = (err?.stack ?? err.message).split("\n");
const error = stack.shift();
logger.error(
"hf:main",
`Failed to dispatch command: ${error}\n\t${stack.join("\n\t")}`
);
}
});
2024-05-17 20:33:01 +00:00
bot.on("messageUpdate", async (msg, oldMsg) => {
2024-05-16 20:43:51 +00:00
try {
const oneDay = Date.now() - 86400000;
if (
msg.timestamp > oneDay &&
!msg.hasRan &&
oldMsg &&
oldMsg.content !== msg.content
) {
2024-05-17 20:33:01 +00:00
await CommandDispatcher(msg);
2024-05-16 20:43:51 +00:00
}
} catch (err) {
const stack = (err?.stack ?? err.message).split("\n");
const error = stack.shift();
logger.error(
"hf:main",
`Failed to dispatch command update: ${error}\n\t${stack.join("\n\t")}`
);
}
});
bot.on("messageReactionAdd", async (msg, reaction, reactor) => {
2024-05-17 20:39:14 +00:00
if (msg?.author?.id !== bot.user.id) return;
2024-05-16 20:43:51 +00:00
if (reaction.name !== "\u274c") return;
try {
let channel = msg.channel;
if (!(channel instanceof Dysnomia.Channel)) {
const newChannel = hf.bot.getChannel(channel.id);
if (newChannel) {
channel = newChannel;
} else {
channel = await hf.bot.getRESTChannel(channel.id);
}
}
if (!msg.messageReference) {
msg = await channel.getMessage(msg.id);
}
if (!msg.messageReference) return;
const ref = await channel.getMessage(msg.messageReference.messageID);
if (!ref) return;
if (ref.author.id !== reactor.id) return;
await msg.delete("Command sender requested output deletion.");
} catch (err) {
const stack = (err?.stack ?? err.message).split("\n");
const error = stack.shift();
logger.error(
"hf:main",
`Failed to self-delete message: ${error}\n\t${stack.join("\n\t")}`
);
2021-03-15 01:41:40 +00:00
}
});
2024-05-17 20:33:01 +00:00
bot.on("interactionCreate", async (interaction) => {
try {
if (!(interaction.channel instanceof Dysnomia.Channel)) {
const newChannel = hf.bot.getChannel(interaction.channel.id);
if (newChannel) {
interaction.channel = newChannel;
} else {
interaction.channel = await hf.bot.getRESTChannel(
interaction.channel.id
);
}
}
await InteractionDispatcher(interaction);
} catch (err) {
const stack = (err?.stack ?? err.message).split("\n");
const error = stack.shift();
logger.error(
"hf:main",
`Failed to dispatch interaction command: ${error}\n\t${stack.join(
"\n\t"
)}`
);
}
});
2021-03-15 01:41:40 +00:00
bot.once("ready", async () => {
2021-03-15 01:41:40 +00:00
logger.info("hf:main", "Connected to Discord.");
logger.info(
"hf:main",
`Logged in as: ${formatUsername(bot.user)} (${bot.user.id})`
);
2021-03-15 01:41:40 +00:00
2023-01-22 04:52:07 +00:00
const channel = await bot.getDMChannel(config.owner_id);
2021-03-15 01:41:40 +00:00
if (channel) {
2022-10-09 18:15:37 +00:00
channel.createMessage({
content: "<:ms_tick:503341995348066313> Loaded HiddenPhox.",
});
2021-03-15 01:41:40 +00:00
}
bot.on("ready", () => {
logger.info("hf:main", "Reconnected to Discord.");
});
2024-05-17 20:33:01 +00:00
const commands = await bot.getCommands();
for (const command of interactionCommands.values()) {
const hasCommand = commands.find((c) => c.name == command.name);
if (hasCommand) continue;
const options = Object.values(command.options);
for (const option of options) {
delete option.default;
}
2024-05-17 20:33:01 +00:00
await bot.createCommand({
name: command.name,
type: command.type,
description: command.helpText,
options: options,
2024-05-17 20:33:01 +00:00
defaultMemberPermissions: command.permissions,
dmPermission: !command.guildOnly,
});
}
for (const command of commands) {
if (interactionCommands.has(command.name)) continue;
await bot.deleteCommand(command.id);
}
2021-03-15 01:41:40 +00:00
});
2021-06-01 18:59:15 +00:00
bot.on("error", (err) => {
logger.error("hf:main", "Catching error: " + err);
2021-07-21 16:33:36 +00:00
});
bot.on("warn", (err) => {
logger.warn("hf:main", "Catching warn: " + err);
2021-07-21 16:33:36 +00:00
});
bot.on("shardDisconnect", (err, id) => {
logger.verbose("hf:shard", `Disconnecting from shard ${id}: ${err}`);
2021-07-21 16:33:36 +00:00
});
bot.on("shardResume", (id) => {
logger.verbose("hf:shard", "Resuming on shard " + id);
2021-07-21 16:33:36 +00:00
});
bot.on("shardPreReady", (id) => {
logger.verbose("hf:shard", `Shard ${id} getting ready`);
2021-07-21 16:33:36 +00:00
});
bot.on("shardReady", (id) => {
logger.verbose("hf:shard", `Shard ${id} ready`);
2021-07-21 16:33:36 +00:00
});
bot.on("unknown", (packet, id) => {
logger.verbose(
"hf:main",
`Shard ${id} caught unknown packet: ${JSON.stringify(packet)}`
);
2021-06-01 18:59:15 +00:00
});
2023-09-25 20:00:36 +00:00
instead("spawn", bot.shards, function (args, orig) {
const ret = orig.apply(this, args);
const shard = this.get(args[0]);
if (shard) {
2023-09-25 20:12:14 +00:00
before("sendWS", shard.__proto__, function ([op, _data]) {
2023-09-25 20:00:36 +00:00
if (op === Dysnomia.Constants.GatewayOPCodes.IDENTIFY) {
_data.properties.browser = "Discord Embedded";
delete _data.properties.device;
}
});
}
return ret;
});
2021-03-15 01:41:40 +00:00
bot.connect();