UNPKG

zyno-bot-addons

Version:

Create easily addons for Zyno Bot

161 lines (157 loc) 8.72 kB
const Save = require('./save.js'); const User = require('./structures/user.js'); const Role = require('./structures/role.js'); const { getClientParser, getClient, validatePermission, getAddonPermission } = require('../utils/functions.js'); const { getMessageContent } = require('../utils/messageFunctions.js'); const { ApplicationCommandOptionType, ChannelType } = require('discord.js'); const channelManager = require('./managers/channelManager.js'); const roleManager = require('./managers/roleManager.js'); const userManager = require('./managers/userManager.js'); const memberManager = require('./managers/guildMemberManager.js'); const guildManager = require('./managers/guildManager.js'); const messageManager = require('./managers/messageManager.js'); const scopes = require('../bitfields/scopes.js'); function commandResolver(data, save, guild, structureHandler, addonData, defaultData){ const addonChannelManager = channelManager.get(addonData.addon.name) || new Save(); const guildChannelManager = addonChannelManager.get(defaultData.guild.id) || new Save(); const addonRoleManager = roleManager.get(addonData.addon.name) || new Save(); const guildRoleManager = addonRoleManager.get(defaultData.guild.id) || new Save(); const addonUserManager = userManager.get(addonData.addon.name) || new Save(); return data.reduce((arr, item) => { var add; if(item.type === ApplicationCommandOptionType.Subcommand || item.type === ApplicationCommandOptionType.SubcommandGroup){ add = [item.name]; let newSave = new Save(); add.push(...commandResolver(item.options, newSave, guild, structureHandler, addonData, defaultData)); save.set(item.name, newSave); } else if(item.type === ApplicationCommandOptionType.String){ add = item.value.split(' '); save.set(item.name, item.value); } else if(item.type === ApplicationCommandOptionType.Number || item.type === ApplicationCommandOptionType.Integer){ add = item.value; save.set(item.name, item.value); } else if(item.type === ApplicationCommandOptionType.Channel){ let channel; if(item.channel.type === ChannelType.GuildText || item.channel.type === ChannelType.GuildAnnouncement){ channel = guildChannelManager.get(item.channel.id); if(!channel) channel = structureHandler.createStructure('TextChannel', [item.channel, addonData.addon, guild]); } else if(item.channel.type === ChannelType.GuildCategory){ channel = guildChannelManager.get(item.channel.id); if(!channel) channel = structureHandler.createStructure('CategoryChannel', [item.channel, addonData.addon, guild]); } else if(item.channel.type === ChannelType.GuildVoice){ channel = guildChannelManager.get(item.channel.id); if(!channel) channel = structureHandler.createStructure('VoiceChannel', [item.channel, addonData.addon, guild]); } else if(item.channel.type === ChannelType.GuildStageVoice){ channel = guildChannelManager.get(item.channel.id); if(!channel) channel = structureHandler.createStructure('StageChannel', [item.channel, addonData.addon, guild]); } else if(item.channel.type === ChannelType.GuildForum){ channel = guildChannelManager.get(item.channel.id); if(!channel) channel = structureHandler.createStructure('ForumChannel', [item.channel, addonData.addon, guild]); } else if(item.channel.type === ChannelType.GuildDirectory){ channel = guildChannelManager.get(item.channel.id); if(!channel) channel = structureHandler.createStructure('DirectoryChannel', [item.channel, addonData.addon, guild]); } add = channel.string; save.set(item.name, channel); } else if(item.type === ApplicationCommandOptionType.Role){ let role = guildRoleManager.get(item.role.id) ?? new Role(item.role, addonData.addon, guild) add = role.string; save.set(item.name, role); } else if(item.type === ApplicationCommandOptionType.User){ let user = addonUserManager.get(item.user.id) ?? new User(item.user, addonData.addon, false, structureHandler); add = user.string; save.set(item.name, user); } if(Array.isArray(add)){ arr.push(...add); } else { arr.push(add); } return arr; }, []); } class Command{ constructor(data, interaction, registeredCommandData, addonData, structureHandler){ let client = getClient(); this.addon = addonData.addon; this.name = registeredCommandData.name; this.description = registeredCommandData.description; this.slashCommand = interaction === true; this.memberId = data.member?.id; this.guildId = data.guild?.id; this.created = new Date(); this.createdTimestamp = this.created.getTime(); this.reply = (...content) => { return new Promise(async (resolve, reject) => { if(content.length === 0) return reject(`At least one argument must be given`); let _content = getMessageContent(content); if(interaction === true){ data.reply({..._content, fetchReply: true}).then(msg => { resolve(structureHandler.createStructure('Message', [msg, addonData.addon])); }).catch(reject); } else { data.channel.send(_content).then(msg => { resolve(structureHandler.createStructure('Message', [msg, addonData.addon])); }).catch(reject); } }); } this.channelId = data.channelId; this.messageId = interaction === false ? data.id : undefined; if(interaction === false) this.args.push(...(data.content || '').substring(client.config.prefix.length).split(' ')); else { const addonGuildManager = guildManager.get(this.addon.name) || new Save(); const g = addonGuildManager.get(this.guildId); let args = commandResolver(data.options.data, this.options, g, structureHandler, addonData, data); this.args = [registeredCommandData.name, ...args]; } this.isSlashCommand = () => { return this.slashCommand; } this.executeCommand = (commandName, args) => { return new Promise((resolve, reject) => { if(!validatePermission(getAddonPermission(addonData.addon.name), scopes.bitfield.COMMANDS)) return reject(`Missing commands scope in bitfield`); if(typeof commandName !== 'string') return reject(`Command name must be a type of string`); if(!Array.isArray(args)){ args = this.args; } let clientParser = getClientParser(); let client = clientParser.getClient(); const cmd = client.commands.get(commandName); if(cmd){ args[0] = commandName; cmd.run(client, args, data, interaction); } else { client.clientParser.interactionHandler.emit('execute', data, interaction); } resolve(); }); } } get channel(){ const addonChannelManager = channelManager.get(this.addon.name) || new Save(); const guildChannelManager = addonChannelManager.get(this.guildId) || new Save(); return guildChannelManager.get(this.channelId); } get guild(){ const addonGuildManager = guildManager.get(this.addon.name) || new Save(); return addonGuildManager.get(this.guildId); } get member(){ const addonMemberManager = memberManager.get(this.addon.name) || new Save(); const guildMemberManager = addonMemberManager.get(this.guildId) || new Save(); return guildMemberManager.get(this.memberId); } get message(){ if(this.slashCommand === true) return undefined; const addonMessageManager = messageManager.get(this.addon.name) || new Save(); const guildMessageManager = addonMessageManager.get(this.guildId) || new Save(); const channelMessageManager = guildMessageManager.get(this.channelId) || new Save(); return channelMessageManager.get(this.messageId); } name = null; description = null; args = []; options = new Save(); } module.exports = Command;