Files
toho-miku/util/users.js
Minzkraut eb4ffae173 Add command permission checks
Level 0: Every user - Public commands
Level 1: Guild owners or members with respective admin role - Elevated guild commands
Level 2: Global admins - Every command including levels below
2022-08-19 19:18:01 +02:00

103 lines
3.3 KiB
JavaScript

const { User, Guild } = require("../models");
const GeneralUtils = require("./general");
module.exports = {
name: "UserUtils",
getUserByDiscordId: async function(discordId) {
return await User.findOne({
where: {
discordId: discordId
}
});
},
registrationCheck: async function(interaction) {
let user = await this.getUserByDiscordId(interaction.member.id);
if (user) {
return true;
}
if (!interaction.isButton() && interaction.commandName === "register") {
return true;
}
interaction.reply({
content: `${interaction.member} You are not registered, use the /register command`,
ephemeral: false
});
return false;
},
getCooldowns: async function(user) {
/* Returns an object with the following properties:
* now: the current time in milliseconds
--- For each key in cooldownKeys ---
* nextPullTimestamp: the next time the user can pull a card in milliseconds
* pullCooldown: time in milliseconds until the user can pull again
* pullCooldownFormatted: print friendly version of pullCooldown in hours and minutes
*/
const cooldownKeys = ["Pull", "Drop", "Daily"]
let reply = {
now: new Date().getTime()
};
for (key of cooldownKeys) {
reply[`next${key}Timestamp`] = user[`next${key}`].getTime();
let cooldown = Math.max(reply[`next${key}Timestamp`] - reply['now'], 0);
reply[`${key.toLowerCase()}Cooldown`] = cooldown;
if (cooldown > 0) {
reply[`${key.toLowerCase()}CooldownFormatted`] = `Next ${key} in ${Math.floor(cooldown / 3600000)} hours ` +
`and ${Math.floor((cooldown % 3600000) / 60000)} minutes`;
} else {
reply[`${key.toLowerCase()}CooldownFormatted`] = `${key} Ready!`;
}
}
return reply;
},
setCooldown: async function(user, cooldownType, cooldown) {
/* cooldownType: "pull", "drop", "daily"
* cooldown: time in milliseconds
*/
let newCooldown = new Date(new Date().getTime() + cooldown);
user[`next${cooldownType[0].toUpperCase() + cooldownType.slice(1)}`] = newCooldown;
await user.save();
},
getPermissionLevel: async function(user) {
/* THIS FUNCTION EXPECTS A DISCORD USER INSTANCE!
* Returns the permission level of the user
* 0 - no permissions
* 1 - guild permissions
* 2 - admin permissions
*/
let guild = await Guild.findOne({
where: {
guildId: user.guild.id
}
});
//Global Admin
let adminIDs = await GeneralUtils.getBotProperty("adminIDs");
if (adminIDs.includes(user.id)) {
return 2;
}
//Guild Admin if role is present
if(user._roles.includes(String(guild.adminRoleId))) {
return 1;
}
//or if user is owner
if(user.guild.ownerId === user.id) {
return 1;
}
//Regular User
return 0;
}
}