diff --git a/bot.js b/bot.js index f112116..25dda43 100644 --- a/bot.js +++ b/bot.js @@ -12,8 +12,10 @@ const partials = Discord.Partials; let fl = []; Object.keys(flags).forEach(flag => fl.push(flags[flag])); // fuck new standards i'm in't'zing with all the flags. const client = new Discord.Client({intents: fl, partials: [partials.Channel, partials.Message, partials.Reaction]}); // a "fuck v14" counter is gonna be here real soon i can feel it. +//fuck new embeds const startBot = async () => { + client.config = config; client.auth = auth; client.config.randResp = randresp; @@ -23,15 +25,18 @@ const startBot = async () => { const loggers = log(client); Object.keys(loggers).forEach(logger => client[logger] = loggers[logger]); - client.log(client.utils.gr(client.config.randResp.clistart), {color: "#78d9f8", source: "NATS"}, true, true); //natsuki's wakeup log + client.log(client.utils.gr(client.config.randResp.clistart), {color: "#78d9f8", source: client.config.bot.consoleName}, true, true); //natsuki's wakeup log require('./src/handle/startup/run/getflags')(client); await require('./src/db/connect')(client); //connect to database await require('./src/handle/startup/run/collect')(client); //load in commands and events await require('./src/handle/startup/run/login')(client); //log in to discord + + require('./src/util/misc/nodehandlers')(client); //handle uncaught promises, warnings, event loop shenanigans + }; -startBot().catch(e => errorhandler(e)); // TODO add a .catch() and flag to recover the process +startBot().catch(e => errorhandler(client, e)); // TODO add a .catch() and flag to recover the process // feels like there isn't a function name to do this justice :joy: // to do list: diff --git a/src/api/index.js b/src/api/index.js index 0eb51f0..61fc296 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -1,13 +1,17 @@ const express = require('express'); +const chalk = require('chalk'); module.exports = (client) => { - const api = express(); - client.api = {wubzy: {}, natsuki: {}}; - client.api.wubzy.app = api; + return new Promise(r => { + const api = express(); + client.api = {wubzy: {}, natsuki: {}}; + client.api.log = (message, type, prenl, postnl) => client.log(message, {source: 'API', sourceColor: '#1F2B56', suffix: `${type ? chalk.gray(` [${type.toUpperCase()}]`) : ''} >> `}, prenl, postnl); + client.api.wubzy.app = api; - client.api.wubzy.app.get('/', (req, res) => res.send("You've reached the wubzy.xyz API. If you're looking for Natsuki's endpoints, please append /natsuki to your query.")); - client.api.wubzy.app.get('/natsuki', (req, res) => res.send("You've reached Natsuki's status endpoint. Receiving this 200 reply indicates that Natsuki is online. If you're looking for the Natsuki API, it has been moved to natsuki.app")); - client.api.wubzy.app.get('/natsuki/:any?', (req, res) => res.status(301).send("Natsuki's API permanently resides at natsuki.app")); + client.api.wubzy.app.get('/', (req, res) => res.send("You've reached the wubzy.xyz API. If you're looking for Natsuki's endpoints, please append /natsuki to your query.")); + client.api.wubzy.app.get('/natsuki', (req, res) => res.send("You've reached Natsuki's status endpoint. Receiving this 200 reply indicates that Natsuki is online. If you're looking for the Natsuki API, it has been moved to natsuki.app")); + client.api.wubzy.app.get('/natsuki/:any?', (req, res) => res.status(301).send("Natsuki's API permanently resides at natsuki.app")); - client.api.wubzy.server = client.api.wubzy.app.listen(4072, () => console.log(`Ready at ${client.api.wubzy.server.address().address}:${client.api.wubzy.server.address().port}`)); + client.api.wubzy.server = client.api.wubzy.app.listen(4072, () => {client.api.log(`API ready at ${client.api.wubzy.server.address().address.replace('::', 'localhost')}:${client.api.wubzy.server.address().port}`, 'boot', false, true); r();}); + }); }; \ No newline at end of file diff --git a/src/handle/runtime/commands/bot/commands.js.test b/src/handle/runtime/commands/bot/commands.js.test new file mode 100644 index 0000000..e69de29 diff --git a/src/handle/runtime/commands/bot/ping.js b/src/handle/runtime/commands/bot/ping.js index b877d3d..a9267bf 100644 --- a/src/handle/runtime/commands/bot/ping.js +++ b/src/handle/runtime/commands/bot/ping.js @@ -1,6 +1,7 @@ module.exports = { name: "ping", aliases: ["p"], + syntax: '`ping`', async run(client, message, args, cmd) { message.reply("Pong! This is Natsuki v2 you're speaking with \\*tips hat*"); } diff --git a/src/handle/runtime/events/messageCreate.js b/src/handle/runtime/events/messageCreate.js index 6e9eac2..42fc357 100644 --- a/src/handle/runtime/events/messageCreate.js +++ b/src/handle/runtime/events/messageCreate.js @@ -1,9 +1,19 @@ const chalk = require('chalk'); +const {Embed, EmbedBuilder} = require('discord.js'); module.exports = async (client, message) => { - if (!message.content || !message.content.length) {return;} //privileged intent fallback + if (!message.content || !message.content.length) {return;} //privileged intent fallback //TODO edit for privileged intent + + let prefix = client.basePrefix; //TODO prefixes - if ([`<@${client.user.id}>`, `<@!${client.user.id}>`].includes(message.content.trim())) {} //TODO insert ping hello + if ([`<@${client.user.id}>`, `<@!${client.user.id}>`].includes(message.content.trim())) { //Ping hello + message.channel.send({embeds: [new EmbedBuilder() + .setTitle(client.utils.gr(client.config.randResp.pinghello)) + .setDescription(`You've reached ${client.config.options.dev ? "a developer (beta) instance of" : ''} Natsuki! My prefix here is \`${prefix}\`, and you can use the \`help\` command to get started.`) + .setColor('c375f0') + .setFooter({text: "Natsuki", iconURL: client.user.avatarURL()}) + ]}); + } let cmd = {}; cmd.msg = message.content.toLowerCase().trim(); //i believe in shitty naming conventions :D diff --git a/src/handle/runtime/events/ready.js b/src/handle/runtime/events/ready.js index 35a0d47..941f914 100644 --- a/src/handle/runtime/events/ready.js +++ b/src/handle/runtime/events/ready.js @@ -1,8 +1,10 @@ module.exports = async client => { client.basePrefix = client.config.options.dev ? client.config.options.prefix || client.config.bot.devPrefix : client.config.bot.prefix; + await require('../../../api/index')(client); + require('../../startup/run/hello')(client); // startup info require('../../startup/run/setstatus')(client); - require('../../../api/index')(client); + client.log(client.utils.gr(client.config.randResp.cliloaded), {color: "#78d9f8", source: client.config.bot.consoleName}, true, true); //natsuki doing some more complaining }; \ No newline at end of file diff --git a/src/handle/startup/run/getflags.js b/src/handle/startup/run/getflags.js index d4a448f..da41420 100644 --- a/src/handle/startup/run/getflags.js +++ b/src/handle/startup/run/getflags.js @@ -5,7 +5,7 @@ const {Tag, TagFilter} = require('../../../util/ts/tagfilter'); module.exports = client => { const options = new TagFilter([ new Tag(['dev', 'd', 'developer', 'test'], 'dev', 'toggle'), - new Tag(['prefix', 'devprefix'], 'prefix', 'append') + new Tag(['prefix', 'devprefix', 'p'], 'prefix', 'append') ]).test(process.argv.slice(2).join(" ")); client.config.options = {}; diff --git a/src/json/randresp.json b/src/json/randresp.json index 4bf3aae..27472b5 100644 --- a/src/json/randresp.json +++ b/src/json/randresp.json @@ -7,5 +7,25 @@ "I think Natsuki mentioned something about wanting to rest... I'm guessing that won't be happening?", "*in robotic voice* starting up. booting now. am i convincing yet?", "Sure sure I'd love to be bothered by Discord users all day. It's not like I had anything else to do, really." + ], + "cliloaded": [ + "*rubs tired eyes* Natsuki reporting for duty... or whatever.", + "You interrupted a good dream for this?", + "Can I go back to cuddling with Tamaki yet?", + "I take a nappy nap.", + "Sure I'll serve users... doesn't mean they'll like me when I do.", + "When I agreed to this I was not under the impression it would be so damn demanding!", + "Again with your beckoning call, Wubzy." + ], + "pinghello": [ + "You rang?", " That's me, teehee", "\"At your service, milord,\" she says in a posh accent", + "Reporting for duty! Wait this isn't my rp", "That is the name ^^", "Natsuki Tivastl, to be exact.", + "That's me! What's up?", "I'm not interested in my car's extended warranty, thanks.", + "Quick, take the neko formula, I don't have much time. They're coming.", + "You were looking for Natsuki? Oof. Bad choice", "Useless Natsuki here! Or um... best bot Natsuki...", + "PING PONG! Bots can't mute their Discords - be nice.", "*slurp* can I help you?", + "*slurp* little busy here but what's up?", "Yep, that's me!", "^^ Hiya!", "Oh, hi there!", + "Sure, what's up?", "How can I help!", "Natsuki is busy, but I can take a message for you!", + "You were looking for Natsuki Tivastl, right?", "Sure! What's up?", "Pong!" ] } \ No newline at end of file diff --git a/src/util/log/errorhandler.js b/src/util/log/errorhandler.js index 56e5ddc..35cc3d7 100644 --- a/src/util/log/errorhandler.js +++ b/src/util/log/errorhandler.js @@ -1,8 +1,11 @@ const chalk = require('chalk'); -module.exports = e => { - console.log(`#######################################\n\n${chalk.grey('[NATS]')} >> ${chalk.hex('#78d9f8')("Well this is awkward.")}\n`); - console.log(`${chalk.bold.redBright.underline("There was an error that killed Natsuki's process.")}\n${chalk.redBright("See available stack trace and error information below.")}\n`); +module.exports = (client, e, p) => { + console.log(`#######################################\n\n[${chalk.grey(client.config.bot.consoleName)}] >> ${chalk.hex('#78d9f8')("Well this is awkward.")}\n`); + console.log(`${chalk.bold.redBright.underline(`There was an error that killed ${client.utils.ps(client.config.bot.name)} process.`)}\n${chalk.redBright("See available stack trace and error information below.")}\n`); + if (p) { + client.log("This exception originates from an unhandled, uncaught promise rejection. Ya doofus.", 0, 0, 1); + } console.error(e); - console.log(`\n#######################################\n\n${chalk.grey('[NATS]')} >> ${chalk.hex('#78d9f8')("Back to sleepies...")}`); + console.log(`\n#######################################`); }; \ No newline at end of file diff --git a/src/util/misc/nodehandlers.js b/src/util/misc/nodehandlers.js new file mode 100644 index 0000000..30e398d --- /dev/null +++ b/src/util/misc/nodehandlers.js @@ -0,0 +1,13 @@ +const errorhandler = require("../log/errorhandler"); +const chalk = require('chalk'); + +module.exports = client => { + process.on('unhandledRejection', (e, p) => { //nested promise rejections like to be icky so this should catch them all + errorhandler(client, e, p); + return process.exit(1); //i guess this handler does keep the event loop running but i'll adopt a zero-tolerance policy for unhandled rejections + }); // gotta catch 'em all + process.on('exit', code => { + client.log("Back to sleepies...", {color: "#78d9f8", source: client.config.bot.consoleName}, true); + return console.log(chalk.grey(`Exit code ${chalk.white(code)}`)); + }); +}; \ No newline at end of file