Files
SANCTUM/ADAM/adam.js

169 lines
4.6 KiB
JavaScript

// .env Variables
require('dotenv').config({path: '../.env'});
// Node Modules
let discord = require('discord.js');
let client = new discord.Client();
let cron = require('node-cron');
// Bot Modules
let core = require("./core");
let npcSettings = require('./npcSettings');
let shared = require("../Shared/shared");
//dialog system
let dialog = shared.GenerateDialogFunction(require("./dialog.json"));
//ADAM dialog decorator
dialog = function(baseDialog) {
return function(key, ...data) {
if ( (key === "help" || key === "lore") && typeof(data[0]) !== "undefined") {
//force the arg into camelCase
arg = data[0].toLowerCase();
arg = arg.charAt(0).toUpperCase() + arg.substr(1);
key += arg;
}
let result = baseDialog(key, ...data);
if (result === "") {
return "No result for \"" + key + "\"";
}
return result;
}
}(dialog);
//handle errors
client.on('error', console.error);
// The ready event is vital, it means that your bot will only start reacting to information from discord _after_ ready is emitted
client.on('ready', async () => {
// Generates invite link
try {
let link = await client.generateInvite(["ADMINISTRATOR"]);
console.log("Invite Link: " + link);
} catch(e) {
console.log(e.stack);
}
// You can set status to 'online', 'invisible', 'away', or 'dnd' (do not disturb)
client.user.setStatus('online');
// Sets your "Playing"
if (npcSettings.activity) {
client.user.setActivity(npcSettings.activity, { type: npcSettings.type })
//DEBUGGING
.then(presence => console.log("Activity set to " + (presence.game ? presence.game.name : 'none')) )
.catch(console.error);
}
console.log("Logged in as: " + client.user.username + " - " + client.user.id);
//ADAM updates stamina (1) and health by 1% every 2 min.
cron.schedule('*/2 * * * *', () => {
console.log('Updating STAMINA every 2 min.');
shared.SendServerData("updateStamina");
});
});
// Create an event listener for messages
client.on('message', async message => {
// Ignores ALL bot messages
if (message.author.bot) {
return;
}
//skip the statis channel
if (message.channel.id === process.env.STASIS_CHANNEL_ID) {
return;
}
//ADAM only - handle the gate
if (processGateCommands(message)) {
return;
}
// Has to be (prefix)command
if (message.content.indexOf(process.env.PREFIX) !== 0) {
return;
}
if (processBasicCommands(client, message)) {
return;
}
});
//Log our bot in
client.login(npcSettings.token);
function processGateCommands(message) {
// If it's not the gate
if (message.channel.id !== process.env.GATE_CHANNEL_ID) {
return false; //not processed
}
//TODO: parse function for commands to hide these ugly lines
let args = message.content.slice(process.env.PREFIX.length).trim().split(/ +/g);
let command = args.shift().toLowerCase();
//WARNING: string constants used here
//if laying out the intro
if (command.substr(0, 5) === "intro") {
return false;
}
//if they haven't chosen a faction
if (!(command === "obsidian" || command === "genesis" || command === "hand")) {
message.reply("Please choose one of the factions by typing your desired faction shown above (!obsidian, !genesis, or !hand).")
.then(msg => msg.delete(10000)) //remove the error message
.catch(console.error);
}
message.delete(100); //remove the user's input to keep the gate clean
return true;
}
function processBasicCommands(client, message) {
// "This is the best way to define args. Trust me."
// - Some tutorial dude on the internet
let args = message.content.slice(process.env.PREFIX.length).trim().split(/ +/g);
let command = args.shift().toLowerCase();
switch (command) {
case "ping":
if (shared.IsAdmin(client, message.author)) {
shared.SendPublicMessage(client, message.author, message.channel, "PONG!");
}
return true;
//ADAM and the faction leaders print the intros in the gate
//TODO: prune the unneeded intros from each bot
case "intro":
if (shared.IsAdmin(client, message.author) && message.channel.id == process.env.GATE_CHANNEL_ID) {
shared.SendPublicMessage(client, client.channels.get(process.env.GATE_CHANNEL_ID), dialog("intro"));
message.delete(1000);
}
return true;
case "introend":
if (shared.IsAdmin(client, message.author) && message.channel.id == process.env.GATE_CHANNEL_ID) {
shared.SendPublicMessage(client, client.channels.get(process.env.GATE_CHANNEL_ID), dialog("introEnd"));
message.delete(1000);
}
return true;
case "help":
case "lore":
shared.SendPublicMessage(client, message.author, message.channel, dialog(command, args[0]));
return true;
//DEBUGGING
case "debugxp":
shared.AddXP(client, message.author, args[0]);
return true;
}
return false;
}