v2
Kit Kasune 1 week ago
parent 6124dc7d6d
commit 1083262fae
  1. 2
      .gitignore
  2. 19
      bot.js
  3. 30
      package-lock.json
  4. 2
      package.json
  5. 0
      src/bot/runtime/commands/bot/commands.js.test
  6. 0
      src/bot/runtime/commands/bot/ping.js
  7. 78
      src/bot/runtime/events/messageCreate.js
  8. 18
      src/bot/runtime/events/ready.js
  9. 104
      src/bot/startup/collect/commands.js
  10. 88
      src/bot/startup/collect/events.js
  11. 14
      src/bot/startup/run/collect.js
  12. 38
      src/bot/startup/run/getflags.js
  13. 22
      src/bot/startup/run/hello.js
  14. 42
      src/bot/startup/run/login.js
  15. 82
      src/bot/startup/run/setstatus.js
  16. 2
      src/db/connect.js

2
.gitignore vendored

@ -1,5 +1,5 @@
node_modules/ node_modules/
auth.json src/json/auth.json
test.js test.js
/.idea/ /.idea/

@ -1,10 +1,6 @@
const Discord = require('discord.js'); const Discord = require('discord.js');
const auth = require('./src/json/auth.json');
const config = require('./src/json/config.json');
const randresp = require('./src/json/randresp.json');
const errorhandler = require('./src/util/log/errorhandler'); const errorhandler = require('./src/util/log/errorhandler');
const log = require('./src/util/log/log'); const log = require('./src/util/log/log');
const flags = Discord.GatewayIntentBits; const flags = Discord.GatewayIntentBits;
@ -14,11 +10,12 @@ const client = new Discord.Client({intents: fl, partials: [partials.Channel, par
// a "fuck v14" counter is gonna be here real soon i can feel it. // a "fuck v14" counter is gonna be here real soon i can feel it.
//fuck new embeds //fuck new embeds
const startBot = async () => { const startBot = async () => {
client.config = config; client.config = require('./src/json/config.json');
client.auth = auth; client.auth = require('./src/json/auth.json');
client.config.randResp = randresp; client.config.randResp = require('./src/json/randresp.json');
require('./src/util/misc/setutils')(client); // add some basic swiss army knife utils require('./src/util/misc/setutils')(client); // add some basic swiss army knife utils
@ -27,13 +24,13 @@ const startBot = async () => {
client.log(client.utils.gr(client.config.randResp.clistart), {color: "#78d9f8", source: client.config.bot.consoleName}, 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); require('./src/bot/startup/run/getflags')(client);
await require('./src/db/connect')(client); //connect to database 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/bot/startup/run/collect')(client); //load in commands and events
await require('./src/handle/startup/run/login')(client); //log in to discord await require('./src/bot/startup/run/login')(client); //log in to discord
require('./src/util/misc/nodehandlers')(client); //handle uncaught promises, warnings, event loop shenanigans require('./src/util/misc/nodehandlers')(client); //bot uncaught promises, warnings, event loop shenanigans
}; };
startBot().catch(e => errorhandler(client, 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

30
package-lock.json generated

@ -16,7 +16,7 @@
"dreidels": "^0.6.1", "dreidels": "^0.6.1",
"express": "^4.21.2", "express": "^4.21.2",
"fuzzysort": "^3.1.0", "fuzzysort": "^3.1.0",
"gradient-string": "^3.0.0", "gradient-string": "^2.0.2",
"lastfm": "^0.9.4", "lastfm": "^0.9.4",
"moment": "^2.30.1", "moment": "^2.30.1",
"moment-precise-range-plugin": "^1.3.0", "moment-precise-range-plugin": "^1.3.0",
@ -414,9 +414,9 @@
} }
}, },
"node_modules/chalk": { "node_modules/chalk": {
"version": "4.1.0", "version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"ansi-styles": "^4.1.0", "ansi-styles": "^4.1.0",
@ -971,28 +971,16 @@
} }
}, },
"node_modules/gradient-string": { "node_modules/gradient-string": {
"version": "3.0.0", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/gradient-string/-/gradient-string-3.0.0.tgz", "resolved": "https://registry.npmjs.org/gradient-string/-/gradient-string-2.0.2.tgz",
"integrity": "sha512-frdKI4Qi8Ihp4C6wZNB565de/THpIaw3DjP5ku87M+N9rNSGmPTjfkq61SdRXB7eCaL8O1hkKDvf6CDMtOzIAg==", "integrity": "sha512-rEDCuqUQ4tbD78TpzsMtt5OIf0cBCSDWSJtUDaF6JsAh+k0v9r++NzxNEG87oDZx9ZwGhD8DaezR2L/yrw0Jdw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"chalk": "^5.3.0", "chalk": "^4.1.2",
"tinygradient": "^1.1.5" "tinygradient": "^1.1.5"
}, },
"engines": { "engines": {
"node": ">=14" "node": ">=10"
}
},
"node_modules/gradient-string/node_modules/chalk": {
"version": "5.4.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
"integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
"license": "MIT",
"engines": {
"node": "^12.17.0 || ^14.13 || >=16.0.0"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
} }
}, },
"node_modules/gradient-string/node_modules/tinygradient": { "node_modules/gradient-string/node_modules/tinygradient": {

@ -26,7 +26,7 @@
"dreidels": "^0.6.1", "dreidels": "^0.6.1",
"express": "^4.21.2", "express": "^4.21.2",
"fuzzysort": "^3.1.0", "fuzzysort": "^3.1.0",
"gradient-string": "^3.0.0", "gradient-string": "^2.0.2",
"lastfm": "^0.9.4", "lastfm": "^0.9.4",
"moment": "^2.30.1", "moment": "^2.30.1",
"moment-precise-range-plugin": "^1.3.0", "moment-precise-range-plugin": "^1.3.0",

@ -1,40 +1,40 @@
const chalk = require('chalk'); const chalk = require('chalk');
const {Embed, EmbedBuilder} = require('discord.js'); const {Embed, EmbedBuilder} = require('discord.js');
module.exports = async (client, message) => { module.exports = async (client, message) => {
if (!message.content || !message.content.length) {return;} //privileged intent fallback //TODO edit for privileged intent if (!message.content || !message.content.length) {return;} //privileged intent fallback //TODO edit for privileged intent
let prefix = client.basePrefix; //TODO prefixes let prefix = client.basePrefix; //TODO prefixes
if ([`<@${client.user.id}>`, `<@!${client.user.id}>`].includes(message.content.trim())) { //Ping hello if ([`<@${client.user.id}>`, `<@!${client.user.id}>`].includes(message.content.trim())) { //Ping hello
message.channel.send({embeds: [new EmbedBuilder() message.channel.send({embeds: [new EmbedBuilder()
.setTitle(client.utils.gr(client.config.randResp.pinghello)) .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.`) .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') .setColor('c375f0')
.setFooter({text: "Natsuki", iconURL: client.user.avatarURL()}) .setFooter({text: "Natsuki", iconURL: client.user.avatarURL()})
]}); ]});
} }
let cmd = {}; let cmd = {};
cmd.msg = message.content.toLowerCase().trim(); //i believe in shitty naming conventions :D cmd.msg = message.content.toLowerCase().trim(); //i believe in shitty naming conventions :D
let prefixUsed = cmd.msg.startsWith(client.basePrefix) ? client.basePrefix //stamdard default/dev client prefix let prefixUsed = cmd.msg.startsWith(client.basePrefix) ? client.basePrefix //stamdard default/dev client prefix
: cmd.msg.startsWith(`<@${client.user.id}>`) ? `<@${client.user.id}>` //mention prefix : cmd.msg.startsWith(`<@${client.user.id}>`) ? `<@${client.user.id}>` //mention prefix
: cmd.msg.startsWith(`<@!${client.user.id}>`) ? `<@!${client.user.id}>` //nicknamed mention prefix : cmd.msg.startsWith(`<@!${client.user.id}>`) ? `<@!${client.user.id}>` //nicknamed mention prefix
: null //no prefix used : null //no prefix used
cmd.prefix = prefixUsed; cmd.prefix = prefixUsed;
if (!cmd.prefix) {return;} // ----------> PREFIXED GATEWAY <---------- if (!cmd.prefix) {return;} // ----------> PREFIXED GATEWAY <----------
cmd.msg = cmd.msg.slice(prefixUsed.length); cmd.msg = cmd.msg.slice(prefixUsed.length);
let args = cmd.msg.split(/\s+/gm); //"args" is split by ALL WHITESPACE AND IS LOWERCASED let args = cmd.msg.split(/\s+/gm); //"args" is split by ALL WHITESPACE AND IS LOWERCASED
cmd.name = args.shift(); //the command without the prefix cmd.name = args.shift(); //the command without the prefix
cmd.msg = args.join(" "); cmd.msg = args.join(" ");
cmd.args = message.content.trim().slice(prefixUsed.length).trim().split(/ +/gm).slice(1); //args but preserves text state and newlines cmd.args = message.content.trim().slice(prefixUsed.length).trim().split(/ +/gm).slice(1); //args but preserves text state and newlines
let cmdToRun = client.commands.get(cmd.name) || client.commands.get(client.aliases.get(cmd.name)); let cmdToRun = client.commands.get(cmd.name) || client.commands.get(client.aliases.get(cmd.name));
if (!cmdToRun) {return;} if (!cmdToRun) {return;}
try {cmdToRun.run(client, message, args, cmd).catch(e => client.error(`There was an error in the ${cmdToRun.name} command.`, 0, 1, e, '\n'));} try {cmdToRun.run(client, message, args, cmd).catch(e => client.error(`There was an error in the ${cmdToRun.name} command.`, 0, 1, e, '\n'));}
catch (e) {client.error(`There was an error in the ${cmdToRun.name} command.`, 0, 1, e, '\n');} catch (e) {client.error(`There was an error in the ${cmdToRun.name} command.`, 0, 1, e, '\n');}
}; };

@ -1,10 +1,10 @@
module.exports = async client => { module.exports = async client => {
client.basePrefix = client.config.options.dev ? client.config.options.prefix || client.config.bot.devPrefix : client.config.bot.prefix; client.basePrefix = client.config.options.dev ? client.config.options.prefix || client.config.bot.devPrefix : client.config.bot.prefix;
await require('../../../api/index')(client); await require('../../../api/index')(client);
require('../../startup/run/hello')(client); // startup info require('../../startup/run/hello')(client); // startup info
require('../../startup/run/setstatus')(client); require('../../startup/run/setstatus')(client);
client.log(client.utils.gr(client.config.randResp.cliloaded), {color: "#78d9f8", source: client.config.bot.consoleName}, true, true); //natsuki doing some more complaining client.log(client.utils.gr(client.config.randResp.cliloaded), {color: "#78d9f8", source: client.config.bot.consoleName}, true, true); //natsuki doing some more complaining
}; };

@ -1,53 +1,53 @@
const fs = require('fs'); const fs = require('fs');
const chalk = require('chalk'); const chalk = require('chalk');
const {Collection} = require('discord.js'); const {Collection} = require('discord.js');
const commandsDirName = './src/handle/runtime/commands'; const commandsDirName = './src/bot/runtime/commands';
module.exports = async client => { module.exports = async client => {
client.aliases = new Collection(); client.aliases = new Collection();
let dirErrors = []; let fileErrors = []; //collect error objects to output them all at the end let dirErrors = []; let fileErrors = []; //collect error objects to output them all at the end
let readDirs = []; //list of dirs to print at the end let readDirs = []; //list of dirs to print at the end
let conflictingAliases = {}; let conflictingAliases = {};
client.log('Loading commands...', {source: 'boot', color: 'blue'}, 0, 1); client.log('Loading commands...', {source: 'boot', color: 'blue'}, 0, 1);
const readDir = dir => { //when you're trying to comment your code but realize you have good variable naming for once and don't need to :D const readDir = dir => { //when you're trying to comment your code but realize you have good variable naming for once and don't need to :D
let dirRead; let dirRead;
try {dirRead = fs.readdirSync(dir);} try {dirRead = fs.readdirSync(dir);}
catch (e) { catch (e) {
client.error(`Failed to read directory ${chalk.white(dir)}`); client.error(`Failed to read directory ${chalk.white(dir)}`);
return dirErrors.push([`Unable to read directory ${chalk.white(dir)}. Error:`, e]); return dirErrors.push([`Unable to read directory ${chalk.white(dir)}. Error:`, e]);
} }
let files = dirRead.filter(item => item.endsWith('.js')); let files = dirRead.filter(item => item.endsWith('.js'));
let folders = dirRead.filter(item => fs.lstatSync(`${dir}/${item}`).isDirectory()); let folders = dirRead.filter(item => fs.lstatSync(`${dir}/${item}`).isDirectory());
files.forEach(file => { files.forEach(file => {
try { try {
const command = require(`../../../../${dir.slice(2)}/${file}`); const command = require(`../../../../${dir.slice(2)}/${file}`);
client.commands.set(command.name, command); client.commands.set(command.name, command);
if (command.aliases) {command.aliases.forEach(alias => { if (command.aliases) {command.aliases.forEach(alias => {
if (client.aliases.has(alias)) { if (client.aliases.has(alias)) {
if (conflictingAliases[alias]) {conflictingAliases[alias].push(command.name);} //object of alias conflictions keyed by alias -> by array[command names] if (conflictingAliases[alias]) {conflictingAliases[alias].push(command.name);} //object of alias conflictions keyed by alias -> by array[command names]
else {conflictingAliases[alias] = [command.name];} else {conflictingAliases[alias] = [command.name];}
} }
client.aliases.set(alias, command.name); client.aliases.set(alias, command.name);
});} });}
client.log(`Loaded ${chalk.white(command.name)} with ${chalk.white(`${command.aliases ? command.aliases.length : 0}`)} alias${command.aliases && command.aliases.length === 1 ? '' : 'es'}.`, {color: 'blueBright', source: 'boot', sourceColor: 'blue'}); client.log(`Loaded ${chalk.white(command.name)} with ${chalk.white(`${command.aliases ? command.aliases.length : 0}`)} alias${command.aliases && command.aliases.length === 1 ? '' : 'es'}.`, {color: 'blueBright', source: 'boot', sourceColor: 'blue'});
} }
catch (e) { catch (e) {
client.error(`Failed to read file ${chalk.white(file)}`); client.error(`Failed to read file ${chalk.white(file)}`);
return fileErrors.push([`Unable to read file ${chalk.white(file)}. Error:`, e]); return fileErrors.push([`Unable to read file ${chalk.white(file)}. Error:`, e]);
} }
}); });
readDirs.push(`${dir.split('/').slice(4).join('/')}/`); // "commands/..." readDirs.push(`${dir.split('/').slice(4).join('/')}/`); // "commands/..."
return folders.forEach(folder => readDir(`${dir}/${folder}`)); //recurse infinitely return folders.forEach(folder => readDir(`${dir}/${folder}`)); //recurse infinitely
}; };
readDir(commandsDirName); readDir(commandsDirName);
console.log(""); console.log("");
dirErrors.forEach(error => client.error(error[0], 0, 0, 1, error[1])); dirErrors.forEach(error => client.error(error[0], 0, 0, 1, error[1]));
fileErrors.forEach(error => client.error(error[0], 0, 0, 1, error[1])); fileErrors.forEach(error => client.error(error[0], 0, 0, 1, error[1]));
readDirs.forEach(dir => client.log(`Read from directory ${chalk.green(dir)}`, {source: 'proc'})); readDirs.forEach(dir => client.log(`Read from directory ${chalk.green(dir)}`, {source: 'proc'}));
console.log(''); console.log('');
Object.keys(conflictingAliases).forEach(alias => client.warn(`Alias ${chalk.white(alias)} appears on ${client.utils.as(conflictingAliases[alias].length, 'command')} ${chalk.white(conflictingAliases[alias].join(chalk.yellow(', ')))}`)); Object.keys(conflictingAliases).forEach(alias => client.warn(`Alias ${chalk.white(alias)} appears on ${client.utils.as(conflictingAliases[alias].length, 'command')} ${chalk.white(conflictingAliases[alias].join(chalk.yellow(', ')))}`));
if (Object.keys(conflictingAliases).length) {console.log('')}; if (Object.keys(conflictingAliases).length) {console.log('')};
client.log(`Loaded ${chalk.white(client.commands.size)} command${client.utils.s(client.commands.size)}!`, {color: 'blue', source: 'boot'}, 0, 1); client.log(`Loaded ${chalk.white(client.commands.size)} command${client.utils.s(client.commands.size)}!`, {color: 'blue', source: 'boot'}, 0, 1);
}; };

@ -1,45 +1,45 @@
const fs = require('fs'); const fs = require('fs');
const chalk = require('chalk'); const chalk = require('chalk');
const {Collection} = require('discord.js'); const {Collection} = require('discord.js');
const eventsDirName = './src/handle/runtime/events'; const eventsDirName = './src/bot/runtime/events';
module.exports = async client => { module.exports = async client => {
client.aliases = new Collection(); client.aliases = new Collection();
let dirErrors = []; let fileErrors = []; //collect error objects to output them all at the end let dirErrors = []; let fileErrors = []; //collect error objects to output them all at the end
let readDirs = []; //list of dirs to print at the end let readDirs = []; //list of dirs to print at the end
let totalEvents = 0; let totalEvents = 0;
client.log('Loading events...', {source: 'boot', color: 'blue'}, 0, 1); client.log('Loading events...', {source: 'boot', color: 'blue'}, 0, 1);
const readDir = dir => { const readDir = dir => {
let dirRead; let dirRead;
try {dirRead = fs.readdirSync(dir);} try {dirRead = fs.readdirSync(dir);}
catch (e) { catch (e) {
client.error(`Failed to read directory ${chalk.white(dir)}`); client.error(`Failed to read directory ${chalk.white(dir)}`);
return dirErrors.push([`Unable to read directory ${chalk.white(dir)}. Error:`, e]); return dirErrors.push([`Unable to read directory ${chalk.white(dir)}. Error:`, e]);
} }
let files = dirRead.filter(item => item.endsWith('.js')); let files = dirRead.filter(item => item.endsWith('.js'));
let folders = dirRead.filter(item => fs.lstatSync(`${dir}/${item}`).isDirectory()); let folders = dirRead.filter(item => fs.lstatSync(`${dir}/${item}`).isDirectory());
files.forEach(file => { files.forEach(file => {
try { try {
const event = require(`../../../../${dir.slice(2)}/${file}`); const event = require(`../../../../${dir.slice(2)}/${file}`);
const eventName = file.split('.')[0]; const eventName = file.split('.')[0];
client.removeAllListeners(eventName); client.removeAllListeners(eventName);
client.on(eventName, event.bind(null, client)); client.on(eventName, event.bind(null, client));
client.log(`Loaded event ${chalk.white(eventName)}`, {color: 'blueBright', source: 'boot', sourceColor: 'blue'}); client.log(`Loaded event ${chalk.white(eventName)}`, {color: 'blueBright', source: 'boot', sourceColor: 'blue'});
} }
catch (e) { catch (e) {
client.error(`Failed to read file ${chalk.white(file)}`); client.error(`Failed to read file ${chalk.white(file)}`);
return fileErrors.push([`Unable to read file ${chalk.white(file)}. Error:`, e]); return fileErrors.push([`Unable to read file ${chalk.white(file)}. Error:`, e]);
} }
}); });
readDirs.push(`${dir.split('/').slice(4).join('/')}/`); // "events/..." readDirs.push(`${dir.split('/').slice(4).join('/')}/`); // "events/..."
return folders.forEach(folder => readDir(`${dir}/${folder}`)); //recurse infinitely return folders.forEach(folder => readDir(`${dir}/${folder}`)); //recurse infinitely
}; };
readDir(eventsDirName); readDir(eventsDirName);
console.log(""); console.log("");
dirErrors.forEach(error => client.error(error[0], 0, 0, 1, error[1])); dirErrors.forEach(error => client.error(error[0], 0, 0, 1, error[1]));
fileErrors.forEach(error => client.error(error[0], 0, 0, 1, error[1])); fileErrors.forEach(error => client.error(error[0], 0, 0, 1, error[1]));
readDirs.forEach(dir => client.log(`Read from directory ${chalk.green(dir)}`, {source: 'proc'})); readDirs.forEach(dir => client.log(`Read from directory ${chalk.green(dir)}`, {source: 'proc'}));
client.log(`Loaded ${chalk.white(totalEvents)} event${client.utils.s(totalEvents)}!`, {color: 'blue', source: 'boot'}, 1, 1); client.log(`Loaded ${chalk.white(totalEvents)} event${client.utils.s(totalEvents)}!`, {color: 'blue', source: 'boot'}, 1, 1);
}; };

@ -1,8 +1,8 @@
const {Collection} = require("discord.js"); const {Collection} = require("discord.js");
module.exports = async client => { module.exports = async client => {
['commands', 'events'].forEach(x => { ['commands', 'events'].forEach(x => {
client[x] = new Collection(); client[x] = new Collection();
require(`../collect/${x}`)(client); require(`../collect/${x}`)(client);
}); });
}; };

@ -1,20 +1,20 @@
const chalk = require('chalk'); const chalk = require('chalk');
const {Tag, TagFilter} = require('../../../util/ts/tagfilter'); const {Tag, TagFilter} = require('../../../util/ts/tagfilter');
module.exports = client => { module.exports = client => {
const options = new TagFilter([ const options = new TagFilter([
new Tag(['dev', 'd', 'developer', 'test'], 'dev', 'toggle'), new Tag(['dev', 'd', 'developer', 'test'], 'dev', 'toggle'),
new Tag(['prefix', 'devprefix', 'p'], 'prefix', 'append') new Tag(['prefix', 'devprefix', 'p'], 'prefix', 'append')
]).test(process.argv.slice(2).join(" ")); ]).test(process.argv.slice(2).join(" "));
client.config.options = {}; client.config.options = {};
if (Object.keys(options).length) { //log and set options if (Object.keys(options).length) { //log and set options
client.log(`${chalk.gray.bold("Arguments detected.")}`, {source: 'args'}, 0, 1); client.log(`${chalk.gray.bold("Arguments detected.")}`, {source: 'args'}, 0, 1);
Object.keys(options).forEach(arg => { Object.keys(options).forEach(arg => {
client.config.options[arg] = options[arg]; client.config.options[arg] = options[arg];
client.log(`${chalk.gray.bold(arg)}${chalk.gray(':')} ${chalk.blue(options[arg])}`, {source: 'args'}); client.log(`${chalk.gray.bold(arg)}${chalk.gray(':')} ${chalk.blue(options[arg])}`, {source: 'args'});
}); });
console.log(''); console.log('');
} }
}; };

@ -1,12 +1,12 @@
const moment = require("moment"); const moment = require("moment");
const chalk = require('chalk'); const chalk = require('chalk');
const os = require('os'); const os = require('os');
const gs = require('gradient-string'); const gs = require('gradient-string');
module.exports = client => { module.exports = client => {
client.log(`Logged in as ${gs.instagram(client.user.username)}. ${chalk.greenBright(`[${chalk.grey(client.user.id)}]`)}`); client.log(`Logged in as ${gs.instagram(client.user.username)}. ${chalk.greenBright(`[${chalk.grey(client.user.id)}]`)}`);
client.log(`Time: ${chalk.blueBright(moment().format('MMMM d, YYYY - HH:MM:SS'))}`); client.log(`Time: ${chalk.blueBright(moment().format('MMMM d, YYYY - HH:MM:SS'))}`);
client.log(`This ${chalk.blue('heap')} has ${chalk.blueBright((process.memoryUsage().heapTotal / (1024 ** 2)).toFixed(2))}MB allocated; The ${chalk.blue('machine')} has ${chalk.blueBright((os.totalmem() / (1024 ** 3)).toFixed(2))}GB (${chalk.blueBright((os.freemem() / (1024 ** 3)).toFixed(2))}GB free)`); client.log(`This ${chalk.blue('heap')} has ${chalk.blueBright((process.memoryUsage().heapTotal / (1024 ** 2)).toFixed(2))}MB allocated; The ${chalk.blue('machine')} has ${chalk.blueBright((os.totalmem() / (1024 ** 3)).toFixed(2))}GB (${chalk.blueBright((os.freemem() / (1024 ** 3)).toFixed(2))}GB free)`);
client.log(`Running on ${chalk.blueBright(client.guilds.cache.size)} ${chalk.blue("servers")} and interacting with about ${chalk.blueBright(client.users.cache.size)} ${chalk.blue("users")}.`); client.log(`Running on ${chalk.blueBright(client.guilds.cache.size)} ${chalk.blue("servers")} and interacting with about ${chalk.blueBright(client.users.cache.size)} ${chalk.blue("users")}.`);
client.log(`Listening for prefix ${chalk.greenBright(client.basePrefix)} || ${chalk.greenBright(`${client.basePrefix}help`)} to get started!`); client.log(`Listening for prefix ${chalk.greenBright(client.basePrefix)} || ${chalk.greenBright(`${client.basePrefix}help`)} to get started!`);
}; };

@ -1,21 +1,21 @@
const chalk = require('chalk'); const chalk = require('chalk');
const ora = require('../../../util/log/ora'); const ora = require('../../../util/log/ora');
module.exports = async (client) => { module.exports = async (client) => {
const t = Date.now(); const t = Date.now();
client.misc = {}; client.misc = {};
client.misc.dscconnected = true; client.misc.dscconnected = true;
await ora(`Waking up Natsuki... ${chalk.blueBright.bold.underline("(Connecting to Discord...)")}`, await ora(`Waking up Natsuki... ${chalk.blueBright.bold.underline("(Connecting to Discord...)")}`,
client.login(client.auth.token) client.login(client.auth.token)
).catch((e) => { ).catch((e) => {
client.error("Failed to connect to Discord!! Error below.", 0, 0, true, e); client.error("Failed to connect to Discord!! Error below.", 0, 0, true, e);
client.misc.dscconnected = false; client.misc.dscconnected = false;
}); });
if (!client.misc.dscconnected) { if (!client.misc.dscconnected) {
client.warn("Discord not connected, considering runtime to be unusable and exiting.", 0, true, true); client.warn("Discord not connected, considering runtime to be unusable and exiting.", 0, true, true);
throw new Error(); throw new Error();
} }
return client.success(`Connected to Discord in ${chalk.white(`${Date.now() - t}ms`)}.`, 0, 0, 1); return client.success(`Connected to Discord in ${chalk.white(`${Date.now() - t}ms`)}.`, 0, 0, 1);
}; };

@ -1,42 +1,42 @@
module.exports = client => { module.exports = client => {
const prefix = client.basePrefix; const prefix = client.basePrefix;
const statuses = { const statuses = {
"PLAYING": [ "PLAYING": [
`with my darling`, 'RAIN: Shadow Lords', "with my waifu", "with the neko formula", `with my darling`, 'RAIN: Shadow Lords', "with my waifu", "with the neko formula",
"with magic", "terrible anime games", "anime OSTs at max volume", "with magic", "terrible anime games", "anime OSTs at max volume",
`${Math.ceil(Math.random() * 100)} days of trying to become a samurai`, `${Math.ceil(Math.random() * 100)} days of trying to become a samurai`,
"with the sauce", "witch hats are >", "explosion magic is the best magic", "with the sauce", "witch hats are >", "explosion magic is the best magic",
"with Kazuma's sanity", "please help i gave myself cat ears", "with Kazuma's sanity", "please help i gave myself cat ears",
"starting my own harem", "wor. wor never changes", "a little more UwU than necessary", "starting my own harem", "wor. wor never changes", "a little more UwU than necessary",
"please i just want a cat girl in my life", "i'm your waifu now.", "please i just want a cat girl in my life", "i'm your waifu now.",
"i'm in intervention for my neko addiction", "i tried to make a catgirl and broke my staff", "i'm in intervention for my neko addiction", "i tried to make a catgirl and broke my staff",
"fluffy tails = drugs", "in a dungeon without wearing my plot armor", "fluffy tails = drugs", "in a dungeon without wearing my plot armor",
"benefits of Natsuki worship: my beautiful face" "benefits of Natsuki worship: my beautiful face"
,`in ${client.guilds.cache.size} servers` ,`in ${client.guilds.cache.size} servers`
], ],
"WATCHING": [ "WATCHING": [
`for ${client.commands.size} commands`, `for ${client.commands.size} commands`,
"I'm not a bad slime, slurp!", "Lelouch rule the world!", "I'm not a bad slime, slurp!", "Lelouch rule the world!",
"a slime somehow start an empire", "a fox-maid get her tail fluffed", "a slime somehow start an empire", "a fox-maid get her tail fluffed",
"a raccoon-girl and some guy with a shield", "some chick with unusually red hair", "a raccoon-girl and some guy with a shield", "some chick with unusually red hair",
"Mob hit 100", "a really bad harem anime", "The Black Swordsman", "Mob hit 100", "a really bad harem anime", "The Black Swordsman",
"The Misfit of Demon King Academy", "Akame ga Kill", "a witch explode a castle", "The Misfit of Demon King Academy", "Akame ga Kill", "a witch explode a castle",
"Code Geass", "\"did you really think ___ would be enough to kill me?\"", "Code Geass", "\"did you really think ___ would be enough to kill me?\"",
"hentacle tentai", "JIBUN WO-", "he did it... he actually made risotto", "hentacle tentai", "JIBUN WO-", "he did it... he actually made risotto",
"sasageyo, sasageyo, chi nto wo sasegeyo", "scientists make nekos real :3", "sasageyo, sasageyo, chi nto wo sasegeyo", "scientists make nekos real :3",
"yet another isekai don't @ me", "magical girl anime", "episode 1 of One Piece.. pain.", "yet another isekai don't @ me", "magical girl anime", "episode 1 of One Piece.. pain.",
"a white-haired dude and a goddess with some MELONS" "a white-haired dude and a goddess with some MELONS"
,`over ${client.guilds.cache.size} servers` ,`over ${client.guilds.cache.size} servers`
] ]
}; };
try {if (client.misc.statusTimeout) {clearTimeout(client.misc.statusTimeout)};} catch {} try {if (client.misc.statusTimeout) {clearTimeout(client.misc.statusTimeout)};} catch {}
const setStatus = () => { const setStatus = () => {
let type = Object.keys(statuses)[Math.floor(Math.random() * Object.keys(statuses).length)]; let type = Object.keys(statuses)[Math.floor(Math.random() * Object.keys(statuses).length)];
if (type === "PLAYING") {client.user.setActivity(statuses[type][Math.floor(Math.random() * statuses[type].length)] + " | " + prefix + "help");} if (type === "PLAYING") {client.user.setActivity(statuses[type][Math.floor(Math.random() * statuses[type].length)] + " | " + prefix + "help");}
else {client.user.setActivity(statuses[type][Math.floor(Math.random() * statuses[type].length)] + " | " + prefix + "help", {type: type});} else {client.user.setActivity(statuses[type][Math.floor(Math.random() * statuses[type].length)] + " | " + prefix + "help", {type: type});}
}; };
setStatus(); setStatus();
client.misc.statusTimeout = setTimeout(setStatus, 14400000); client.misc.statusTimeout = setTimeout(setStatus, 14400000);
}; };

@ -10,7 +10,7 @@ module.exports = async client => {
client.misc.dbconnected = true; client.misc.dbconnected = true;
await ora(chalk.blueBright.bold.underline("Connecting to MongoDB..."), await ora(chalk.blueBright.bold.underline("Connecting to MongoDB..."),
mongoose.connect(`mongodb+srv://${auth.database.user}:${auth.database.password}@${auth.database.cluster}.3jpp4.mongodb.net/test`, { mongoose.connect(`mongodb+srv://${auth.database.user}:${auth.database.password}@${auth.database.cluster}.3jpp4.mongodb.net/test`, {
useFindAndModify: false, useNewUrlParser: true, dbName: auth.database.name, useUnifiedTopology: true, useCreateIndex: true dbName: auth.database.name //TODO research mongo connect options
}) })
).catch((e) => { ).catch((e) => {
client.error("Failed to connect to mongoose!! Error below.", 0, 0, true, e); client.error("Failed to connect to mongoose!! Error below.", 0, 0, true, e);

Loading…
Cancel
Save