woomy/util/functions.js

235 lines
6.6 KiB
JavaScript
Raw Normal View History

2020-04-04 06:59:22 +00:00
const mongoose = require('mongoose')
const Guild = require('../models/guild')
2020-03-29 07:45:09 +00:00
module.exports = client => {
2020-04-03 08:31:48 +00:00
// Permission level function
2020-04-04 09:16:05 +00:00
client.permlevel = (message, settings) => {
2020-03-31 08:24:51 +00:00
let permlvl = 0
const permOrder = client.config.permLevels.slice(0).sort((p, c) => p.level < c.level ? 1 : -1)
2020-04-04 09:16:05 +00:00
console.log(permOrder)
2020-03-31 08:24:51 +00:00
while (permOrder.length) {
const currentLevel = permOrder.shift()
if (message.guild && currentLevel.guildOnly) continue
2020-04-04 09:16:05 +00:00
if (currentLevel.check(message, settings)) {
2020-03-31 08:24:51 +00:00
permlvl = currentLevel.level
break
}
}
return permlvl
}
2020-04-04 06:59:22 +00:00
// Get settings
client.getGuild = async (guild) => {
const data = await Guild.findOne({ guildID: guild.id })
if (data) {
return data
} else {
throw new Error('No entry for this guild was found in the database!')
}
}
// Update settings
client.updateGuild = async (guild, settings) => {
const data = await client.getGuild(guild)
for (const key in settings) {
// eslint-disable-next-line no-prototype-builtins
if (settings.hasOwnProperty(key)) {
if (data[key] !== settings[key]) {
data[key] = settings[key]
} else {
return
}
}
client.logger.debug(`Updated settings for ${data.guildName}: ${Object.keys(settings)}`)
}
}
// Create new entry for new guild
client.createGuild = async (settings) => {
const merged = Object.assign({ _id: mongoose.Types.ObjectId() }, settings)
const newGuild = await new Guild(merged)
return newGuild.save().then(g => {
client.logger.debug(`Created settings for guild ${g.guildName}`)
})
}
// Delete guild data
client.deleteGuild = async (guild) => {
const data = await client.getGuild(guild)
if (data) {
data.deleteOne({ guildID: guild.id })
}
}
2020-04-03 08:31:48 +00:00
// Loads commands
2020-03-31 07:59:09 +00:00
client.loadCommand = (commandName) => {
try {
const props = require(`../commands/${commandName}`)
if (props.init) {
props.init(client)
}
client.commands.set(props.help.name, props)
2020-03-31 08:24:51 +00:00
// So commands can each have their own cooldown time
client.cooldown.set(props.help.name, new Map())
2020-03-31 07:59:09 +00:00
props.conf.aliases.forEach(alias => {
client.aliases.set(alias, props.help.name)
})
return false
} catch (e) {
return `Failed to load ${commandName}: ${e}`
}
}
2020-03-29 07:45:09 +00:00
2020-04-03 08:31:48 +00:00
// Command unloader
2020-04-01 08:33:02 +00:00
client.unloadCommand = async (commandName) => {
let command
if (client.commands.has(commandName)) {
command = client.commands.get(commandName)
} else if (client.aliases.has(commandName)) {
command = client.commands.get(client.aliases.get(commandName))
}
2020-04-03 06:26:16 +00:00
if (!command) return `The command \`${commandName}\` doesn't seem to exist, nor is it an alias. Try again!`
2020-04-01 08:33:02 +00:00
if (command.shutdown) {
await command.shutdown(client)
}
const mod = require.cache[require.resolve(`../commands/${command.help.name}`)]
delete require.cache[require.resolve(`../commands/${command.help.name}.js`)]
for (let i = 0; i < mod.parent.children.length; i++) {
if (mod.parent.children[i] === mod) {
mod.parent.children.splice(i, 1)
break
}
}
return false
}
2020-04-03 08:31:48 +00:00
// Clean up input to remove @everyone, token, etc
2020-04-03 06:26:16 +00:00
client.clean = async (client, text) => {
if (text && text.constructor.name === 'Promise') {
text = await text
}
if (typeof text !== 'string') {
text = require('util').inspect(text, { depth: 1 })
}
text = text
.replace(/`/g, '`' + String.fromCharCode(8203))
.replace(/@/g, '@' + String.fromCharCode(8203))
.replace(client.token, 'mfa.VkO_2G4Qv3T--NO--lWetW_tjND--TOKEN--QFTm6YGtzq9PH--4U--tG0')
return text
}
2020-04-03 08:31:48 +00:00
// Single line await messages
client.awaitReply = async (msg, question, limit = 60000) => {
const filter = m => m.author.id === msg.author.id
await msg.channel.send(question)
try {
const collected = await msg.channel.awaitMessages(filter, {
max: 1,
time: limit,
errors: ['time']
})
return collected.first().content
} catch (e) {
return false
}
}
2020-04-01 08:33:02 +00:00
2020-04-03 08:31:48 +00:00
client.embedColour = function (guild) {
if (!guild || guild.member(client.user).displayHexColor === '#000000') {
return ['#ff9d68', '#ff97cb', '#d789ff', '#74FFFF'].random()
} else {
return guild.member(client.user).displayHexColor
}
}
2020-04-01 08:33:02 +00:00
2020-04-04 06:59:22 +00:00
// Returns a random number between min and max
2020-04-03 08:31:48 +00:00
client.intBetween = function (min, max) {
2020-04-04 06:59:22 +00:00
return Math.floor((Math.random() * (max - min)) + min)
2020-04-01 08:33:02 +00:00
}
2020-04-03 14:55:35 +00:00
// Get random array object
// eslint-disable-next-line no-extend-native
2020-04-03 08:31:48 +00:00
Object.defineProperty(Array.prototype, 'random', {
2020-04-03 14:55:35 +00:00
value: function () {
2020-04-03 08:31:48 +00:00
return this[Math.floor(Math.random() * this.length)]
}
})
// `await client.wait(1000);` to 'pause' for 1 second.
client.wait = require('util').promisify(setTimeout)
// Find guild members
client.findMembers = function (guild, search) {
if (!search || typeof search !== 'string') return
2020-04-02 08:24:36 +00:00
2020-04-03 06:26:16 +00:00
const members = []
2020-04-03 08:31:48 +00:00
let member
// Try mention
if (search.startsWith('<@') && search.endsWith('>')) {
let mention = search.slice(2, -1)
if (mention.startsWith('!')) {
mention = mention.slice(1)
}
return guild.members.cache.get(mention)
}
2020-04-02 08:24:36 +00:00
2020-04-03 06:26:16 +00:00
// Try ID search
2020-04-03 08:31:48 +00:00
if (!isNaN(search) === true) {
members.push(guild.members.cache.get(search))
2020-04-03 06:26:16 +00:00
if (members[0]) {
return members[0]
}
2020-04-02 08:24:36 +00:00
}
2020-04-01 08:33:02 +00:00
2020-04-03 06:26:16 +00:00
// Try username search
2020-04-01 08:33:02 +00:00
try {
2020-04-03 08:31:48 +00:00
member = guild.members.cache.find(m => m.displayName.toLowerCase() === search)
if (!member) {
guild.members.cache.find(m => m.user.tag.toLowerCase() === search)
}
2020-04-01 08:33:02 +00:00
} catch (err) {}
2020-04-03 08:31:48 +00:00
if (member) {
members.push(member)
}
guild.members.cache.forEach(m => {
if (m.displayName.toLowerCase().startsWith(search) || m.user.tag.toLowerCase().startsWith(search)) {
members.push(m)
}
})
return members
}
client.findRole = function (guild, search) {
var role
role = guild.roles.cache.find(r => r.name.toLowerCase() === search.toLowerCase())
if (!role) {
role = guild.roles.cache.get(search.toLowerCase())
}
if (!role) {
return
}
return role
2020-04-01 08:33:02 +00:00
}
2020-04-03 14:55:35 +00:00
// Both of these functions catch errors and log them (maybe we could use sentry?)
2020-03-31 07:59:09 +00:00
process.on('uncaughtException', (err) => {
const errorMsg = err.stack.replace(new RegExp(`${__dirname}/`, 'g'), './')
client.logger.fatal(`Uncaught Exception: ${errorMsg}`)
process.exit(1)
})
process.on('unhandledRejection', err => {
client.logger.error(`Unhandled rejection: ${err}`)
})
2020-03-29 07:45:09 +00:00
}