mirror of
https://github.com/Ratstail91/SANCTUM.git
synced 2025-11-29 02:24:27 +11:00
288 lines
9.9 KiB
JavaScript
288 lines
9.9 KiB
JavaScript
exports = module.exports = {};
|
|
|
|
let dataRequest = require("../Shared/data_request");
|
|
let discord = require('discord.js');
|
|
let shared = require("../Shared/shared");
|
|
|
|
//TODO: convert all doc comments to JSDoc format
|
|
|
|
//CheckValidDisplay
|
|
//client - discord.js client
|
|
//member - discord.js member OR username
|
|
//channel - discord.js channel OR channel name
|
|
//checkRole - check the member's role or not
|
|
exports.CheckValidDisplay = function(client, member, channel, checkRole) { //See if the bot should display its message
|
|
//handle member strings
|
|
if (typeof(member) === "string") {
|
|
//get the member
|
|
let user = client.users.find(item => item.username === member || item.id === member);
|
|
let guild = client.guilds.get(process.env.SANCTUM_ID);
|
|
member = guild.members.get(user.id);
|
|
}
|
|
|
|
//handle channel strings
|
|
if (typeof(channel) === "string") {
|
|
channel = client.channels.find(item => item.name === channel || item.id === channel);
|
|
}
|
|
|
|
switch(client.user.username) {
|
|
//NOTE: some copy/paste here that could be fixed
|
|
case process.env.GROUP_A_LEADER_NAME:
|
|
if (checkRole) {
|
|
return channel.id == process.env.GROUP_A_CHANNEL_ID && member.roles.has(process.env.GROUP_A_ROLE);
|
|
} else {
|
|
return channel.id == process.env.GROUP_A_CHANNEL_ID;
|
|
}
|
|
|
|
case process.env.GROUP_B_LEADER_NAME:
|
|
if (checkRole) {
|
|
return channel.id == process.env.GROUP_B_CHANNEL_ID && member.roles.has(process.env.GROUP_B_ROLE);
|
|
} else {
|
|
return channel.id == process.env.GROUP_B_CHANNEL_ID;
|
|
}
|
|
|
|
case process.env.GROUP_C_LEADER_NAME:
|
|
if (checkRole) {
|
|
return channel.id == process.env.GROUP_C_CHANNEL_ID && member.roles.has(process.env.GROUP_C_ROLE);
|
|
} else {
|
|
return channel.id == process.env.GROUP_C_CHANNEL_ID;
|
|
}
|
|
}
|
|
}
|
|
|
|
//ProcessGameplayCommands
|
|
//client - discord.js client
|
|
//message - discord.js message
|
|
//dialog - the dialog function
|
|
exports.ProcessGameplayCommands = function(client, message, dialog) {
|
|
// "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 "checkin":
|
|
exports.ProcessCheckinCommand(client, message.member, message.channel, dialog);
|
|
return true;
|
|
|
|
case "give":
|
|
exports.ProcessGiveCommand(client, message, args, dialog);
|
|
return true;
|
|
|
|
case "stats":
|
|
exports.ProcessStatsCommand(client, message.member, message.channel, dialog);
|
|
return true;
|
|
}
|
|
|
|
//didn't process it
|
|
return false;
|
|
}
|
|
|
|
//ProcessFactionChangeAttempt
|
|
//client - discord.js client
|
|
//message - discord.js message
|
|
//factionRole - the new faction's role
|
|
//dialog - the dialog function
|
|
//factionShorthand - the shorthand name of the new faction (TEMPORARY)
|
|
exports.ProcessFactionChangeAttempt = function(client, message, factionRole, dialog, factionShorthand) {
|
|
//tailor this for each faction leader?
|
|
let handleResponse = async function(response) {
|
|
switch (response) {
|
|
case "alreadyJoined":
|
|
shared.SendPublicMessage(client, message.channel, dialog("alreadyJoined" + factionShorthand, message.author.id));
|
|
break;
|
|
case "conversionLocked":
|
|
shared.SendPublicMessage(client, message.channel, dialog("conversionLocked", message.author.id));
|
|
break;
|
|
case "newUser":
|
|
shared.SendPublicMessage(client, message.author, shared.GetFactionChannel(factionRole), dialog("newUserPublicMessage", shared.GetFactionName(factionRole), shared.GetFactionChannel(factionRole)));
|
|
shared.SendPrivateMessage(client, message.author, dialog("newUserPrivateMessage", dialog("newUserPrivateMessageRemark" + factionShorthand)));
|
|
break;
|
|
case "joined":
|
|
shared.SendPublicMessage(client, message.author, message.channel, dialog("join" + factionShorthand));
|
|
break;
|
|
default:
|
|
//DEBUGGING
|
|
console.log("processFactionChangeAttempt failed:" + result);
|
|
}
|
|
}
|
|
|
|
shared.ChangeFaction(client, factionRole, message.channel, message.member, handleResponse);
|
|
}
|
|
|
|
//ProcessCheckinCommand
|
|
//client - discord.js client
|
|
//member - discord.js member
|
|
//channel - discord.js channel
|
|
//dialog - dialog function
|
|
exports.ProcessCheckinCommand = function(client, member, channel, dialog) {
|
|
let handleResponse = function(checkinResponse, checkinAmount) {
|
|
if (checkinResponse === "available") {
|
|
shared.SendPublicMessage(client, member.user, channel, dialog("checkin", checkinAmount));
|
|
exports.HandleLevelUp(client, member, channel, dialog);
|
|
} else {
|
|
shared.SendPublicMessage(client, channel, dialog("checkinLocked", member.user.id, checkinResponse));
|
|
}
|
|
}
|
|
|
|
dataRequest.OnServerData("checkin", handleResponse, member.user.id); //ID of the person who checked in TODO: username too
|
|
}
|
|
|
|
//ProcessGiveCommand
|
|
//client - discord.js client
|
|
//message - discord.js message
|
|
//args - arguments to the give command
|
|
//dialog - dialog function
|
|
exports.ProcessGiveCommand = function(client, message, args, dialog) {
|
|
let amount = Math.floor(parseFloat(args[0]));
|
|
|
|
if (isNaN(amount)) {
|
|
shared.SendPublicMessage(client, message.channel, dialog("giveFailed", message.author.id));
|
|
return;
|
|
}
|
|
|
|
//not enough
|
|
if (amount <= 0) {
|
|
shared.SendPublicMessage(client, message.channel, dialog("giveNotAboveZero", message.author.id));
|
|
return;
|
|
}
|
|
|
|
//didn't mention anyone
|
|
if (message.mentions.members.size == 0) {
|
|
shared.SendPublicMessage(client, message.channel, dialog("giveInvalidUser", message.author.id));
|
|
return;
|
|
}
|
|
|
|
let targetMember = message.mentions.members.first();
|
|
|
|
//can't give to yourself
|
|
if (targetMember.id === message.author.id) {
|
|
shared.SendPublicMessage(client, message.channel, dialog("giveInvalidUserSelf", message.author.id));
|
|
return;
|
|
}
|
|
|
|
let handleResponse = function(accountBalance) {
|
|
//not enough money in account
|
|
if (accountBalance < amount) {
|
|
shared.SendPublicMessage(client, message.channel, dialog("giveNotEnoughInAccount", message.author.id));
|
|
return;
|
|
}
|
|
|
|
//try to send the money
|
|
let handleResponse = function(response) {
|
|
if (response !== "success") {
|
|
shared.SendPublicMessage(client, message.channel, dialog("giveFailed", message.author.id));
|
|
} else {
|
|
//print the success message
|
|
shared.SendPublicMessage(client, message.author, message.channel, dialog("giveSuccessful", targetMember.id, amount));
|
|
}
|
|
}
|
|
|
|
dataRequest.OnServerData("transfer", handleResponse, message.author.id, targetMember.id, amount);
|
|
}
|
|
|
|
dataRequest.OnServerData("wallet", handleResponse, message.author.id);
|
|
}
|
|
|
|
//ProcessStatsCommand
|
|
//client - discord.js client
|
|
//member - discord.js member
|
|
//channel - discord.js channel
|
|
//dialog - dialog function
|
|
exports.ProcessStatsCommand = function(client, member, channel, dialog) {
|
|
exports.HandleLevelUp(client, member, channel, dialog, () => {
|
|
//BUGFIX: this code is in a next function to resolve the stats display bug
|
|
exports.GetStats(member.user, (stats) => {
|
|
exports.PrintStats(client, member, channel, stats);
|
|
});
|
|
});
|
|
}
|
|
|
|
//GetStats
|
|
//user - discord.js user OR username
|
|
//fn - function to pass the stats to
|
|
exports.GetStats = function(user, fn) {
|
|
//handle user strings
|
|
if (typeof(user) === "string") {
|
|
user = client.users.find(item => item.username === user || item.id === user);
|
|
}
|
|
|
|
dataRequest.OnServerData("userStats", fn, user.id);
|
|
}
|
|
|
|
//PrintStats
|
|
//client - discord.js client
|
|
//member - discord.js member OR username OR id
|
|
//channel - discord.js channel OR channel name OR id
|
|
//stats - stats generated by GetStats
|
|
exports.PrintStats = function(client, member, channel, stats) {
|
|
//handle member strings
|
|
if (typeof(member) === "string") { //TODO: fold these into their own functions EVERYWHERE.
|
|
//get the member
|
|
let user = client.users.find(item => item.username === member || item.id === member);
|
|
member = guild.members.get(user.id);
|
|
}
|
|
|
|
//handle channel strings
|
|
if (typeof(channel) === "string") {
|
|
channel = client.channels.find(item => item.name === channel || item.id === channel);
|
|
}
|
|
|
|
// Forms stats into a string
|
|
let levelText = `:level: **${stats.level}**`; //NOTE: I don't like backticks
|
|
let levelProgress = `(${stats.levelProgress}%)`;
|
|
let crystalText = `:crystals: **${stats.wallet}**`;
|
|
let cannisterText = `:cannister: **${stats.upgradePoints}**`;
|
|
let userStats = "```" + `STR: ${stats.strength} | SPD: ${stats.speed} | STAM: ${stats.stamina}/${stats.maxStamina} | HP: ${stats.health}/${stats.maxHealth}` + "```";
|
|
|
|
// Says level is maxed out if it is LVL 30+
|
|
if (stats.level >= process.env.RANK_3_THRESHOLD) {
|
|
levelProgress = "(MAX)";
|
|
}
|
|
|
|
// Creates embed & sends it
|
|
const embed = new discord.RichEmbed()
|
|
.setAuthor(`${member.user.username}`, member.user.avatarURL)
|
|
.setColor(member.displayColor)
|
|
.setDescription(`${levelText} ${levelProgress} | ${crystalText} | ${cannisterText}`)
|
|
.addField("Stats", userStats)
|
|
.setFooter("Commands: !help | !lore | !checkin | !give");
|
|
|
|
channel.send({ embed });
|
|
}
|
|
|
|
//HandleLevelUp
|
|
//client - discord.js client
|
|
//member - discord.js member
|
|
//channel - discord.js channel
|
|
//dialog - dialog function
|
|
exports.HandleLevelUp = function(client, member, channel, dialog, next) {
|
|
//handle member strings
|
|
if (typeof(member) === "string") { //TODO: fold these into their own functions EVERYWHERE.
|
|
//get the member
|
|
let user = client.users.find(item => item.username === member || item.id === member);
|
|
member = guild.members.get(user.id);
|
|
}
|
|
|
|
//handle channel strings
|
|
if (typeof(channel) === "string") {
|
|
channel = client.channels.find(item => item.name === channel || item.id === channel);
|
|
}
|
|
|
|
// Sees if the user is supposed to level up
|
|
let handleResponse = function(response, level, upgradePoints) {
|
|
//handle levelling up
|
|
if (response === "levelUp" || response === "RankUp") {
|
|
if (level >= process.env.RANK_3_THRESHOLD) {
|
|
shared.SendPublicMessage(client, member.user, channel, dialog("levelUpCap", dialog("levelUpCapRemark"), process.env.RANK_3_THRESHOLD));
|
|
} else {
|
|
shared.SendPublicMessage(client, member.user, channel, dialog("LevelUp", dialog("levelUpRemark"), level, upgradePoints));
|
|
}
|
|
}
|
|
|
|
if (next) next(); //BUGFIX
|
|
}
|
|
|
|
shared.LevelUp(client, member, handleResponse);
|
|
}
|