From 98a6959e604eae1ea4772e33a9cfa5b3cd14fe1e Mon Sep 17 00:00:00 2001 From: Tobiah Date: Fri, 1 Jun 2018 20:52:34 -0500 Subject: [PATCH 01/10] feat(promocodes): all but mass import starting commands, empty files for most commands needed have been added cleanups fix(pencil): fix database query class generation, schema for pools feat(pencil): added promocode commands * Add manager * delete manager * add pool * delete pool * Pool resolver (explicit or not) feat(pencil): added promocode commands * Set guild * Set pool password * Set pool name * Clear pool password feat(pencil): promocode commands * Grant Promocde * List Pools * Restrict pools * Revoke Promocode * List claimed promocodes * Set pool public * List managed pools (with number of codes) chore(pencil): codacy cleanups feat: claim, as well as tweaks for common functions fix: clean up logic for export **Import's next!!** feat(embed pages): implement page turning for some commands --- src/CommonFunctions.js | 87 ++ src/commands/Builds/ListBuilds.js | 13 +- src/commands/Core/Help.js | 71 +- src/commands/Ondemand/WhereIs.js | 11 +- src/commands/Promocodes/AddManager.js | 30 + src/commands/Promocodes/AddPromocode.js | 19 + src/commands/Promocodes/ClaimPromocode.js | 43 + src/commands/Promocodes/ClearPoolPassword.js | 26 + src/commands/Promocodes/CreatePool.js | 32 + src/commands/Promocodes/DeletePool.js | 27 + src/commands/Promocodes/Export.js | 33 + src/commands/Promocodes/GrantPromocode.js | 42 + src/commands/Promocodes/ListClaimed.js | 31 + src/commands/Promocodes/ListPools.js | 43 + src/commands/Promocodes/RemoveManager.js | 35 + src/commands/Promocodes/RestrictPool.js | 33 + src/commands/Promocodes/RevokePromocode.js | 33 + src/commands/Promocodes/SetPoolGuild.js | 30 + src/commands/Promocodes/SetPoolName.js | 30 + src/commands/Promocodes/SetPoolPassword.js | 30 + src/commands/Promocodes/SetPoolPublic.js | 33 + src/commands/Roles/RoleIds.js | 15 +- src/commands/Roles/Roles.js | 18 +- src/commands/Rooms/RoomDefaultNoText.js | 2 +- src/commands/Rooms/RoomPublicDefault.js | 2 +- src/commands/Rooms/RoomShownDefault.js | 2 +- src/embeds/WeaponEmbed.js | 32 +- src/models/CustomCommand.js | 2 +- src/settings/Database.js | 1087 +---------------- src/settings/DatabaseQueries/BuildQueries.js | 91 ++ .../DatabaseQueries/CustomCommandQueries.js | 51 + src/settings/DatabaseQueries/DBMQueries.js | 107 ++ .../DatabaseQueries/PermissionsQueries.js | 243 ++++ src/settings/DatabaseQueries/PingsQueries.js | 163 +++ .../DatabaseQueries/PrivateRoomQueries.js | 112 ++ .../DatabaseQueries/PromocodeQueries.js | 229 ++++ .../DatabaseQueries/SettingsQueries.js | 159 +++ .../DatabaseQueries/TrackingQueries.js | 167 +++ .../DatabaseQueries/WelcomeQueries.js | 52 + src/settings/MessageManager.js | 3 +- src/settings/schema.js | 33 + 41 files changed, 2191 insertions(+), 1111 deletions(-) create mode 100644 src/commands/Promocodes/AddManager.js create mode 100644 src/commands/Promocodes/AddPromocode.js create mode 100644 src/commands/Promocodes/ClaimPromocode.js create mode 100644 src/commands/Promocodes/ClearPoolPassword.js create mode 100644 src/commands/Promocodes/CreatePool.js create mode 100644 src/commands/Promocodes/DeletePool.js create mode 100644 src/commands/Promocodes/Export.js create mode 100644 src/commands/Promocodes/GrantPromocode.js create mode 100644 src/commands/Promocodes/ListClaimed.js create mode 100644 src/commands/Promocodes/ListPools.js create mode 100644 src/commands/Promocodes/RemoveManager.js create mode 100644 src/commands/Promocodes/RestrictPool.js create mode 100644 src/commands/Promocodes/RevokePromocode.js create mode 100644 src/commands/Promocodes/SetPoolGuild.js create mode 100644 src/commands/Promocodes/SetPoolName.js create mode 100644 src/commands/Promocodes/SetPoolPassword.js create mode 100644 src/commands/Promocodes/SetPoolPublic.js create mode 100644 src/settings/DatabaseQueries/BuildQueries.js create mode 100644 src/settings/DatabaseQueries/CustomCommandQueries.js create mode 100644 src/settings/DatabaseQueries/DBMQueries.js create mode 100644 src/settings/DatabaseQueries/PermissionsQueries.js create mode 100644 src/settings/DatabaseQueries/PingsQueries.js create mode 100644 src/settings/DatabaseQueries/PrivateRoomQueries.js create mode 100644 src/settings/DatabaseQueries/PromocodeQueries.js create mode 100644 src/settings/DatabaseQueries/SettingsQueries.js create mode 100644 src/settings/DatabaseQueries/TrackingQueries.js create mode 100644 src/settings/DatabaseQueries/WelcomeQueries.js diff --git a/src/CommonFunctions.js b/src/CommonFunctions.js index 1e9d6c55c..71ea4b274 100644 --- a/src/CommonFunctions.js +++ b/src/CommonFunctions.js @@ -224,6 +224,7 @@ function trackablesFromParameters(paramString) { } return trackables; } + const eventsOrItems = new RegExp(`cetus\\.day\\.[0-1]?[0-9]?[0-9]|cetus\\.night\\.[0-1]?[0-9]?[0-9]|${eventTypes.join('|')}|${rewardTypes.join('|')}|${opts.join('|')}`, 'ig'); function getEventsOrItems(message) { @@ -482,6 +483,90 @@ const getUsersForCall = (message, excludeAuthor) => { return users; }; +const resolvePool = async (message, settings, + { + explicitOnly = false, + skipManages = false, + pool = undefined, + checkRestriction = false, + allowMultiple = false, + } = { explicitOnly: false, skipManages: false }) => { + let poolId = pool; + if (!skipManages && !await settings.userManagesPool(message.author, poolId)) { + poolId = undefined; + } else { + return poolId; + } + const explicitPoolMatches = message.strippedContent.match(/(?:--pool\s+([a-zA-Z0-9-]*))/i); + + if (!poolId && explicitPoolMatches && explicitPoolMatches.length > 1) { + [, poolId] = explicitPoolMatches; + if (!skipManages && !(await settings.userManagesPool(message.author, poolId))) { + poolId = undefined; + } + } else if (!explicitOnly) { + let pools = (await settings.getPoolsUserManages(message.author)) + .map(poolRow => poolRow.pool_id); + if (pools.length > 1 && allowMultiple) { + return pools; + } + if (pools.length === 1) { + [poolId] = pools; + } else if (pools.length === 0) { + poolId = undefined; + } else if (await settings.getGuildsPool(message.guild).length) { + pools = await settings.getGuildsPool(message.guild); + if (pools.length === 1 + && (skipManages || await settings.userManagesPool(message.author, pools[0]))) { + [poolId] = pools; + } + } else { + poolId = undefined; + } + } + + if (poolId && checkRestriction && await settings.isPoolRestricted(poolId)) { + poolId = undefined; + } + return poolId; +}; + +const createPageCollector = async (msg, pages, author) => { + let page = 1; + await msg.react('◀'); + await msg.react('▶'); + const collector = msg.createReactionCollector((reaction, user) => ((reaction.emoji.name === '◀' || reaction.emoji.name === '▶') && user.id === author.id), { time: 120000 }); + + collector.on('collect', async (reaction) => { + if (reaction.emoji.name === '◀') { + if (page > 1) page -= 1; + } else if (reaction.emoji.name === '▶') { + if (page <= pages.length) page += 1; + } + await reaction.remove(author.id); + if (page <= pages.length && page > 0) { + const newPage = pages[page - 1]; + const pageInd = `Page ${page}/${pages.length}`; + if (newPage.footer) { + if (newPage.footer.text) { + if (newPage.footer.text.indexOf('Page') === -1) { + newPage.footer.text = `${pageInd} • ${newPage.footer.text}`; + } + } else { + newPage.footer.text = pageInd; + } + } else { + newPage.footer = { text: pageInd }; + } + msg.edit({ embed: newPage }); + } else if (page < 1) { + page = 1; + } else if (page >= pages.length) { + page = pages.length; + } + }); +}; + module.exports = { createGroupedArray, emojify, @@ -498,4 +583,6 @@ module.exports = { isVulgarCheck, getRandomWelcome, resolveRoles, + resolvePool, + createPageCollector, }; diff --git a/src/commands/Builds/ListBuilds.js b/src/commands/Builds/ListBuilds.js index 2fb17b9ef..573fb160d 100644 --- a/src/commands/Builds/ListBuilds.js +++ b/src/commands/Builds/ListBuilds.js @@ -1,7 +1,7 @@ 'use strict'; const Command = require('../../models/Command.js'); -const { createGroupedArray } = require('../../CommonFunctions.js'); +const { createGroupedArray, createPageCollector } = require('../../CommonFunctions.js'); /** * Create temporary voice/text channels (can be expanded in the future) @@ -27,14 +27,17 @@ class ListBuilds extends Command { const buildGroups = createGroupedArray(builds, 15); const tokens = buildGroups.map(buildGroup => ({ name: '_ _', value: buildGroup.map(build => `\`${build.id} | ${build.title} | Owned by ${typeof build.owner === 'object' ? build.owner.tag : build.owner}\``).join('\n') })); const tokenGroups = createGroupedArray(tokens, 5); - await Promise.all(tokenGroups.map((tokenGroup) => { + const embeds = []; + tokenGroups.forEach((tokenGroup) => { const fields = tokenGroup; fields[0].value = `\`Build ID | Title | Owner\`\n${tokenGroup[0].value}`; - return this.messageManager.embed(message, { + embeds.push({ color: 0xcda2a3, fields, - }, true, true); - })); + }); + }); + const msg = await this.messageManager.embed(message, embeds[0], true, false); + await createPageCollector(msg, embeds, message.author); return this.messageManager.statuses.SUCCESS; } await this.messageManager.embed(message, { color: 0xcda2a3, title: 'No builds for user' }, true, true); diff --git a/src/commands/Core/Help.js b/src/commands/Core/Help.js index 61195f724..601837f08 100644 --- a/src/commands/Core/Help.js +++ b/src/commands/Core/Help.js @@ -1,12 +1,23 @@ 'use strict'; const Command = require('../../models/Command.js'); +const { createGroupedArray, createPageCollector } = require('../../CommonFunctions'); const invalidResultsEmbed = { color: 0x00CCFF, title: 'No results, please refine query.', }; +const createEmbedsForCommands = (commandFields, title, color) => ({ + title, + fields: [].concat(...commandFields), + color, + type: 'rich', + footer: { + text: commandFields.length === 10 ? 'Search results limited to 10. If you believe more are available, please refine your search.' : undefined, + icon_url: 'https://warframestat.us/wfcd_logo_color.png', + }, +}); /** * Describes the Help command @@ -50,27 +61,28 @@ class Help extends Command { async run(message) { let query = message.strippedContent.match(this.regex)[1]; + const config = { + prefix: await this.settings.getGuildSetting(message.guild, 'prefix'), + isOwner: message.author.id === this.bot.owner, + hasAuth: message.channel.type === 'dm' || message.channel + .permissionsFor(message.author) + .has('MANAGE_ROLES_OR_PERMISSIONS'), + }; + + const searchableCommands = this.commandHandler.commands.filter((command) => { + if ((command.ownerOnly && !config.isOwner) || (command.requiresAuth && !config.hasAuth)) { + return false; + } + return true; + }); + if (query) { query = query.toLowerCase(); if (message.channel.type !== 'dm') { await this.messageManager.reply(message, this.helpReplyMsg, true, true); } - const config = { - prefix: await this.settings.getGuildSetting(message.guild, 'prefix'), - isOwner: message.author.id === this.bot.owner, - hasAuth: message.channel.type === 'dm' || message.channel - .permissionsFor(message.author) - .has('MANAGE_ROLES_OR_PERMISSIONS'), - }; - - const searchableCommands = this.commandHandler.commands.filter((command) => { - if ((command.ownerOnly && !config.isOwner) || (command.requiresAuth && !config.hasAuth)) { - return false; - } - return true; - }); - // filter commands + // filter commands let matchingCommands = searchableCommands.filter((command) => { if (query.length < 3) { return false; @@ -86,31 +98,26 @@ class Help extends Command { await this.messageManager.sendDirectEmbedToAuthor(message, invalidResultsEmbed, false); return this.messageManager.statuses.FAILURE; } - matchingCommands = matchingCommands.slice(0, 10).map(command => command.usages.map(u => ({ - name: `${config.prefix}${command.call} ${u.parameters.map(p => `<${p}>`).join(u.separator ? u.separator : ' ')}`, - value: u.description, - inline: false, - }))); + matchingCommands = matchingCommands.slice(0, 10); await this.sendEmbedForCommands(message, matchingCommands, 'Help!', 0x4068BD); return this.messageManager.statuses.SUCCESS; } - await this.messageManager.reply(message, `Visit ${process.env.HELP_URL || 'http://genesis.warframestat.us'} for all the commands and usages!`, true, true); + const lines = searchableCommands.map(command => command.usages.map(u => ({ + name: `${config.prefix}${command.call} ${u.parameters.map(p => `<${p}>`).join(u.separator ? u.separator : ' ')}`, + value: u.description, + inline: false, + }))); + const groups = createGroupedArray(lines, 5); + const embeds = groups.map(group => createEmbedsForCommands(group, 'Help!', 0x4068BD)); + const msg = await this.messageManager.embed(message, embeds[0], false, false); + await createGroupedArray(msg, embeds, message.author); return this.messageManager.statuses.SUCCESS; } async sendEmbedForCommands(message, commands, title, color) { - const embed = { - title, - fields: [].concat(...commands), - color, - type: 'rich', - footer: { - text: commands.length === 10 ? 'Search results limited to 10. If you believe more are available, please refine your search.' : undefined, - icon_url: 'https://raw.githubusercontent.com/WFCD/genesis/master/src/resources/genesis-vector-cyan.png', - }, - }; + const embed = createEmbedsForCommands(commands, title, color); if (commands.length > 0) { - await this.messageManager.sendDirectEmbedToAuthor(message, embed, false); + await this.messageManager.embed(message, embed, true, false); } } } diff --git a/src/commands/Ondemand/WhereIs.js b/src/commands/Ondemand/WhereIs.js index cda2fe521..b3abb3652 100644 --- a/src/commands/Ondemand/WhereIs.js +++ b/src/commands/Ondemand/WhereIs.js @@ -2,7 +2,7 @@ const Command = require('../../models/Command.js'); const WhereisEmbed = require('../../embeds/WhereisEmbed.js'); -const { createGroupedArray } = require('../../CommonFunctions.js'); +const { createGroupedArray, createPageCollector } = require('../../CommonFunctions.js'); const request = require('request-promise'); @@ -61,17 +61,18 @@ class Whereis extends Command { const longestRelic = results.length ? results.map(result => result.place) .reduce((a, b) => (a.length > b.length ? a : b)) : ''; query = toTitleCase(query.trim()); - createGroupedArray(results, 50).forEach((group, index) => { + const embeds = []; + createGroupedArray(results, 28).forEach((group, index) => { const embed = new WhereisEmbed( this.bot, createGroupedArray(group, 4), query, longestName.length, longestRelic.length, ); + embeds.push(embed); if (index === 0) { - sentMessage.edit('', { embed }); - } else { - this.messageManager.embed(sentMessage, embed, false, false); + sentMessage.edit({ embed }); } }); + await createPageCollector(sentMessage, embeds, message.author); if (results.length > 0) { return this.messageManager.statuses.SUCCESS; } diff --git a/src/commands/Promocodes/AddManager.js b/src/commands/Promocodes/AddManager.js new file mode 100644 index 000000000..2fc7467a1 --- /dev/null +++ b/src/commands/Promocodes/AddManager.js @@ -0,0 +1,30 @@ +'use strict'; + +const Command = require('../../models/Command.js'); +const { resolvePool } = require('../../CommonFunctions'); + +class AddManager extends Command { + constructor(bot) { + super(bot, 'promocode.managers.add', 'glyphs add manager', 'Add a manager to a glyph pool'); + this.regex = new RegExp(`^${this.call}\\s?(?:--p\\s?(.*))?([0-9]{0,20})?`, 'i'); + this.requiresAuth = true; + this.allowDM = false; + } + + async run(message) { + const user = message.strippedContent.match(/[0-9]{15,20}/i)[0] || 0; + const pool = await resolvePool(message, this.settings); + if (typeof pool === 'undefined') { + this.messageManager.reply(message, 'You either manage none or too many pools. Please specify the pool ID.'); + return this.messageManager.statuses.FAILURE; + } + if (this.bot.client.users.has(user.trim())) { + await this.settings.addPoolManager(pool, user.trim()); + return this.messageManager.statuses.SUCCESS; + } + await this.messageManager.reply(message, 'Please specify a valid user ID or mention the user.'); + return this.messageManager.statuses.FAILURE; + } +} + +module.exports = AddManager; diff --git a/src/commands/Promocodes/AddPromocode.js b/src/commands/Promocodes/AddPromocode.js new file mode 100644 index 000000000..4502ef61d --- /dev/null +++ b/src/commands/Promocodes/AddPromocode.js @@ -0,0 +1,19 @@ +'use strict'; + +const Command = require('../../models/Command.js'); + +class AddPromocode extends Command { + constructor(bot) { + super(bot, 'glyphs.addCode', 'glyph add code', 'Add a glyph or prize code.'); + this.ownerOnly = true; + this.regex = new RegExp(`^${this.call}\\s*(.*)?`, 'i'); + } + + async run(message) { + // do nothing + await this.messageManager.reply(message, message.content); + return this.messageManager.statuses.FAILURE; + } +} + +module.exports = AddPromocode; diff --git a/src/commands/Promocodes/ClaimPromocode.js b/src/commands/Promocodes/ClaimPromocode.js new file mode 100644 index 000000000..711e395ef --- /dev/null +++ b/src/commands/Promocodes/ClaimPromocode.js @@ -0,0 +1,43 @@ +'use strict'; + +const Command = require('../../models/Command.js'); +const { resolvePool } = require('../../CommonFunctions'); + +class ClaimPromocode extends Command { + constructor(bot) { + super(bot, 'promocode.code.claim', 'glyphs claim', 'Claim a code.'); + this.regex = new RegExp(`^${this.call}\\s?(?:--pool\\s(.*))?\\s?(pc|ps4|xb1)?\\s?(?:--password\\s(.*))?`, 'i'); + this.requiresAuth = true; + this.allowDM = false; + } + + async run(message) { + const pool = await resolvePool(message, this.settings, { checkRestriction: true }); + const platform = (message.strippedContent.match(/(pc|ps4|xb1)/i) || [])[0] || 'pc'; + const userPassword = (message.strippedContent.match(/(?:--pass(?:word)\s?(.*))/i) || [])[0] || undefined; + if (!pool) { + this.messageManager.reply(message, 'The pool is either restricted to another guild, or you need to specify one.'); + return this.messageManager.statuses.FAILURE; + } + const res = await this.settings.getNextCodeInPool(platform, pool); + this.logger.error(JSON.stringify(res)); + const [{ code, grantedTo, password }] = res; + if (typeof code === 'undefined') { + this.messageManager.reply(message, 'No more codes are available, contact your code provider or the owner of the pool to add more.'); + return this.messageManager.statuses.FAILURE; + } + const passMatch = password === null || userPassword === password; + if (!(passMatch || await this.settings.isPoolPublic(pool))) { + this.messageManager.reply(message, 'Your password is invalid, or you didn\'t provide one and the pool is not open.'); + return this.messageManager.statuses.FAILURE; + } + if (grantedTo === null) { + await this.settings.grantCode(code, message.author.id, message.author.id); + this.messageManager.reply(message, `Code claimed by <@${message.author.id}>`); + return this.messageManager.statuses.SUCCESS; + } + return this.messageManager.statuses.SUCCESS; + } +} + +module.exports = ClaimPromocode; diff --git a/src/commands/Promocodes/ClearPoolPassword.js b/src/commands/Promocodes/ClearPoolPassword.js new file mode 100644 index 000000000..dcf5ea5ad --- /dev/null +++ b/src/commands/Promocodes/ClearPoolPassword.js @@ -0,0 +1,26 @@ +'use strict'; + +const Command = require('../../models/Command.js'); +const { resolvePool } = require('../../CommonFunctions'); + +class ClearPoolPassword extends Command { + constructor(bot) { + super(bot, 'promocode.pool.clearpassword', 'glyphs clear password', 'Clear a pool\'s password'); + this.regex = new RegExp(`^${this.call}\\s?(?:--pool\\s(.*))?`, 'i'); + this.requiresAuth = true; + this.allowDM = false; + } + + async run(message) { + const pool = await resolvePool(message, this.settings); + if (typeof pool === 'undefined') { + this.messageManager.reply(message, 'You either manage none or too many pools. Please specify the pool ID.'); + return this.messageManager.statuses.FAILURE; + } + await this.settings.clearPoolPassword(pool); + this.messageManager.reply(message, 'Cleared.'); + return this.messageManager.statuses.SUCCESS; + } +} + +module.exports = ClearPoolPassword; diff --git a/src/commands/Promocodes/CreatePool.js b/src/commands/Promocodes/CreatePool.js new file mode 100644 index 000000000..8b295a9e2 --- /dev/null +++ b/src/commands/Promocodes/CreatePool.js @@ -0,0 +1,32 @@ +'use strict'; + +const Command = require('../../models/Command.js'); + +/** + * Reloads the script containing the commands + */ +class CreatePool extends Command { + constructor(bot) { + super(bot, 'promocode.pools.add', 'glyphs create pool', 'Create a new Glyph Pool'); + this.regex = new RegExp(`^${this.call}\\s?(.+)?`, 'i'); + this.requiresAuth = true; + this.allowDM = false; + } + + async run(message) { + const name = (message.strippedContent.match(this.regex)[1] || '').trim(); + // Make sure there's a name + if (name.length === 0) { + await this.messageManager.sendMessage(message, 'Specify a name for the Pool'); + return this.messageManager.statuses.FAILURE; + } + + const id = name.toLowerCase().replace(/\s/g, '-').replace(/[^A-Za-z0-9-]/g, ''); + await this.settings.addPool(id, name, message.author.id, 'glyph', message.guild); + await this.settings.addPoolManager(id, message.author.id); + await this.messageManager.sendDirectMessageToUser(message.author, `Added new pool ${id} on ${message.guild.name} with name \`${name}\`.`); + return this.messageManager.statuses.SUCCESS; + } +} + +module.exports = CreatePool; diff --git a/src/commands/Promocodes/DeletePool.js b/src/commands/Promocodes/DeletePool.js new file mode 100644 index 000000000..414145a1e --- /dev/null +++ b/src/commands/Promocodes/DeletePool.js @@ -0,0 +1,27 @@ +'use strict'; + +const Command = require('../../models/Command.js'); +const { resolvePool } = require('../../CommonFunctions'); + +class RemovePool extends Command { + constructor(bot) { + super(bot, 'promocode.pools.remove', 'glyphs del pool', 'Remove a glyph pool'); + this.regex = new RegExp(`^${this.call}\\s?(.*)?`, 'i'); + this.requiresAuth = true; + this.allowDM = false; + } + + async run(message) { + let pool = message.strippedContent.match(this.regex)[1] || ''; + pool = await resolvePool(message, this.settings, { explicitOnly: true, pool }); + if (typeof pool === 'undefined') { + this.messageManager.reply(message, 'You either manage none or too many pools. Please specify the pool ID.'); + return this.messageManager.statuses.FAILURE; + } + await this.settings.deletePool(pool); + await this.messageManager.reply(message, `Deleted pool \`${pool}\`.`); + return this.messageManager.statuses.FAILURE; + } +} + +module.exports = RemovePool; diff --git a/src/commands/Promocodes/Export.js b/src/commands/Promocodes/Export.js new file mode 100644 index 000000000..6967af45a --- /dev/null +++ b/src/commands/Promocodes/Export.js @@ -0,0 +1,33 @@ +'use strict'; + +const Command = require('../../models/Command.js'); +const { resolvePool } = require('../../CommonFunctions'); + +class ExportPromocodes extends Command { + constructor(bot) { + super(bot, 'promocode.export', 'glyphs export', 'Export promocodes the user has access to to a csv file.'); + this.requiresAuth = true; + this.allowDM = true; + } + + async run(message) { + let pools = await resolvePool(message, this.settings); + if (typeof pools === 'string') { + pools = [pools]; + } + if (pools.length === 0) { + this.messageManager.reply(message, '**[Denied]** You manage no pools.'); + return this.messageManager.statuses.FAILURE; + } + const codes = await this.settings.getCodesInPools(pools); + const fileContents = codes.map(code => `"${code.id}","${code.platform}","${code.addedBy}","${code.addedOn}",${code.grantedTo},${code.grantedBy},${code.grantedOn},${code.code}`); + if (message.channel.type !== 'dm') { + this.messageManager.reply(message, 'Check your direct messages for the file.', true, true); + } + this.messageManager.sendFileToAuthor(message, Buffer.from(fileContents.join('\n'), 'ascii'), 'codes.csv', true); + + return this.messageManager.statuses.SUCCESS; + } +} + +module.exports = ExportPromocodes; diff --git a/src/commands/Promocodes/GrantPromocode.js b/src/commands/Promocodes/GrantPromocode.js new file mode 100644 index 000000000..ce61443c8 --- /dev/null +++ b/src/commands/Promocodes/GrantPromocode.js @@ -0,0 +1,42 @@ +'use strict'; + +const Command = require('../../models/Command.js'); +const { resolvePool } = require('../../CommonFunctions'); + +class GrantPromocode extends Command { + constructor(bot) { + super(bot, 'promocode.code.grant', 'glyphs grant', 'Revoke a claimed or granted code.'); + this.regex = new RegExp(`^${this.call}\\s?(?:--pool\\s(.*))?\\s?(pc|ps4|xb1)?\\s?(?:<@([0-9]{0,20})>)?`, 'i'); + this.requiresAuth = true; + this.allowDM = false; + } + + async run(message) { + const pool = await resolvePool(message, this.settings); + const platform = message.strippedContent.match(/(pc|ps4|xb1)/i)[0] || 'pc'; + const user = message.strippedContent.match(/([0-9]{16,20})/i)[0]; + if (!pool) { + this.messageManager.reply(message, 'You can either not manage provided pool, or provided pool doesn\'t exist.'); + return this.messageManager.statuses.FAILURE; + } + if (!user || !this.bot.client.users.has(user)) { + this.messageManager.reply(message, 'A user to grant to must be specified'); + return this.messageManager.statuses.FAILURE; + } + // eslint-disable-next-line camelcase + const [{ code, grantedTo }] = await this.settings.getNextCodeInPool(platform, pool); + if (typeof code === 'undefined') { + this.messageManager.reply(message, 'No more codes are available, contact your code provider or the owner of the pool to add more.'); + return this.messageManager.statuses.FAILURE; + } + // eslint-disable-next-line camelcase + if (grantedTo === null) { + await this.settings.grantCode(code, user, message.author.id); + this.messageManager.reply(message, `Code granted to <@${user}>`); + return this.messageManager.statuses.SUCCESS; + } + return this.messageManager.statuses.SUCCESS; + } +} + +module.exports = GrantPromocode; diff --git a/src/commands/Promocodes/ListClaimed.js b/src/commands/Promocodes/ListClaimed.js new file mode 100644 index 000000000..c4ef3a5bf --- /dev/null +++ b/src/commands/Promocodes/ListClaimed.js @@ -0,0 +1,31 @@ +'use strict'; + +const Command = require('../../models/Command.js'); + +class ListClaimed extends Command { + constructor(bot) { + super(bot, 'promocode.code.claimed', 'glyphs claimed', 'List claimed codes.'); + this.regex = new RegExp(`^${this.call}`, 'i'); + this.allowDM = true; + } + + async run(message) { + const codes = await this.settings.getUserCodes(message.author); + const embed = { + title: 'Claimed Codes', + color: 0xd30000, + fields: codes.length === 0 ? [{ name: '_ _', value: 'No claimed codes' }] : + codes.map(code => ({ + name: `${code.pool_name} • ${code.platform.toUpperCase()}`, + value: `\`\`\`\n${code.code}\`\`\``, + })), + }; + await this.messageManager.reply(message, 'Check your direct messages for results'); + await this.messageManager.sendDirectEmbedToAuthor(message, embed, false); + return codes.length > 0 ? + this.messageManager.statuses.SUCCESS : + this.messageManager.statuses.FAILURE; + } +} + +module.exports = ListClaimed; diff --git a/src/commands/Promocodes/ListPools.js b/src/commands/Promocodes/ListPools.js new file mode 100644 index 000000000..5c8f463e6 --- /dev/null +++ b/src/commands/Promocodes/ListPools.js @@ -0,0 +1,43 @@ +'use strict'; + +const Command = require('../../models/Command.js'); +const rpad = require('right-pad'); +const { createGroupedArray } = require('../../CommonFunctions.js'); + +class ListPools extends Command { + constructor(bot) { + super(bot, 'promocode.pools.managed', 'glyphs managed', 'List claimed codes.'); + this.regex = new RegExp(`^${this.call}`, 'i'); + this.allowDM = true; + } + + async run(message) { + const pools = await this.settings.getPoolsUserManages(message.author); + const longestName = pools.length ? pools.map(pool => pool.name) + .reduce((a, b) => (a.length > b.length ? a : b)) : ''; + const longestId = pools.length ? pools.map(pool => pool.pool_id) + .reduce((a, b) => (a.length > b.length ? a : b)) : ''; + pools.unshift({ pool_id: 'Pool Id', name: 'Pool Name', len: '# of Codes' }); + this.logger.debug(`name: ${longestName} | id: ${longestId}`); + const groupPools = createGroupedArray(pools, 50); + const poolOfPools = createGroupedArray(groupPools, 4); + poolOfPools.forEach(async (poolGroup) => { + const embed = { + title: 'Managed Pools', + color: 0xd30000, + fields: poolGroup.map(group => ({ + name: '_ _', + value: group.map(pool => `\`${rpad(pool.pool_id, longestName.length, ' ')} ` + + `| ${rpad(pool.name, longestId.length, ' ')} | ${pool.len}\``).join('\n'), + })), + }; + await this.messageManager.sendDirectEmbedToAuthor(message, embed, false); + }); + await this.messageManager.reply(message, 'Check your direct messages for results.'); + return pools.length > 0 ? + this.messageManager.statuses.SUCCESS : + this.messageManager.statuses.FAILURE; + } +} + +module.exports = ListPools; diff --git a/src/commands/Promocodes/RemoveManager.js b/src/commands/Promocodes/RemoveManager.js new file mode 100644 index 000000000..27a9c1ada --- /dev/null +++ b/src/commands/Promocodes/RemoveManager.js @@ -0,0 +1,35 @@ +'use strict'; + +const Command = require('../../models/Command.js'); +const { resolvePool } = require('../../CommonFunctions'); + +class RemoveManager extends Command { + constructor(bot) { + super(bot, 'promocode.managers.remove', 'glyphs del manager', 'Remove a manager from a glyph pool'); + this.regex = new RegExp(`^${this.call}\\s?(?:--p\\s?(.*))?([0-9]{0,20})?`, 'i'); + this.requiresAuth = true; + this.allowDM = false; + } + + async run(message) { + const user = message.strippedContent.match(/[0-9]{15,20}/i)[0] || 0; + const pool = await resolvePool(message, this.settings); + if (user === message.author.id) { + this.messageManager.reply(message, 'Tenno, you can\'t remove yourself!'); + return this.messageManager.statuses.FAILURE; + } + + if (typeof pool === 'undefined') { + this.messageManager.reply(message, 'You either manage none or too many pools. Please specify the pool ID.'); + return this.messageManager.statuses.FAILURE; + } + if (this.bot.client.users.has(user.trim())) { + await this.settings.removePoolManager(pool, user.trim()); + return this.messageManager.statuses.SUCCESS; + } + await this.messageManager.reply(message, 'Please specify a valid user ID or mention the user.'); + return this.messageManager.statuses.FAILURE; + } +} + +module.exports = RemoveManager; diff --git a/src/commands/Promocodes/RestrictPool.js b/src/commands/Promocodes/RestrictPool.js new file mode 100644 index 000000000..c156f8a2c --- /dev/null +++ b/src/commands/Promocodes/RestrictPool.js @@ -0,0 +1,33 @@ +'use strict'; + +const Command = require('../../models/Command.js'); +const { resolvePool } = require('../../CommonFunctions'); + +class RestrictPool extends Command { + constructor(bot) { + super(bot, 'promocode.pool.restrict', 'glyphs restrict', 'Restrict or unrestrict a pool'); + this.regex = new RegExp(`^${this.call}\\s?(on|off)?\\s*(?:--pool\\s?(.*))?`, 'i'); + this.requiresAuth = true; + this.allowDM = false; + } + + async run(message) { + let enable = message.strippedContent.match(this.regex)[1]; + if (!enable) { + return this.sendToggleUsage(message); + } + enable = enable.trim(); + + const pool = await resolvePool(message, this.settings); + + if (typeof pool === 'undefined') { + this.messageManager.reply(message, 'You either manage none or too many pools. Please specify the pool ID.'); + return this.messageManager.statuses.FAILURE; + } + await this.settings.restrictPool(pool, enable === 'on'); + await this.messageManager.reply(message, 'Pool restriction set.'); + return this.messageManager.statuses.SUCCESS; + } +} + +module.exports = RestrictPool; diff --git a/src/commands/Promocodes/RevokePromocode.js b/src/commands/Promocodes/RevokePromocode.js new file mode 100644 index 000000000..99094ca34 --- /dev/null +++ b/src/commands/Promocodes/RevokePromocode.js @@ -0,0 +1,33 @@ +'use strict'; + +const Command = require('../../models/Command.js'); + +class RevokePromocode extends Command { + constructor(bot) { + super(bot, 'promocode.code.revoke', 'glyphs revoke', 'Revoke a claimed or granted code.'); + this.regex = new RegExp(`^${this.call}\\s?(.*)?`, 'i'); + this.requiresAuth = true; + this.allowDM = false; + } + + async run(message) { + const code = message.strippedContent.match(this.regex)[1] || 0; + + if (typeof code === 'undefined') { + this.messageManager.reply(message, 'No code provided to revoke.'); + return this.messageManager.statuses.FAILURE; + } + // eslint-disable-next-line camelcase + const [{ pool_id }] = await this.settings.getCode(code); + // eslint-disable-next-line camelcase + if (pool_id && await this.settings.userManagesPool(message.author, pool_id)) { + await this.settings.revokeCode(code); + this.messageManager.reply(message, 'Code Revoked.'); + return this.messageManager.statuses.SUCCESS; + } + await this.messageManager.reply(message, 'You need to manage the pool that this code is part of, or provide a valid code.'); + return this.messageManager.statuses.FAILURE; + } +} + +module.exports = RevokePromocode; diff --git a/src/commands/Promocodes/SetPoolGuild.js b/src/commands/Promocodes/SetPoolGuild.js new file mode 100644 index 000000000..cfe84962f --- /dev/null +++ b/src/commands/Promocodes/SetPoolGuild.js @@ -0,0 +1,30 @@ +'use strict'; + +const Command = require('../../models/Command.js'); +const { resolvePool } = require('../../CommonFunctions'); + +class SetPoolGuild extends Command { + constructor(bot) { + super(bot, 'promocode.pool.guild', 'glyphs set guild', 'Set a pool\'s guild'); + this.regex = new RegExp(`^${this.call}\\s?(?:--pool\\s?(.*))?([0-9]{0,20})?`, 'i'); + this.requiresAuth = true; + this.allowDM = false; + } + + async run(message) { + const guildId = message.strippedContent.match(/[0-9]{15,20}/i)[0] || 0; + const pool = await resolvePool(message, this.settings); + if (typeof pool === 'undefined') { + this.messageManager.reply(message, 'You either manage none or too many pools. Please specify the pool ID.'); + return this.messageManager.statuses.FAILURE; + } + if (guildId && this.bot.client.guilds.has(guildId)) { + await this.settings.setPoolGuild(pool, guildId.trim()); + return this.messageManager.statuses.SUCCESS; + } + await this.messageManager.reply(message, 'Please specify a valid guild.'); + return this.messageManager.statuses.FAILURE; + } +} + +module.exports = SetPoolGuild; diff --git a/src/commands/Promocodes/SetPoolName.js b/src/commands/Promocodes/SetPoolName.js new file mode 100644 index 000000000..8190d08c7 --- /dev/null +++ b/src/commands/Promocodes/SetPoolName.js @@ -0,0 +1,30 @@ +'use strict'; + +const Command = require('../../models/Command.js'); +const { resolvePool } = require('../../CommonFunctions'); + +class SetPoolGuild extends Command { + constructor(bot) { + super(bot, 'promocode.pool.name', 'glyphs set name', 'Set a pool\'s name'); + this.regex = new RegExp(`^${this.call}\\s?(?:--pool\\s?(?:.*))?(.*)?`, 'i'); + this.requiresAuth = true; + this.allowDM = false; + } + + async run(message) { + const name = message.strippedContent.match(this.regex)[1] || 0; + const pool = await resolvePool(message, this.settings); + if (typeof pool === 'undefined') { + this.messageManager.reply(message, 'You either manage none or too many pools. Please specify the pool ID.'); + return this.messageManager.statuses.FAILURE; + } + if (name) { + await this.settings.setPoolName(pool, name); + return this.messageManager.statuses.SUCCESS; + } + await this.messageManager.reply(message, 'Please specify a name.'); + return this.messageManager.statuses.FAILURE; + } +} + +module.exports = SetPoolGuild; diff --git a/src/commands/Promocodes/SetPoolPassword.js b/src/commands/Promocodes/SetPoolPassword.js new file mode 100644 index 000000000..0f999e168 --- /dev/null +++ b/src/commands/Promocodes/SetPoolPassword.js @@ -0,0 +1,30 @@ +'use strict'; + +const Command = require('../../models/Command.js'); +const { resolvePool } = require('../../CommonFunctions'); + +class SetPoolPassword extends Command { + constructor(bot) { + super(bot, 'promocode.pool.password', 'glyphs set password', 'Set a pool\'s password'); + this.regex = new RegExp(`^${this.call}\\s?(?:--pool\\s?(?:.*))?(.*)?`, 'i'); + this.requiresAuth = true; + this.allowDM = false; + } + + async run(message) { + const password = message.strippedContent.match(this.regex)[1] || 0; + const pool = await resolvePool(message, this.settings); + if (typeof pool === 'undefined') { + this.messageManager.reply(message, 'You either manage none or too many pools. Please specify the pool ID.'); + return this.messageManager.statuses.FAILURE; + } + if (password) { + await this.settings.setPoolPassword(pool, password); + return this.messageManager.statuses.SUCCESS; + } + await this.messageManager.reply(message, 'Please specify a password.'); + return this.messageManager.statuses.FAILURE; + } +} + +module.exports = SetPoolPassword; diff --git a/src/commands/Promocodes/SetPoolPublic.js b/src/commands/Promocodes/SetPoolPublic.js new file mode 100644 index 000000000..9bc87c3df --- /dev/null +++ b/src/commands/Promocodes/SetPoolPublic.js @@ -0,0 +1,33 @@ +'use strict'; + +const Command = require('../../models/Command.js'); +const { resolvePool } = require('../../CommonFunctions'); + +class SetPoolPublic extends Command { + constructor(bot) { + super(bot, 'promocode.pool.public', 'glyphs public', 'Make a pool public or private'); + this.regex = new RegExp(`^${this.call}\\s?(on|off)?\\s*(?:--pool\\s?(.*))?`, 'i'); + this.requiresAuth = true; + this.allowDM = false; + } + + async run(message) { + let enable = message.strippedContent.match(this.regex)[1]; + if (!enable) { + return this.sendToggleUsage(message); + } + enable = enable.trim(); + + const pool = await resolvePool(message, this.settings); + + if (typeof pool === 'undefined') { + this.messageManager.reply(message, 'You either manage none or too many pools. Please specify the pool ID.'); + return this.messageManager.statuses.FAILURE; + } + await this.settings.setPoolPublic(pool, enable === 'on'); + await this.messageManager.reply(message, 'Pool publicity set.'); + return this.messageManager.statuses.SUCCESS; + } +} + +module.exports = SetPoolPublic; diff --git a/src/commands/Roles/RoleIds.js b/src/commands/Roles/RoleIds.js index abb493a6f..3efc58428 100644 --- a/src/commands/Roles/RoleIds.js +++ b/src/commands/Roles/RoleIds.js @@ -2,7 +2,7 @@ const Command = require('../../models/Command.js'); const rpad = require('right-pad'); -const { createGroupedArray } = require('../../CommonFunctions.js'); +const { createGroupedArray, createPageCollector } = require('../../CommonFunctions.js'); /** * Add a joinable role @@ -20,7 +20,7 @@ class Roles extends Command { * or perform an action based on parameters. * @returns {string} success status */ - run(message) { + async run(message) { const roles = message.guild.roles.array().sort((a, b) => { if (a.name < b.name) { return -1; @@ -31,16 +31,21 @@ class Roles extends Command { }); const longest = roles.map(role => role.name) .reduce((a, b) => (a.length > b.length ? a : b)); - const roleGroups = createGroupedArray(roles.map(role => `\`${rpad(role.name, longest.length, ' ')} ${role.id}\``), 17); + const roleGroups = createGroupedArray(roles.map(role => `\`${rpad(role.name, longest.length, ' ')} ${role.id}\``), 6); const metaGroups = createGroupedArray(roleGroups, 4); + const embeds = []; metaGroups.forEach((metaGroup) => { - this.messageManager.embed(message, { + embeds.push({ + title: 'Role Ids', + color: 0xFFD700, fields: metaGroup.map(roleGroup => ({ name: '_ _', value: roleGroup.join('\n'), })), - }, true, false); + }); }); + const msg = await this.messageManager.embed(message, embeds[0], true, false); + await createPageCollector(msg, embeds, message.author); return this.messageManager.statuses.SUCCESS; } } diff --git a/src/commands/Roles/Roles.js b/src/commands/Roles/Roles.js index 457a0f2f2..072331538 100644 --- a/src/commands/Roles/Roles.js +++ b/src/commands/Roles/Roles.js @@ -2,14 +2,7 @@ const Command = require('../../models/Command.js'); const RolesEmbed = require('../../embeds/RolesEmbed.js'); - -function createGroupedArray(arr, chunkSize) { - const groups = []; - for (let i = 0; i < arr.length; i += chunkSize) { - groups.push(arr.slice(i, i + chunkSize)); - } - return groups; -} +const { createGroupedArray, createPageCollector } = require('../../CommonFunctions'); /** * Add a joinable role @@ -34,13 +27,12 @@ class Roles extends Command { .reduce((a, b) => (a.length > b.length ? a : b)); const groupedRoles = createGroupedArray(roles, 20); const metaGroups = createGroupedArray(groupedRoles, 4); + const embeds = []; metaGroups.forEach((metaGroup) => { - this.messageManager.embed( - message, - new RolesEmbed(this.bot, metaGroup, prefix, longest.length), - true, true, - ); + embeds.push(new RolesEmbed(this.bot, metaGroup, prefix, longest.length)); }); + const msg = await this.messageManager.embed(message, embeds[0], true, false); + await createPageCollector(msg, embeds, message.author); return this.messageManager.statuses.SUCCESS; } await this.messageManager.embed( diff --git a/src/commands/Rooms/RoomDefaultNoText.js b/src/commands/Rooms/RoomDefaultNoText.js index 7da6503d6..4cd129f36 100644 --- a/src/commands/Rooms/RoomDefaultNoText.js +++ b/src/commands/Rooms/RoomDefaultNoText.js @@ -20,7 +20,7 @@ class RoomUnlockedDefault extends Command { * @param {Object} ctx Command context for calling commands * @returns {string} success status */ - async run(message, ctx) { + async run(message) { let enable = message.strippedContent.match(this.regex)[1]; if (!enable) { return this.sendToggleUsage(message); diff --git a/src/commands/Rooms/RoomPublicDefault.js b/src/commands/Rooms/RoomPublicDefault.js index 06a23b800..5ae683b7f 100644 --- a/src/commands/Rooms/RoomPublicDefault.js +++ b/src/commands/Rooms/RoomPublicDefault.js @@ -20,7 +20,7 @@ class RoomUnlockedDefault extends Command { * @param {Object} ctx Command context for calling commands * @returns {string} success status */ - async run(message, ctx) { + async run(message) { let enable = message.strippedContent.match(this.regex)[1]; if (!enable) { return this.sendToggleUsage(message); diff --git a/src/commands/Rooms/RoomShownDefault.js b/src/commands/Rooms/RoomShownDefault.js index a85433005..8bfe8eaa1 100644 --- a/src/commands/Rooms/RoomShownDefault.js +++ b/src/commands/Rooms/RoomShownDefault.js @@ -20,7 +20,7 @@ class RoomShownDefault extends Command { * @param {Object} ctx Command context for calling commands * @returns {string} success status */ - async run(message, ctx) { + async run(message) { let enable = message.strippedContent.match(this.regex)[1]; if (!enable) { return this.sendToggleUsage(message); diff --git a/src/embeds/WeaponEmbed.js b/src/embeds/WeaponEmbed.js index 6a36761b8..f11b6ef00 100644 --- a/src/embeds/WeaponEmbed.js +++ b/src/embeds/WeaponEmbed.js @@ -87,22 +87,26 @@ class WeaponEmbed extends BaseEmbed { } if (weapon.secondary) { + const values = []; + values.push(`**Trigger:** ${weapon.secondary.trigger || '-'}`); + values.push(`**Projectile:** ${weapon.secondary.pellet.name}`); + values.push(`**Rate:** ${weapon.secondary.rate}`); + values.push(`**Flight:**: ${weapon.secondary.flight}m\\s`); + values.push(`**Noise:** ${weapon.secondary.noise}`); + values.push(`**Accuracy:** ${weapon.secondary.accuracy}`); + values.push(`**Reload:** ${weapon.secondary.reload}`); + values.push(`**Damage:** ${emojify(weapon.secondary.damage || '-')}`); + values.push(`**Impact:** ${weapon.secondary.impact}`); + values.push(`**Puncture:** ${weapon.secondary.puncture}`); + values.push(`**Slash:** ${weapon.secondary.slash}`); + values.push(`**Critical Chance:** ${weapon.secondary.crit_chance}%`); + values.push(`**Critical Multiplier:** ${weapon.secondary.crit_mult}x`); + values.push(`**Status Chance:** ${weapon.secondary.status_chance}%`); + + this.fields.push({ name: 'Secondary Fire', - value: (weapon.secondary.trigger ? `**Trigger:** ${weapon.secondary.trigger || '-'}\n` : `${ - weapon.secondary.pellet}` ? `**Projectile:** ${weapon.secondary.pellet.name}\n` : `${ - weapon.secondary.rate}` ? `**Rate:** ${weapon.secondary.rate}\n` : `${ - weapon.secondary.flight}` ? `**Flight:**: ${weapon.secondary.flight}m\\s\n` : `${ - weapon.secondary.noise}` ? `**Noise:** ${weapon.secondary.noise}\n` : `${ - weapon.secondary.accuracy}` ? `**Accuracy:** ${weapon.secondary.accuracy}\n` : `${ - weapon.secondary.reload}` ? `**Reload:** ${weapon.secondary.reload}\n` : `${ - weapon.secondary.damage}` ? `**Damage:** ${emojify(weapon.secondary.damage || '-')}\n` : `${ - weapon.secondary.impact}` ? `**Impact:** ${weapon.secondary.impact}\n` : `${ - weapon.secondary.puncture}` ? `**Puncture:** ${weapon.secondary.puncture}\n` : `${ - weapon.secondary.slash}` ? `**Slash:** ${weapon.secondary.slash}\n` : `${ - weapon.secondary.crit_chance}` ? `**Critical Chance:** ${weapon.secondary.crit_chance}%\n` : `${ - weapon.secondary.crit_mult}` ? `**Critical Multiplier:** ${weapon.secondary.crit_mult}x\n` : `${ - weapon.secondary.status_chance}` ? `**Status Chance:** ${weapon.secondary.status_chance}%` : '') || '-', + value: values.join('\n') || '--', inline: true, }); } diff --git a/src/models/CustomCommand.js b/src/models/CustomCommand.js index fa30eaef0..39d258946 100644 --- a/src/models/CustomCommand.js +++ b/src/models/CustomCommand.js @@ -25,7 +25,7 @@ class CustomCommand extends Command { * Run the command * @param {Message} message Message with a command to handle, reply to, * or perform an action based on parameters. - * @parm {Object} ctx command context + * @param {Object} ctx command context */ async run(message, ctx) { let format; diff --git a/src/settings/Database.js b/src/settings/Database.js index 054076dba..11fe22a69 100644 --- a/src/settings/Database.js +++ b/src/settings/Database.js @@ -3,8 +3,31 @@ const SQL = require('sql-template-strings'); const mysql = require('mysql2/promise'); const Promise = require('bluebird'); -const schema = require('./schema.js'); -const CustomCommand = require('../models/CustomCommand.js'); + +const BuildQueries = require('./DatabaseQueries/BuildQueries'); +const WelcomeQueries = require('./DatabaseQueries/WelcomeQueries'); +const CustomCommandQueries = require('./DatabaseQueries/CustomCommandQueries'); +const SettingsQueries = require('./DatabaseQueries/SettingsQueries'); +const TrackingQueries = require('./DatabaseQueries/TrackingQueries'); +const PingsQueries = require('./DatabaseQueries/PingsQueries'); +const PermissionsQueries = require('./DatabaseQueries/PermissionsQueries'); +const DBMQueries = require('./DatabaseQueries/DBMQueries'); +const PrivateRoomQueries = require('./DatabaseQueries/PrivateRoomQueries'); +const PromocodeQueries = require('./DatabaseQueries/PromocodeQueries'); + +const props = (obj) => { + const p = []; + for (; obj != null; obj = Object.getPrototypeOf(obj)) { // eslint-disable-line no-param-reassign + const op = Object.getOwnPropertyNames(obj); + for (let i = 0; i < op.length; i += 1) { + if (p.indexOf(op[i]) === -1) { p.push(op[i]); } + } + } + return p.filter(thing => + !['db', 'constructor', '__defineGetter__', '__defineSetter__', 'hasOwnProperty', '__lookupGetter__', + '__lookupSetter__', 'isPrototypeOf', 'propertyIsEnumerable', 'toString', 'valueOf', '__proto__', + 'toLocaleString'].includes(thing)); +}; /** * Connection options for the database @@ -16,15 +39,6 @@ const CustomCommand = require('../models/CustomCommand.js'); * @property {string} database - The database to use */ -const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; -const makeId = () => { - const tokens = []; - for (let i = 0; i < 8; i += 1) { - tokens.push(possible.charAt(Math.floor(Math.random() * possible.length))); - } - return tokens.join(''); -}; - /** * Persistent storage for the bot */ @@ -62,48 +76,38 @@ class Database { tempCategory: false, 'settings.cc.ping': true, }; - } - /** - * Creates the required tables in the database - * @returns {Promise} - */ - createSchema() { - return Promise.mapSeries(schema, q => this.db.query(q)); - } - - /** - * Initialize data for guilds in channels for existing guilds - * @param {Client} client for pulling guild information - */ - async ensureData(client) { - const promises = []; - client.guilds.array().forEach((guild) => { - if (guild.channels.array().length) { - promises.push(this.addGuild(guild)); - } + const queryClasses = [ + new BuildQueries(this.db), + new WelcomeQueries(this.db), + new CustomCommandQueries(this.db), + new SettingsQueries(this.db), + new TrackingQueries(this.db), + new PingsQueries(this.db), + new PermissionsQueries(this.db), + new DBMQueries(this.db), + new PrivateRoomQueries(this.db), + new PromocodeQueries(this.db), + ]; + + queryClasses.forEach((queryClass) => { + this.copyChildrenQueries(queryClass); }); - await Promise.all(promises); } /** - * Adds a new guild to the database - * @param {Guild} guild A Discord guild (server) - * @returns {Promise} + * Copy funcitonns from class to this class... theoretically + * @param {Object} queriesClass class instance + * @returns {undefined} doesn't return anything */ - addGuild(guild) { - if (!guild.available) return undefined; - - const channelIDs = guild.channels.filter(c => c.type === 'text').keyArray(); - if (channelIDs.length) { - const query = SQL`INSERT IGNORE INTO channels (id, guild_id) VALUES `; - channelIDs.forEach((id, index) => { - query.append(SQL`(${id}, ${guild.id})`).append(index !== (channelIDs.length - 1) ? ',' : ';'); - }); - - return this.db.query(query); - } - return undefined; + copyChildrenQueries(queriesClass) { + const keys = props(queriesClass); + keys.forEach((key) => { + if (key !== 'db') { + Database.prototype[key] = queriesClass[key]; + } + }); + this.logger.debug(`Imported Functions: ${props(this).length}`); } /** @@ -123,838 +127,13 @@ class Database { } /** - * Adds a new guild text channel to the database - * @param {TextChannel} channel A discord guild text channel - * @returns {Promise} - */ - async addGuildTextChannel(channel) { - const query = SQL`INSERT IGNORE INTO channels (id, guild_id) VALUES (${channel.id}, ${channel.guild.id});`; - return this.db.query(query); - } - - /** - * Adds a new DM or group DM channel to the database - * @param {DMChannel|GroupDMChannel} channel A discord DM or group DM channel - * @returns {Promise} - */ - async addDMChannel(channel) { - const query = SQL`INSERT IGNORE INTO channels (id) VALUES (${channel.id});`; - return this.db.query(query); - } - - /** - * Deletes a channel from the database - * @param {Channel} channel The channel to delete - * @returns {Promise} - */ - async deleteChannel(channel) { - const query = SQL`DELETE FROM channels WHERE id = ${channel.id};`; - return this.db.query(query); - } - - async getGuildSetting(guild, setting) { - if (guild) { - const query = SQL`SELECT val FROM settings, channels WHERE channel_id=channels.id and channels.guild_id=${guild.id} and settings.setting=${setting}`; - const res = await this.db.query(query); - if (res[0].length === 0) { - await this.setGuildSetting(guild, setting, this.defaults[`${setting}`]); - return this.defaults[`${setting}`]; - } - await this.setGuildSetting(guild, setting, res[0][0].val); - return res[0][0].val; - } - return this.defaults[`${setting}`]; - } - - async checkWebhookAndReturn(channel, setting) { - if (!/webhook/.test(setting)) { - await this.setChannelSetting(channel, setting, this.defaults[`${setting}`]); - return this.defaults[`${setting}`]; - } - return undefined; - } - - /** - * Get a setting for a particular channel - * @param {Channel} channel channel to get the setting for - * @param {string} setting name of the setting to get - * @returns {Promise} setting - */ - async getChannelSetting(channel, setting) { - if (channel) { - const query = SQL`SELECT val FROM settings WHERE settings.channel_id=${channel.id} and settings.setting=${setting};`; - const res = await this.db.query(query); - if (res[0].length === 0) { - if (channel.type === 'text') { - await this.addGuildTextChannel(channel); - } else { - await this.addDMChannel(channel); - } - return this.checkWebhookAndReturn(channel, setting); - } - return res[0][0].val; - } - return undefined; - } - - async setChannelWebhook(channel, webhook) { - const query = SQL`INSERT INTO settings (channel_id, setting, val) - VALUES (${channel.id}, 'webhookId', ${webhook.id}), - (${channel.id}, 'webhookToken', ${webhook.token}), - (${channel.id}, 'webhookName', ${webhook.name}), - (${channel.id}, 'webhookAvatar', ${webhook.avatar}) - ON DUPLICATE KEY UPDATE - val = Values(val)`; - - return this.db.query(query); - } - - async getChannelWebhook(channel) { - const query = SQL`SELECT setting, val FROM settings where channel_id = ${channel.id} and setting in ('webhookId', 'webhookToken', 'webhookName', 'webhookAvatar');`; - const res = await this.db.query(query); - let webhook = {}; - if (res[0]) { - res[0].map(row => ({ - setting: row.setting, - value: row.val, - })).forEach((row) => { - if (row.setting.indexOf('webhook') > -1) { - webhook[`${row.setting.replace('webhook', '').toLowerCase()}`] = row.value; - } - }); - - if (!webhook.avatar) { - webhook.avatar = this.bot.client.user.avatarURL.replace('?size=2048', ''); - } - if (!webhook.name) { - webhook.name = this.bot.client.user.username; - } - if (!(webhook.id && webhook.token)) { - webhook = undefined; - } - } else { - webhook = undefined; - } - return webhook; - } - - /** - * Get a setting for a particular channel - * @param {Channel} channel channel to get the setting for - * @param {string} setting name of the setting to set - * @param {string|boolean} value value of the setting to be set - * @returns {Promise} setting - */ - async setChannelSetting(channel, setting, value) { - const query = SQL`INSERT IGNORE INTO settings (channel_id, setting, val) VALUE (${channel.id},${setting},${value}) ON DUPLICATE KEY UPDATE val=${value};`; - return this.db.query(query); - } - - async deleteChannelSetting(channel, setting) { - const query = SQL`DELETE FROM settings where channel_id = ${channel.id} and setting=${setting};`; - return this.db.query(query); - } - - /** - * Resets the custom prefix for this guild to the bot's globally configured prefix - * @param {Guild} guild The Discord guild for which to set the response setting - * @param {string} setting Name of the setting to set - * @param {string|boolean} val value of the setting to be set - * @returns {Promise} - */ - async setGuildSetting(guild, setting, val) { - const promises = []; - guild.channels.array().forEach((channel) => { - promises.push(this.setChannelSetting(channel, setting, val)); - }); - return Promise.all(promises); - } - - /** - * Delete a guild setting - * @param {Discord.Guild} guild guild to delete for - * @param {strimg} setting string key - * @returns {Promise} resolution of deletion - */ - async deleteGuildSetting(guild, setting) { - const promises = []; - guild.channels.array().forEach((channel) => { - promises.push(this.deleteChannelSetting(channel, setting)); - }); - return Promise.all(promises); - } - - /** - * Enables notifications for an item in a channel - * @param {Channel} channel The channel where to enable notifications - * @param {string} item The item to track - * @returns {Promise} - */ - async trackItem(channel, item) { - const query = SQL`INSERT IGNORE INTO item_notifications (channel_id, item) VALUES (${channel.id},${item});`; - return this.db.query(query); - } - - /** - * Enables notifications for items in a channel - * @param {Channel} channel The channel where to enable notifications - * @param {string} items The items to track - * @returns {Promise} - */ - async trackItems(channel, items) { - const query = SQL`INSERT IGNORE INTO item_notifications (channel_id, item) VALUES `; - items.forEach((item, index) => { - query.append(SQL`(${channel.id}, ${item})`).append(index !== (items.length - 1) ? ',' : ';'); - }); - return this.db.query(query); - } - - /** - * Disables notifications for an item in a channel - * @param {Channel} channel The channel where to enable notifications - * @param {string} item The item to track - * @returns {Promise} - */ - async untrackItem(channel, item) { - const query = SQL`DELETE FROM item_notifications WHERE channel_id = ${channel.id} AND item = ${item};`; - return this.db.query(query); - } - - /** - * Disables notifications for items in a channel - * @param {Channel} channel The channel where to enable notifications - * @param {string} items The items to untrack - * @returns {Promise} - */ - async untrackItems(channel, items) { - const query = SQL`DELETE FROM item_notifications WHERE channel_id = ${channel.id} AND (`; - items.forEach((item, index) => { - query.append(index > 0 ? ' OR ' : '').append(SQL`item = ${item}`); - }); - query.append(SQL`);`); - return this.db.query(query); - } - - /** - * Enables notifications for an event type in a channel - * @param {Channel} channel The channel where to enable notifications - * @param {string} type The item to track - * @returns {Promise} - */ - async trackEventType(channel, type) { - const query = SQL`INSERT IGNORE INTO type_notifications (channel_id, type) VALUES (${channel.id},${type});`; - return this.db.query(query); - } - - /** - * Enables notifications for items in a channel - * @param {Channel} channel The channel where to enable notifications - * @param {string} types The types to track - * @returns {Promise} - */ - async trackEventTypes(channel, types) { - const query = SQL`INSERT IGNORE INTO type_notifications (channel_id, type) VALUES `; - types.forEach((type, index) => { - if (channel && channel.id) { - query.append(SQL`(${channel.id}, ${type})`).append(index !== (types.length - 1) ? ',' : ';'); - } - }); - return this.db.query(query); - } - - /** - * Disables notifications for an event type in a channel - * @param {Channel} channel The channel where to enable notifications - * @param {string} type The item to track - * @returns {Promise} - */ - async untrackEventType(channel, type) { - const query = SQL`DELETE FROM type_notifications WHERE channel_id = ${channel.id} AND type = ${type};`; - return this.db.query(query); - } - - /** - * Disables notifications for event types in a channel - * @param {Channel} channel The channel where to enable notifications - * @param {string} types The types to untrack - * @returns {Promise} - */ - async untrackEventTypes(channel, types) { - const query = SQL`DELETE FROM type_notifications WHERE channel_id = ${channel.id} AND (`; - types.forEach((type, index) => { - query.append(index > 0 ? ' OR ' : '').append(SQL`type = ${type}`); - }); - query.append(SQL`);`); - return this.db.query(query); - } - - /** - * Enables or disables pings for an item in a channel - * @param {TextChannel} channel The channel where to enable notifications - * @param {string} item The item to set ping status for - * @param {boolean} enabled true to enable pinging, false to disable - * @returns {Promise} - */ - async setItemPing(channel, item, enabled) { - const query = SQL`UPDATE item_notifications SET ping = ${enabled} WHERE channel_id = ${channel.id} - AND item = ${item};`; - return this.db.query(query); - } - - /** - * Enables or disables pings for an event type in a channel - * @param {TextChannel} channel The channel where to enable notifications - * @param {string} type The event type to set ping status for - * @param {boolean} enabled true to enable pinging, false to disable - * @returns {Promise} - */ - async setEventTypePing(channel, type, enabled) { - const query = SQL`UPDATE type_notifications SET ping = ${enabled} WHERE channel_id = ${channel.id} - AND type = ${type};`; - return this.db.query(query); - } - - /** - * Sets a ping message for an item or event type in a guild - * @param {Guild} guild The guild - * @param {string} itemOrType The item or event type to set the ping message for - * @param {string} text The text of the ping message - * @returns {Promise} - */ - async setPing(guild, itemOrType, text) { - const query = SQL`INSERT INTO pings VALUES (${guild.id}, ${itemOrType}, ${text}) - ON DUPLICATE KEY UPDATE text = ${text};`; - return this.db.query(query); - } - - /** - * Get all pings for a guild for the provided event types and items - * @param {Guild} guild Guild to get pings for - * @param {Array.} itemsOrTypes array of strings corresponding to event and reward types - * @returns {Promise.} Promise of a string to prepend to a message - */ - async getPing(guild, itemsOrTypes) { - const query = SQL`SELECT text FROM pings WHERE guild_id=${guild.id} AND item_or_type in (${itemsOrTypes})`; - const res = await this.db.query(query); - if (res[0].length === 0) { - return ''; - } - return res[0] - .map(result => result.text).join(', '); - } - - async getPingsForGuild(guild) { - if (guild) { - const query = SQL`SELECT item_or_type, text FROM pings WHERE guild_id=${guild.id}`; - const res = await this.db.query(query); - - if (res[0].length === 0) { - return []; - } - return res[0] - .map(result => ({ text: result.text, thing: result.item_or_type })); - } - return []; - } - - /** - * Removes a ping message - * @param {Guild} guild The guild where the ping message is currently being sent - * @param {string} itemOrType The item or event type associated to the ping message - * @returns {Promise} - */ - async removePing(guild, itemOrType) { - if (guild) { - const query = SQL`DELETE FROM pings WHERE guild_id = ${guild.id} AND item_or_type = ${itemOrType};`; - return this.db.query(query); - } - return false; - } - - /** - * Returns all the channels that should get a notification for the items in the list - * @param {string} type The type of the event - * @param {string} platform The platform of the event - * @param {Array.} items The items in the reward that is being notified - * @returns {Promise.>} - */ - async getNotifications(type, platform, items) { - try { - const query = SQL`SELECT DISTINCT channels.id as channelId - FROM type_notifications` - .append(items && items.length > 0 ? - SQL` INNER JOIN item_notifications ON type_notifications.channel_id = item_notifications.channel_id` : SQL``) - .append(SQL` INNER JOIN channels ON channels.id = type_notifications.channel_id`) - .append(SQL` INNER JOIN settings ON channels.id = settings.channel_id`) - .append(SQL` - WHERE type_notifications.type = ${String(type)} - AND MOD(IFNULL(channels.guild_id, 0) >> 22, ${this.bot.shardCount}) = ${this.bot.shardId} - AND settings.setting = "platform" AND settings.val = ${platform || 'pc'} `) - .append(items && items.length > 0 ? SQL`AND item_notifications.item IN (${items}) - AND item_notifications.channel_id = settings.channel_id;` : SQL`;`); - return (await this.db.query(query))[0]; - } catch (e) { - this.logger.error(e); - return []; - } - } - - /** - * Returns the items that the channel is tracking - * @param {Channel} channel A Discord channel - * @returns {Promise.>} - */ - async getTrackedItems(channel) { - const query = SQL`SELECT item FROM item_notifications WHERE channel_id = ${channel.id};`; - const res = await this.db.query(query); - return res[0].map(r => r.item); - } - - /** - * Returns the event types that the channel is tracking - * @param {Channel} channel A Discord channel - * @returns {Promise.>} - */ - async getTrackedEventTypes(channel) { - const query = SQL`SELECT type FROM type_notifications WHERE channel_id = ${channel.id};`; - const res = await this.db.query(query); - return res[0].map(r => r.type); - } - - /** - * Enables or disables a command for an individual member in a channel - * @param {GuildChannel} channel - A discord guild channel - * @param {GuildMember} member - A discord guild member - * @param {string} commandId - The ID of the command to set the permission for - * @param {boolean} allowed - Whether this member should be allowed to use this command - * @returns {Promise} - */ - async setChannelPermissionForMember(channel, member, commandId, allowed) { - const query = SQL`INSERT INTO channel_permissions VALUES - (${channel.id}, ${member.id}, TRUE, ${commandId}, ${allowed}) - ON DUPLICATE KEY UPDATE allowed = ${allowed};`; - return this.db.query(query); - } - - /** - * Enables or disables a command for a role in a channel - * @param {GuildChannel} channel - A discord guild channel - * @param {Role} role - A discord role - * @param {string} commandId - The ID of the command to set the permission for - * @param {boolean} allowed - Whether this member should be allowed to use this command - * @returns {Promise} - */ - async setChannelPermissionForRole(channel, role, commandId, allowed) { - const query = SQL`INSERT INTO channel_permissions VALUES - (${channel.id}, ${role.id}, FALSE, ${commandId}, ${allowed}) - ON DUPLICATE KEY UPDATE allowed = ${allowed};`; - return this.db.query(query); - } - - /** - * Enables or disables a command for an individual member in a guild - * @param {Guild} guild - A discord guild - * @param {GuildMember} member - A discord guild member - * @param {string} commandId - The ID of the command to set the permission for - * @param {boolean} allowed - Whether this member should be allowed to use this command - * @returns {Promise} + * Get context (including settings) for a command in a channel + * @param {Discord.Channel} channel channel to get settings for + * @returns {Object} context */ - async setGuildPermissionForMember(guild, member, commandId, allowed) { - const query = SQL`INSERT INTO guild_permissions VALUES - (${guild.id}, ${member.id}, TRUE, ${commandId}, ${allowed}) - ON DUPLICATE KEY UPDATE allowed = ${allowed};`; - return this.db.query(query); - } - - /** - * Enables or disables a command for a role in a channel - * @param {Guild} guild - A discord guild - * @param {Role} role - A discord role - * @param {string} commandId - The ID of the command to set the permission for - * @param {boolean} allowed - Whether this member should be allowed to use this command - * @returns {Promise} - */ - async setGuildPermissionForRole(guild, role, commandId, allowed) { - const query = SQL`INSERT INTO guild_permissions VALUES - (${guild.id}, ${role.id}, FALSE, ${commandId}, ${allowed}) - ON DUPLICATE KEY UPDATE allowed = ${allowed};`; - return this.db.query(query); - } - - /** - * Stops tracking all event types in a channel (disables all notifications) - * @param {Channel} channel - A Discord channel - * @returns {Promise} - */ - async stopTracking(channel) { - const query = SQL`DELETE FROM type_notifications WHERE channel_id = ${channel.id};`; - return this.db.query(query); - } - - /** - * Gets whether or not a user is allowed to use a particular command in a channel - * @param {Channel} channel - A Discord channel - * @param {string} memberId - String representing a user identifier - * @param {string} commandId - String representing a command identifier - * @returns {Promise} - */ - async getChannelPermissionForMember(channel, memberId, commandId) { - const query = SQL`SELECT allowed FROM channel_permissions - WHERE channel_id = ${channel.id} AND command_id = ${commandId} - AND is_user = true AND target_id = ${memberId}`; - const res = await this.db.query(query); - - if (!res || res[0].length === 0) { - return 'none'; - } - return res.rows[0].allowed; - } - - /** - * Gets whether or not a role is allowed to use a particular command in a channel - * @param {Channel} channel A Discord channel - * @param {string} role String representing a user identifier - * @param {string} commandId String representing a command identifier - * @returns {Promise} - */ - async getChannelPermissionForRole(channel, role, commandId) { - const query = SQL`SELECT allowed FROM channel_permissions - WHERE channel_id = ${channel.id} AND command_id = ${commandId} - AND is_user = false AND target_id = ${role.id}`; - const res = await this.db.query(query); - - if (!res || res[0].length === 0) { - return 'none'; - } - return res.rows[0].allowed === 1; - } - - /** - * Gets whether or not a role in the user's - * roles allows the user to use a particular command in a channel - * @param {Channel} channel - A Discord channel - * @param {User} user - A Discord user - * @param {string} commandId - A command id for designating - * a command to check permissions for - * @returns {Promise} - */ - async getChannelPermissionForUserRoles(channel, user, commandId) { - const userRoles = channel.type === 'text' ? channel.guild.member(user).roles : {}; - const userRoleIds = userRoles.keyArray(); - const query = SQL`SELECT target_id, is_user, allowed - FROM channel_permissions - WHERE channel_permissions.channel_id = ${channel.id} - AND channel_permissions.target_id IN (${userRoleIds}) - AND command_id = ${commandId} - UNION SELECT guild_permissions.target_id AS target_id, - guild_permissions.is_user AS is_user, - guild_permissions.allowed AS allowed - FROM guild_permissions - INNER JOIN channels USING (guild_id) - LEFT JOIN channel_permissions ON - channel_permissions.channel_id = channels.id - AND guild_permissions.command_id = channel_permissions.command_id - AND guild_permissions.target_id = channel_permissions.target_id - WHERE channel_permissions.target_id IS NULL - AND channels.id = ${channel.id} - AND guild_permissions.target_id IN (${userRoleIds});`; - const res = await this.db.query(query); - if (res[0].length === 0) { - return 'none'; - } - return res[0][0].allowed; - } - - /** - * Gets whether or not a user is allowed to use a particular command in a guild - * @param {Guild} guild - A Discord guild - * @param {string} memberId - String representing a user identifier - * @param {string} commandId - String representing a command identifier - * @returns {Promise} - */ - async getGuildPermissionForMember(guild, memberId, commandId) { - const query = SQL`SELECT allowed FROM guild_permissions - WHERE channel_id = ${guild.id} AND command_id = ${commandId} - AND is_user = true AND target_id = ${memberId}`; - const res = await this.db.query(query); - if (res.rows.length === 0) { - throw new Error(`The guild permissions for the guild ${guild.id} - for member ${memberId} was not found in the database`); - } - return res.rows[0].allowed; - } - - /** - * Gets whether or not a role is allowed to use a particular command in a guild - * @param {Guild} guild - A Discord guild - * @param {string} role String representing a user identifier - * @param {string} commandId String representing a command identifier - * @returns {Promise} - */ - async getGuildPermissionForRole(guild, role, commandId) { - const query = SQL`SELECT allowed FROM guild_permissions - WHERE channel_id = ${guild.id} AND command_id = ${commandId} - AND is_user = false AND target_id = ${role.id}`; - const res = await this.db.query(query); - if (res.rows.length === 0) { - throw new Error(`The guild permissions for the guild ${guild.id} - for member ${role.id} was not found in the database`); - } - return res.rows[0].allowed; - } - - /** - * Remove guild from database - * @param {snowflake} guild Guild to be removed from database - * @returns {Promise.} status of removal - */ - async removeGuild(guild) { - const query = SQL`DELETE FROM channels WHERE guild_id = ${guild.id}`; - await this.db.query(query); - const channelIds = guild.channels.keyArray(); - const results = []; - channelIds.forEach((channelId) => { - results.push(this.removeChannelPermissions(channelId)); - results.push(this.removeItemNotifications(channelId)); - results.push(this.removeSettings(channelId)); - }); - results.push(this.removePrivateChannels(guild.id)); - results.push(this.removeGuildPermissions(guild.id)); - results.push(this.removePings(guild.id)); - results.push(this.removeGuildCustomCommands(guild.id)); - return Promise.all(results); - } - - async removeSettings(channelId) { - const query = SQL`DELETE FROM settings WHERE settings.channel_id=${channelId};`; - return this.db.query(query); - } - - async removePrivateChannels(guild) { - const query = SQL`DELETE FROM private_channels WHERE guild_id=${guild.id}`; - return this.db.query(query); - } - - /** - * Remove permissions corresponding to the guild id - * @param {snowflake} guildId guild identifier for removal - * @returns {Promise.} status of removal - */ - async removeGuildPermissions(guildId) { - const query = SQL`DELETE FROM guild_permissions WHERE guild_id = ${guildId}`; - return this.db.query(query); - } - - /** - * Remove permissions corresponding to the guild id - * @param {snowflake} channelId channel identifier for removal - * @returns {Promise.} status of removal - */ - async removeChannelPermissions(channelId) { - const query = SQL`DELETE FROM channel_permissions WHERE channel_id = ${channelId}`; - return this.db.query(query); - } - - /** - * Remove item notifications corresponding to the channel id - * @param {snowflake} channelId channel identifier for removal - * @returns {Promise.} status of removal - */ - async removeItemNotifications(channelId) { - const query = SQL`DELETE FROM item_notifications WHERE channel_id = ${channelId}`; - return this.db.query(query); - } - - /** - * Remove type notifications corresponding to the channel id - * @param {snowflake} channelId channel identifier for removal - * @returns {Promise.} status of removal - */ - async removeTypeNotifications(channelId) { - const query = SQL`DELETE FROM type_notifications WHERE channel_id = ${channelId}`; - return this.db.query(query); - } - - /** - * Remove pings corresponding to the guild id - * @param {snowflake} guildId guild identifier for removal - * @returns {Promise.} status of removal - */ - async removePings(guildId) { - const query = SQL`DELETE FROM pings WHERE guild_id = ${guildId}`; - return this.db.query(query); - } - - /** - * Set the notified ids for a given platform and shard id - * @param {string} platform platform corresponding to notified ids - * @param {number} shardId shard id corresponding to notified ids - * @param {JSON} notifiedIds list of oids that have been notifiedIds - * @returns {Promise} - */ - async setNotifiedIds(platform, shardId, notifiedIds) { - const query = SQL`INSERT INTO notified_ids VALUES - (${shardId}, ${platform}, JSON_ARRAY(${notifiedIds})) - ON DUPLICATE KEY UPDATE id_list = JSON_ARRAY(${notifiedIds});`; - return this.db.query(query); - } - - /** - * Get list of notified ids for the given platform and shard id - * @param {string} platform Platform - * @param {number} shardId Identifier of the corresponding shard - * @returns {Promise.} Array of notified oids - */ - async getNotifiedIds(platform, shardId) { - const query = SQL`SELECT id_list - FROM notified_ids - WHERE shard_id=${shardId} AND platform=${platform};`; - const res = await this.db.query(query); - if (res[0].length === 0) { - return []; - } - return res[0][0].id_list; - } - - /** - * Set the joinable roles for a guild - * @param {Guild} guild Guild to set joinable roles for - * @param {Array.} roles Array of role ids to set - * @returns {Promise} - */ - async setRolesForGuild(guild, roles) { - const query = SQL`INSERT INTO guild_joinable_roles VALUES - (${guild.id}, JSON_ARRAY(${roles})) - ON DUPLICATE KEY UPDATE id_list = JSON_ARRAY(${roles});`; - return this.db.query(query); - } - - /** - * Get the roles that can be joined for a guild - * @param {Guild} guild [description] - * @returns {Promise.>} Promise of array of roles that are joinable - */ - async getRolesForGuild(guild) { - const query = SQL`SELECT id_list - FROM guild_joinable_roles - WHERE guild_id=${guild.id}`; - const res = await this.db.query(query); - if (res[0][0]) { - const validListIds = res[0][0].id_list - .filter(id => typeof this.bot.client.guilds.get(guild.id).roles.get(id) !== 'undefined'); - const validList = validListIds - .map(id => this.bot.client.guilds.get(guild.id).roles.get(id)); - return validList; - } - return []; - } - - /** - * Get a dump of allowed and denied permissions - * @param {Guild} guild guild to fetch settings for - * @returns {Object} Data about allowed data - */ - async permissionsForGuild(guild) { - const query = SQL`SELECT * FROM guild_permissions WHERE guild_id = ${guild.id}`; - const res = await this.db.query(query); - if (res[0]) { - return res[0].map(value => ({ - level: 'guild', - command: value.command_id, - isAllowed: value.allowed, - type: value.is_user ? 'user' : 'role', - appliesToId: value.target_id, - })); - } - return []; - } - - /** - * Get a dump of allowed and denied permissions - * @param {Channel} channel channel to fetch settings for - * @returns {Object} Data about allowed data - */ - async permissionsForChannel(channel) { - const query = SQL`SELECT * FROM channel_permissions WHERE channel_id = ${channel.id}`; - const res = await this.db.query(query); - if (res[0]) { - return res[0].map(value => ({ - level: 'channel', - command: value.command_id, - isAllowed: value.allowed, - type: value.is_user ? 'user' : 'role', - appliesToId: value.target_id, - })); - } - return []; - } - - async addPrivateRoom(guild, textChannel, voiceChannel, category, member) { - let query; - if (textChannel) { - query = SQL`INSERT INTO private_channels (guild_id, text_id, voice_id, category_id, created_by) VALUES (${guild.id}, ${textChannel.id}, ${voiceChannel.id}, ${category.id}, ${member.id})`; - } else { - query = SQL`INSERT INTO private_channels (guild_id, text_id, voice_id, category_id, created_by) VALUES (${guild.id}, 0, ${voiceChannel.id}, ${category.id}, ${member.id})`; - } - return this.db.query(query); - } - - async deletePrivateRoom(room) { - const { - guild, voiceChannel, voiceId, - } = room; - const query = SQL`DELETE FROM private_channels WHERE guild_id = ${guild.id} AND voice_id = ${voiceChannel ? voiceChannel.id : voiceId}`; - return this.db.query(query); - } - - async userHasRoom(member) { - const query = SQL`SELECT * FROM private_channels WHERE guild_id = ${member.guild.id} and created_by = ${member.id}`; - const res = await this.db.query(query); - return res[0].length > 0; - } - - async getUsersRoom(member) { - const query = SQL`SELECT guild_id, text_id, voice_id, category_id, created_at as crt_sec FROM private_channels WHERE guild_id = ${member.guild.id} and created_by = ${member.id}`; - const res = await this.db.query(query); - if (res[0]) { - return { - guild: this.bot.client.guilds.get(res[0][0].guild_id), - textChannel: res[0][0].text_id - ? this.bot.client.channels.get(res[0][0].text_id) : undefined, - voiceChannel: this.bot.client.channels.get(res[0][0].voice_id), - category: this.bot.client.channels.get(res[0][0].category_id), - createdAt: res[0][0].crt_sec, - guildId: res[0][0].guild_id, - textId: res[0][0].text_id || undefined, - voiceId: res[0][0].voice_id, - categoryId: res[0][0].category_id, - }; - } - return undefined; - } - - async getPrivateRooms() { - const query = SQL`SELECT guild_id, text_id, voice_id, category_id, created_at as crt_sec FROM private_channels WHERE MOD(IFNULL(guild_id, 0) >> 22, ${this.bot.shardCount}) = ${this.bot.shardId}`; - const res = await this.db.query(query); - if (res[0]) { - return res[0].map(value => ({ - guild: this.bot.client.guilds.get(value.guild_id), - textChannel: value.text_id ? this.bot.client.channels.get(value.text_id) : undefined, - voiceChannel: this.bot.client.channels.get(value.voice_id), - category: this.bot.client.channels.get(value.category_id), - createdAt: value.crt_sec, - guildId: value.guild_id, - textId: value.text_id || undefined, - voiceId: value.voice_id, - categoryId: value.category_id, - })); - } - return []; - } - async getCommandContext(channel) { this.getChannelSetting(channel, 'prefix'); // ensure it's set at some point - const query = SQL`SELECT setting, val FROM settings where channel_id = ${channel.id} + const query = SQL`SELECT setting, val FROM settings where channel_id = ${channel.id} and setting in ('platform', 'prefix', 'allowCustom', 'allowInline', 'webhookId', 'webhookToken', 'webhookName', 'webhookAvatar', 'defaultRoomsLocked', 'defaultNoText', 'defaultShown', 'createPrivateChannel', 'tempCategory', @@ -1052,162 +231,6 @@ class Database { context.channel = channel; return context; } - - async getCustomCommands() { - this.logger.debug(`Shards: ${this.bot.shardCount}, this shard's id: ${this.bot.shardId}`); - const query = SQL`SELECT * FROM custom_commands WHERE (guild_id >> 22) % ${this.bot.shardCount} = ${this.bot.shardId}`; - const res = await this.db.query(query); - if (res[0]) { - return res[0].map(value => - new CustomCommand(this.bot, value.command, value.response, value.guild_id)); - } - return []; - } - - async getCustomCommandsForGuild(guild) { - const query = SQL`SELECT * FROM custom_commands WHERE guild_id = ${guild.id}`; - const res = await this.db.query(query); - if (res[0]) { - return res[0].map(value => - new CustomCommand(this.bot, value.command, value.response, value.guild_id)); - } - return []; - } - - async addCustomCommand(message, call, response) { - const id = `${call}${message.guild.id}`; - const query = SQL`INSERT INTO custom_commands (command_id, guild_id, command, response, creator_id) - VALUES (${id}, ${message.guild.id}, ${call}, ${response}, ${message.author.id})`; - return this.db.query(query); - } - - async deleteCustomCommand(message, call) { - const id = `${call}${message.guild.id}`; - const query = SQL`DELETE FROM custom_commands WHERE command_id = ${id}`; - return this.db.query(query); - } - - async removeGuildCustomCommands(guildId) { - const query = SQL`DELETE FROM custom_commands WHERE guild_id = ${guildId}`; - return this.db.query(query); - } - - /** - * Clear welcome messages for a guild - * @param {Guild} guild The guild - * @param {boolean} isDm whether or not the message to be cleared is the dm or in-chat message - * @returns {Promise} - */ - async clearWelcomeForGuild(guild, isDm) { - const query = SQL`DELETE FROM welcome_messages WHERE guild_id=${guild.id} && is_dm=${isDm}`; - return this.db.query(query); - } - - /** - * Sets a ping message for an item or event type in a guild - * @param {Message} message Message to derive information for guild and channel - * @param {boolean} isDm whether or not this is for the dm welcome - * @param {string} text The text of the ping message - * @returns {Promise} - */ - async setWelcome(message, isDm, text) { - const query = SQL`INSERT INTO welcome_messages (guild_id, is_dm, channel_id, message) VALUES (${message.guild.id}, ${isDm}, ${message.channel.id}, ${text}) - ON DUPLICATE KEY UPDATE message = ${text};`; - return this.db.query(query); - } - - async getWelcomes(guild) { - if (guild) { - const query = SQL`SELECT * FROM welcome_messages WHERE guild_id=${guild.id}`; - const res = await this.db.query(query); - if (res[0]) { - return res[0].map(value => - ({ - isDm: value.is_dm, - message: value.message, - channel: this.bot.client.channels.get(value.channel_id), - })); - } - return []; - } - return []; - } - - async addNewBuild(title, body, image, owner) { - const buildId = makeId(); - const query = SQL`INSERT INTO builds VALUES (${buildId}, ${title}, ${body}, ${image}, ${owner.id}) - ON DUPLICATE KEY UPDATE title=${title}, body=${body}, image=${image};`; - await this.db.query(query); - return { - id: buildId, title, body, url: image, owner, - }; - } - - async getBuild(buildId) { - if (buildId) { - const query = SQL`SELECT * FROM builds WHERE build_id=${buildId};`; - const res = await this.db.query(query); - if (res[0] && res[0][0]) { - const result = res[0][0]; - return { - title: result.title, - body: result.body, - url: result.image, - id: result.build_id, - owner: this.bot.client.users.get(result.owner_id) || result.owner_id, - owner_id: result.owner_id, - }; - } - } - return { - id: '', - title: 'No Such Build', - body: '', - url: '', - owner: '', - }; - } - - async deleteBuild(buildId) { - const query = SQL`DELETE FROM builds WHERE build_id=${buildId};`; - return this.db.query(query); - } - - async getBuilds(owner, author) { - const query = SQL`SELECT * FROM builds WHERE owner_id LIKE ${owner ? '%' : author.id};`; - const res = await this.db.query(query); - if (res[0]) { - return res[0].map(build => ({ - id: build.build_id, - owner: this.bot.client.users.get(build.owner_id) || build.owner_id, - title: build.title, - })); - } - return []; - } - - async setBuildFields(buildId, { title = undefined, body = undefined, image = undefined }) { - const setTokens = []; - if (title) { - setTokens.push(`title = '${title.trim().replace(/'/ig, '\\\'')}'`); - } - if (body) { - setTokens.push(`body = '${body.trim().replace(/'/ig, '\\\'')}'`); - } - if (image) { - setTokens.push(`image = '${image.trim().replace(/'/ig, '\\\'')}'`); - } - if (setTokens.length > 0) { - const query = `UPDATE builds SET ${setTokens.join(', ')} WHERE build_id='${buildId}';`; - return this.db.query(query); - } - return false; - } - - async deleteWebhooksForChannel(channelId) { - const query = SQL`DELETE FROM settings WHERE channel_id=${channelId} and setting like "webhook%";`; - return this.db.query(query); - } } module.exports = Database; diff --git a/src/settings/DatabaseQueries/BuildQueries.js b/src/settings/DatabaseQueries/BuildQueries.js new file mode 100644 index 000000000..7feec1447 --- /dev/null +++ b/src/settings/DatabaseQueries/BuildQueries.js @@ -0,0 +1,91 @@ +'use strict'; + +const SQL = require('sql-template-strings'); + +const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; +const makeId = () => { + const tokens = []; + for (let i = 0; i < 8; i += 1) { + tokens.push(possible.charAt(Math.floor(Math.random() * possible.length))); + } + return tokens.join(''); +}; + +class BuildQueries { + constructor(db) { + this.db = db; + } + + async addNewBuild(title, body, image, owner) { + const buildId = makeId(); + const query = SQL`INSERT INTO builds VALUES (${buildId}, ${title}, ${body}, ${image}, ${owner.id}) + ON DUPLICATE KEY UPDATE title=${title}, body=${body}, image=${image};`; + await this.db.query(query); + return { + id: buildId, title, body, url: image, owner, + }; + } + + async getBuild(buildId) { + if (buildId) { + const query = SQL`SELECT * FROM builds WHERE build_id=${buildId};`; + const res = await this.db.query(query); + if (res[0] && res[0][0]) { + const result = res[0][0]; + return { + title: result.title, + body: result.body, + url: result.image, + id: result.build_id, + owner: this.bot.client.users.get(result.owner_id) || result.owner_id, + owner_id: result.owner_id, + }; + } + } + return { + id: '', + title: 'No Such Build', + body: '', + url: '', + owner: '', + }; + } + + async deleteBuild(buildId) { + const query = SQL`DELETE FROM builds WHERE build_id=${buildId};`; + return this.db.query(query); + } + + async getBuilds(owner, author) { + const query = SQL`SELECT * FROM builds WHERE owner_id LIKE ${owner ? '%' : author.id};`; + const res = await this.db.query(query); + if (res[0]) { + return res[0].map(build => ({ + id: build.build_id, + owner: this.bot.client.users.get(build.owner_id) || build.owner_id, + title: build.title, + })); + } + return []; + } + + async setBuildFields(buildId, { title = undefined, body = undefined, image = undefined }) { + const setTokens = []; + if (title) { + setTokens.push(`title = '${title.trim().replace(/'/ig, '\\\'')}'`); + } + if (body) { + setTokens.push(`body = '${body.trim().replace(/'/ig, '\\\'')}'`); + } + if (image) { + setTokens.push(`image = '${image.trim().replace(/'/ig, '\\\'')}'`); + } + if (setTokens.length > 0) { + const query = `UPDATE builds SET ${setTokens.join(', ')} WHERE build_id='${buildId}';`; + return this.db.query(query); + } + return false; + } +} + +module.exports = BuildQueries; diff --git a/src/settings/DatabaseQueries/CustomCommandQueries.js b/src/settings/DatabaseQueries/CustomCommandQueries.js new file mode 100644 index 000000000..4d1ff51b4 --- /dev/null +++ b/src/settings/DatabaseQueries/CustomCommandQueries.js @@ -0,0 +1,51 @@ +'use strict'; + +const SQL = require('sql-template-strings'); +const CustomCommand = require('../../models/CustomCommand.js'); + +class CustomCommandQueries { + constructor(db) { + this.db = db; + } + + async getCustomCommands() { + this.logger.debug(`Shards: ${this.bot.shardCount}, this shard's id: ${this.bot.shardId}`); + const query = SQL`SELECT * FROM custom_commands WHERE (guild_id >> 22) % ${this.bot.shardCount} = ${this.bot.shardId}`; + const res = await this.db.query(query); + if (res[0]) { + return res[0].map(value => + new CustomCommand(this.bot, value.command, value.response, value.guild_id)); + } + return []; + } + + async getCustomCommandsForGuild(guild) { + const query = SQL`SELECT * FROM custom_commands WHERE guild_id = ${guild.id}`; + const res = await this.db.query(query); + if (res[0]) { + return res[0].map(value => + new CustomCommand(this.bot, value.command, value.response, value.guild_id)); + } + return []; + } + + async addCustomCommand(message, call, response) { + const id = `${call}${message.guild.id}`; + const query = SQL`INSERT INTO custom_commands (command_id, guild_id, command, response, creator_id) + VALUES (${id}, ${message.guild.id}, ${call}, ${response}, ${message.author.id})`; + return this.db.query(query); + } + + async deleteCustomCommand(message, call) { + const id = `${call}${message.guild.id}`; + const query = SQL`DELETE FROM custom_commands WHERE command_id = ${id}`; + return this.db.query(query); + } + + async removeGuildCustomCommands(guildId) { + const query = SQL`DELETE FROM custom_commands WHERE guild_id = ${guildId}`; + return this.db.query(query); + } +} + +module.exports = CustomCommandQueries; diff --git a/src/settings/DatabaseQueries/DBMQueries.js b/src/settings/DatabaseQueries/DBMQueries.js new file mode 100644 index 000000000..0a2d84b5f --- /dev/null +++ b/src/settings/DatabaseQueries/DBMQueries.js @@ -0,0 +1,107 @@ +'use strict'; + +const Promise = require('bluebird'); +const SQL = require('sql-template-strings'); +const schema = require('../schema.js'); + +class DBMQueries { + constructor(db) { + this.db = db; + } + + /** + * Creates the required tables in the database + * @returns {Promise} + */ + createSchema() { + return Promise.mapSeries(schema, q => this.db.query(q)); + } + + /** + * Initialize data for guilds in channels for existing guilds + * @param {Client} client for pulling guild information + */ + async ensureData(client) { + const promises = []; + client.guilds.array().forEach((guild) => { + if (guild.channels.array().length) { + promises.push(this.addGuild(guild)); + } + }); + await Promise.all(promises); + } + + /** + * Adds a new guild to the database + * @param {Guild} guild A Discord guild (server) + * @returns {Promise} + */ + addGuild(guild) { + if (!guild.available) return undefined; + + const channelIDs = guild.channels.filter(c => c.type === 'text').keyArray(); + if (channelIDs.length) { + const query = SQL`INSERT IGNORE INTO channels (id, guild_id) VALUES `; + channelIDs.forEach((id, index) => { + query.append(SQL`(${id}, ${guild.id})`).append(index !== (channelIDs.length - 1) ? ',' : ';'); + }); + + return this.db.query(query); + } + return undefined; + } + + /** + * Adds a new guild text channel to the database + * @param {TextChannel} channel A discord guild text channel + * @returns {Promise} + */ + async addGuildTextChannel(channel) { + const query = SQL`INSERT IGNORE INTO channels (id, guild_id) VALUES (${channel.id}, ${channel.guild.id});`; + return this.db.query(query); + } + + /** + * Adds a new DM or group DM channel to the database + * @param {DMChannel|GroupDMChannel} channel A discord DM or group DM channel + * @returns {Promise} + */ + async addDMChannel(channel) { + const query = SQL`INSERT IGNORE INTO channels (id) VALUES (${channel.id});`; + return this.db.query(query); + } + + /** + * Deletes a channel from the database + * @param {Channel} channel The channel to delete + * @returns {Promise} + */ + async deleteChannel(channel) { + const query = SQL`DELETE FROM channels WHERE id = ${channel.id};`; + return this.db.query(query); + } + + /** + * Remove guild from database + * @param {snowflake} guild Guild to be removed from database + * @returns {Promise.} status of removal + */ + async removeGuild(guild) { + const query = SQL`DELETE FROM channels WHERE guild_id = ${guild.id}`; + await this.db.query(query); + const channelIds = guild.channels.keyArray(); + const results = []; + channelIds.forEach((channelId) => { + results.push(this.removeChannelPermissions(channelId)); + results.push(this.removeItemNotifications(channelId)); + results.push(this.removeSettings(channelId)); + }); + results.push(this.removePrivateChannels(guild.id)); + results.push(this.removeGuildPermissions(guild.id)); + results.push(this.removePings(guild.id)); + results.push(this.removeGuildCustomCommands(guild.id)); + return Promise.all(results); + } +} + +module.exports = DBMQueries; diff --git a/src/settings/DatabaseQueries/PermissionsQueries.js b/src/settings/DatabaseQueries/PermissionsQueries.js new file mode 100644 index 000000000..2e28089ac --- /dev/null +++ b/src/settings/DatabaseQueries/PermissionsQueries.js @@ -0,0 +1,243 @@ +'use strict'; + +const SQL = require('sql-template-strings'); + +class PermissionsQueries { + constructor(db) { + this.db = db; + } + + /** + * Enables or disables a command for an individual member in a channel + * @param {GuildChannel} channel - A discord guild channel + * @param {GuildMember} member - A discord guild member + * @param {string} commandId - The ID of the command to set the permission for + * @param {boolean} allowed - Whether this member should be allowed to use this command + * @returns {Promise} + */ + async setChannelPermissionForMember(channel, member, commandId, allowed) { + const query = SQL`INSERT INTO channel_permissions VALUES + (${channel.id}, ${member.id}, TRUE, ${commandId}, ${allowed}) + ON DUPLICATE KEY UPDATE allowed = ${allowed};`; + return this.db.query(query); + } + + /** + * Enables or disables a command for a role in a channel + * @param {GuildChannel} channel - A discord guild channel + * @param {Role} role - A discord role + * @param {string} commandId - The ID of the command to set the permission for + * @param {boolean} allowed - Whether this member should be allowed to use this command + * @returns {Promise} + */ + async setChannelPermissionForRole(channel, role, commandId, allowed) { + const query = SQL`INSERT INTO channel_permissions VALUES + (${channel.id}, ${role.id}, FALSE, ${commandId}, ${allowed}) + ON DUPLICATE KEY UPDATE allowed = ${allowed};`; + return this.db.query(query); + } + + /** + * Enables or disables a command for an individual member in a guild + * @param {Guild} guild - A discord guild + * @param {GuildMember} member - A discord guild member + * @param {string} commandId - The ID of the command to set the permission for + * @param {boolean} allowed - Whether this member should be allowed to use this command + * @returns {Promise} + */ + async setGuildPermissionForMember(guild, member, commandId, allowed) { + const query = SQL`INSERT INTO guild_permissions VALUES + (${guild.id}, ${member.id}, TRUE, ${commandId}, ${allowed}) + ON DUPLICATE KEY UPDATE allowed = ${allowed};`; + return this.db.query(query); + } + + /** + * Enables or disables a command for a role in a channel + * @param {Guild} guild - A discord guild + * @param {Role} role - A discord role + * @param {string} commandId - The ID of the command to set the permission for + * @param {boolean} allowed - Whether this member should be allowed to use this command + * @returns {Promise} + */ + async setGuildPermissionForRole(guild, role, commandId, allowed) { + const query = SQL`INSERT INTO guild_permissions VALUES + (${guild.id}, ${role.id}, FALSE, ${commandId}, ${allowed}) + ON DUPLICATE KEY UPDATE allowed = ${allowed};`; + return this.db.query(query); + } + + /** + * Gets whether or not a user is allowed to use a particular command in a channel + * @param {Channel} channel - A Discord channel + * @param {string} memberId - String representing a user identifier + * @param {string} commandId - String representing a command identifier + * @returns {Promise} + */ + async getChannelPermissionForMember(channel, memberId, commandId) { + const query = SQL`SELECT allowed FROM channel_permissions + WHERE channel_id = ${channel.id} AND command_id = ${commandId} + AND is_user = true AND target_id = ${memberId}`; + const res = await this.db.query(query); + + if (!res || res[0].length === 0) { + return 'none'; + } + return res.rows[0].allowed; + } + + /** + * Gets whether or not a role is allowed to use a particular command in a channel + * @param {Channel} channel A Discord channel + * @param {string} role String representing a user identifier + * @param {string} commandId String representing a command identifier + * @returns {Promise} + */ + async getChannelPermissionForRole(channel, role, commandId) { + const query = SQL`SELECT allowed FROM channel_permissions + WHERE channel_id = ${channel.id} AND command_id = ${commandId} + AND is_user = false AND target_id = ${role.id}`; + const res = await this.db.query(query); + + if (!res || res[0].length === 0) { + return 'none'; + } + return res.rows[0].allowed === 1; + } + + /** + * Gets whether or not a role in the user's + * roles allows the user to use a particular command in a channel + * @param {Channel} channel - A Discord channel + * @param {User} user - A Discord user + * @param {string} commandId - A command id for designating + * a command to check permissions for + * @returns {Promise} + */ + async getChannelPermissionForUserRoles(channel, user, commandId) { + const userRoles = channel.type === 'text' ? channel.guild.member(user).roles : {}; + const userRoleIds = userRoles.keyArray(); + const query = SQL`SELECT target_id, is_user, allowed + FROM channel_permissions + WHERE channel_permissions.channel_id = ${channel.id} + AND channel_permissions.target_id IN (${userRoleIds}) + AND command_id = ${commandId} + UNION SELECT guild_permissions.target_id AS target_id, + guild_permissions.is_user AS is_user, + guild_permissions.allowed AS allowed + FROM guild_permissions + INNER JOIN channels USING (guild_id) + LEFT JOIN channel_permissions ON + channel_permissions.channel_id = channels.id + AND guild_permissions.command_id = channel_permissions.command_id + AND guild_permissions.target_id = channel_permissions.target_id + WHERE channel_permissions.target_id IS NULL + AND channels.id = ${channel.id} + AND guild_permissions.target_id IN (${userRoleIds});`; + const res = await this.db.query(query); + if (res[0].length === 0) { + return 'none'; + } + return res[0][0].allowed; + } + + /** + * Gets whether or not a user is allowed to use a particular command in a guild + * @param {Guild} guild - A Discord guild + * @param {string} memberId - String representing a user identifier + * @param {string} commandId - String representing a command identifier + * @returns {Promise} + */ + async getGuildPermissionForMember(guild, memberId, commandId) { + const query = SQL`SELECT allowed FROM guild_permissions + WHERE channel_id = ${guild.id} AND command_id = ${commandId} + AND is_user = true AND target_id = ${memberId}`; + const res = await this.db.query(query); + if (res.rows.length === 0) { + throw new Error(`The guild permissions for the guild ${guild.id} + for member ${memberId} was not found in the database`); + } + return res.rows[0].allowed; + } + + /** + * Gets whether or not a role is allowed to use a particular command in a guild + * @param {Guild} guild - A Discord guild + * @param {string} role String representing a user identifier + * @param {string} commandId String representing a command identifier + * @returns {Promise} + */ + async getGuildPermissionForRole(guild, role, commandId) { + const query = SQL`SELECT allowed FROM guild_permissions + WHERE channel_id = ${guild.id} AND command_id = ${commandId} + AND is_user = false AND target_id = ${role.id}`; + const res = await this.db.query(query); + if (res.rows.length === 0) { + throw new Error(`The guild permissions for the guild ${guild.id} + for member ${role.id} was not found in the database`); + } + return res.rows[0].allowed; + } + + /** + * Remove permissions corresponding to the guild id + * @param {snowflake} guildId guild identifier for removal + * @returns {Promise.} status of removal + */ + async removeGuildPermissions(guildId) { + const query = SQL`DELETE FROM guild_permissions WHERE guild_id = ${guildId}`; + return this.db.query(query); + } + + /** + * Remove permissions corresponding to the guild id + * @param {snowflake} channelId channel identifier for removal + * @returns {Promise.} status of removal + */ + async removeChannelPermissions(channelId) { + const query = SQL`DELETE FROM channel_permissions WHERE channel_id = ${channelId}`; + return this.db.query(query); + } + + /** + * Get a dump of allowed and denied permissions + * @param {Guild} guild guild to fetch settings for + * @returns {Object} Data about allowed data + */ + async permissionsForGuild(guild) { + const query = SQL`SELECT * FROM guild_permissions WHERE guild_id = ${guild.id}`; + const res = await this.db.query(query); + if (res[0]) { + return res[0].map(value => ({ + level: 'guild', + command: value.command_id, + isAllowed: value.allowed, + type: value.is_user ? 'user' : 'role', + appliesToId: value.target_id, + })); + } + return []; + } + + /** + * Get a dump of allowed and denied permissions + * @param {Channel} channel channel to fetch settings for + * @returns {Object} Data about allowed data + */ + async permissionsForChannel(channel) { + const query = SQL`SELECT * FROM channel_permissions WHERE channel_id = ${channel.id}`; + const res = await this.db.query(query); + if (res[0]) { + return res[0].map(value => ({ + level: 'channel', + command: value.command_id, + isAllowed: value.allowed, + type: value.is_user ? 'user' : 'role', + appliesToId: value.target_id, + })); + } + return []; + } +} + +module.exports = PermissionsQueries; diff --git a/src/settings/DatabaseQueries/PingsQueries.js b/src/settings/DatabaseQueries/PingsQueries.js new file mode 100644 index 000000000..58b36ff13 --- /dev/null +++ b/src/settings/DatabaseQueries/PingsQueries.js @@ -0,0 +1,163 @@ +'use strict'; + +const SQL = require('sql-template-strings'); + +class PingsQueries { + constructor(db) { + this.db = db; + } + + /** + * Enables or disables pings for an item in a channel + * @param {TextChannel} channel The channel where to enable notifications + * @param {string} item The item to set ping status for + * @param {boolean} enabled true to enable pinging, false to disable + * @returns {Promise} + */ + async setItemPing(channel, item, enabled) { + const query = SQL`UPDATE item_notifications SET ping = ${enabled} WHERE channel_id = ${channel.id} + AND item = ${item};`; + return this.db.query(query); + } + + /** + * Enables or disables pings for an event type in a channel + * @param {TextChannel} channel The channel where to enable notifications + * @param {string} type The event type to set ping status for + * @param {boolean} enabled true to enable pinging, false to disable + * @returns {Promise} + */ + async setEventTypePing(channel, type, enabled) { + const query = SQL`UPDATE type_notifications SET ping = ${enabled} WHERE channel_id = ${channel.id} + AND type = ${type};`; + return this.db.query(query); + } + + /** + * Sets a ping message for an item or event type in a guild + * @param {Guild} guild The guild + * @param {string} itemOrType The item or event type to set the ping message for + * @param {string} text The text of the ping message + * @returns {Promise} + */ + async setPing(guild, itemOrType, text) { + const query = SQL`INSERT INTO pings VALUES (${guild.id}, ${itemOrType}, ${text}) + ON DUPLICATE KEY UPDATE text = ${text};`; + return this.db.query(query); + } + + /** + * Get all pings for a guild for the provided event types and items + * @param {Guild} guild Guild to get pings for + * @param {Array.} itemsOrTypes array of strings corresponding to event and reward types + * @returns {Promise.} Promise of a string to prepend to a message + */ + async getPing(guild, itemsOrTypes) { + const query = SQL`SELECT text FROM pings WHERE guild_id=${guild.id} AND item_or_type in (${itemsOrTypes})`; + const res = await this.db.query(query); + if (res[0].length === 0) { + return ''; + } + return res[0] + .map(result => result.text).join(', '); + } + + async getPingsForGuild(guild) { + if (guild) { + const query = SQL`SELECT item_or_type, text FROM pings WHERE guild_id=${guild.id}`; + const res = await this.db.query(query); + + if (res[0].length === 0) { + return []; + } + return res[0] + .map(result => ({ text: result.text, thing: result.item_or_type })); + } + return []; + } + + /** + * Removes a ping message + * @param {Guild} guild The guild where the ping message is currently being sent + * @param {string} itemOrType The item or event type associated to the ping message + * @returns {Promise} + */ + async removePing(guild, itemOrType) { + if (guild) { + const query = SQL`DELETE FROM pings WHERE guild_id = ${guild.id} AND item_or_type = ${itemOrType};`; + return this.db.query(query); + } + return false; + } + + /** + * Returns all the channels that should get a notification for the items in the list + * @param {string} type The type of the event + * @param {string} platform The platform of the event + * @param {Array.} items The items in the reward that is being notified + * @returns {Promise.>} + */ + async getNotifications(type, platform, items) { + try { + const query = SQL`SELECT DISTINCT channels.id as channelId + FROM type_notifications` + .append(items && items.length > 0 ? + SQL` INNER JOIN item_notifications ON type_notifications.channel_id = item_notifications.channel_id` : SQL``) + .append(SQL` INNER JOIN channels ON channels.id = type_notifications.channel_id`) + .append(SQL` INNER JOIN settings ON channels.id = settings.channel_id`) + .append(SQL` + WHERE type_notifications.type = ${String(type)} + AND MOD(IFNULL(channels.guild_id, 0) >> 22, ${this.bot.shardCount}) = ${this.bot.shardId} + AND settings.setting = "platform" AND settings.val = ${platform || 'pc'} `) + .append(items && items.length > 0 ? SQL`AND item_notifications.item IN (${items}) + AND item_notifications.channel_id = settings.channel_id;` : SQL`;`); + return (await this.db.query(query))[0]; + } catch (e) { + this.logger.error(e); + return []; + } + } + + /** + * Remove pings corresponding to the guild id + * @param {snowflake} guildId guild identifier for removal + * @returns {Promise.} status of removal + */ + async removePings(guildId) { + const query = SQL`DELETE FROM pings WHERE guild_id = ${guildId}`; + return this.db.query(query); + } + + /** + * Set the notified ids for a given platform and shard id + * @param {string} platform platform corresponding to notified ids + * @param {number} shardId shard id corresponding to notified ids + * @param {JSON} notifiedIds list of oids that have been notifiedIds + * @returns {Promise} + */ + async setNotifiedIds(platform, shardId, notifiedIds) { + const query = SQL`INSERT INTO notified_ids VALUES + (${shardId}, ${platform}, JSON_ARRAY(${notifiedIds})) + ON DUPLICATE KEY UPDATE id_list = JSON_ARRAY(${notifiedIds});`; + return this.db.query(query); + } + + /** + * Get list of notified ids for the given platform and shard id + * @param {string} platform Platform + * @param {number} shardId Identifier of the corresponding shard + * @returns {Promise.} Array of notified oids + */ + async getNotifiedIds(platform, shardId) { + const query = SQL`SELECT id_list + FROM notified_ids + WHERE shard_id=${shardId} AND platform=${platform};`; + const res = await this.db.query(query); + if (res[0].length === 0) { + return []; + } + return res[0][0].id_list; + } +} + +module.exports = PingsQueries; diff --git a/src/settings/DatabaseQueries/PrivateRoomQueries.js b/src/settings/DatabaseQueries/PrivateRoomQueries.js new file mode 100644 index 000000000..66afb5fae --- /dev/null +++ b/src/settings/DatabaseQueries/PrivateRoomQueries.js @@ -0,0 +1,112 @@ +'use strict'; + +const SQL = require('sql-template-strings'); + +class PrivateRoomQueries { + constructor(db) { + this.db = db; + } + + async removePrivateChannels(guild) { + const query = SQL`DELETE FROM private_channels WHERE guild_id=${guild.id}`; + return this.db.query(query); + } + + /** + * Set the joinable roles for a guild + * @param {Guild} guild Guild to set joinable roles for + * @param {Array.} roles Array of role ids to set + * @returns {Promise} + */ + async setRolesForGuild(guild, roles) { + const query = SQL`INSERT INTO guild_joinable_roles VALUES + (${guild.id}, JSON_ARRAY(${roles})) + ON DUPLICATE KEY UPDATE id_list = JSON_ARRAY(${roles});`; + return this.db.query(query); + } + + /** + * Get the roles that can be joined for a guild + * @param {Guild} guild [description] + * @returns {Promise.>} Promise of array of roles that are joinable + */ + async getRolesForGuild(guild) { + const query = SQL`SELECT id_list + FROM guild_joinable_roles + WHERE guild_id=${guild.id}`; + const res = await this.db.query(query); + if (res[0][0]) { + const validListIds = res[0][0].id_list + .filter(id => typeof this.bot.client.guilds.get(guild.id).roles.get(id) !== 'undefined'); + const validList = validListIds + .map(id => this.bot.client.guilds.get(guild.id).roles.get(id)); + return validList; + } + return []; + } + + async addPrivateRoom(guild, textChannel, voiceChannel, category, member) { + let query; + if (textChannel) { + query = SQL`INSERT INTO private_channels (guild_id, text_id, voice_id, category_id, created_by) VALUES (${guild.id}, ${textChannel.id}, ${voiceChannel.id}, ${category.id}, ${member.id})`; + } else { + query = SQL`INSERT INTO private_channels (guild_id, text_id, voice_id, category_id, created_by) VALUES (${guild.id}, 0, ${voiceChannel.id}, ${category.id}, ${member.id})`; + } + return this.db.query(query); + } + + async deletePrivateRoom(room) { + const { + guild, voiceChannel, voiceId, + } = room; + const query = SQL`DELETE FROM private_channels WHERE guild_id = ${guild.id} AND voice_id = ${voiceChannel ? voiceChannel.id : voiceId}`; + return this.db.query(query); + } + + async userHasRoom(member) { + const query = SQL`SELECT * FROM private_channels WHERE guild_id = ${member.guild.id} and created_by = ${member.id}`; + const res = await this.db.query(query); + return res[0].length > 0; + } + + async getUsersRoom(member) { + const query = SQL`SELECT guild_id, text_id, voice_id, category_id, created_at as crt_sec FROM private_channels WHERE guild_id = ${member.guild.id} and created_by = ${member.id}`; + const res = await this.db.query(query); + if (res[0]) { + return { + guild: this.bot.client.guilds.get(res[0][0].guild_id), + textChannel: res[0][0].text_id + ? this.bot.client.channels.get(res[0][0].text_id) : undefined, + voiceChannel: this.bot.client.channels.get(res[0][0].voice_id), + category: this.bot.client.channels.get(res[0][0].category_id), + createdAt: res[0][0].crt_sec, + guildId: res[0][0].guild_id, + textId: res[0][0].text_id || undefined, + voiceId: res[0][0].voice_id, + categoryId: res[0][0].category_id, + }; + } + return undefined; + } + + async getPrivateRooms() { + const query = SQL`SELECT guild_id, text_id, voice_id, category_id, created_at as crt_sec FROM private_channels WHERE MOD(IFNULL(guild_id, 0) >> 22, ${this.bot.shardCount}) = ${this.bot.shardId}`; + const res = await this.db.query(query); + if (res[0]) { + return res[0].map(value => ({ + guild: this.bot.client.guilds.get(value.guild_id), + textChannel: value.text_id ? this.bot.client.channels.get(value.text_id) : undefined, + voiceChannel: this.bot.client.channels.get(value.voice_id), + category: this.bot.client.channels.get(value.category_id), + createdAt: value.crt_sec, + guildId: value.guild_id, + textId: value.text_id || undefined, + voiceId: value.voice_id, + categoryId: value.category_id, + })); + } + return []; + } +} + +module.exports = PrivateRoomQueries; diff --git a/src/settings/DatabaseQueries/PromocodeQueries.js b/src/settings/DatabaseQueries/PromocodeQueries.js new file mode 100644 index 000000000..e67f4023d --- /dev/null +++ b/src/settings/DatabaseQueries/PromocodeQueries.js @@ -0,0 +1,229 @@ +'use strict'; + +const SQL = require('sql-template-strings'); + +class PromocodeQueries { + constructor(db) { + this.db = db; + } + + async addPool(id, name, ownerId, type, guild) { + const query = SQL`INSERT IGNORE INTO code_pool + (pool_id, pool_name, pool_owner, pool_type, pool_default_guild) + VALUES + (${id}, ${name}, ${ownerId}, ${type || 'glyph'}, ${guild.id});`; + return this.db.query(query); + } + + async deletePool(id) { + return this.db.query(SQL`DELETE FROM code_pool WHERE pool_id = ${id}`); + } + + async setPoolName(id, name) { + const query = SQL`UPDATE code_pool SET pool_name = ${name} WHERE pool_id = ${id};`; + return this.db.query(query); + } + + async setPoolPassword(id, password) { + const query = SQL`UPDATE code_pool SET pool_password = ${password} WHERE pool_id = ${id};`; + return this.db.query(query); + } + + async setPoolType(id, type) { + const query = SQL`UPDATE code_pool SET pool_type = ${type} WHERE pool_id = ${id};`; + return this.db.query(query); + } + + async clearPoolPassword(id) { + const query = SQL`UPDATE code_pool SET pool_password = NULL WHERE pool_id = ${id};`; + return this.db.query(query); + } + + async restrictPool(id, status) { + const query = SQL`UPDATE code_pool SET pool_restricted = ${status} WHERE pool_id = ${id};`; + return this.db.query(query); + } + + async isPoolRestricted(id) { + const query = SQL`SELECT pool_restricted FROM code_pool WHERE pool_id = ${id};`; + const res = await this.db.query(query); + if (res[0].length === 0) { + return undefined; + } + return res[0].pool_restricted; + } + + async isPoolPublic(id) { + const query = SQL`SELECT pool_public FROM code_pool WHERE pool_id = ${id};`; + const res = await this.db.query(query); + if (res[0].length === 0) { + return undefined; + } + return res[0].pool_public; + } + + async setPoolGuild(id, guildId) { + const query = SQL`UPDATE code_pool SET pool_default_guild = ${guildId} WHERE pool_id = ${id};`; + return this.db.query(query); + } + + async setPoolPublic(id, status) { + const query = SQL`UPDATE code_pool SET pool_public = ${status} WHERE pool_id = ${id};`; + return this.db.query(query); + } + + async addPoolManager(id, manager) { + const query = SQL`INSERT IGNORE INTO code_pool_manager VALUES (${id}, ${manager});`; + return this.db.query(query); + } + + async addPoolManagers(id, newManagers) { + const query = SQL`INSERT IGNORE INTO code_pool_manager VALUES ?;`; + query.values = newManagers.map(manager => ([id, manager])); + return this.db.query(query); + } + + async removePoolManager(id, manager) { + const query = SQL`DELETE FROM code_pool_manager WHERE pool_id = ${id} AND pool_manager = ${manager}`; + return this.db.query(query); + } + + async removePoolManagers(id, removeManagers) { + const query = SQL`DELETE FROM code_pool_manager WHERE pool_id = ${id} AND pool_manager in (?)`; + query.values = removeManagers; + return this.db.query(query); + } + + async addCode(id, platform, adder, grantedTo, grantedBy, code) { + const query = SQL`INSERT IGNORE INTO code_pool_member + VALUES ( + ${id}, + ${platform || 'pc'}, + ${adder}, + NOW(), + ${grantedTo}, + ${grantedBy}, + ${grantedTo ? new Date.toLocaleString() : undefined}, + ${code})`; + return this.query.db(query); + } + + async getCode(code) { + const query = SQL`SELECT * FROM code_pool_member WHERE code = ${code};`; + return (await this.db.query(query))[0]; + } + + async getCodesInPools(poolIds) { + const query = SQL`SELECT * from code_pool_member WHERE pool_id in (${poolIds})`; + const res = await this.db.query(query); + let codes = []; + if (res[0]) { + this.logger.debug(JSON.stringify(res[0])); + codes = res[0].map(row => ({ + id: row.pool_id, + platform: row.platform, + addedBy: row.added_by || null, + addedOn: JSON.stringify(new Date(row.added_on)) || null, + grantedTo: row.granted_to || null, + grantedBy: row.granted_by || null, + grantedOn: row.granted_on === null ? null : JSON.stringify(new Date(row.granted_on)), + code: row.code, + })); + } + return codes; + } + + async grantCode(code, grantedTo, grantedBy) { + const query = SQL`UPDATE code_pool_member SET granted_to = ${grantedTo}, granted_by = ${grantedBy}, granted_on = NOW();`; + return this.db.query(query); + } + + async revokeCode(code) { + const query = SQL`UPDATE code_pool_member SET granted_to = NULL, granted_by = NULL, granted_on = NULL WHERE code = ${code};`; + return this.db.query(query); + } + + async getNextCodeInPool(platform, pool) { + const any = 'ANY'; + const query = SQL` + SELECT + m.code, + m.added_on as addedOn, + m.granted_to as grantedTo, + p.pool_password as password + FROM + code_pool_member as m, + code_pool as p + WHERE m.platform = ${platform} + AND p.pool_id = ${pool} + AND p.pool_id = m.pool_id + AND (m.granted_to IS NULL OR m.granted_to = ${any}) + ORDER BY m.added_on LIMIT 1;`; + const res = await this.db.query(query); + if (res[0].length === 0) { + return undefined; + } + return res[0]; + } + + async addCodes(codes) { + const query = SQL`INSERT IGNORE INTO code_pool_member VALUES ?;`; + query.values = codes.map(code => [ + code.id, + code.platform || 'pc', + code.adder, + new Date.toLocaleString(), + code.grantedTo, + code.grantedBy, + code.grantedTo ? new Date.toLocaleString() : null, + code.code, + ]); + return this.db.query(query); + } + + async getPoolsUserManages(user) { + const query = SQL`SELECT code_pool_manager.pool_id, + code_pool.pool_name as name, + COUNT(code_pool_member.code) as len + FROM code_pool_manager + LEFT JOIN code_pool + ON code_pool.pool_id = code_pool_manager.pool_id + LEFT JOIN code_pool_member + ON (code_pool_member.pool_id = code_pool_manager.pool_id) + WHERE code_pool_manager.pool_manager = ${user.id} + GROUP BY code_pool_manager.pool_id;`; + const res = await this.db.query(query); + + if (!(res && res[0]) || res[0].length === 0) { + return []; + } + return res[0]; + } + + async userManagesPool(user, pool) { + const query = SQL`SELECT pool_id FROM code_pool_manager WHERE pool_manager = ${user.id} AND pool_id = ${pool}`; + const res = await this.db.query(query); + if (res[0].length === 0) { + return false; + } + return true; + } + + async getGuildsPool(guild) { + const query = SQL`SELECT pool_id FROM code_pool WHERE pool_default_guild = ${guild.id};`; + const res = await this.db.query(query); + if (res[0].length === 0) { + return []; + } + return res[0][0]; + } + + async getUserCodes(user) { + const query = SQL`SELECT p.pool_name, m.platform, m.code + FROM code_pool_member as m, code_pool as p + WHERE m.granted_to = ${user.id};`; + return (await this.db.query(query))[0]; + } +} + +module.exports = PromocodeQueries; diff --git a/src/settings/DatabaseQueries/SettingsQueries.js b/src/settings/DatabaseQueries/SettingsQueries.js new file mode 100644 index 000000000..030afda1c --- /dev/null +++ b/src/settings/DatabaseQueries/SettingsQueries.js @@ -0,0 +1,159 @@ +'use strict'; + +const SQL = require('sql-template-strings'); + +class SettingsQueries { + constructor(db) { + this.db = db; + } + + /** + * Get a guild-wide setting + * @param {Discord.Guild} guild to get settings for + * @param {string} setting setting to fetch + * @returns {string} setting value + */ + async getGuildSetting(guild, setting) { + if (guild) { + const query = SQL`SELECT val FROM settings, channels WHERE channel_id=channels.id and channels.guild_id=${guild.id} and settings.setting=${setting}`; + const res = await this.db.query(query); + if (res[0].length === 0) { + await this.setGuildSetting(guild, setting, this.defaults[`${setting}`]); + return this.defaults[`${setting}`]; + } + await this.setGuildSetting(guild, setting, res[0][0].val); + return res[0][0].val; + } + return this.defaults[`${setting}`]; + } + + async checkWebhookAndReturn(channel, setting) { + if (!/webhook/.test(setting)) { + await this.setChannelSetting(channel, setting, this.defaults[`${setting}`]); + return this.defaults[`${setting}`]; + } + return undefined; + } + + /** + * Get a setting for a particular channel + * @param {Channel} channel channel to get the setting for + * @param {string} setting name of the setting to get + * @returns {Promise} setting + */ + async getChannelSetting(channel, setting) { + if (channel) { + const query = SQL`SELECT val FROM settings WHERE settings.channel_id=${channel.id} and settings.setting=${setting};`; + const res = await this.db.query(query); + if (res[0].length === 0) { + if (channel.type === 'text') { + await this.addGuildTextChannel(channel); + } else { + await this.addDMChannel(channel); + } + return this.checkWebhookAndReturn(channel, setting); + } + return res[0][0].val; + } + return undefined; + } + + async setChannelWebhook(channel, webhook) { + const query = SQL`INSERT INTO settings (channel_id, setting, val) + VALUES (${channel.id}, 'webhookId', ${webhook.id}), + (${channel.id}, 'webhookToken', ${webhook.token}), + (${channel.id}, 'webhookName', ${webhook.name}), + (${channel.id}, 'webhookAvatar', ${webhook.avatar}) + ON DUPLICATE KEY UPDATE + val = Values(val)`; + + return this.db.query(query); + } + + async getChannelWebhook(channel) { + const query = SQL`SELECT setting, val FROM settings where channel_id = ${channel.id} and setting in ('webhookId', 'webhookToken', 'webhookName', 'webhookAvatar');`; + const res = await this.db.query(query); + let webhook = {}; + if (res[0]) { + res[0].map(row => ({ + setting: row.setting, + value: row.val, + })).forEach((row) => { + if (row.setting.indexOf('webhook') > -1) { + webhook[`${row.setting.replace('webhook', '').toLowerCase()}`] = row.value; + } + }); + + if (!webhook.avatar) { + webhook.avatar = this.bot.client.user.avatarURL.replace('?size=2048', ''); + } + if (!webhook.name) { + webhook.name = this.bot.client.user.username; + } + if (!(webhook.id && webhook.token)) { + webhook = undefined; + } + } else { + webhook = undefined; + } + return webhook; + } + + /** + * Get a setting for a particular channel + * @param {Channel} channel channel to get the setting for + * @param {string} setting name of the setting to set + * @param {string|boolean} value value of the setting to be set + * @returns {Promise} setting + */ + async setChannelSetting(channel, setting, value) { + const query = SQL`INSERT IGNORE INTO settings (channel_id, setting, val) VALUE (${channel.id},${setting},${value}) ON DUPLICATE KEY UPDATE val=${value};`; + return this.db.query(query); + } + + async deleteChannelSetting(channel, setting) { + const query = SQL`DELETE FROM settings where channel_id = ${channel.id} and setting=${setting};`; + return this.db.query(query); + } + + /** + * Resets the custom prefix for this guild to the bot's globally configured prefix + * @param {Guild} guild The Discord guild for which to set the response setting + * @param {string} setting Name of the setting to set + * @param {string|boolean} val value of the setting to be set + * @returns {Promise} + */ + async setGuildSetting(guild, setting, val) { + const promises = []; + guild.channels.array().forEach((channel) => { + promises.push(this.setChannelSetting(channel, setting, val)); + }); + return Promise.all(promises); + } + + /** + * Delete a guild setting + * @param {Discord.Guild} guild guild to delete for + * @param {strimg} setting string key + * @returns {Promise} resolution of deletion + */ + async deleteGuildSetting(guild, setting) { + const promises = []; + guild.channels.array().forEach((channel) => { + promises.push(this.deleteChannelSetting(channel, setting)); + }); + return Promise.all(promises); + } + + async removeSettings(channelId) { + const query = SQL`DELETE FROM settings WHERE settings.channel_id=${channelId};`; + return this.db.query(query); + } + + async deleteWebhooksForChannel(channelId) { + const query = SQL`DELETE FROM settings WHERE channel_id=${channelId} and setting like "webhook%";`; + return this.db.query(query); + } +} + +module.exports = SettingsQueries; diff --git a/src/settings/DatabaseQueries/TrackingQueries.js b/src/settings/DatabaseQueries/TrackingQueries.js new file mode 100644 index 000000000..fce940d86 --- /dev/null +++ b/src/settings/DatabaseQueries/TrackingQueries.js @@ -0,0 +1,167 @@ +'use strict'; + +const SQL = require('sql-template-strings'); + +class TrackingQueries { + constructor(db) { + this.db = db; + } + + /** + * Enables notifications for an item in a channel + * @param {Channel} channel The channel where to enable notifications + * @param {string} item The item to track + * @returns {Promise} + */ + async trackItem(channel, item) { + const query = SQL`INSERT IGNORE INTO item_notifications (channel_id, item) VALUES (${channel.id},${item});`; + return this.db.query(query); + } + + /** + * Enables notifications for items in a channel + * @param {Channel} channel The channel where to enable notifications + * @param {string} items The items to track + * @returns {Promise} + */ + async trackItems(channel, items) { + const query = SQL`INSERT IGNORE INTO item_notifications (channel_id, item) VALUES `; + items.forEach((item, index) => { + query.append(SQL`(${channel.id}, ${item})`).append(index !== (items.length - 1) ? ',' : ';'); + }); + return this.db.query(query); + } + + /** + * Disables notifications for an item in a channel + * @param {Channel} channel The channel where to enable notifications + * @param {string} item The item to track + * @returns {Promise} + */ + async untrackItem(channel, item) { + const query = SQL`DELETE FROM item_notifications WHERE channel_id = ${channel.id} AND item = ${item};`; + return this.db.query(query); + } + + /** + * Disables notifications for items in a channel + * @param {Channel} channel The channel where to enable notifications + * @param {string} items The items to untrack + * @returns {Promise} + */ + async untrackItems(channel, items) { + const query = SQL`DELETE FROM item_notifications WHERE channel_id = ${channel.id} AND (`; + items.forEach((item, index) => { + query.append(index > 0 ? ' OR ' : '').append(SQL`item = ${item}`); + }); + query.append(SQL`);`); + return this.db.query(query); + } + + /** + * Enables notifications for an event type in a channel + * @param {Channel} channel The channel where to enable notifications + * @param {string} type The item to track + * @returns {Promise} + */ + async trackEventType(channel, type) { + const query = SQL`INSERT IGNORE INTO type_notifications (channel_id, type) VALUES (${channel.id},${type});`; + return this.db.query(query); + } + + /** + * Enables notifications for items in a channel + * @param {Channel} channel The channel where to enable notifications + * @param {string} types The types to track + * @returns {Promise} + */ + async trackEventTypes(channel, types) { + const query = SQL`INSERT IGNORE INTO type_notifications (channel_id, type) VALUES `; + types.forEach((type, index) => { + if (channel && channel.id) { + query.append(SQL`(${channel.id}, ${type})`).append(index !== (types.length - 1) ? ',' : ';'); + } + }); + return this.db.query(query); + } + + /** + * Disables notifications for an event type in a channel + * @param {Channel} channel The channel where to enable notifications + * @param {string} type The item to track + * @returns {Promise} + */ + async untrackEventType(channel, type) { + const query = SQL`DELETE FROM type_notifications WHERE channel_id = ${channel.id} AND type = ${type};`; + return this.db.query(query); + } + + /** + * Disables notifications for event types in a channel + * @param {Channel} channel The channel where to enable notifications + * @param {string} types The types to untrack + * @returns {Promise} + */ + async untrackEventTypes(channel, types) { + const query = SQL`DELETE FROM type_notifications WHERE channel_id = ${channel.id} AND (`; + types.forEach((type, index) => { + query.append(index > 0 ? ' OR ' : '').append(SQL`type = ${type}`); + }); + query.append(SQL`);`); + return this.db.query(query); + } + + /** + * Returns the items that the channel is tracking + * @param {Channel} channel A Discord channel + * @returns {Promise.>} + */ + async getTrackedItems(channel) { + const query = SQL`SELECT item FROM item_notifications WHERE channel_id = ${channel.id};`; + const res = await this.db.query(query); + return res[0].map(r => r.item); + } + + /** + * Returns the event types that the channel is tracking + * @param {Channel} channel A Discord channel + * @returns {Promise.>} + */ + async getTrackedEventTypes(channel) { + const query = SQL`SELECT type FROM type_notifications WHERE channel_id = ${channel.id};`; + const res = await this.db.query(query); + return res[0].map(r => r.type); + } + + /** + * Remove item notifications corresponding to the channel id + * @param {snowflake} channelId channel identifier for removal + * @returns {Promise.} status of removal + */ + async removeItemNotifications(channelId) { + const query = SQL`DELETE FROM item_notifications WHERE channel_id = ${channelId}`; + return this.db.query(query); + } + + /** + * Remove type notifications corresponding to the channel id + * @param {snowflake} channelId channel identifier for removal + * @returns {Promise.} status of removal + */ + async removeTypeNotifications(channelId) { + const query = SQL`DELETE FROM type_notifications WHERE channel_id = ${channelId}`; + return this.db.query(query); + } + + /** + * Stops tracking all event types in a channel (disables all notifications) + * @param {Channel} channel - A Discord channel + * @returns {Promise} + */ + async stopTracking(channel) { + const query = SQL`DELETE FROM type_notifications WHERE channel_id = ${channel.id};`; + return this.db.query(query); + } +} + +module.exports = TrackingQueries; diff --git a/src/settings/DatabaseQueries/WelcomeQueries.js b/src/settings/DatabaseQueries/WelcomeQueries.js new file mode 100644 index 000000000..17ca886d3 --- /dev/null +++ b/src/settings/DatabaseQueries/WelcomeQueries.js @@ -0,0 +1,52 @@ +'use strict'; + +const SQL = require('sql-template-strings'); + +class WelcomeQueries { + constructor(db) { + this.db = db; + } + + /** + * Clear welcome messages for a guild + * @param {Guild} guild The guild + * @param {boolean} isDm whether or not the message to be cleared is the dm or in-chat message + * @returns {Promise} + */ + async clearWelcomeForGuild(guild, isDm) { + const query = SQL`DELETE FROM welcome_messages WHERE guild_id=${guild.id} && is_dm=${isDm}`; + return this.db.query(query); + } + + /** + * Sets a ping message for an item or event type in a guild + * @param {Message} message Message to derive information for guild and channel + * @param {boolean} isDm whether or not this is for the dm welcome + * @param {string} text The text of the ping message + * @returns {Promise} + */ + async setWelcome(message, isDm, text) { + const query = SQL`INSERT INTO welcome_messages (guild_id, is_dm, channel_id, message) VALUES (${message.guild.id}, ${isDm}, ${message.channel.id}, ${text}) + ON DUPLICATE KEY UPDATE message = ${text};`; + return this.db.query(query); + } + + async getWelcomes(guild) { + if (guild) { + const query = SQL`SELECT * FROM welcome_messages WHERE guild_id=${guild.id}`; + const res = await this.db.query(query); + if (res[0]) { + return res[0].map(value => + ({ + isDm: value.is_dm, + message: value.message, + channel: this.bot.client.channels.get(value.channel_id), + })); + } + return []; + } + return []; + } +} + +module.exports = WelcomeQueries; diff --git a/src/settings/MessageManager.js b/src/settings/MessageManager.js index 424a4760f..4a6f9493e 100644 --- a/src/settings/MessageManager.js +++ b/src/settings/MessageManager.js @@ -96,7 +96,8 @@ class MessaageManager { .has(['SEND_MESSAGES', 'EMBED_LINKS'])) || message.channel.type === 'dm') { const msg = await message.channel.send(content || '', { embed }); - return this.deleteCallAndResponse(message, msg, deleteOriginal, deleteResponse); + this.deleteCallAndResponse(message, msg, deleteOriginal, deleteResponse); + return msg; } return null; } diff --git a/src/settings/schema.js b/src/settings/schema.js index ed994b9f1..1fa486769 100644 --- a/src/settings/schema.js +++ b/src/settings/schema.js @@ -107,4 +107,37 @@ module.exports = [ owner_id BIGINT UNSIGNED NOT NULL, PRIMARY KEY (build_id) );`, + `CREATE TABLE IF NOT EXISTS code_pool ( + pool_id VARCHAR(255) NOT NULL PRIMARY KEY, + pool_name TEXT NOT NULL, + pool_owner BIGINT(20) UNSIGNED NOT NULL, + pool_type VARCHAR(10) NOT NULL default 'glyph', + pool_default_guild BIGINT(20) UNSIGNED NOT NULL, + pool_public BOOLEAN NOT NULL DEFAULT FALSE, + pool_restricted BOOLEAN NOT NULL DEFAULT TRUE, + pool_password VARCHAR(255), + UNIQUE (pool_id) + );`, + `CREATE TABLE IF NOT EXISTS code_pool_member ( + pool_id VARCHAR(255) NOT NULL, + platform VARCHAR(3) NOT NULL DEFAULT 'pc', + added_by BIGINT(20) UNSIGNED NOT NULL, + added_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + granted_to BIGINT(20) UNSIGNED, + granted_by BIGINT(20) UNSIGNED, + granted_on TIMESTAMP NULL DEFAULT NULL, + code CHAR(19) NOT NULL, + CONSTRAINT UC_Code UNIQUE (pool_id,platform,code), + FOREIGN KEY (pool_id) + REFERENCES code_pool(pool_id) + ON DELETE CASCADE + );`, + `CREATE TABLE IF NOT EXISTS code_pool_manager ( + pool_id VARCHAR(255) NOT NULL, + pool_manager BIGINT(20) UNSIGNED NOT NULL, + PRIMARY KEY (pool_id, pool_manager), + FOREIGN KEY (pool_id) + REFERENCES code_pool(pool_id) + ON DELETE CASCADE + );`, ]; From 7fabbe448b987b8a3374db75ea674be47f80b3b8 Mon Sep 17 00:00:00 2001 From: Matej Voboril Date: Fri, 1 Jun 2018 22:42:43 -0500 Subject: [PATCH 02/10] chore(dependencies): update dependencies --- package-lock.json | 104 ++++++++++++++++++++-------------------------- package.json | 12 +++--- 2 files changed, 52 insertions(+), 64 deletions(-) diff --git a/package-lock.json b/package-lock.json index a88e5d2f4..772f5130f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "dependencies": { "@sinonjs/formatio": { "version": "2.0.0", - "resolved": "http://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", "dev": true, "requires": { @@ -849,9 +849,9 @@ } }, "eslint-plugin-import": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.11.0.tgz", - "integrity": "sha1-Fa7qN6Z0mdhI6OmBgG1GJ7VQOBY=", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.12.0.tgz", + "integrity": "sha1-2tMXgSktZmSyUxf9BJ0uKy8CIF0=", "dev": true, "requires": { "contains-path": "^0.1.0", @@ -903,9 +903,9 @@ } }, "eslint-plugin-react": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.7.0.tgz", - "integrity": "sha512-KC7Snr4YsWZD5flu6A5c0AcIZidzW3Exbqp7OT67OaD2AppJtlBr/GuPrW/vaQM/yfZotEvKAdrxrO+v8vwYJA==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.8.2.tgz", + "integrity": "sha512-H3ne8ob4Bn6NXSN9N9twsn7t8dyHT5bF/ibQepxIHi6JiPIdC2gXlfYvZYucbdrWio4FxBq7Z4mSauQP+qmMkQ==", "dev": true, "requires": { "doctrine": "^2.0.2", @@ -1173,9 +1173,9 @@ "dev": true }, "greenkeeper-lockfile": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/greenkeeper-lockfile/-/greenkeeper-lockfile-1.15.0.tgz", - "integrity": "sha512-pUf2Aq6JrguVVuhKFHv815TyFJVtRmI4mNkGbzeryDqRxb+OVwM7OmTneqI4Lx3q4TMhwutUAPZfR78a/mAupw==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/greenkeeper-lockfile/-/greenkeeper-lockfile-1.15.1.tgz", + "integrity": "sha512-9NxU5EfWYzv8dEmpAFrFjhJkHcc2OVOPecaH9Td43546vsK88HB0Qet4Pv1PeW1s1sEz2kaF3LksolLKq2TEPw==", "requires": { "lodash": "^4.17.4", "require-relative": "^0.8.7", @@ -1183,9 +1183,9 @@ } }, "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, "har-schema": { @@ -1691,9 +1691,9 @@ "dev": true }, "lolex": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.4.2.tgz", - "integrity": "sha512-92IC6/K6abCQqmaBhFt4OYLSkpOkqUULeazKiEna96om4o87vLGmwTmrsZ5mK+4F6kZ8dS1w8VnFbdhFJF8sJw==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.0.tgz", + "integrity": "sha512-uJkH2e0BVfU5KOJUevbTOtpDduooSarH5PopO+LfM/vZf8Z9sJzODqKev804JYM2i++ktJfUmC1le4LwFQ1VMg==", "dev": true }, "long": { @@ -1779,43 +1779,31 @@ } }, "mocha": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.1.1.tgz", - "integrity": "sha512-kKKs/H1KrMMQIEsWNxGmb4/BGsmj0dkeyotEvbrAuQ01FcWRLssUNXCEUZk6SZtyJBi6EE7SL0zDDtItw1rGhw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", "dev": true, "requires": { "browser-stdout": "1.3.1", - "commander": "2.11.0", + "commander": "2.15.1", "debug": "3.1.0", "diff": "3.5.0", "escape-string-regexp": "1.0.5", "glob": "7.1.2", - "growl": "1.10.3", + "growl": "1.10.5", "he": "1.1.1", "minimatch": "3.0.4", "mkdirp": "0.5.1", - "supports-color": "4.4.0" + "supports-color": "5.4.0" }, "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "^2.0.0" + "has-flag": "^3.0.0" } } } @@ -1879,9 +1867,9 @@ "dev": true }, "nise": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.3.3.tgz", - "integrity": "sha512-v1J/FLUB9PfGqZLGDBhQqODkbLotP0WtLo9R4EJY2PPu5f5Xg4o0rA8FDlmrjFSv9vBBKcfnOSpfYYuu5RTHqg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.0.tgz", + "integrity": "sha512-vQ4J69BBu0CjNoTJICJzIEzmomn+KqLLAp6VSv5zU6Ea3HI01rg86yUuCmzNv+AhxpRvLiTufV+c72sIzF9Wiw==", "dev": true, "requires": { "@sinonjs/formatio": "^2.0.0", @@ -2223,9 +2211,9 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "raven": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/raven/-/raven-2.6.1.tgz", - "integrity": "sha512-ucfPDuOkChtMMgNAXUFRvVWdw7IbR1GOCNV8Ch9Z2eM5xUPEUq9amgianjydsmkbeFWaQ6DaDxG81fH3Lx0t+w==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/raven/-/raven-2.6.2.tgz", + "integrity": "sha1-yS8wiQ4t/NFSWNGE5D45Mm5YAy4=", "requires": { "cookie": "0.3.1", "md5": "^2.2.1", @@ -2530,18 +2518,18 @@ "dev": true }, "sinon": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-5.0.7.tgz", - "integrity": "sha512-GvNLrwpvLZ8jIMZBUhHGUZDq5wlUdceJWyHvZDmqBxnjazpxY1L0FNbGBX6VpcOEoQ8Q4XMWFzm2myJMvx+VjA==", + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-5.0.10.tgz", + "integrity": "sha512-+YT7Mjr8BpNndQqUUydO/daggF4yuOAnsVjo+5Ayx3mLLUqojfkXhDkho4HB5VgfnZYSdhxVDPbfJ2EBXFMSvA==", "dev": true, "requires": { "@sinonjs/formatio": "^2.0.0", - "diff": "^3.1.0", + "diff": "^3.5.0", "lodash.get": "^4.4.2", - "lolex": "^2.2.0", - "nise": "^1.2.0", - "supports-color": "^5.1.0", - "type-detect": "^4.0.5" + "lolex": "^2.4.2", + "nise": "^1.3.3", + "supports-color": "^5.4.0", + "type-detect": "^4.0.8" }, "dependencies": { "supports-color": { @@ -2556,9 +2544,9 @@ } }, "sinon-chai": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.0.0.tgz", - "integrity": "sha512-+cqeKiuMZjZs800fRf4kjJR/Pp4p7bYY3ciZHClFNS8tSzJoAcWni/ZUZD8TrfZ+oFRyLiKWX3fTClDATGy5vQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.1.0.tgz", + "integrity": "sha512-gKcpH0GpDwEDWq6DXzdKf2PCvK4MgB2x6w1hSaNVQKnGF7vDY+uM7RK15pHqRuleypDKFpLUVDPTvlpyBVV1Mw==", "dev": true }, "slice-ansi": { @@ -2699,9 +2687,9 @@ } }, "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==" }, "strip-ansi": { "version": "4.0.0", diff --git a/package.json b/package.json index ada1441f3..8d49446e0 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "nspacestd (https://github.com/nspacestd)" ], "dependencies": { - "bluebird": "^3.5.0", + "bluebird": "^3.5.1", "decache": "^4.4.0", "discord.js": "^11.3.0", "greenkeeper-lockfile": "^1.14.0", @@ -53,15 +53,15 @@ "eslint": "^4.19.1", "eslint-config-airbnb": "^16.1.0", "eslint-config-airbnb-base": "^12.1.0", - "eslint-plugin-import": "^2.11.0", + "eslint-plugin-import": "^2.12.0", "eslint-plugin-jsx-a11y": "^6.0.3", - "eslint-plugin-react": "^7.7.0", + "eslint-plugin-react": "^7.8.2", "ink-docstrap": "^1.3.2", "jsdoc": "^3.5.5", - "mocha": "^5.1.1", + "mocha": "^5.2.0", "rewire": "^4.0.0", - "sinon": "^5.0.2", - "sinon-chai": "^3.0.0" + "sinon": "^5.0.10", + "sinon-chai": "^3.1.0" }, "license": "Apache-2.0", "engines": { From cf4f88e8ad6ac5258f494610e22fb5ca494f6ef7 Mon Sep 17 00:00:00 2001 From: Matej Voboril Date: Fri, 1 Jun 2018 23:13:50 -0500 Subject: [PATCH 03/10] fix(commands): pages for help, reset description --- src/commands/Core/Help.js | 6 +++--- src/commands/Core/Reset.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/commands/Core/Help.js b/src/commands/Core/Help.js index 601837f08..77f174360 100644 --- a/src/commands/Core/Help.js +++ b/src/commands/Core/Help.js @@ -104,13 +104,13 @@ class Help extends Command { } const lines = searchableCommands.map(command => command.usages.map(u => ({ name: `${config.prefix}${command.call} ${u.parameters.map(p => `<${p}>`).join(u.separator ? u.separator : ' ')}`, - value: u.description, + value: u.description || 'No description', inline: false, }))); - const groups = createGroupedArray(lines, 5); + const groups = createGroupedArray(lines, 9); const embeds = groups.map(group => createEmbedsForCommands(group, 'Help!', 0x4068BD)); const msg = await this.messageManager.embed(message, embeds[0], false, false); - await createGroupedArray(msg, embeds, message.author); + await createPageCollector(msg, embeds, message.author); return this.messageManager.statuses.SUCCESS; } diff --git a/src/commands/Core/Reset.js b/src/commands/Core/Reset.js index bcef6beda..3ee3f9254 100644 --- a/src/commands/Core/Reset.js +++ b/src/commands/Core/Reset.js @@ -4,7 +4,7 @@ const Command = require('../../models/Command.js'); class ResetGuild extends Command { constructor(bot) { - super(bot, 'core.reset', 'reset'); + super(bot, 'core.reset', 'reset', 'Reset the settings for this guild'); this.requiresAuth = true; this.allowDM = false; } From af3235169100189dc7a62bcda16d37e965e57db4 Mon Sep 17 00:00:00 2001 From: Matej Voboril Date: Fri, 1 Jun 2018 23:54:49 -0500 Subject: [PATCH 04/10] feat(commands): pages for alerts --- src/commands/Worldstate/Alerts.js | 11 +++++++++-- src/embeds/AlertEmbed.js | 3 +-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/commands/Worldstate/Alerts.js b/src/commands/Worldstate/Alerts.js index e3cf0d9ec..038d8f4cf 100644 --- a/src/commands/Worldstate/Alerts.js +++ b/src/commands/Worldstate/Alerts.js @@ -2,6 +2,7 @@ const Command = require('../../models/Command.js'); const AlertEmbed = require('../../embeds/AlertEmbed.js'); +const { createPageCollector } = require('../../CommonFunctions'); /** * Displays the currently active alerts @@ -36,8 +37,14 @@ class Alerts extends Command { await this.messageManager .embed(message, new AlertEmbed(this.bot, alerts, platform), true, true); } else { - await Promise.all(alerts.map(alert => this.messageManager - .embed(message, new AlertEmbed(this.bot, [alert], platform), false, false))); + const pages = []; + alerts.forEach((alert) => { + pages.push(new AlertEmbed(this.bot, [alert], platform)); + }); + if (pages.length) { + const msg = await this.messageManager.embed(message, pages[0], false, false); + await createPageCollector(msg, pages, message.author); + } if (parseInt(await this.settings.getChannelSetting(message.channel, 'delete_after_respond'), 10) && message.deletable) { message.delete(10000); } diff --git a/src/embeds/AlertEmbed.js b/src/embeds/AlertEmbed.js index 8bf27b82e..371f61718 100644 --- a/src/embeds/AlertEmbed.js +++ b/src/embeds/AlertEmbed.js @@ -46,11 +46,10 @@ class AlertEmbed extends BaseEmbed { if (this.title.indexOf('Cr') === -1) { this.fields.push({ name: '_ _', value: `**Credits:** ${a.mission.reward.credits}`, inline: true }); } - this.footer.text = `${a.eta} remaining | Expires `; + this.footer.text = `${a.eta} remaining • Expires `; this.timestamp = a.expiry; } } } module.exports = AlertEmbed; - From ac73d9d586806296d0ec34c1226a90fe2c7a2515 Mon Sep 17 00:00:00 2001 From: Tobiah Date: Sun, 3 Jun 2018 01:04:40 -0500 Subject: [PATCH 05/10] chore(docs): update docs --- docs/AddBuild.html | 602 ++ docs/AddChannelToDatabase.html | 610 ++ docs/AddGuildToDatabase.html | 610 ++ docs/AddLFG.html | 420 + docs/AddRole.html | 533 ++ docs/AlertEmbed.html | 464 + docs/Alerts.html | 420 + docs/Arcane.html | 587 ++ docs/Armor.html | 1089 +++ docs/AssignDefaultRolesHandle.html | 610 ++ docs/Avatar.html | 587 ++ docs/Baro.html | 420 + docs/BaseEmbed.html | 366 + docs/BaseEventHandler.html | 1136 +++ docs/Broadcaster.html | 826 ++ docs/BugReport.html | 563 ++ docs/BuildChart.html | 587 ++ docs/BuildEmbed.html | 440 + docs/Command.html | 1960 +++++ docs/CommandHandler.html | 884 ++ docs/ConclaveChallengeEmbed.html | 488 ++ docs/ConclaveChallenges.html | 420 + docs/Construction.html | 420 + docs/ConstructionEmbed.html | 464 + docs/Corgi.html | 586 ++ docs/Create.html | 1051 +++ docs/CreatePool.html | 366 + docs/CustomCommand.html | 1358 +++ docs/Damage.html | 587 ++ docs/Darvo.html | 420 + docs/DarvoEmbed.html | 464 + docs/Database.html | 876 ++ docs/DeleteBuild.html | 420 + docs/DeleteChannel.html | 562 ++ docs/DeleteGuild.html | 562 ++ docs/DeleteWebhook.html | 420 + docs/Destroy.html | 611 ++ docs/EarthCycle.html | 587 ++ docs/EarthCycleEmbed.html | 440 + docs/Echo.html | 587 ++ docs/Efficiency.html | 587 ++ docs/EnableInfoEmbed.html | 464 + docs/EnableUsageEmbed.html | 464 + docs/Enemies.html | 420 + docs/EnemyEmbed.html | 464 + docs/EnhancementEmbed.html | 464 + docs/Event.html | 420 + docs/EventEmbed.html | 464 + docs/EventHandler.html | 674 ++ docs/FeaturedDeal.html | 420 + docs/FissureEmbed.html | 464 + docs/Fissures.html | 420 + docs/FrameEmbed.html | 464 + docs/FrameProfile.html | 587 ++ docs/FrameStats.html | 587 ++ docs/FrameStatsInline.html | 587 ++ docs/Genesis.html | 1654 ++++ docs/GetBuild.html | 420 + docs/GetCommandIds.html | 420 + docs/Help.html | 562 ++ docs/Hide.html | 611 ++ docs/Hug.html | 420 + docs/InvasionEmbed.html | 464 + docs/Invasions.html | 420 + docs/Invitation.html | 587 ++ docs/Invite.html | 797 ++ docs/JoinRole.html | 533 ++ docs/Jokes.html | 1260 +++ docs/LFGEmbed.html | 440 + docs/LeaveRole.html | 533 ++ docs/LeaveServer.html | 587 ++ docs/ListBuilds.html | 420 + docs/Lock.html | 611 ++ docs/LogEmbed.html | 440 + docs/LogMemberBan.html | 630 ++ docs/LogMemberRemove.html | 606 ++ docs/LogMemberUnban.html | 630 ++ docs/LogMessageDelete.html | 1258 +++ docs/MessaageManager.html | 2690 ++++++ docs/Mod.html | 587 ++ docs/News.html | 420 + docs/NewsEmbed.html | 489 ++ docs/Notifier.html | 940 ++ docs/OnReadyHandle.html | 560 ++ docs/Ping.html | 587 ++ docs/PollInline.html | 563 ++ docs/PopularDeal.html | 420 + docs/Prefix.html | 366 + docs/PriceCheck.html | 1262 +++ docs/PriceCheckEmbed.html | 464 + docs/PrimeAccess.html | 420 + docs/ProfileEmbed.html | 440 + docs/Progression.html | 587 ++ docs/Raid.html | 587 ++ docs/RaidStatEmbed.html | 488 ++ docs/Reload.html | 587 ++ docs/RemoveRole.html | 533 ++ docs/Rename.html | 611 ++ docs/Resize.html | 611 ++ docs/Roles.html | 1154 +++ docs/RolesEmbed.html | 488 ++ docs/RollInline.html | 563 ++ docs/SalesEmbed.html | 464 + docs/ServerInfo.html | 420 + docs/ServerInfoEmbed.html | 440 + docs/Servers.html | 587 ++ docs/SettingsEmbed.html | 464 + docs/ShieldEmbed.html | 440 + docs/Shields.html | 587 ++ docs/Show.html | 611 ++ docs/Simaris.html | 420 + docs/SimarisEmbed.html | 464 + docs/SortieEmbed.html | 464 + docs/Sorties.html | 420 + docs/StringManager.html | 639 ++ docs/SyndicateEmbed.html | 488 ++ docs/Syndicates.html | 420 + docs/Track.html | 366 + docs/Tracker.html | 1115 +++ docs/Unlock.html | 611 ++ docs/Untrack.html | 2528 ++++++ docs/Updates.html | 420 + docs/UserInfo.html | 420 + docs/UserInfoEmbed.html | 513 ++ docs/Username.html | 587 ++ docs/VoidTraderEmbed.html | 464 + docs/VulgarNameHandle.html | 608 ++ docs/WeaponEmbed.html | 440 + docs/WeaponStats.html | 587 ++ docs/WelcomeHandler.html | 608 ++ docs/Whatsin.html | 587 ++ docs/WhatsinEmbed.html | 488 ++ docs/Whereis.html | 587 ++ docs/WhereisEmbed.html | 512 ++ docs/Wiki.html | 587 ++ docs/WikiEmbed.html | 464 + docs/classes.list.html | 769 ++ docs/fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes docs/fonts/glyphicons-halflings-regular.svg | 288 + docs/fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes docs/fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes docs/fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes docs/global.html | 6430 ++++++++++++++ docs/global.html#Logger | 566 ++ docs/img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes docs/img/glyphicons-halflings.png | Bin 0 -> 12799 bytes docs/index.html | 417 + docs/main.js.html | 308 + docs/quicksearch.html | 31 + docs/scripts/docstrap.lib.js | 11 + docs/scripts/fulltext-search-ui.js | 89 + docs/scripts/fulltext-search.js | 36 + docs/scripts/lunr.min.js | 6 + docs/scripts/prettify/Apache-License-2.0.txt | 202 + docs/scripts/prettify/jquery.min.js | 6 + docs/scripts/prettify/lang-css.js | 21 + docs/scripts/prettify/prettify.js | 496 ++ docs/scripts/sunlight.js | 1157 +++ docs/scripts/toc.js | 203 + docs/src_CommandHandler.js.html | 480 ++ docs/src_CommonFunctions.js.html | 835 ++ docs/src_EventHandler.js.html | 330 + docs/src_Logger.js.html | 304 + docs/src_Tracker.js.html | 433 + docs/src_bot.js.html | 496 ++ docs/src_commands_Builds_AddBuild.js.html | 290 + docs/src_commands_Builds_DeleteBuild.js.html | 288 + docs/src_commands_Builds_GetBuild.js.html | 283 + docs/src_commands_Builds_ListBuilds.js.html | 295 + docs/src_commands_Builds_SetField.js.html | 318 + docs/src_commands_Core_Bug.js.html | 339 + docs/src_commands_Core_Help.js.html | 372 + docs/src_commands_Core_Info.js.html | 300 + docs/src_commands_Core_Invite.js.html | 277 + docs/src_commands_Core_Ping.js.html | 320 + docs/src_commands_Core_Support.js.html | 292 + ...c_commands_Info_ItemEmbeddedInline.js.html | 325 + docs/src_commands_LFG_LFG.js.html | 299 + docs/src_commands_LFG_SetLFGChannel.js.html | 282 + docs/src_commands_Logging_BanLog.js.html | 282 + ...c_commands_Logging_MemberRemoveLog.js.html | 282 + ...mmands_Logging_SetMessageDeleteLog.js.html | 282 + docs/src_commands_Logging_SetModRole.js.html | 282 + .../src_commands_Logging_SetVulgarLog.js.html | 282 + docs/src_commands_Logging_UnbanLog.js.html | 282 + docs/src_commands_Ondemand_Arcane.js.html | 305 + docs/src_commands_Ondemand_Armor.js.html | 413 + docs/src_commands_Ondemand_BuildChart.js.html | 283 + docs/src_commands_Ondemand_Damage.js.html | 297 + docs/src_commands_Ondemand_Efficiency.js.html | 281 + docs/src_commands_Ondemand_FrameStats.js.html | 305 + docs/src_commands_Ondemand_Mod.js.html | 312 + docs/src_commands_Ondemand_Pricecheck.js.html | 303 + docs/src_commands_Ondemand_Profile.js.html | 331 + .../src_commands_Ondemand_Progression.js.html | 283 + docs/src_commands_Ondemand_Raid.js.html | 298 + docs/src_commands_Ondemand_Shields.js.html | 290 + docs/src_commands_Ondemand_Tutorial.js.html | 310 + docs/src_commands_Ondemand_Weapon.js.html | 308 + docs/src_commands_Ondemand_Whatsin.js.html | 313 + docs/src_commands_Ondemand_WhereIs.js.html | 334 + docs/src_commands_Ondemand_Wiki.js.html | 301 + docs/src_commands_Owner_Avatar.js.html | 291 + docs/src_commands_Owner_DeleteWebhook.js.html | 285 + docs/src_commands_Owner_LeaveServer.js.html | 290 + docs/src_commands_Owner_Reload.js.html | 290 + docs/src_commands_Owner_Servers.js.html | 282 + docs/src_commands_Owner_Username.js.html | 291 + ...src_commands_Promocodes_CreatePool.js.html | 279 + docs/src_commands_Roles_AddRole.js.html | 369 + docs/src_commands_Roles_JoinRole.js.html | 372 + docs/src_commands_Roles_LeaveRole.js.html | 371 + docs/src_commands_Roles_RemoveRole.js.html | 369 + docs/src_commands_Roles_RoleIds.js.html | 300 + docs/src_commands_Roles_Roles.js.html | 294 + docs/src_commands_Rooms_Create.js.html | 557 ++ docs/src_commands_Rooms_Destroy.js.html | 301 + docs/src_commands_Rooms_Hide.js.html | 307 + docs/src_commands_Rooms_Invite.js.html | 330 + docs/src_commands_Rooms_Lock.js.html | 307 + docs/src_commands_Rooms_Rename.js.html | 301 + docs/src_commands_Rooms_ResizeRoom.js.html | 299 + docs/src_commands_Rooms_RoomCreation.js.html | 281 + ...c_commands_Rooms_RoomDefaultNoText.js.html | 282 + ...c_commands_Rooms_RoomPublicDefault.js.html | 282 + ...rc_commands_Rooms_RoomShownDefault.js.html | 282 + ..._commands_Rooms_SetDefaultCategory.js.html | 282 + docs/src_commands_Rooms_Show.js.html | 307 + docs/src_commands_Rooms_Unlock.js.html | 307 + docs/src_commands_Settings_Disable.js.html | 347 + docs/src_commands_Settings_Enable.js.html | 344 + docs/src_commands_Settings_Prefix.js.html | 300 + docs/src_commands_Silly_Corgi.js.html | 281 + docs/src_commands_Silly_Echo.js.html | 280 + docs/src_commands_Silly_Hug.js.html | 270 + docs/src_commands_Silly_Joke.js.html | 323 + docs/src_commands_Silly_PromoCodes.js.html | 290 + docs/src_commands_Tracking_Start.js.html | 267 + docs/src_commands_Tracking_Stop.js.html | 279 + docs/src_commands_Tracking_Track.js.html | 308 + docs/src_commands_Tracking_Untrack.js.html | 309 + ...c_commands_Utilities_GetCommandIds.js.html | 285 + .../src_commands_Utilities_PollInline.js.html | 286 + .../src_commands_Utilities_RollInline.js.html | 286 + .../src_commands_Utilities_ServerInfo.js.html | 276 + docs/src_commands_Utilities_UserInfo.js.html | 306 + docs/src_commands_Worldstate_Alerts.js.html | 304 + docs/src_commands_Worldstate_Baro.js.html | 276 + ...ands_Worldstate_ConclaveChallenges.js.html | 296 + ...c_commands_Worldstate_Construction.js.html | 277 + docs/src_commands_Worldstate_Darvo.js.html | 276 + ...src_commands_Worldstate_EarthCycle.js.html | 301 + docs/src_commands_Worldstate_Enemies.js.html | 278 + docs/src_commands_Worldstate_Event.js.html | 290 + ...c_commands_Worldstate_FeaturedDeal.js.html | 279 + docs/src_commands_Worldstate_Fissures.js.html | 279 + .../src_commands_Worldstate_Invasions.js.html | 279 + docs/src_commands_Worldstate_News.js.html | 280 + ...rc_commands_Worldstate_PopularSale.js.html | 279 + ...rc_commands_Worldstate_PrimeAccess.js.html | 276 + docs/src_commands_Worldstate_Simaris.js.html | 279 + docs/src_commands_Worldstate_Sorties.js.html | 297 + ...src_commands_Worldstate_Syndicates.js.html | 295 + docs/src_commands_Worldstate_Updates.js.html | 276 + docs/src_embeds_AlertEmbed.js.html | 302 + docs/src_embeds_BaseEmbed.js.html | 264 + docs/src_embeds_BuildEmbed.js.html | 270 + .../src_embeds_ConclaveChallengeEmbed.js.html | 292 + docs/src_embeds_ConstructionEmbed.js.html | 274 + docs/src_embeds_DarvoEmbed.js.html | 278 + docs/src_embeds_EarthCycleEmbed.js.html | 282 + docs/src_embeds_EnableInfoEmbed.js.html | 282 + docs/src_embeds_EnableUsageEmbed.js.html | 289 + docs/src_embeds_EnemyEmbed.js.html | 291 + docs/src_embeds_EnhancementEmbed.js.html | 302 + docs/src_embeds_EventEmbed.js.html | 313 + docs/src_embeds_FissureEmbed.js.html | 294 + docs/src_embeds_FrameEmbed.js.html | 333 + docs/src_embeds_InvasionEmbed.js.html | 300 + docs/src_embeds_LFGEmbed.js.html | 284 + docs/src_embeds_LogEmbed.js.html | 278 + docs/src_embeds_NewsEmbed.js.html | 299 + docs/src_embeds_PriceCheckEmbed.js.html | 300 + docs/src_embeds_ProfileEmbed.js.html | 381 + docs/src_embeds_RaidEmbed.js.html | 306 + docs/src_embeds_RolesEmbed.js.html | 287 + docs/src_embeds_SalesEmbed.js.html | 279 + docs/src_embeds_ServerInfoEmbed.js.html | 315 + docs/src_embeds_SettingsEmbed.js.html | 278 + docs/src_embeds_ShieldEmbed.js.html | 299 + docs/src_embeds_SimarisEmbed.js.html | 273 + docs/src_embeds_SortieEmbed.js.html | 281 + docs/src_embeds_SyndicateEmbed.js.html | 311 + docs/src_embeds_UserInfoEmbed.js.html | 345 + docs/src_embeds_VoidTraderEmbed.js.html | 286 + docs/src_embeds_WeaponEmbed.js.html | 440 + docs/src_embeds_WhatsinEmbed.js.html | 305 + docs/src_embeds_WhereisEmbed.js.html | 280 + docs/src_embeds_WikiEmbed.js.html | 280 + ...eventHandlers_AddChannelToDatabase.js.html | 292 + ...c_eventHandlers_AddGuildToDatabase.js.html | 286 + ...c_eventHandlers_AssignDefaultRoles.js.html | 281 + ...ntHandlers_BulkMessageDeleteHandle.js.html | 301 + docs/src_eventHandlers_DeleteChannel.js.html | 279 + docs/src_eventHandlers_DeleteGuild.js.html | 279 + docs/src_eventHandlers_LogMemberBan.js.html | 295 + .../src_eventHandlers_LogMemberRemove.js.html | 295 + docs/src_eventHandlers_LogMemberUnban.js.html | 296 + ..._eventHandlers_MessageDeleteHandle.js.html | 311 + ...src_eventHandlers_NotifyVulgarName.js.html | 283 + docs/src_eventHandlers_Ready.js.html | 353 + docs/src_eventHandlers_WelcomeHandler.js.html | 301 + docs/src_models_BaseEventHandler.js.html | 315 + docs/src_models_Command.js.html | 407 + docs/src_models_CustomCommand.js.html | 291 + docs/src_models_InlineCommand.js.html | 279 + docs/src_notifications_Broadcaster.js.html | 358 + docs/src_notifications_Notifier.js.html | 619 ++ docs/src_resources_RaidStat.js.html | 421 + docs/src_settings_Database.js.html | 483 ++ ...ettings_DatabaseQueries_DBMQueries.js.html | 354 + ...DatabaseQueries_PermissionsQueries.js.html | 490 ++ ...tings_DatabaseQueries_PingsQueries.js.html | 410 + ...DatabaseQueries_PrivateRoomQueries.js.html | 359 + ...gs_DatabaseQueries_SettingsQueries.js.html | 406 + ...gs_DatabaseQueries_TrackingQueries.js.html | 414 + ...ngs_DatabaseQueries_WelcomeQueries.js.html | 299 + docs/src_settings_MessageManager.js.html | 534 ++ docs/src_settings_StringManager.js.html | 298 + docs/styles/darkstrap.css | 960 +++ docs/styles/prettify-tomorrow.css | 132 + docs/styles/site.cerulean.css | 7008 +++++++++++++++ docs/styles/site.cosmo.css | 7061 +++++++++++++++ docs/styles/site.cyborg.css | 7048 +++++++++++++++ docs/styles/site.darkly.css | 7171 ++++++++++++++++ docs/styles/site.darkstrap.css | 5638 ++++++++++++ docs/styles/site.dibs-bootstrap.css | 5899 +++++++++++++ docs/styles/site.flatly.css | 7147 ++++++++++++++++ docs/styles/site.journal.css | 6973 +++++++++++++++ docs/styles/site.lumen.css | 7298 ++++++++++++++++ docs/styles/site.paper.css | 7623 +++++++++++++++++ docs/styles/site.readable.css | 6997 +++++++++++++++ docs/styles/site.sandstone.css | 7035 +++++++++++++++ docs/styles/site.simplex.css | 7023 +++++++++++++++ docs/styles/site.slate.css | 7343 ++++++++++++++++ docs/styles/site.spacelab.css | 7055 +++++++++++++++ docs/styles/site.superhero.css | 7131 +++++++++++++++ docs/styles/site.united.css | 6895 +++++++++++++++ docs/styles/site.yeti.css | 7195 ++++++++++++++++ docs/styles/sunlight.dark.css | 345 + docs/styles/sunlight.default.css | 344 + package.json | 2 +- src/models/BaseEventHandler.js | 2 +- 353 files changed, 276093 insertions(+), 2 deletions(-) create mode 100644 docs/AddBuild.html create mode 100644 docs/AddChannelToDatabase.html create mode 100644 docs/AddGuildToDatabase.html create mode 100644 docs/AddLFG.html create mode 100644 docs/AddRole.html create mode 100644 docs/AlertEmbed.html create mode 100644 docs/Alerts.html create mode 100644 docs/Arcane.html create mode 100644 docs/Armor.html create mode 100644 docs/AssignDefaultRolesHandle.html create mode 100644 docs/Avatar.html create mode 100644 docs/Baro.html create mode 100644 docs/BaseEmbed.html create mode 100644 docs/BaseEventHandler.html create mode 100644 docs/Broadcaster.html create mode 100644 docs/BugReport.html create mode 100644 docs/BuildChart.html create mode 100644 docs/BuildEmbed.html create mode 100644 docs/Command.html create mode 100644 docs/CommandHandler.html create mode 100644 docs/ConclaveChallengeEmbed.html create mode 100644 docs/ConclaveChallenges.html create mode 100644 docs/Construction.html create mode 100644 docs/ConstructionEmbed.html create mode 100644 docs/Corgi.html create mode 100644 docs/Create.html create mode 100644 docs/CreatePool.html create mode 100644 docs/CustomCommand.html create mode 100644 docs/Damage.html create mode 100644 docs/Darvo.html create mode 100644 docs/DarvoEmbed.html create mode 100644 docs/Database.html create mode 100644 docs/DeleteBuild.html create mode 100644 docs/DeleteChannel.html create mode 100644 docs/DeleteGuild.html create mode 100644 docs/DeleteWebhook.html create mode 100644 docs/Destroy.html create mode 100644 docs/EarthCycle.html create mode 100644 docs/EarthCycleEmbed.html create mode 100644 docs/Echo.html create mode 100644 docs/Efficiency.html create mode 100644 docs/EnableInfoEmbed.html create mode 100644 docs/EnableUsageEmbed.html create mode 100644 docs/Enemies.html create mode 100644 docs/EnemyEmbed.html create mode 100644 docs/EnhancementEmbed.html create mode 100644 docs/Event.html create mode 100644 docs/EventEmbed.html create mode 100644 docs/EventHandler.html create mode 100644 docs/FeaturedDeal.html create mode 100644 docs/FissureEmbed.html create mode 100644 docs/Fissures.html create mode 100644 docs/FrameEmbed.html create mode 100644 docs/FrameProfile.html create mode 100644 docs/FrameStats.html create mode 100644 docs/FrameStatsInline.html create mode 100644 docs/Genesis.html create mode 100644 docs/GetBuild.html create mode 100644 docs/GetCommandIds.html create mode 100644 docs/Help.html create mode 100644 docs/Hide.html create mode 100644 docs/Hug.html create mode 100644 docs/InvasionEmbed.html create mode 100644 docs/Invasions.html create mode 100644 docs/Invitation.html create mode 100644 docs/Invite.html create mode 100644 docs/JoinRole.html create mode 100644 docs/Jokes.html create mode 100644 docs/LFGEmbed.html create mode 100644 docs/LeaveRole.html create mode 100644 docs/LeaveServer.html create mode 100644 docs/ListBuilds.html create mode 100644 docs/Lock.html create mode 100644 docs/LogEmbed.html create mode 100644 docs/LogMemberBan.html create mode 100644 docs/LogMemberRemove.html create mode 100644 docs/LogMemberUnban.html create mode 100644 docs/LogMessageDelete.html create mode 100644 docs/MessaageManager.html create mode 100644 docs/Mod.html create mode 100644 docs/News.html create mode 100644 docs/NewsEmbed.html create mode 100644 docs/Notifier.html create mode 100644 docs/OnReadyHandle.html create mode 100644 docs/Ping.html create mode 100644 docs/PollInline.html create mode 100644 docs/PopularDeal.html create mode 100644 docs/Prefix.html create mode 100644 docs/PriceCheck.html create mode 100644 docs/PriceCheckEmbed.html create mode 100644 docs/PrimeAccess.html create mode 100644 docs/ProfileEmbed.html create mode 100644 docs/Progression.html create mode 100644 docs/Raid.html create mode 100644 docs/RaidStatEmbed.html create mode 100644 docs/Reload.html create mode 100644 docs/RemoveRole.html create mode 100644 docs/Rename.html create mode 100644 docs/Resize.html create mode 100644 docs/Roles.html create mode 100644 docs/RolesEmbed.html create mode 100644 docs/RollInline.html create mode 100644 docs/SalesEmbed.html create mode 100644 docs/ServerInfo.html create mode 100644 docs/ServerInfoEmbed.html create mode 100644 docs/Servers.html create mode 100644 docs/SettingsEmbed.html create mode 100644 docs/ShieldEmbed.html create mode 100644 docs/Shields.html create mode 100644 docs/Show.html create mode 100644 docs/Simaris.html create mode 100644 docs/SimarisEmbed.html create mode 100644 docs/SortieEmbed.html create mode 100644 docs/Sorties.html create mode 100644 docs/StringManager.html create mode 100644 docs/SyndicateEmbed.html create mode 100644 docs/Syndicates.html create mode 100644 docs/Track.html create mode 100644 docs/Tracker.html create mode 100644 docs/Unlock.html create mode 100644 docs/Untrack.html create mode 100644 docs/Updates.html create mode 100644 docs/UserInfo.html create mode 100644 docs/UserInfoEmbed.html create mode 100644 docs/Username.html create mode 100644 docs/VoidTraderEmbed.html create mode 100644 docs/VulgarNameHandle.html create mode 100644 docs/WeaponEmbed.html create mode 100644 docs/WeaponStats.html create mode 100644 docs/WelcomeHandler.html create mode 100644 docs/Whatsin.html create mode 100644 docs/WhatsinEmbed.html create mode 100644 docs/Whereis.html create mode 100644 docs/WhereisEmbed.html create mode 100644 docs/Wiki.html create mode 100644 docs/WikiEmbed.html create mode 100644 docs/classes.list.html create mode 100644 docs/fonts/glyphicons-halflings-regular.eot create mode 100644 docs/fonts/glyphicons-halflings-regular.svg create mode 100644 docs/fonts/glyphicons-halflings-regular.ttf create mode 100644 docs/fonts/glyphicons-halflings-regular.woff create mode 100644 docs/fonts/glyphicons-halflings-regular.woff2 create mode 100644 docs/global.html create mode 100644 docs/global.html#Logger create mode 100644 docs/img/glyphicons-halflings-white.png create mode 100644 docs/img/glyphicons-halflings.png create mode 100644 docs/index.html create mode 100644 docs/main.js.html create mode 100644 docs/quicksearch.html create mode 100644 docs/scripts/docstrap.lib.js create mode 100644 docs/scripts/fulltext-search-ui.js create mode 100644 docs/scripts/fulltext-search.js create mode 100644 docs/scripts/lunr.min.js create mode 100644 docs/scripts/prettify/Apache-License-2.0.txt create mode 100644 docs/scripts/prettify/jquery.min.js create mode 100644 docs/scripts/prettify/lang-css.js create mode 100644 docs/scripts/prettify/prettify.js create mode 100644 docs/scripts/sunlight.js create mode 100644 docs/scripts/toc.js create mode 100644 docs/src_CommandHandler.js.html create mode 100644 docs/src_CommonFunctions.js.html create mode 100644 docs/src_EventHandler.js.html create mode 100644 docs/src_Logger.js.html create mode 100644 docs/src_Tracker.js.html create mode 100644 docs/src_bot.js.html create mode 100644 docs/src_commands_Builds_AddBuild.js.html create mode 100644 docs/src_commands_Builds_DeleteBuild.js.html create mode 100644 docs/src_commands_Builds_GetBuild.js.html create mode 100644 docs/src_commands_Builds_ListBuilds.js.html create mode 100644 docs/src_commands_Builds_SetField.js.html create mode 100644 docs/src_commands_Core_Bug.js.html create mode 100644 docs/src_commands_Core_Help.js.html create mode 100644 docs/src_commands_Core_Info.js.html create mode 100644 docs/src_commands_Core_Invite.js.html create mode 100644 docs/src_commands_Core_Ping.js.html create mode 100644 docs/src_commands_Core_Support.js.html create mode 100644 docs/src_commands_Info_ItemEmbeddedInline.js.html create mode 100644 docs/src_commands_LFG_LFG.js.html create mode 100644 docs/src_commands_LFG_SetLFGChannel.js.html create mode 100644 docs/src_commands_Logging_BanLog.js.html create mode 100644 docs/src_commands_Logging_MemberRemoveLog.js.html create mode 100644 docs/src_commands_Logging_SetMessageDeleteLog.js.html create mode 100644 docs/src_commands_Logging_SetModRole.js.html create mode 100644 docs/src_commands_Logging_SetVulgarLog.js.html create mode 100644 docs/src_commands_Logging_UnbanLog.js.html create mode 100644 docs/src_commands_Ondemand_Arcane.js.html create mode 100644 docs/src_commands_Ondemand_Armor.js.html create mode 100644 docs/src_commands_Ondemand_BuildChart.js.html create mode 100644 docs/src_commands_Ondemand_Damage.js.html create mode 100644 docs/src_commands_Ondemand_Efficiency.js.html create mode 100644 docs/src_commands_Ondemand_FrameStats.js.html create mode 100644 docs/src_commands_Ondemand_Mod.js.html create mode 100644 docs/src_commands_Ondemand_Pricecheck.js.html create mode 100644 docs/src_commands_Ondemand_Profile.js.html create mode 100644 docs/src_commands_Ondemand_Progression.js.html create mode 100644 docs/src_commands_Ondemand_Raid.js.html create mode 100644 docs/src_commands_Ondemand_Shields.js.html create mode 100644 docs/src_commands_Ondemand_Tutorial.js.html create mode 100644 docs/src_commands_Ondemand_Weapon.js.html create mode 100644 docs/src_commands_Ondemand_Whatsin.js.html create mode 100644 docs/src_commands_Ondemand_WhereIs.js.html create mode 100644 docs/src_commands_Ondemand_Wiki.js.html create mode 100644 docs/src_commands_Owner_Avatar.js.html create mode 100644 docs/src_commands_Owner_DeleteWebhook.js.html create mode 100644 docs/src_commands_Owner_LeaveServer.js.html create mode 100644 docs/src_commands_Owner_Reload.js.html create mode 100644 docs/src_commands_Owner_Servers.js.html create mode 100644 docs/src_commands_Owner_Username.js.html create mode 100644 docs/src_commands_Promocodes_CreatePool.js.html create mode 100644 docs/src_commands_Roles_AddRole.js.html create mode 100644 docs/src_commands_Roles_JoinRole.js.html create mode 100644 docs/src_commands_Roles_LeaveRole.js.html create mode 100644 docs/src_commands_Roles_RemoveRole.js.html create mode 100644 docs/src_commands_Roles_RoleIds.js.html create mode 100644 docs/src_commands_Roles_Roles.js.html create mode 100644 docs/src_commands_Rooms_Create.js.html create mode 100644 docs/src_commands_Rooms_Destroy.js.html create mode 100644 docs/src_commands_Rooms_Hide.js.html create mode 100644 docs/src_commands_Rooms_Invite.js.html create mode 100644 docs/src_commands_Rooms_Lock.js.html create mode 100644 docs/src_commands_Rooms_Rename.js.html create mode 100644 docs/src_commands_Rooms_ResizeRoom.js.html create mode 100644 docs/src_commands_Rooms_RoomCreation.js.html create mode 100644 docs/src_commands_Rooms_RoomDefaultNoText.js.html create mode 100644 docs/src_commands_Rooms_RoomPublicDefault.js.html create mode 100644 docs/src_commands_Rooms_RoomShownDefault.js.html create mode 100644 docs/src_commands_Rooms_SetDefaultCategory.js.html create mode 100644 docs/src_commands_Rooms_Show.js.html create mode 100644 docs/src_commands_Rooms_Unlock.js.html create mode 100644 docs/src_commands_Settings_Disable.js.html create mode 100644 docs/src_commands_Settings_Enable.js.html create mode 100644 docs/src_commands_Settings_Prefix.js.html create mode 100644 docs/src_commands_Silly_Corgi.js.html create mode 100644 docs/src_commands_Silly_Echo.js.html create mode 100644 docs/src_commands_Silly_Hug.js.html create mode 100644 docs/src_commands_Silly_Joke.js.html create mode 100644 docs/src_commands_Silly_PromoCodes.js.html create mode 100644 docs/src_commands_Tracking_Start.js.html create mode 100644 docs/src_commands_Tracking_Stop.js.html create mode 100644 docs/src_commands_Tracking_Track.js.html create mode 100644 docs/src_commands_Tracking_Untrack.js.html create mode 100644 docs/src_commands_Utilities_GetCommandIds.js.html create mode 100644 docs/src_commands_Utilities_PollInline.js.html create mode 100644 docs/src_commands_Utilities_RollInline.js.html create mode 100644 docs/src_commands_Utilities_ServerInfo.js.html create mode 100644 docs/src_commands_Utilities_UserInfo.js.html create mode 100644 docs/src_commands_Worldstate_Alerts.js.html create mode 100644 docs/src_commands_Worldstate_Baro.js.html create mode 100644 docs/src_commands_Worldstate_ConclaveChallenges.js.html create mode 100644 docs/src_commands_Worldstate_Construction.js.html create mode 100644 docs/src_commands_Worldstate_Darvo.js.html create mode 100644 docs/src_commands_Worldstate_EarthCycle.js.html create mode 100644 docs/src_commands_Worldstate_Enemies.js.html create mode 100644 docs/src_commands_Worldstate_Event.js.html create mode 100644 docs/src_commands_Worldstate_FeaturedDeal.js.html create mode 100644 docs/src_commands_Worldstate_Fissures.js.html create mode 100644 docs/src_commands_Worldstate_Invasions.js.html create mode 100644 docs/src_commands_Worldstate_News.js.html create mode 100644 docs/src_commands_Worldstate_PopularSale.js.html create mode 100644 docs/src_commands_Worldstate_PrimeAccess.js.html create mode 100644 docs/src_commands_Worldstate_Simaris.js.html create mode 100644 docs/src_commands_Worldstate_Sorties.js.html create mode 100644 docs/src_commands_Worldstate_Syndicates.js.html create mode 100644 docs/src_commands_Worldstate_Updates.js.html create mode 100644 docs/src_embeds_AlertEmbed.js.html create mode 100644 docs/src_embeds_BaseEmbed.js.html create mode 100644 docs/src_embeds_BuildEmbed.js.html create mode 100644 docs/src_embeds_ConclaveChallengeEmbed.js.html create mode 100644 docs/src_embeds_ConstructionEmbed.js.html create mode 100644 docs/src_embeds_DarvoEmbed.js.html create mode 100644 docs/src_embeds_EarthCycleEmbed.js.html create mode 100644 docs/src_embeds_EnableInfoEmbed.js.html create mode 100644 docs/src_embeds_EnableUsageEmbed.js.html create mode 100644 docs/src_embeds_EnemyEmbed.js.html create mode 100644 docs/src_embeds_EnhancementEmbed.js.html create mode 100644 docs/src_embeds_EventEmbed.js.html create mode 100644 docs/src_embeds_FissureEmbed.js.html create mode 100644 docs/src_embeds_FrameEmbed.js.html create mode 100644 docs/src_embeds_InvasionEmbed.js.html create mode 100644 docs/src_embeds_LFGEmbed.js.html create mode 100644 docs/src_embeds_LogEmbed.js.html create mode 100644 docs/src_embeds_NewsEmbed.js.html create mode 100644 docs/src_embeds_PriceCheckEmbed.js.html create mode 100644 docs/src_embeds_ProfileEmbed.js.html create mode 100644 docs/src_embeds_RaidEmbed.js.html create mode 100644 docs/src_embeds_RolesEmbed.js.html create mode 100644 docs/src_embeds_SalesEmbed.js.html create mode 100644 docs/src_embeds_ServerInfoEmbed.js.html create mode 100644 docs/src_embeds_SettingsEmbed.js.html create mode 100644 docs/src_embeds_ShieldEmbed.js.html create mode 100644 docs/src_embeds_SimarisEmbed.js.html create mode 100644 docs/src_embeds_SortieEmbed.js.html create mode 100644 docs/src_embeds_SyndicateEmbed.js.html create mode 100644 docs/src_embeds_UserInfoEmbed.js.html create mode 100644 docs/src_embeds_VoidTraderEmbed.js.html create mode 100644 docs/src_embeds_WeaponEmbed.js.html create mode 100644 docs/src_embeds_WhatsinEmbed.js.html create mode 100644 docs/src_embeds_WhereisEmbed.js.html create mode 100644 docs/src_embeds_WikiEmbed.js.html create mode 100644 docs/src_eventHandlers_AddChannelToDatabase.js.html create mode 100644 docs/src_eventHandlers_AddGuildToDatabase.js.html create mode 100644 docs/src_eventHandlers_AssignDefaultRoles.js.html create mode 100644 docs/src_eventHandlers_BulkMessageDeleteHandle.js.html create mode 100644 docs/src_eventHandlers_DeleteChannel.js.html create mode 100644 docs/src_eventHandlers_DeleteGuild.js.html create mode 100644 docs/src_eventHandlers_LogMemberBan.js.html create mode 100644 docs/src_eventHandlers_LogMemberRemove.js.html create mode 100644 docs/src_eventHandlers_LogMemberUnban.js.html create mode 100644 docs/src_eventHandlers_MessageDeleteHandle.js.html create mode 100644 docs/src_eventHandlers_NotifyVulgarName.js.html create mode 100644 docs/src_eventHandlers_Ready.js.html create mode 100644 docs/src_eventHandlers_WelcomeHandler.js.html create mode 100644 docs/src_models_BaseEventHandler.js.html create mode 100644 docs/src_models_Command.js.html create mode 100644 docs/src_models_CustomCommand.js.html create mode 100644 docs/src_models_InlineCommand.js.html create mode 100644 docs/src_notifications_Broadcaster.js.html create mode 100644 docs/src_notifications_Notifier.js.html create mode 100644 docs/src_resources_RaidStat.js.html create mode 100644 docs/src_settings_Database.js.html create mode 100644 docs/src_settings_DatabaseQueries_DBMQueries.js.html create mode 100644 docs/src_settings_DatabaseQueries_PermissionsQueries.js.html create mode 100644 docs/src_settings_DatabaseQueries_PingsQueries.js.html create mode 100644 docs/src_settings_DatabaseQueries_PrivateRoomQueries.js.html create mode 100644 docs/src_settings_DatabaseQueries_SettingsQueries.js.html create mode 100644 docs/src_settings_DatabaseQueries_TrackingQueries.js.html create mode 100644 docs/src_settings_DatabaseQueries_WelcomeQueries.js.html create mode 100644 docs/src_settings_MessageManager.js.html create mode 100644 docs/src_settings_StringManager.js.html create mode 100644 docs/styles/darkstrap.css create mode 100644 docs/styles/prettify-tomorrow.css create mode 100644 docs/styles/site.cerulean.css create mode 100644 docs/styles/site.cosmo.css create mode 100644 docs/styles/site.cyborg.css create mode 100644 docs/styles/site.darkly.css create mode 100644 docs/styles/site.darkstrap.css create mode 100644 docs/styles/site.dibs-bootstrap.css create mode 100644 docs/styles/site.flatly.css create mode 100644 docs/styles/site.journal.css create mode 100644 docs/styles/site.lumen.css create mode 100644 docs/styles/site.paper.css create mode 100644 docs/styles/site.readable.css create mode 100644 docs/styles/site.sandstone.css create mode 100644 docs/styles/site.simplex.css create mode 100644 docs/styles/site.slate.css create mode 100644 docs/styles/site.spacelab.css create mode 100644 docs/styles/site.superhero.css create mode 100644 docs/styles/site.united.css create mode 100644 docs/styles/site.yeti.css create mode 100644 docs/styles/sunlight.dark.css create mode 100644 docs/styles/sunlight.default.css diff --git a/docs/AddBuild.html b/docs/AddBuild.html new file mode 100644 index 000000000..1fc113d7f --- /dev/null +++ b/docs/AddBuild.html @@ -0,0 +1,602 @@ + + + + + + + genesis Class: AddBuild + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: AddBuild

+
+ +
+ +

+ AddBuild +

+ +
Create temporary voice/text channels (can be expanded in the future)
+ + +
+ + +
+
+ + +
+
+

new AddBuild(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +

Class: AddBuild

+
+ +
+ +

+ AddBuild +

+ +
Create temporary voice/text channels (can be expanded in the future)
+ + +
+ + +
+
+ + +
+
+

new AddBuild(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/AddChannelToDatabase.html b/docs/AddChannelToDatabase.html new file mode 100644 index 000000000..ffc51902e --- /dev/null +++ b/docs/AddChannelToDatabase.html @@ -0,0 +1,610 @@ + + + + + + + genesis Class: AddChannelToDatabase + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: AddChannelToDatabase

+
+ +
+ +

+ AddChannelToDatabase +

+ +
Describes a handler
+ + +
+ + +
+
+ + +
+
+

new AddChannelToDatabase(bot, id, event)

+ + +
+
+ + +
+ Base class for bot commands +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
id + + +string + + + + + The command's unique id
event + + +string + + + + + Event to trigger this handler
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> execute(channel)

+ + +
+
+ + +
+ add the guild to teh Database +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
channel + + +Discord.Channel + + + + + channel to add to the database
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/AddGuildToDatabase.html b/docs/AddGuildToDatabase.html new file mode 100644 index 000000000..17af09a7d --- /dev/null +++ b/docs/AddGuildToDatabase.html @@ -0,0 +1,610 @@ + + + + + + + genesis Class: AddGuildToDatabase + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: AddGuildToDatabase

+
+ +
+ +

+ AddGuildToDatabase +

+ +
Describes a handler
+ + +
+ + +
+
+ + +
+
+

new AddGuildToDatabase(bot, id, event)

+ + +
+
+ + +
+ Base class for bot commands +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
id + + +string + + + + + The command's unique id
event + + +string + + + + + Event to trigger this handler
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> execute(guild)

+ + +
+
+ + +
+ add the guild to teh Database +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
guild + + +Discord.Guild + + + + + guild to add to the database
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/AddLFG.html b/docs/AddLFG.html new file mode 100644 index 000000000..83ac968c0 --- /dev/null +++ b/docs/AddLFG.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: AddLFG + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: AddLFG

+
+ +
+ +

+ AddLFG +

+ +
Create temporary voice/text channels (can be expanded in the future)
+ + +
+ + +
+
+ + +
+
+

new AddLFG(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/AddRole.html b/docs/AddRole.html new file mode 100644 index 000000000..66a399419 --- /dev/null +++ b/docs/AddRole.html @@ -0,0 +1,533 @@ + + + + + + + genesis Class: AddRole + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: AddRole

+
+ +
+ +

+ AddRole +

+ +
Add a joinable role
+ + +
+ + +
+
+ + +
+
+

new AddRole()

+ + +
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/AlertEmbed.html b/docs/AlertEmbed.html new file mode 100644 index 000000000..5866e65fc --- /dev/null +++ b/docs/AlertEmbed.html @@ -0,0 +1,464 @@ + + + + + + + genesis Class: AlertEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: AlertEmbed

+
+ +
+ +

+ AlertEmbed +

+ +
Generates alert embeds
+ + +
+ + +
+
+ + +
+
+

new AlertEmbed(bot, alerts, platform)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
alerts + + +Array.<Alert> + + + + + The alerts to be included in the embed
platform + + +string + + + + + platform
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Alerts.html b/docs/Alerts.html new file mode 100644 index 000000000..76930326d --- /dev/null +++ b/docs/Alerts.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: Alerts + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Alerts

+
+ +
+ +

+ Alerts +

+ +
Displays the currently active alerts
+ + +
+ + +
+
+ + +
+
+

new Alerts(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Arcane.html b/docs/Arcane.html new file mode 100644 index 000000000..aa0b98361 --- /dev/null +++ b/docs/Arcane.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: Arcane + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Arcane

+
+ +
+ +

+ Arcane +

+ +
Displays the response time for the bot and checks Warframe's servers to see if they are up
+ + +
+ + +
+
+ + +
+
+

new Arcane(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Armor.html b/docs/Armor.html new file mode 100644 index 000000000..af1ee5201 --- /dev/null +++ b/docs/Armor.html @@ -0,0 +1,1089 @@ + + + + + + + genesis Class: Armor + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Armor

+
+ +
+ +

+ Armor +

+ +
Performs armor calculations
+ + +
+ + +
+
+ + +
+
+

new Armor(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

armorFull(baseArmor, baseLevel, currentLevel)

+ + +
+
+ + +
+ Returns a string with details on an enemy's armor at a certain level +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
baseArmor + + +number + + + + + The enemy's armor at the base level
baseLevel + + +number + + + + + The enemy's base level
currentLevel + + +number + + + + + The level to calculate armor at
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ + + +
+
+

armorSimple(armor)

+ + +
+
+ + +
+ Returns a string with details on an enemy's armor +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
armor + + +number + + + + + The enemy's armor
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ + + +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ + + +
+
+

sendUsage(message)

+ + +
+
+ + +
+ Replies with details on the command's usage +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + The message to reply to
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/AssignDefaultRolesHandle.html b/docs/AssignDefaultRolesHandle.html new file mode 100644 index 000000000..b8901df85 --- /dev/null +++ b/docs/AssignDefaultRolesHandle.html @@ -0,0 +1,610 @@ + + + + + + + genesis Class: AssignDefaultRolesHandle + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: AssignDefaultRolesHandle

+
+ +
+ +

+ AssignDefaultRolesHandle +

+ +
Describes a handler
+ + +
+ + +
+
+ + +
+
+

new AssignDefaultRolesHandle(bot, id, event)

+ + +
+
+ + +
+ Base class for bot commands +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
id + + +string + + + + + The command's unique id
event + + +string + + + + + Event to trigger this handler
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> execute(member)

+ + +
+
+ + +
+ add the guild to teh Database +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
member + + +Discord.member + + + + + member to add roles to
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Avatar.html b/docs/Avatar.html new file mode 100644 index 000000000..311535523 --- /dev/null +++ b/docs/Avatar.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: Avatar + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Avatar

+
+ +
+ +

+ Avatar +

+ +
Sets the avatar for the bot
+ + +
+ + +
+
+ + +
+
+

new Avatar(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Bot + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Baro.html b/docs/Baro.html new file mode 100644 index 000000000..6525e1d6b --- /dev/null +++ b/docs/Baro.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: Baro + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Baro

+
+ +
+ +

+ Baro +

+ +
Displays the currently active Invasions
+ + +
+ + +
+
+ + +
+
+

new Baro(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/BaseEmbed.html b/docs/BaseEmbed.html new file mode 100644 index 000000000..fdc08f9cc --- /dev/null +++ b/docs/BaseEmbed.html @@ -0,0 +1,366 @@ + + + + + + + genesis Class: BaseEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: BaseEmbed

+
+ +
+ +

+ BaseEmbed +

+ +
Utility class for making rich embeds
+ + +
+ + +
+
+ + +
+
+

new BaseEmbed()

+ + +
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/BaseEventHandler.html b/docs/BaseEventHandler.html new file mode 100644 index 000000000..43da5df39 --- /dev/null +++ b/docs/BaseEventHandler.html @@ -0,0 +1,1136 @@ + + + + + + + genesis Class: BaseEventHandler + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: BaseEventHandler

+
+ +
+ +

+ BaseEventHandler +

+ +
Describes a handler
+ + +
+ + +
+
+ + +
+
+

new BaseEventHandler(bot, id, event)

+ + +
+
+ + +
+ Base class for bot commands +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
id + + +string + + + + + The command's unique id
event + + +string + + + + + Event to trigger this handler
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + +

Members

+ +
+ +
+
+

bot :Genesis

+ + +
+
+ +
+ The bot object +
+ + + +
Type:
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

client :Discord.Client

+ + +
+
+ +
+ The bot client +
+ + + +
Type:
+
    +
  • + +Discord.Client + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

event :string

+ + +
+
+ +
+ Event to be triggerd by this handler +
+ + + +
Type:
+
    +
  • + +string + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

id :string

+ + +
+
+ +
+ Handler Identifier +
+ + + +
Type:
+
    +
  • + +string + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

messageManager :MessageManager

+ + +
+
+ +
+ Message manager +
+ + + +
Type:
+
    +
  • + +MessageManager + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

settings :Database

+ + +
+
+ +
+ Database settings wrapper +
+ + + +
Type:
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+
+

<async> execute(event, event2)

+ + +
+
+ + +
+ Run the handle +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
event + + +GuildMember +| + +Guild +| + +User + + + + + Event param to handle
event2 + + +GuildMember +| + +Guild +| + +User + + + + + Second event param to handle
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Broadcaster.html b/docs/Broadcaster.html new file mode 100644 index 000000000..660c6082b --- /dev/null +++ b/docs/Broadcaster.html @@ -0,0 +1,826 @@ + + + + + + + genesis Class: Broadcaster + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Broadcaster

+
+ +
+ +

+ Broadcaster +

+ +
Broadcast updates out to subscribing channels
+ + +
+ + +
+
+ + +
+
+

new Broadcaster(client, settings, messageManager, logger)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
client + + +Discord.Client + + + + + bot client
settings + + +Database + + + + + settings object for fetching data + information about current channel, guild, and bot settings
messageManager + + +MessageManager + + + + + manages messages, including sending, deleing, and webhooks
logger + + +Logger +| + +console + + + + + Logger for errors and debugging
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> broadcast(embed, platform, type [, items] [, deleteAfter])

+ + +
+
+ + +
+ Broadcast embed to all channels for a platform and type +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDefaultDescription
embed + + +Object + + + + + + + + + + + + + Embed to send to a channel
platform + + +string + + + + + + + + + + + + + Platform of worldstate
type + + +string + + + + + + + + + + + + + Type of new data to notify
items + + +Array + + + + + + + <optional>
+ + + + + +
+ + [] + + Items to broadcast
deleteAfter + + +number + + + + + + + <optional>
+ + + + + +
+ + 0 + + Amount of time to delete broadcast after
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ values for successes +
+ + + +
+
+ Type +
+
+ +Array.<Object> + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/BugReport.html b/docs/BugReport.html new file mode 100644 index 000000000..feaf717d7 --- /dev/null +++ b/docs/BugReport.html @@ -0,0 +1,563 @@ + + + + + + + genesis Class: BugReport + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: BugReport

+
+ +
+ +

+ BugReport +

+ +
Send a bug report to owner
+ + +
+ + +
+
+ + +
+
+

new BugReport(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Bot + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/BuildChart.html b/docs/BuildChart.html new file mode 100644 index 000000000..21d0837fd --- /dev/null +++ b/docs/BuildChart.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: BuildChart + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: BuildChart

+
+ +
+ +

+ BuildChart +

+ +
Displays the weapon crafting chart
+ + +
+ + +
+
+ + +
+
+

new BuildChart(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/BuildEmbed.html b/docs/BuildEmbed.html new file mode 100644 index 000000000..0d5887ac8 --- /dev/null +++ b/docs/BuildEmbed.html @@ -0,0 +1,440 @@ + + + + + + + genesis Class: BuildEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: BuildEmbed

+
+ +
+ +

+ BuildEmbed +

+ +
Generates build embeds
+ + +
+ + +
+
+ + +
+
+

new BuildEmbed(bot, build)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
build + + +Build + + + + + The alerts to be included in the embed
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Command.html b/docs/Command.html new file mode 100644 index 000000000..15a460a44 --- /dev/null +++ b/docs/Command.html @@ -0,0 +1,1960 @@ + + + + + + + genesis Class: Command + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Command

+
+ +
+ +

+ Command +

+ +
Describes a callable command
+ + +
+ + +
+
+ + +
+
+

new Command(bot, id, call, description)

+ + +
+
+ + +
+ Base class for bot commands +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
id + + +string + + + + + The command's unique id
call + + +string + + + + + The string that invokes this command
description + + +string + + + + + A description for this command
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + +

Members

+ +
+ +
+
+

allowDM :Boolean

+ + +
+
+ +
+ True if this command is allowed in direct messages +
+ + + +
Type:
+
    +
  • + +Boolean + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

blacklistable :Boolean

+ + +
+
+ +
+ True if this command is allowed to be disabled. +
+ + + +
Type:
+
    +
  • + +Boolean + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

bot :Genesis

+ + +
+
+ +
+ The bot object +
+ + + +
Type:
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

commandHandler :CommandHandler

+ + +
+
+ +
+ The command handler for processing commands +
+ + + +
Type:
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

id :string

+ + +
+
+ +
+ Command Identifier +
+ + + +
Type:
+
    +
  • + +string + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

isCustomCommand :Boolean

+ + +
+
+ +
+ True if command is a custom command +
+ + + +
Type:
+
    +
  • + +Boolean + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

isInline :Boolean

+ + +
+
+ +
+ True if this is an inline command +
+ + + +
Type:
+
    +
  • + +Boolean + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

messageManager :MessageManager

+ + +
+
+ +
+ Message manager for sending and managing messages +
+ + + +
Type:
+
    +
  • + +MessageManager + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

ownerOnly :boolean

+ + +
+
+ +
+ True if the command may only be executed by the owner of the bot +
+ + + +
Type:
+
    +
  • + +boolean + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

regex :RegExp

+ + +
+
+ +
+ Command regex for calling the command +
+ + + +
Type:
+
    +
  • + +RegExp + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

requiresAuth :Boolean

+ + +
+
+ +
+ True if this command requires authorization to be executed +
+ + + +
Type:
+
    +
  • + +Boolean + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

settings :Database

+ + +
+
+ +
+ Settings object interface +
+ + + +
Type:
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

usages :string

+ + +
+
+ +
+ Help command for documenting the function or purpose of a command. +
+ + + +
Type:
+
    +
  • + +string + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

zSWC :string

+ + +
+
+ +
+ Zero space whitespace character to prepend to any messages sent +to prevent a command from inadvertantly being triggered. +
+ + + +
Type:
+
    +
  • + +string + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + +
+
+

<async> sendToggleUsage(message, options)

+ + +
+
+ + +
+ Send Usage for a toggle command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Discord.Message + + + + + message to respond to
options + + +Array.<string> + + + + + optional replacement for args
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ failure status. +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/CommandHandler.html b/docs/CommandHandler.html new file mode 100644 index 000000000..309722d50 --- /dev/null +++ b/docs/CommandHandler.html @@ -0,0 +1,884 @@ + + + + + + + genesis Class: CommandHandler + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: CommandHandler

+
+ +
+ +

+ CommandHandler +

+ +
Describes a CommandHandler for a bot.
+ + +
+ + +
+
+ + +
+
+

new CommandHandler(bot)

+ + +
+
+ + +
+ Constructs CommandHandler +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + Bot to derive prefix for commands from
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> checkCanAct(command, message, allowCustom, allowInline)

+ + +
+
+ + +
+ Check if the current command being called is able to be performed for the user calling it. +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
command + + +Command + + + + + command to process to see if it can be called
message + + +Message + + + + + Discord message object
allowCustom + + +boolean + + + + + Whether or not to allow custom commands
allowInline + + +boolean + + + + + Whether or not to allow inline commands
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ Whether or not the current command can be called by the author +
+ + + +
+
+ Type +
+
+ +Promise.<boolean> + + + +
+
+ + + + + +
+ + + +
+
+

<async> handleCommand(message)

+ + +
+
+ + +
+ Handle the command contained in the message contents, if any. +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message whose command should be checked and handled
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + +
+
+

<async> loadCommands()

+ + +
+
+ + +
+ Loads the commands from disk into this.commands +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/ConclaveChallengeEmbed.html b/docs/ConclaveChallengeEmbed.html new file mode 100644 index 000000000..d20bad354 --- /dev/null +++ b/docs/ConclaveChallengeEmbed.html @@ -0,0 +1,488 @@ + + + + + + + genesis Class: ConclaveChallengeEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: ConclaveChallengeEmbed

+
+ +
+ +

+ ConclaveChallengeEmbed +

+ +
Generates conclave challenge embeds
+ + +
+ + +
+
+ + +
+
+

new ConclaveChallengeEmbed(bot, challenges, category, platform)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
challenges + + +Array.<ConclaveChallenge> + + + + + The challenges to be included in the embed
category + + +string + + + + + The category of the challenges in the embed
platform + + +string + + + + + The platform for the information
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/ConclaveChallenges.html b/docs/ConclaveChallenges.html new file mode 100644 index 000000000..d1cfb81b8 --- /dev/null +++ b/docs/ConclaveChallenges.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: ConclaveChallenges + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: ConclaveChallenges

+
+ +
+ +

+ ConclaveChallenges +

+ +
Displays the currently active Invasions
+ + +
+ + +
+
+ + +
+
+

new ConclaveChallenges(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Construction.html b/docs/Construction.html new file mode 100644 index 000000000..fe2769322 --- /dev/null +++ b/docs/Construction.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: Construction + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Construction

+
+ +
+ +

+ Construction +

+ +
Displays the current simaris target
+ + +
+ + +
+
+ + +
+
+

new Construction(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/ConstructionEmbed.html b/docs/ConstructionEmbed.html new file mode 100644 index 000000000..05aea608a --- /dev/null +++ b/docs/ConstructionEmbed.html @@ -0,0 +1,464 @@ + + + + + + + genesis Class: ConstructionEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: ConstructionEmbed

+
+ +
+ +

+ ConstructionEmbed +

+ +
Generates daily deal embeds
+ + +
+ + +
+
+ + +
+
+

new ConstructionEmbed(bot, constructionProgress, platform)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
constructionProgress + + +Construction + + + + + The current construction information
platform + + +string + + + + + The platform the event is for
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Corgi.html b/docs/Corgi.html new file mode 100644 index 000000000..1ba8c9ec9 --- /dev/null +++ b/docs/Corgi.html @@ -0,0 +1,586 @@ + + + + + + + genesis Class: Corgi + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Corgi

+
+ +
+ +

+ Corgi +

+ +
Corgis - Bsed on https://github.com/ryands/hubot-corgi
+ + +
+ + +
+
+ + +
+
+

new Corgi(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Create.html b/docs/Create.html new file mode 100644 index 000000000..f7a981a38 --- /dev/null +++ b/docs/Create.html @@ -0,0 +1,1051 @@ + + + + + + + genesis Class: Create + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Create

+
+ +
+ +

+ Create +

+ +
Create temporary voice/text channels (can be expanded in the future)
+ + +
+ + +
+
+ + +
+
+

new Create(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

createOverwrites(users, everyoneRole, author, isPublic, shown)

+ + +
+
+ + +
+ Create an array of permissions overwrites for the channel +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
users + + +Array.<User> + + + + + Array of users for whom to allow into channels
everyoneRole + + +RoleResolvable + + + + + RoleResolvable for the @everyone role
author + + +User + + + + + User object for creator of room
isPublic + + +boolean + + + + + Whether or not this channel will be public
shown + + +boolean + + + + + Whether or not this channel will be visible
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Array.<PermissionsOVerwrites> + + + +
+
+ + + + + +
+ + + +
+
+

<async> run(message, ctx)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
ctx + + +Object + + + + + Command context for calling commands
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ + + +
+
+

<async> sendInvites(voiceChannel, users, author)

+ + +
+
+ + +
+ Send channel invites to users who were tagged in message +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
voiceChannel + + +VoiceChannel + + + + + Voice channel to create invites for
users + + +Array.<User> + + + + + Array of users to send invites to
author + + +User + + + + + Calling user who sends message
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/CreatePool.html b/docs/CreatePool.html new file mode 100644 index 000000000..6428925cb --- /dev/null +++ b/docs/CreatePool.html @@ -0,0 +1,366 @@ + + + + + + + genesis Class: CreatePool + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: CreatePool

+
+ +
+ +

+ CreatePool +

+ +
Reloads the script containing the commands
+ + +
+ + +
+
+ + +
+
+

new CreatePool()

+ + +
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/CustomCommand.html b/docs/CustomCommand.html new file mode 100644 index 000000000..5c0e420f6 --- /dev/null +++ b/docs/CustomCommand.html @@ -0,0 +1,1358 @@ + + + + + + + genesis Class: CustomCommand + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: CustomCommand

+
+ +
+ +

+ CustomCommand +

+ +
Describes a callable command
+ + +
+ + +
+
+ + +
+
+

new CustomCommand(bot, call, response, guildId)

+ + +
+
+ + +
+ Base class for custom bot commands +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
call + + +string + + + + + The string that invokes this command
response + + +string + + + + + What the responds to the command
guildId + + +string + + + + + Guild id for the guild it was created in
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message, ctx)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
ctx + + +Object + + + + + command context
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + +
+
+

run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +

Class: CustomCommand

+
+ +
+ +

+ CustomCommand +

+ +
Describes a callable command
+ + +
+ + +
+
+ + +
+
+

new CustomCommand(bot, id, call, description)

+ + +
+
+ + +
+ Base class for inline bot commands +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
id + + +string + + + + + The command's unique id
call + + +string + + + + + The string that invokes this command
description + + +string + + + + + A description for this command
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message, ctx)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
ctx + + +Object + + + + + command context
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + +
+
+

run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Damage.html b/docs/Damage.html new file mode 100644 index 000000000..b139b16b7 --- /dev/null +++ b/docs/Damage.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: Damage + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Damage

+
+ +
+ +

+ Damage +

+ +
Displays the Damage 2.0 charts
+ + +
+ + +
+
+ + +
+
+

new Damage(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Darvo.html b/docs/Darvo.html new file mode 100644 index 000000000..e1b2299a4 --- /dev/null +++ b/docs/Darvo.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: Darvo + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Darvo

+
+ +
+ +

+ Darvo +

+ +
Displays today's Darvo deal
+ + +
+ + +
+
+ + +
+
+

new Darvo(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/DarvoEmbed.html b/docs/DarvoEmbed.html new file mode 100644 index 000000000..869b8a244 --- /dev/null +++ b/docs/DarvoEmbed.html @@ -0,0 +1,464 @@ + + + + + + + genesis Class: DarvoEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: DarvoEmbed

+
+ +
+ +

+ DarvoEmbed +

+ +
Generates daily deal embeds
+ + +
+ + +
+
+ + +
+
+

new DarvoEmbed(bot, deal, platform)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
deal + + +DailyDeal + + + + + The deal to be included in the embed
platform + + +string + + + + + platform
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Database.html b/docs/Database.html new file mode 100644 index 000000000..c57da913f --- /dev/null +++ b/docs/Database.html @@ -0,0 +1,876 @@ + + + + + + + genesis Class: Database + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Database

+
+ +
+ +

+ Database +

+ +
Persistent storage for the bot
+ + +
+ + +
+
+ + +
+
+

new Database(dbOptions, bot)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
dbOptions + + +DbConnectionOptions + + + + + Connection options for the database
bot + + +Genesis + + + + + Bot to load the settings for
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

copyChildrenQueries(queriesClass)

+ + +
+
+ + +
+ Copy funcitonns from class to this class... theoretically +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
queriesClass + + +Object + + + + + class instance
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ doesn't return anything +
+ + + +
+
+ Type +
+
+ +undefined + + + +
+
+ + + + + +
+ + + +
+
+

<async> getChannelAndGuildCounts()

+ + +
+
+ + +
+ Gets the current count of guilds and channels +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

<async> getCommandContext(channel)

+ + +
+
+ + +
+ Get context (including settings) for a command in a channel +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
channel + + +Discord.Channel + + + + + channel to get settings for
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ context +
+ + + +
+
+ Type +
+
+ +Object + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/DeleteBuild.html b/docs/DeleteBuild.html new file mode 100644 index 000000000..34144ec07 --- /dev/null +++ b/docs/DeleteBuild.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: DeleteBuild + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: DeleteBuild

+
+ +
+ +

+ DeleteBuild +

+ +
Create temporary voice/text channels (can be expanded in the future)
+ + +
+ + +
+
+ + +
+
+

new DeleteBuild(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/DeleteChannel.html b/docs/DeleteChannel.html new file mode 100644 index 000000000..f064a8d8d --- /dev/null +++ b/docs/DeleteChannel.html @@ -0,0 +1,562 @@ + + + + + + + genesis Class: DeleteChannel + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: DeleteChannel

+
+ +
+ +

+ DeleteChannel +

+ +
Describes a handler
+ + +
+ + +
+
+ + +
+
+

new DeleteChannel(bot)

+ + +
+
+ + +
+ Construct handle +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> execute(channel)

+ + +
+
+ + +
+ delete channel from databse +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
channel + + +Discord.Channel + + + + + channel to delete from the database
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/DeleteGuild.html b/docs/DeleteGuild.html new file mode 100644 index 000000000..9b96c0093 --- /dev/null +++ b/docs/DeleteGuild.html @@ -0,0 +1,562 @@ + + + + + + + genesis Class: DeleteGuild + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: DeleteGuild

+
+ +
+ +

+ DeleteGuild +

+ +
Describes a handler
+ + +
+ + +
+
+ + +
+
+

new DeleteGuild(bot)

+ + +
+
+ + +
+ Construct handle +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> execute(guild)

+ + +
+
+ + +
+ delete channel from databse +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
guild + + +Discord.Guild + + + + + channel to delete from the database
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/DeleteWebhook.html b/docs/DeleteWebhook.html new file mode 100644 index 000000000..a04409cf5 --- /dev/null +++ b/docs/DeleteWebhook.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: DeleteWebhook + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: DeleteWebhook

+
+ +
+ +

+ DeleteWebhook +

+ +
Sets the avatar for the bot
+ + +
+ + +
+
+ + +
+
+

new DeleteWebhook(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Bot + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Destroy.html b/docs/Destroy.html new file mode 100644 index 000000000..8d63d00e6 --- /dev/null +++ b/docs/Destroy.html @@ -0,0 +1,611 @@ + + + + + + + genesis Class: Destroy + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Destroy

+
+ +
+ +

+ Destroy +

+ +
Rename user's temp room
+ + +
+ + +
+
+ + +
+
+

new Destroy(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message, ctx)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
ctx + + +Object + + + + + Command context for calling commands
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/EarthCycle.html b/docs/EarthCycle.html new file mode 100644 index 000000000..aeef13497 --- /dev/null +++ b/docs/EarthCycle.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: EarthCycle + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: EarthCycle

+
+ +
+ +

+ EarthCycle +

+ +
Displays the current stage in Earth's cycle
+ + +
+ + +
+
+ + +
+
+

new EarthCycle(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/EarthCycleEmbed.html b/docs/EarthCycleEmbed.html new file mode 100644 index 000000000..f2dfd0d7b --- /dev/null +++ b/docs/EarthCycleEmbed.html @@ -0,0 +1,440 @@ + + + + + + + genesis Class: EarthCycleEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: EarthCycleEmbed

+
+ +
+ +

+ EarthCycleEmbed +

+ +
Generates Earth cycle embeds
+ + +
+ + +
+
+ + +
+
+

new EarthCycleEmbed(bot, state)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
state + + +Object + + + + + The current state of the cycle
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Echo.html b/docs/Echo.html new file mode 100644 index 000000000..d9b00d8cd --- /dev/null +++ b/docs/Echo.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: Echo + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Echo

+
+ +
+ +

+ Echo +

+ +
Echo what the user says
+ + +
+ + +
+
+ + +
+
+

new Echo(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Efficiency.html b/docs/Efficiency.html new file mode 100644 index 000000000..421c56fb8 --- /dev/null +++ b/docs/Efficiency.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: Efficiency + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Efficiency

+
+ +
+ +

+ Efficiency +

+ +
Displays the Warframe efficincy/duration Chart
+ + +
+ + +
+
+ + +
+
+

new Efficiency(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/EnableInfoEmbed.html b/docs/EnableInfoEmbed.html new file mode 100644 index 000000000..12b31b7c6 --- /dev/null +++ b/docs/EnableInfoEmbed.html @@ -0,0 +1,464 @@ + + + + + + + genesis Class: EnableInfoEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: EnableInfoEmbed

+
+ +
+ +

+ EnableInfoEmbed +

+ +
Utility class for making rich embeds
+ + +
+ + +
+
+ + +
+
+

new EnableInfoEmbed(bot, enable, params)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
enable + + +number + + + + + 1 if enabling command, 0 if disabling
params + + +Array.<string> + + + + + list of params
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/EnableUsageEmbed.html b/docs/EnableUsageEmbed.html new file mode 100644 index 000000000..5c5402448 --- /dev/null +++ b/docs/EnableUsageEmbed.html @@ -0,0 +1,464 @@ + + + + + + + genesis Class: EnableUsageEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: EnableUsageEmbed

+
+ +
+ +

+ EnableUsageEmbed +

+ +
Utility class for making rich embeds
+ + +
+ + +
+
+ + +
+
+

new EnableUsageEmbed(bot, params, enable)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
params + + +Array.<string> + + + + + list of params
enable + + +number + + + + + 1 if enable, 0 if disable
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Enemies.html b/docs/Enemies.html new file mode 100644 index 000000000..260ee13ba --- /dev/null +++ b/docs/Enemies.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: Enemies + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Enemies

+
+ +
+ +

+ Enemies +

+ +
Displays the currently persistent enemies
+ + +
+ + +
+
+ + +
+
+

new Enemies(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/EnemyEmbed.html b/docs/EnemyEmbed.html new file mode 100644 index 000000000..030b63fd3 --- /dev/null +++ b/docs/EnemyEmbed.html @@ -0,0 +1,464 @@ + + + + + + + genesis Class: EnemyEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: EnemyEmbed

+
+ +
+ +

+ EnemyEmbed +

+ +
Generates enemy embeds
+ + +
+ + +
+
+ + +
+
+

new EnemyEmbed(bot, enemies, platform)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
enemies + + +Array.<PersistentEnemy> + + + + + The persistentEnemies to be included in the embed
platform + + +string + + + + + platform
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/EnhancementEmbed.html b/docs/EnhancementEmbed.html new file mode 100644 index 000000000..f64f01fd4 --- /dev/null +++ b/docs/EnhancementEmbed.html @@ -0,0 +1,464 @@ + + + + + + + genesis Class: EnhancementEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: EnhancementEmbed

+
+ +
+ +

+ EnhancementEmbed +

+ +
Generates enemy embeds
+ + +
+ + +
+
+ + +
+
+

new EnhancementEmbed(bot, enhancement, enhancements)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
enhancement + + +Enhancement + + + + + The enhancement to send info on
enhancements + + +Array.<Enhancement> + + + + + The enhancement to send info on
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Event.html b/docs/Event.html new file mode 100644 index 000000000..f00c4db9c --- /dev/null +++ b/docs/Event.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: Event + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Event

+
+ +
+ +

+ Event +

+ +
Displays the current event statuses
+ + +
+ + +
+
+ + +
+
+

new Event(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/EventEmbed.html b/docs/EventEmbed.html new file mode 100644 index 000000000..bae8d290b --- /dev/null +++ b/docs/EventEmbed.html @@ -0,0 +1,464 @@ + + + + + + + genesis Class: EventEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: EventEmbed

+
+ +
+ +

+ EventEmbed +

+ +
Generates daily deal embeds
+ + +
+ + +
+
+ + +
+
+

new EventEmbed(bot, event, platform)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
event + + +Event + + + + + The deal to be included in the embed
platform + + +string + + + + + The platform the event is for
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/EventHandler.html b/docs/EventHandler.html new file mode 100644 index 000000000..b73433b39 --- /dev/null +++ b/docs/EventHandler.html @@ -0,0 +1,674 @@ + + + + + + + genesis Class: EventHandler + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: EventHandler

+
+ +
+ +

+ EventHandler +

+ +
Describes a CommandHandler for a bot.
+ + +
+ + +
+
+ + +
+
+

new EventHandler(bot)

+ + +
+
+ + +
+ Constructs CommandHandler +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + Bot to derive prefix for commands from
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> handleEvent(args)

+ + +
+
+ + +
+ Handle the command contained in the message contents, if any. +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
args + + +Object + + + + + arguments for handlers
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ resolution of handlers execution +
+ + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

<async> loadHandles()

+ + +
+
+ + +
+ Loads the handles from disk into this.handles +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/FeaturedDeal.html b/docs/FeaturedDeal.html new file mode 100644 index 000000000..f2cacc52d --- /dev/null +++ b/docs/FeaturedDeal.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: FeaturedDeal + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: FeaturedDeal

+
+ +
+ +

+ FeaturedDeal +

+ +
Displays current featured deals
+ + +
+ + +
+
+ + +
+
+

new FeaturedDeal(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/FissureEmbed.html b/docs/FissureEmbed.html new file mode 100644 index 000000000..29ac12ad3 --- /dev/null +++ b/docs/FissureEmbed.html @@ -0,0 +1,464 @@ + + + + + + + genesis Class: FissureEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: FissureEmbed

+
+ +
+ +

+ FissureEmbed +

+ +
Generates fissure embeds
+ + +
+ + +
+
+ + +
+
+

new FissureEmbed(bot, fissures, platform)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
fissures + + +Array.<Fissure> + + + + + The fissures to be included in the embed
platform + + +string + + + + + platform
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Fissures.html b/docs/Fissures.html new file mode 100644 index 000000000..1b3f796e0 --- /dev/null +++ b/docs/Fissures.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: Fissures + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Fissures

+
+ +
+ +

+ Fissures +

+ +
Displays the currently active Invasions
+ + +
+ + +
+
+ + +
+
+

new Fissures(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/FrameEmbed.html b/docs/FrameEmbed.html new file mode 100644 index 000000000..f944c7059 --- /dev/null +++ b/docs/FrameEmbed.html @@ -0,0 +1,464 @@ + + + + + + + genesis Class: FrameEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: FrameEmbed

+
+ +
+ +

+ FrameEmbed +

+ +
Generates enemy embeds
+ + +
+ + +
+
+ + +
+
+

new FrameEmbed(bot, frame, frames)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
frame + + +Warframe + + + + + The enhancement to send info on
frames + + +Array.<Warframe> + + + + + List of available warframes
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/FrameProfile.html b/docs/FrameProfile.html new file mode 100644 index 000000000..a6d851e91 --- /dev/null +++ b/docs/FrameProfile.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: FrameProfile + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: FrameProfile

+
+ +
+ +

+ FrameProfile +

+ +
Displays the response time for the bot and checks Warframe's servers to see if they are up
+ + +
+ + +
+
+ + +
+
+

new FrameProfile(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/FrameStats.html b/docs/FrameStats.html new file mode 100644 index 000000000..31750a958 --- /dev/null +++ b/docs/FrameStats.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: FrameStats + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: FrameStats

+
+ +
+ +

+ FrameStats +

+ +
Displays the stats for a warframe
+ + +
+ + +
+
+ + +
+
+

new FrameStats(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/FrameStatsInline.html b/docs/FrameStatsInline.html new file mode 100644 index 000000000..384096cf7 --- /dev/null +++ b/docs/FrameStatsInline.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: FrameStatsInline + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: FrameStatsInline

+
+ +
+ +

+ FrameStatsInline +

+ +
Displays the stats for a warframe
+ + +
+ + +
+
+ + +
+
+

new FrameStatsInline(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Genesis.html b/docs/Genesis.html new file mode 100644 index 000000000..074e653cf --- /dev/null +++ b/docs/Genesis.html @@ -0,0 +1,1654 @@ + + + + + + + genesis Class: Genesis + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Genesis

+
+ +
+ +

+ Genesis +

+ +
Class describing Genesis bot
+ + +
+ + +
+
+ + +
+
+

new Genesis(discordToken, logger [, options])

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
discordToken + + +string + + + + + + + + + + + The token used to authenticate with Discord
logger + + +Logger + + + + + + + + + + + The logger object
options + + +Object + + + + + + + <optional>
+ + + + + +
Bot options +
Properties
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
shardId + + +number + + + + + + + <optional>
+ + + + + +
The shard ID of this instance
shardCount + + +number + + + + + + + <optional>
+ + + + + +
The total number of shards
prefix + + +string + + + + + + + <optional>
+ + + + + +
Prefix for calling the bot
mdConfig + + +MarkdownSettings + + + + + + + <optional>
+ + + + + +
The markdown settings
caches + + +Object + + + + + + + <optional>
+ + + + + +
json-fetch-cache for each Warframe worldstate
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + +

Members

+ +
+ +
+
+

discord :Discord

+ + +
+
+ +
+ Discord.js API +
+ + + +
Type:
+
    +
  • + +Discord + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

eventHandler :EventHandler

+ + +
+
+ +
+ Handles events, such as member joins, bans, delets, etc. +
+ + + +
Type:
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

languages :Array.<string>

+ + +
+
+ +
+ The languages that are useable for the bot +
+ + + +
Type:
+
    +
  • + +Array.<string> + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

owner :string

+ + +
+
+ +
+ The bot's owner +
+ + + +
Type:
+
    +
  • + +string + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

platforms :Array.<string>

+ + +
+
+ +
+ The platforms that Warframe exists for +
+ + + +
Type:
+
    +
  • + +Array.<string> + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

readyToExecute :boolean

+ + +
+
+ +
+ Whether or not the bot is ready to execute. +This allows stopping commands before servers and users are ready. +
+ + + +
Type:
+
    +
  • + +boolean + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

settings :Database

+ + +
+
+ +
+ Persistent storage for settings +
+ + + +
Type:
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

shardClient :Discord.ShardClientUtil

+ + +
+
+ +
+ Shard client for communicating with other shards +
+ + + +
Type:
+
    +
  • + +Discord.ShardClientUtil + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

worldStates :Object.<WorldStateCache>

+ + +
+
+ +
+ Objects holding worldState data, one for each platform +
+ + + +
Type:
+
    +
  • + +Object.<WorldStateCache> + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+
+

onMessage(message)

+ + +
+
+ + +
+ Handle message +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + to handle
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + +
+
+

<async> start()

+ + +
+
+ + +
+ Creates the database schema and logs in the bot to Discord +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/GetBuild.html b/docs/GetBuild.html new file mode 100644 index 000000000..dde05a3bc --- /dev/null +++ b/docs/GetBuild.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: GetBuild + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: GetBuild

+
+ +
+ +

+ GetBuild +

+ +
Create temporary voice/text channels (can be expanded in the future)
+ + +
+ + +
+
+ + +
+
+

new GetBuild(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/GetCommandIds.html b/docs/GetCommandIds.html new file mode 100644 index 000000000..05147e1ea --- /dev/null +++ b/docs/GetCommandIds.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: GetCommandIds + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: GetCommandIds

+
+ +
+ +

+ GetCommandIds +

+ +
Get a list of all servers
+ + +
+ + +
+
+ + +
+
+

new GetCommandIds(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Bot + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Help.html b/docs/Help.html new file mode 100644 index 000000000..cd5985783 --- /dev/null +++ b/docs/Help.html @@ -0,0 +1,562 @@ + + + + + + + genesis Class: Help + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Help

+
+ +
+ +

+ Help +

+ +
Describes the Help command
+ + +
+ + +
+
+ + +
+
+

new Help(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Send help message +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message to reply to
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Hide.html b/docs/Hide.html new file mode 100644 index 000000000..b814aeadd --- /dev/null +++ b/docs/Hide.html @@ -0,0 +1,611 @@ + + + + + + + genesis Class: Hide + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Hide

+
+ +
+ +

+ Hide +

+ +
Change channel visibility
+ + +
+ + +
+
+ + +
+
+

new Hide(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message, ctx)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
ctx + + +Object + + + + + Command context for calling commands
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Hug.html b/docs/Hug.html new file mode 100644 index 000000000..a40844cee --- /dev/null +++ b/docs/Hug.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: Hug + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Hug

+
+ +
+ +

+ Hug +

+ +
Hug Genesis
+ + +
+ + +
+
+ + +
+
+

new Hug(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Bot + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/InvasionEmbed.html b/docs/InvasionEmbed.html new file mode 100644 index 000000000..6764aa789 --- /dev/null +++ b/docs/InvasionEmbed.html @@ -0,0 +1,464 @@ + + + + + + + genesis Class: InvasionEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: InvasionEmbed

+
+ +
+ +

+ InvasionEmbed +

+ +
Generates invasion embeds
+ + +
+ + +
+
+ + +
+
+

new InvasionEmbed(bot, invasions, platform)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
invasions + + +Array.<Invasion> + + + + + The invasions to be included in the embed
platform + + +string + + + + + platform
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Invasions.html b/docs/Invasions.html new file mode 100644 index 000000000..b106eb7dd --- /dev/null +++ b/docs/Invasions.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: Invasions + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Invasions

+
+ +
+ +

+ Invasions +

+ +
Displays the currently active Invasions
+ + +
+ + +
+
+ + +
+
+

new Invasions(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Invitation.html b/docs/Invitation.html new file mode 100644 index 000000000..989f421b5 --- /dev/null +++ b/docs/Invitation.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: Invitation + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Invitation

+
+ +
+ +

+ Invitation +

+ +
Sends the user an OAuth or other URL for inviting the bot (User configurable env: INVITE_URL)
+ + +
+ + +
+
+ + +
+
+

new Invitation(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Invite.html b/docs/Invite.html new file mode 100644 index 000000000..11b154bb8 --- /dev/null +++ b/docs/Invite.html @@ -0,0 +1,797 @@ + + + + + + + genesis Class: Invite + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Invite

+
+ +
+ +

+ Invite +

+ +
Invite people to temp voice/text/category
+ + +
+ + +
+
+ + +
+
+

new Invite(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message, ctx)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
ctx + + +Object + + + + + Command context for calling commands
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ + + +
+
+

<async> sendInvites(voiceChannel, users, author)

+ + +
+
+ + +
+ Send channel invites to users who were tagged in message +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
voiceChannel + + +VoiceChannel + + + + + Voice channel to create invites for
users + + +Array.<User> + + + + + Array of users to send invites to
author + + +User + + + + + Calling user who sends message
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/JoinRole.html b/docs/JoinRole.html new file mode 100644 index 000000000..5cd0ebd13 --- /dev/null +++ b/docs/JoinRole.html @@ -0,0 +1,533 @@ + + + + + + + genesis Class: JoinRole + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: JoinRole

+
+ +
+ +

+ JoinRole +

+ +
Add a joinable role
+ + +
+ + +
+
+ + +
+
+

new JoinRole()

+ + +
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Jokes.html b/docs/Jokes.html new file mode 100644 index 000000000..9f7296cab --- /dev/null +++ b/docs/Jokes.html @@ -0,0 +1,1260 @@ + + + + + + + genesis Class: Jokes + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Jokes

+
+ +
+ +

+ Jokes +

+ +
Promocodes
+ + +
+ + +
+
+ + +
+
+

new Jokes(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ + + +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +

Class: Jokes

+
+ +
+ +

+ Jokes +

+ +
Tell a joke
+ + +
+ + +
+
+ + +
+
+

new Jokes(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ + + +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/LFGEmbed.html b/docs/LFGEmbed.html new file mode 100644 index 000000000..7a880c70a --- /dev/null +++ b/docs/LFGEmbed.html @@ -0,0 +1,440 @@ + + + + + + + genesis Class: LFGEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: LFGEmbed

+
+ +
+ +

+ LFGEmbed +

+ +
Generates LFG embeds
+ + +
+ + +
+
+ + +
+
+

new LFGEmbed(bot, lfg)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
lfg + + +LFG + + + + + LFG Options
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/LeaveRole.html b/docs/LeaveRole.html new file mode 100644 index 000000000..4a2b24615 --- /dev/null +++ b/docs/LeaveRole.html @@ -0,0 +1,533 @@ + + + + + + + genesis Class: LeaveRole + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: LeaveRole

+
+ +
+ +

+ LeaveRole +

+ +
Add a joinable role
+ + +
+ + +
+
+ + +
+
+

new LeaveRole()

+ + +
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/LeaveServer.html b/docs/LeaveServer.html new file mode 100644 index 000000000..bb7d14a76 --- /dev/null +++ b/docs/LeaveServer.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: LeaveServer + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: LeaveServer

+
+ +
+ +

+ LeaveServer +

+ +
Leaves a server.
+ + +
+ + +
+
+ + +
+
+

new LeaveServer(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Bot + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/ListBuilds.html b/docs/ListBuilds.html new file mode 100644 index 000000000..df5776d7d --- /dev/null +++ b/docs/ListBuilds.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: ListBuilds + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: ListBuilds

+
+ +
+ +

+ ListBuilds +

+ +
Create temporary voice/text channels (can be expanded in the future)
+ + +
+ + +
+
+ + +
+
+

new ListBuilds(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Lock.html b/docs/Lock.html new file mode 100644 index 000000000..451b41727 --- /dev/null +++ b/docs/Lock.html @@ -0,0 +1,611 @@ + + + + + + + genesis Class: Lock + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Lock

+
+ +
+ +

+ Lock +

+ +
Resize temp channel
+ + +
+ + +
+
+ + +
+
+

new Lock(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message, ctx)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
ctx + + +Object + + + + + Command context for calling commands
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/LogEmbed.html b/docs/LogEmbed.html new file mode 100644 index 000000000..144478005 --- /dev/null +++ b/docs/LogEmbed.html @@ -0,0 +1,440 @@ + + + + + + + genesis Class: LogEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: LogEmbed

+
+ +
+ +

+ LogEmbed +

+ +
Generates LFG embeds
+ + +
+ + +
+
+ + +
+
+

new LogEmbed(bot, log)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
log + + +Log + + + + + LFG Options
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/LogMemberBan.html b/docs/LogMemberBan.html new file mode 100644 index 000000000..538651f9e --- /dev/null +++ b/docs/LogMemberBan.html @@ -0,0 +1,630 @@ + + + + + + + genesis Class: LogMemberBan + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: LogMemberBan

+
+ +
+ +

+ LogMemberBan +

+ +
Describes a handler
+ + +
+ + +
+
+ + +
+
+

new LogMemberBan(bot, id, event)

+ + +
+
+ + +
+ Base class for bot commands +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
id + + +string + + + + + The command's unique id
event + + +string + + + + + Event to trigger this handler
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> execute(guild, user)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
guild + + +Discord.Guild + + + + + guild that member was banned from
user + + +Discord.User + + + + + user that was banned
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/LogMemberRemove.html b/docs/LogMemberRemove.html new file mode 100644 index 000000000..0ebd6d198 --- /dev/null +++ b/docs/LogMemberRemove.html @@ -0,0 +1,606 @@ + + + + + + + genesis Class: LogMemberRemove + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: LogMemberRemove

+
+ +
+ +

+ LogMemberRemove +

+ +
Describes a handler
+ + +
+ + +
+
+ + +
+
+

new LogMemberRemove(bot, id, event)

+ + +
+
+ + +
+ Base class for bot commands +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
id + + +string + + + + + The command's unique id
event + + +string + + + + + Event to trigger this handler
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> execute(message)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Discord.Message + + + + + member that was remvoed, left, or kicked
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/LogMemberUnban.html b/docs/LogMemberUnban.html new file mode 100644 index 000000000..42a28a101 --- /dev/null +++ b/docs/LogMemberUnban.html @@ -0,0 +1,630 @@ + + + + + + + genesis Class: LogMemberUnban + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: LogMemberUnban

+
+ +
+ +

+ LogMemberUnban +

+ +
Describes a handler
+ + +
+ + +
+
+ + +
+
+

new LogMemberUnban(bot, id, event)

+ + +
+
+ + +
+ Base class for bot commands +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
id + + +string + + + + + The command's unique id
event + + +string + + + + + Event to trigger this handler
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> execute(guild, user)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
guild + + +Discord.Guild + + + + + guild that member was banned from
user + + +Discord.User + + + + + user that was banned
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/LogMessageDelete.html b/docs/LogMessageDelete.html new file mode 100644 index 000000000..53aea3a43 --- /dev/null +++ b/docs/LogMessageDelete.html @@ -0,0 +1,1258 @@ + + + + + + + genesis Class: LogMessageDelete + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: LogMessageDelete

+
+ +
+ +

+ LogMessageDelete +

+ +
Describes a handler
+ + +
+ + +
+
+ + +
+
+

new LogMessageDelete(bot, id, event)

+ + +
+
+ + +
+ Base class for bot commands +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
id + + +string + + + + + The command's unique id
event + + +string + + + + + Event to trigger this handler
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> execute(messages)

+ + +
+
+ + +
+ add the guild to teh Database +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
messages + + +Discord.Collection.<Message> + + + + + member to add roles to
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + +
+
+

<async> execute(message)

+ + +
+
+ + +
+ add the guild to teh Database +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Discord.Message + + + + + member to add roles to
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +

Class: LogMessageDelete

+
+ +
+ +

+ LogMessageDelete +

+ +
Describes a handler
+ + +
+ + +
+
+ + +
+
+

new LogMessageDelete(bot, id, event)

+ + +
+
+ + +
+ Base class for bot commands +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
id + + +string + + + + + The command's unique id
event + + +string + + + + + Event to trigger this handler
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> execute(messages)

+ + +
+
+ + +
+ add the guild to teh Database +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
messages + + +Discord.Collection.<Message> + + + + + member to add roles to
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + +
+
+

<async> execute(message)

+ + +
+
+ + +
+ add the guild to teh Database +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Discord.Message + + + + + member to add roles to
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/MessaageManager.html b/docs/MessaageManager.html new file mode 100644 index 000000000..b9a58aeb3 --- /dev/null +++ b/docs/MessaageManager.html @@ -0,0 +1,2690 @@ + + + + + + + genesis Class: MessaageManager + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: MessaageManager

+
+ +
+ +

+ MessaageManager +

+ +
MessageManager for
+ + +
+ + +
+
+ + +
+
+

new MessaageManager(bot)

+ + +
+
+ + +
+ Construct a message manager for sending and managing messages +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + bot containing necessary settings
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + +

Members

+ +
+ +
+
+

zSWC :string

+ + +
+
+ +
+ Zero space whitespace character to prepend to any messages sent +to prevent a command from inadvertantly being triggered. +
+ + + +
Type:
+
    +
  • + +string + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+
+

<async> deleteCallAndResponse(call, response, deleteCall, deleteResponse)

+ + +
+
+ + +
+ Delete call and response for a command, depending on settings +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
call + + +Message + + + + + calling command
response + + +Message + + + + + response message
deleteCall + + +boolean + + + + + whether or not to delete the calling message
deleteResponse + + +boolean + + + + + whether or not to delete the message response
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + +
+
+

<async> embed(message, embed, deleteOriginal, deleteResponse, content)

+ + +
+
+ + +
+ Send an embed, with options to delete messages after calling +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + original message being responded to
embed + + +Object + + + + + Embed object to send
deleteOriginal + + +boolean + + + + + True to delete the original message
deleteResponse + + +boolean + + + + + True to delete the sent message after time
content + + +content + + + + + Content of the embed, prepended to the embed.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +null +| + +Promise.<Message> + + + +
+
+ + + + + +
+ + + +
+
+

<async> embedToChannel(channel, embed, prepend, deleteAfter)

+ + +
+
+ + +
+ Send an embed +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
channel + + +Channel + + + + + channel to send message to
embed + + +Object + + + + + Embed object to send
prepend + + +string + + + + + String to prepend to the embed
deleteAfter + + +nunber + + + + + delete after a specified time
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + +
+
+

<async> notifySettingsChange(message, deleteOriginal, deleteResponse)

+ + +
+
+ + +
+ Notify channel of settings change if enabled +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message to reply to and fetch channel settings from
deleteOriginal + + +boolean + + + + + whether or not to delete the original message
deleteResponse + + +boolean + + + + + whether or not to delete the response message
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +null +| + +Promise.<Message> + + + +
+
+ + + + + +
+ + + +
+
+

<async> reply(message, content, deleteOriginal, deleteResponse)

+ + +
+
+ + +
+ Send a message, with options to delete messages after calling +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + original message being responded to
content + + +string + + + + + String to send to a channel
deleteOriginal + + +boolean + + + + + True to delete the original message
deleteResponse + + +boolean + + + + + True to delete the sent message after time
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +null +| + +Promise.<Message> + + + +
+
+ + + + + +
+ + + +
+
+

<async> replyMessageRetPromise(message, content, deleteOriginal, deleteResponse)

+ + +
+
+ + +
+ Send a message, with options to delete messages after calling +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + original message being responded to
content + + +string + + + + + String to send to a channel
deleteOriginal + + +boolean + + + + + True to delete the original message
deleteResponse + + +boolean + + + + + True to delete the sent message after time
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +null +| + +Promise.<Message> + + + +
+
+ + + + + +
+ + + +
+
+

<async> sendDirectEmbedToAuthor(message, embed, deleteResponse)

+ + +
+
+ + +
+ Send a message, with options to delete messages after calling +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + original message being responded to
embed + + +Object + + + + + Embed object to send
deleteResponse + + +boolean + + + + + True to delete the sent message after time
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise.<Message> + + + +
+
+ + + + + +
+ + + +
+
+

<async> sendDirectMessageToAuthor(message, content, deleteResponse)

+ + +
+
+ + +
+ Send a message, with options to delete messages after calling +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + original message being responded to
content + + +string + + + + + String to send to a channel
deleteResponse + + +boolean + + + + + True to delete the sent message after time
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise.<Message> + + + +
+
+ + + + + +
+ + + +
+
+

<async> sendDirectMessageToUser(user, content, deleteResponse)

+ + +
+
+ + +
+ Send a message, with options to delete messages after calling +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
user + + +TextChannel + + + + + user being sent a message
content + + +string + + + + + String to send to a channel
deleteResponse + + +boolean + + + + + True to delete the sent message after time
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise.<Message> + + + +
+
+ + + + + +
+ + + +
+
+

<async> sendMessage(message, content, deleteOriginal, deleteResponse)

+ + +
+
+ + +
+ Send a message, with options to delete messages after calling +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + original message being responded to
content + + +string + + + + + String to send to a channel
deleteOriginal + + +boolean + + + + + True to delete the original message
deleteResponse + + +boolean + + + + + True to delete the sent message after time
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Mod.html b/docs/Mod.html new file mode 100644 index 000000000..70f4d9683 --- /dev/null +++ b/docs/Mod.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: Mod + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Mod

+
+ +
+ +

+ Mod +

+ +
Displays mods from the wiki
+ + +
+ + +
+
+ + +
+
+

new Mod(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/News.html b/docs/News.html new file mode 100644 index 000000000..ef3787e74 --- /dev/null +++ b/docs/News.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: News + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: News

+
+ +
+ +

+ News +

+ +
Displays the currently active warframe news
+ + +
+ + +
+
+ + +
+
+

new News(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/NewsEmbed.html b/docs/NewsEmbed.html new file mode 100644 index 000000000..267ad0a9c --- /dev/null +++ b/docs/NewsEmbed.html @@ -0,0 +1,489 @@ + + + + + + + genesis Class: NewsEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: NewsEmbed

+
+ +
+ +

+ NewsEmbed +

+ +
Generates news embeds
+ + +
+ + +
+
+ + +
+
+

new NewsEmbed(bot, news, type, platform)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
news + + +Array.<News> + + + + + The news to be included in the embed
type + + +string + + + + + [Optional] type of embed between news, updates, + or prime access. Not provided for news.
platform + + +string + + + + + platform
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Notifier.html b/docs/Notifier.html new file mode 100644 index 000000000..4ae5d3e8a --- /dev/null +++ b/docs/Notifier.html @@ -0,0 +1,940 @@ + + + + + + + genesis Class: Notifier + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Notifier

+
+ +
+ +

+ Notifier +

+ +
Notifier for alerts, invasions, etc.
+ + +
+ + +
+
+ + +
+
+

new Notifier()

+ + +
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> getNotifiedIds(platform)

+ + +
+
+ + +
+ Get the list of notified ids +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
platform + + +string + + + + + Platform to get notified ids for
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Array + + + +
+
+ + + + + +
+ + + +
+
+

<async> onNewData(platform, newData)

+ + +
+
+ + +
+ Send notifications on new data from worldstate +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
platform + + +string + + + + + Platform to be updated
newData + + +json + + + + + Updated data from the worldstate
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + +
+
+

<async> start()

+ + +
+
+ + +
+ Start the notifier +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + +
+
+

<async> updateNotified(ids, platform)

+ + +
+
+ + +
+ Set the notified ids for a given platform and shard id +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
ids + + +JSON + + + + + list of oids that have been notifiedIds
platform + + +string + + + + + platform corresponding to notified ids
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/OnReadyHandle.html b/docs/OnReadyHandle.html new file mode 100644 index 000000000..165ec98e4 --- /dev/null +++ b/docs/OnReadyHandle.html @@ -0,0 +1,560 @@ + + + + + + + genesis Class: OnReadyHandle + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: OnReadyHandle

+
+ +
+ +

+ OnReadyHandle +

+ +
Describes a handler
+ + +
+ + +
+
+ + +
+
+

new OnReadyHandle(bot, id, event)

+ + +
+
+ + +
+ Base class for bot commands +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
id + + +string + + + + + The command's unique id
event + + +string + + + + + Event to trigger this handler
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> execute()

+ + +
+
+ + +
+ Run the ready handle +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Ping.html b/docs/Ping.html new file mode 100644 index 000000000..ad774d23e --- /dev/null +++ b/docs/Ping.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: Ping + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Ping

+
+ +
+ +

+ Ping +

+ +
Displays the response time for the bot and checks Warframe's servers to see if they are up
+ + +
+ + +
+
+ + +
+
+

new Ping(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/PollInline.html b/docs/PollInline.html new file mode 100644 index 000000000..06355a3d7 --- /dev/null +++ b/docs/PollInline.html @@ -0,0 +1,563 @@ + + + + + + + genesis Class: PollInline + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: PollInline

+
+ +
+ +

+ PollInline +

+ +
Make a simple poll
+ + +
+ + +
+
+ + +
+
+

new PollInline(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/PopularDeal.html b/docs/PopularDeal.html new file mode 100644 index 000000000..590bc5011 --- /dev/null +++ b/docs/PopularDeal.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: PopularDeal + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: PopularDeal

+
+ +
+ +

+ PopularDeal +

+ +
Displays current popular sales
+ + +
+ + +
+
+ + +
+
+

new PopularDeal(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Prefix.html b/docs/Prefix.html new file mode 100644 index 000000000..bdfcb15e3 --- /dev/null +++ b/docs/Prefix.html @@ -0,0 +1,366 @@ + + + + + + + genesis Class: Prefix + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Prefix

+
+ +
+ +

+ Prefix +

+ +
Sets the current guild's custom prefix
+ + +
+ + +
+
+ + +
+
+

new Prefix()

+ + +
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/PriceCheck.html b/docs/PriceCheck.html new file mode 100644 index 000000000..b4bbce337 --- /dev/null +++ b/docs/PriceCheck.html @@ -0,0 +1,1262 @@ + + + + + + + genesis Class: PriceCheck + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: PriceCheck

+
+ +
+ +

+ PriceCheck +

+ +
Looks up items from Nexus-stats.com
+ + +
+ + +
+
+ + +
+
+

new PriceCheck(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ + + +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +

Class: PriceCheck

+
+ +
+ +

+ PriceCheck +

+ +
Looks up items from Nexus-stats.com
+ + +
+ + +
+
+ + +
+
+

new PriceCheck(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ + + +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/PriceCheckEmbed.html b/docs/PriceCheckEmbed.html new file mode 100644 index 000000000..c0cbf9b39 --- /dev/null +++ b/docs/PriceCheckEmbed.html @@ -0,0 +1,464 @@ + + + + + + + genesis Class: PriceCheckEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: PriceCheckEmbed

+
+ +
+ +

+ PriceCheckEmbed +

+ +
Generates enemy embeds
+ + +
+ + +
+
+ + +
+
+

new PriceCheckEmbed(bot, result, query)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
result + + +Array.<Attachment> + + + + + array of string results or attachments
query + + +string + + + + + query that this is a result for
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/PrimeAccess.html b/docs/PrimeAccess.html new file mode 100644 index 000000000..037e2ce05 --- /dev/null +++ b/docs/PrimeAccess.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: PrimeAccess + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: PrimeAccess

+
+ +
+ +

+ PrimeAccess +

+ +
Displays the currently active warframe prime access news
+ + +
+ + +
+
+ + +
+
+

new PrimeAccess(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/ProfileEmbed.html b/docs/ProfileEmbed.html new file mode 100644 index 000000000..2bc37edf2 --- /dev/null +++ b/docs/ProfileEmbed.html @@ -0,0 +1,440 @@ + + + + + + + genesis Class: ProfileEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: ProfileEmbed

+
+ +
+ +

+ ProfileEmbed +

+ +
Generates enemy embeds
+ + +
+ + +
+
+ + +
+
+

new ProfileEmbed(bot, player)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
player + + +Object + + + + + The enhancement to send info on
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Progression.html b/docs/Progression.html new file mode 100644 index 000000000..6e97adf1b --- /dev/null +++ b/docs/Progression.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: Progression + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Progression

+
+ +
+ +

+ Progression +

+ +
Displays the Warframe Progression Chart
+ + +
+ + +
+
+ + +
+
+

new Progression(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Raid.html b/docs/Raid.html new file mode 100644 index 000000000..685e0e261 --- /dev/null +++ b/docs/Raid.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: Raid + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Raid

+
+ +
+ +

+ Raid +

+ +
Returns search results from the Warframe wiki
+ + +
+ + +
+
+ + +
+
+

new Raid(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/RaidStatEmbed.html b/docs/RaidStatEmbed.html new file mode 100644 index 000000000..504ede11b --- /dev/null +++ b/docs/RaidStatEmbed.html @@ -0,0 +1,488 @@ + + + + + + + genesis Class: RaidStatEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: RaidStatEmbed

+
+ +
+ +

+ RaidStatEmbed +

+ +
Generates simaris embeds
+ + +
+ + +
+
+ + +
+
+

new RaidStatEmbed(bot, userStats, query, platform)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
userStats + + +Simaris + + + + + User raid stat json
query + + +string + + + + + Query for this embed
platform + + +string + + + + + Platform for the query
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Reload.html b/docs/Reload.html new file mode 100644 index 000000000..f50fa898d --- /dev/null +++ b/docs/Reload.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: Reload + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Reload

+
+ +
+ +

+ Reload +

+ +
Reloads the script containing the commands
+ + +
+ + +
+
+ + +
+
+

new Reload(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/RemoveRole.html b/docs/RemoveRole.html new file mode 100644 index 000000000..9de6e336a --- /dev/null +++ b/docs/RemoveRole.html @@ -0,0 +1,533 @@ + + + + + + + genesis Class: RemoveRole + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: RemoveRole

+
+ +
+ +

+ RemoveRole +

+ +
Remove a joinable role
+ + +
+ + +
+
+ + +
+
+

new RemoveRole()

+ + +
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Rename.html b/docs/Rename.html new file mode 100644 index 000000000..92f977eec --- /dev/null +++ b/docs/Rename.html @@ -0,0 +1,611 @@ + + + + + + + genesis Class: Rename + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Rename

+
+ +
+ +

+ Rename +

+ +
Rename user's temp room
+ + +
+ + +
+
+ + +
+
+

new Rename(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message, ctx)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
ctx + + +Object + + + + + Command context for calling commands
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Resize.html b/docs/Resize.html new file mode 100644 index 000000000..5fe271e4a --- /dev/null +++ b/docs/Resize.html @@ -0,0 +1,611 @@ + + + + + + + genesis Class: Resize + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Resize

+
+ +
+ +

+ Resize +

+ +
Resize temp channel
+ + +
+ + +
+
+ + +
+
+

new Resize(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message, ctx)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
ctx + + +Object + + + + + Command context for calling commands
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Roles.html b/docs/Roles.html new file mode 100644 index 000000000..09335a19b --- /dev/null +++ b/docs/Roles.html @@ -0,0 +1,1154 @@ + + + + + + + genesis Class: Roles + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Roles

+
+ +
+ +

+ Roles +

+ +
Add a joinable role
+ + +
+ + +
+
+ + +
+
+

new Roles()

+ + +
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ + + +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +

Class: Roles

+
+ +
+ +

+ Roles +

+ +
Add a joinable role
+ + +
+ + +
+
+ + +
+
+

new Roles()

+ + +
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ + + +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/RolesEmbed.html b/docs/RolesEmbed.html new file mode 100644 index 000000000..874c1de9b --- /dev/null +++ b/docs/RolesEmbed.html @@ -0,0 +1,488 @@ + + + + + + + genesis Class: RolesEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: RolesEmbed

+
+ +
+ +

+ RolesEmbed +

+ +
Generates enemy embeds
+ + +
+ + +
+
+ + +
+
+

new RolesEmbed(bot, roleGroups, prefix, longest)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
roleGroups + + +Array.<Array.<Role>> + + + + + An array of an array of roles allowed to be used
prefix + + +string + + + + + prefix for the command
longest + + +number + + + + + length of longest name so that all are aligned
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/RollInline.html b/docs/RollInline.html new file mode 100644 index 000000000..29b91493a --- /dev/null +++ b/docs/RollInline.html @@ -0,0 +1,563 @@ + + + + + + + genesis Class: RollInline + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: RollInline

+
+ +
+ +

+ RollInline +

+ +
Post a quesiton of left or right
+ + +
+ + +
+
+ + +
+
+

new RollInline(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/SalesEmbed.html b/docs/SalesEmbed.html new file mode 100644 index 000000000..8a1661388 --- /dev/null +++ b/docs/SalesEmbed.html @@ -0,0 +1,464 @@ + + + + + + + genesis Class: SalesEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: SalesEmbed

+
+ +
+ +

+ SalesEmbed +

+ +
Generates daily deal embeds
+ + +
+ + +
+
+ + +
+
+

new SalesEmbed(bot, sales, platform)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
sales + + +Array.<FeaturedItemSales> + + + + + The sales to be displayed as featured or popular
platform + + +string + + + + + platform
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/ServerInfo.html b/docs/ServerInfo.html new file mode 100644 index 000000000..b6eda0dc2 --- /dev/null +++ b/docs/ServerInfo.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: ServerInfo + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: ServerInfo

+
+ +
+ +

+ ServerInfo +

+ +
Get a list of all servers
+ + +
+ + +
+
+ + +
+
+

new ServerInfo(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Bot + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/ServerInfoEmbed.html b/docs/ServerInfoEmbed.html new file mode 100644 index 000000000..33cd4cc58 --- /dev/null +++ b/docs/ServerInfoEmbed.html @@ -0,0 +1,440 @@ + + + + + + + genesis Class: ServerInfoEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: ServerInfoEmbed

+
+ +
+ +

+ ServerInfoEmbed +

+ +
Generates daily deal embeds
+ + +
+ + +
+
+ + +
+
+

new ServerInfoEmbed(bot, guild)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
guild + + +Guild + + + + + The sales to be displayed as featured or popular
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Servers.html b/docs/Servers.html new file mode 100644 index 000000000..0713e1a7f --- /dev/null +++ b/docs/Servers.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: Servers + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Servers

+
+ +
+ +

+ Servers +

+ +
Get a list of all servers
+ + +
+ + +
+
+ + +
+
+

new Servers(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Bot + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/SettingsEmbed.html b/docs/SettingsEmbed.html new file mode 100644 index 000000000..9c3caeea4 --- /dev/null +++ b/docs/SettingsEmbed.html @@ -0,0 +1,464 @@ + + + + + + + genesis Class: SettingsEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: SettingsEmbed

+
+ +
+ +

+ SettingsEmbed +

+ +
Generates settings embeds
+ + +
+ + +
+
+ + +
+
+

new SettingsEmbed(bot, channel, tokens)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
channel + + +Channel + + + + + The channel for which to send settings
tokens + + +Array.<strings> + + + + + The settngs to to display
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/ShieldEmbed.html b/docs/ShieldEmbed.html new file mode 100644 index 000000000..81009856d --- /dev/null +++ b/docs/ShieldEmbed.html @@ -0,0 +1,440 @@ + + + + + + + genesis Class: ShieldEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: ShieldEmbed

+
+ +
+ +

+ ShieldEmbed +

+ +
Generates enemy embeds
+ + +
+ + +
+
+ + +
+
+

new ShieldEmbed(bot, params)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
params + + +Array.<string> + + + + + array of string parameters
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Shields.html b/docs/Shields.html new file mode 100644 index 000000000..0297bffa1 --- /dev/null +++ b/docs/Shields.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: Shields + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Shields

+
+ +
+ +

+ Shields +

+ +
Performs shield calculations
+ + +
+ + +
+
+ + +
+
+

new Shields(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Show.html b/docs/Show.html new file mode 100644 index 000000000..b307a583c --- /dev/null +++ b/docs/Show.html @@ -0,0 +1,611 @@ + + + + + + + genesis Class: Show + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Show

+
+ +
+ +

+ Show +

+ +
Change channel visibility
+ + +
+ + +
+
+ + +
+
+

new Show(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message, ctx)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
ctx + + +Object + + + + + Command context for calling commands
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Simaris.html b/docs/Simaris.html new file mode 100644 index 000000000..2263f0a96 --- /dev/null +++ b/docs/Simaris.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: Simaris + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Simaris

+
+ +
+ +

+ Simaris +

+ +
Displays the current simaris target
+ + +
+ + +
+
+ + +
+
+

new Simaris(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/SimarisEmbed.html b/docs/SimarisEmbed.html new file mode 100644 index 000000000..959ca59d1 --- /dev/null +++ b/docs/SimarisEmbed.html @@ -0,0 +1,464 @@ + + + + + + + genesis Class: SimarisEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: SimarisEmbed

+
+ +
+ +

+ SimarisEmbed +

+ +
Generates simaris embeds
+ + +
+ + +
+
+ + +
+
+

new SimarisEmbed(bot, simaris, platform)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
simaris + + +Simaris + + + + + The sanctuary state data to be included in the embed
platform + + +string + + + + + Platform
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/SortieEmbed.html b/docs/SortieEmbed.html new file mode 100644 index 000000000..d7bf3de4d --- /dev/null +++ b/docs/SortieEmbed.html @@ -0,0 +1,464 @@ + + + + + + + genesis Class: SortieEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: SortieEmbed

+
+ +
+ +

+ SortieEmbed +

+ +
Generates sortie embeds
+ + +
+ + +
+
+ + +
+
+

new SortieEmbed(bot, sortie, platform)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
sortie + + +Sortie + + + + + The sortie to be included in the embed
platform + + +string + + + + + platform
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Sorties.html b/docs/Sorties.html new file mode 100644 index 000000000..fd75bc8d0 --- /dev/null +++ b/docs/Sorties.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: Sorties + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Sorties

+
+ +
+ +

+ Sorties +

+ +
Displays the currently active Invasions
+ + +
+ + +
+
+ + +
+
+

new Sorties(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/StringManager.html b/docs/StringManager.html new file mode 100644 index 000000000..6a80dc529 --- /dev/null +++ b/docs/StringManager.html @@ -0,0 +1,639 @@ + + + + + + + genesis Class: StringManager + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: StringManager

+
+ +
+ +

+ StringManager +

+ + +
+ + +
+
+ + +
+
+

new StringManager(settings, logger)

+ + +
+
+ + +
+ Construct a string manager for internationalizing strings +String template: + * `$author` - Replaced by the message author + * `$message` - Replaced by the message content + * `$channel` - Replaced by the message channel name + * `$ch_mntn` - Replaced by the message channel mention +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
settings + + +Settings + + + + + Settings for this string manager + to fetch the language for a channel with
logger + + +Logger + + + + + something to log with
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> getString(stringId, message)

+ + +
+
+ + +
+ Get the localized string for a particular stringId +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
stringId + + +string + + + + + String id of the internationalized string to fetch
message + + +Message + + + + + Message to derive template replacement data from + as well as for fetching settings
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ String promise with the corresponding string +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/SyndicateEmbed.html b/docs/SyndicateEmbed.html new file mode 100644 index 000000000..ac3ecab3f --- /dev/null +++ b/docs/SyndicateEmbed.html @@ -0,0 +1,488 @@ + + + + + + + genesis Class: SyndicateEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: SyndicateEmbed

+
+ +
+ +

+ SyndicateEmbed +

+ +
Generates syndicate embeds
+ + +
+ + +
+
+ + +
+
+

new SyndicateEmbed(bot, missions, syndicate, platform)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
missions + + +Array.<SyndicateMission> + + + + + The missions to be included in the embed
syndicate + + +string + + + + + The syndicate to display the missions for
platform + + +string + + + + + Platform
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Syndicates.html b/docs/Syndicates.html new file mode 100644 index 000000000..0cd2cffa6 --- /dev/null +++ b/docs/Syndicates.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: Syndicates + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Syndicates

+
+ +
+ +

+ Syndicates +

+ +
Displays the currently active Invasions
+ + +
+ + +
+
+ + +
+
+

new Syndicates(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Track.html b/docs/Track.html new file mode 100644 index 000000000..e1b783ca4 --- /dev/null +++ b/docs/Track.html @@ -0,0 +1,366 @@ + + + + + + + genesis Class: Track + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Track

+
+ +
+ +

+ Track +

+ +
Track an event or item
+ + +
+ + +
+
+ + +
+
+

new Track()

+ + +
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Tracker.html b/docs/Tracker.html new file mode 100644 index 000000000..497ed79ec --- /dev/null +++ b/docs/Tracker.html @@ -0,0 +1,1115 @@ + + + + + + + genesis Class: Tracker + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Tracker

+
+ +
+ +

+ Tracker +

+ +
Describes a tracking service for updating remote sites +with server count for this bot
+ + +
+ + +
+
+ + +
+
+

new Tracker(logger, client, shardUtil)

+ + +
+
+ + +
+ Constructs a simple tracking service with the given logger +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
logger + + +Logger + + + + + Simple logger for logging information
client + + +Client + + + + + Discord Client for fetching statistucs from
shardUtil + + +ShardClientUtil + + + + + Discord shard client util +used to fetch shard count of all shards
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> postHeartBeat()

+ + +
+
+ + +
+ Post the cachet heartbeat for the shardCount +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + +
+
+

updateAll(guildsLen)

+ + +
+
+ + +
+ Update all trackers +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
guildsLen + + +number + + + + + Number of guilds that this bot is present on
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + +
+
+

<async> updateCarbonitex(shardUtil)

+ + +
+
+ + +
+ Updates carbonitex.net if the corresponding token is provided +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
shardUtil + + +ShardClientUtil + + + + + Discord shard client util used +to fetch shard count of all shards
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + +
+
+

<async> updateDiscordBotsOrg(guildsLen)

+ + +
+
+ + +
+ Updates discordbots.org if the corresponding token is provided +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
guildsLen + + +number + + + + + number of guilds that this bot is present on
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + +
+
+

<async> updateDiscordBotsWeb(guildsLen)

+ + +
+
+ + +
+ Updates bots.discord.pw if the corresponding token is provided +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
guildsLen + + +number + + + + + number of guilds that this bot is present on
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Unlock.html b/docs/Unlock.html new file mode 100644 index 000000000..cbfcf8e5b --- /dev/null +++ b/docs/Unlock.html @@ -0,0 +1,611 @@ + + + + + + + genesis Class: Unlock + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Unlock

+
+ +
+ +

+ Unlock +

+ +
Resize temp channel
+ + +
+ + +
+
+ + +
+
+

new Unlock(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message, ctx)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
ctx + + +Object + + + + + Command context for calling commands
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Untrack.html b/docs/Untrack.html new file mode 100644 index 000000000..5bf1993cb --- /dev/null +++ b/docs/Untrack.html @@ -0,0 +1,2528 @@ + + + + + + + genesis Class: Untrack + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Untrack

+
+ +
+ +

+ Untrack +

+ +
Sets the current guild's custom prefix
+ + +
+ + +
+
+ + +
+
+

new Untrack()

+ + +
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ + + +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +

Class: Untrack

+
+ +
+ +

+ Untrack +

+ +
Untrack an event or item
+ + +
+ + +
+
+ + +
+
+

new Untrack()

+ + +
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ + + +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +

Class: Untrack

+
+ +
+ +

+ Untrack +

+ +
Untrack an event or item
+ + +
+ + +
+
+ + +
+
+

new Untrack()

+ + +
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ + + +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +

Class: Untrack

+
+ +
+ +

+ Untrack +

+ +
Sets the current guild's custom prefix
+ + +
+ + +
+
+ + +
+
+

new Untrack()

+ + +
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ + + +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +

Class: Untrack

+
+ +
+ +

+ Untrack +

+ +
Sets the current guild's custom prefix
+ + +
+ + +
+
+ + +
+
+

new Untrack()

+ + +
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ + + +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Updates.html b/docs/Updates.html new file mode 100644 index 000000000..5cd8f93e8 --- /dev/null +++ b/docs/Updates.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: Updates + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Updates

+
+ +
+ +

+ Updates +

+ +
Displays the currently active Warframe update news
+ + +
+ + +
+
+ + +
+
+

new Updates(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/UserInfo.html b/docs/UserInfo.html new file mode 100644 index 000000000..11ed98416 --- /dev/null +++ b/docs/UserInfo.html @@ -0,0 +1,420 @@ + + + + + + + genesis Class: UserInfo + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: UserInfo

+
+ +
+ +

+ UserInfo +

+ +
Get info about a user
+ + +
+ + +
+
+ + +
+
+

new UserInfo(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Bot + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/UserInfoEmbed.html b/docs/UserInfoEmbed.html new file mode 100644 index 000000000..b1fb2da79 --- /dev/null +++ b/docs/UserInfoEmbed.html @@ -0,0 +1,513 @@ + + + + + + + genesis Class: UserInfoEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: UserInfoEmbed

+
+ +
+ +

+ UserInfoEmbed +

+ +
Generates daily deal thiss
+ + +
+ + +
+
+ + +
+
+

new UserInfoEmbed(bot, guilds, user, member, message)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
guilds + + +Array.<Guild> + + + + + The guilds this bot shares on this shard with a user
user + + +User + + + + + The targeted user of the command
member + + +GuildMemeber + + + + + The guild member object for thetargeted user, + if called in a guild.
message + + +Message + + + + + Message this derives information from.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Username.html b/docs/Username.html new file mode 100644 index 000000000..3b64f3b45 --- /dev/null +++ b/docs/Username.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: Username + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Username

+
+ +
+ +

+ Username +

+ +
Sets the username for the bot
+ + +
+ + +
+
+ + +
+
+

new Username(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Bot + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/VoidTraderEmbed.html b/docs/VoidTraderEmbed.html new file mode 100644 index 000000000..41c0ab874 --- /dev/null +++ b/docs/VoidTraderEmbed.html @@ -0,0 +1,464 @@ + + + + + + + genesis Class: VoidTraderEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: VoidTraderEmbed

+
+ +
+ +

+ VoidTraderEmbed +

+ +
Generates void trader embeds
+ + +
+ + +
+
+ + +
+
+

new VoidTraderEmbed(bot, voidTrader, platform)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
voidTrader + + +VoidTrader + + + + + The current state of the Void Trader
platform + + +string + + + + + platform
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/VulgarNameHandle.html b/docs/VulgarNameHandle.html new file mode 100644 index 000000000..5fd673993 --- /dev/null +++ b/docs/VulgarNameHandle.html @@ -0,0 +1,608 @@ + + + + + + + genesis Class: VulgarNameHandle + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: VulgarNameHandle

+
+ +
+ +

+ VulgarNameHandle +

+ + +
+ + +
+
+ + +
+
+

new VulgarNameHandle(bot, id, event)

+ + +
+
+ + +
+ Base class for bot commands +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
id + + +string + + + + + The command's unique id
event + + +string + + + + + Event to trigger this handler
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> execute(member)

+ + +
+
+ + +
+ Run the handle +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
member + + +GuildMember + + + + + guildMember to welcome
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/WeaponEmbed.html b/docs/WeaponEmbed.html new file mode 100644 index 000000000..0a268a292 --- /dev/null +++ b/docs/WeaponEmbed.html @@ -0,0 +1,440 @@ + + + + + + + genesis Class: WeaponEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: WeaponEmbed

+
+ +
+ +

+ WeaponEmbed +

+ +
Generates enemy embeds
+ + +
+ + +
+
+ + +
+
+

new WeaponEmbed(bot, weapon)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesisad
weapon + + +Enhancement + + + + + The enhancement to send info on
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/WeaponStats.html b/docs/WeaponStats.html new file mode 100644 index 000000000..9e648675b --- /dev/null +++ b/docs/WeaponStats.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: WeaponStats + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: WeaponStats

+
+ +
+ +

+ WeaponStats +

+ +
Displays the stats for a warframe
+ + +
+ + +
+
+ + +
+
+

new WeaponStats(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/WelcomeHandler.html b/docs/WelcomeHandler.html new file mode 100644 index 000000000..90d132451 --- /dev/null +++ b/docs/WelcomeHandler.html @@ -0,0 +1,608 @@ + + + + + + + genesis Class: WelcomeHandler + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: WelcomeHandler

+
+ +
+ +

+ WelcomeHandler +

+ + +
+ + +
+
+ + +
+
+

new WelcomeHandler(bot, id, event)

+ + +
+
+ + +
+ Base class for bot commands +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
id + + +string + + + + + The command's unique id
event + + +string + + + + + Event to trigger this handler
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> execute(member)

+ + +
+
+ + +
+ Run the handle +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
member + + +GuildMember + + + + + guildMember to welcome
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Whatsin.html b/docs/Whatsin.html new file mode 100644 index 000000000..33d9f514a --- /dev/null +++ b/docs/Whatsin.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: Whatsin + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Whatsin

+
+ +
+ +

+ Whatsin +

+ +
Looks up locations of items
+ + +
+ + +
+
+ + +
+
+

new Whatsin(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/WhatsinEmbed.html b/docs/WhatsinEmbed.html new file mode 100644 index 000000000..f815ca872 --- /dev/null +++ b/docs/WhatsinEmbed.html @@ -0,0 +1,488 @@ + + + + + + + genesis Class: WhatsinEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: WhatsinEmbed

+
+ +
+ +

+ WhatsinEmbed +

+ +
Generates enemy embeds
+ + +
+ + +
+
+ + +
+
+

new WhatsinEmbed(bot, details, tier, type)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
details + + +Object + + + + + details to derive data from
tier + + +string + + + + + Relic tier
type + + +string + + + + + Relic type
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Whereis.html b/docs/Whereis.html new file mode 100644 index 000000000..e3275288e --- /dev/null +++ b/docs/Whereis.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: Whereis + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Whereis

+
+ +
+ +

+ Whereis +

+ +
Looks up locations of items
+ + +
+ + +
+
+ + +
+
+

new Whereis(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/WhereisEmbed.html b/docs/WhereisEmbed.html new file mode 100644 index 000000000..cfa61c29c --- /dev/null +++ b/docs/WhereisEmbed.html @@ -0,0 +1,512 @@ + + + + + + + genesis Class: WhereisEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: WhereisEmbed

+
+ +
+ +

+ WhereisEmbed +

+ +
Generates enemy embeds
+ + +
+ + +
+
+ + +
+
+

new WhereisEmbed(bot, resultsGroups, query, nameWidth, relicWidth)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
resultsGroups + + +Object + + + + + details to derive data from
query + + +string + + + + + The query that this search corresponds to
nameWidth + + +number + + + + + Spacing for Names
relicWidth + + +number + + + + + Spacing for relics
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Wiki.html b/docs/Wiki.html new file mode 100644 index 000000000..69105ac5e --- /dev/null +++ b/docs/Wiki.html @@ -0,0 +1,587 @@ + + + + + + + genesis Class: Wiki + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Wiki

+
+ +
+ +

+ Wiki +

+ +
Returns search results from the Warframe wiki
+ + +
+ + +
+
+ + +
+
+

new Wiki(bot)

+ + +
+
+ + +
+ Constructs a callable command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + The bot object
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async> run(message)

+ + +
+
+ + +
+ Run the command +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Message with a command to handle, reply to, + or perform an action based on parameters.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ success status +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/WikiEmbed.html b/docs/WikiEmbed.html new file mode 100644 index 000000000..3658dc181 --- /dev/null +++ b/docs/WikiEmbed.html @@ -0,0 +1,464 @@ + + + + + + + genesis Class: WikiEmbed + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: WikiEmbed

+
+ +
+ +

+ WikiEmbed +

+ +
Generates enemy embeds
+ + +
+ + +
+
+ + +
+
+

new WikiEmbed(bot, details, thumbnail)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bot + + +Genesis + + + + + An instance of Genesis
details + + +Array.<Attachment> + + + + + details to derive data from
thumbnail + + +boolean + + + + + whether or not to use the image as a thumbnail or image
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/classes.list.html b/docs/classes.list.html new file mode 100644 index 000000000..57584ca12 --- /dev/null +++ b/docs/classes.list.html @@ -0,0 +1,769 @@ + + + + + + + genesis Classes + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Classes

+
+ +
+ +

+ +

+ + +
+ + +
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + +

Classes

+ +
+
AddBuild
+
+ +
AddBuild
+
+ +
AddChannelToDatabase
+
+ +
AddGuildToDatabase
+
+ +
AddLFG
+
+ +
AddRole
+
+ +
AlertEmbed
+
+ +
Alerts
+
+ +
Arcane
+
+ +
Armor
+
+ +
AssignDefaultRolesHandle
+
+ +
Avatar
+
+ +
Baro
+
+ +
BaseEmbed
+
+ +
BaseEventHandler
+
+ +
Broadcaster
+
+ +
BugReport
+
+ +
BuildChart
+
+ +
BuildEmbed
+
+ +
Command
+
+ +
CommandHandler
+
+ +
ConclaveChallengeEmbed
+
+ +
ConclaveChallenges
+
+ +
Construction
+
+ +
ConstructionEmbed
+
+ +
Corgi
+
+ +
Create
+
+ +
CreatePool
+
+ +
CustomCommand
+
+ +
CustomCommand
+
+ +
Damage
+
+ +
Darvo
+
+ +
DarvoEmbed
+
+ +
Database
+
+ +
DeleteBuild
+
+ +
DeleteChannel
+
+ +
DeleteGuild
+
+ +
DeleteWebhook
+
+ +
Destroy
+
+ +
EarthCycle
+
+ +
EarthCycleEmbed
+
+ +
Echo
+
+ +
Efficiency
+
+ +
EnableInfoEmbed
+
+ +
EnableUsageEmbed
+
+ +
Enemies
+
+ +
EnemyEmbed
+
+ +
EnhancementEmbed
+
+ +
Event
+
+ +
EventEmbed
+
+ +
EventHandler
+
+ +
FeaturedDeal
+
+ +
FissureEmbed
+
+ +
Fissures
+
+ +
FrameEmbed
+
+ +
FrameProfile
+
+ +
FrameStats
+
+ +
FrameStatsInline
+
+ +
Genesis
+
+ +
GetBuild
+
+ +
GetCommandIds
+
+ +
Help
+
+ +
Hide
+
+ +
Hug
+
+ +
InvasionEmbed
+
+ +
Invasions
+
+ +
Invitation
+
+ +
Invite
+
+ +
JoinRole
+
+ +
Jokes
+
+ +
Jokes
+
+ +
LeaveRole
+
+ +
LeaveServer
+
+ +
LFGEmbed
+
+ +
ListBuilds
+
+ +
Lock
+
+ +
LogEmbed
+
+ +
Logger
+
+ +
LogMemberBan
+
+ +
LogMemberRemove
+
+ +
LogMemberUnban
+
+ +
LogMessageDelete
+
+ +
LogMessageDelete
+
+ +
MessaageManager
+
+ +
Mod
+
+ +
News
+
+ +
NewsEmbed
+
+ +
Notifier
+
+ +
OnReadyHandle
+
+ +
Ping
+
+ +
PollInline
+
+ +
PopularDeal
+
+ +
Prefix
+
+ +
PriceCheck
+
+ +
PriceCheck
+
+ +
PriceCheckEmbed
+
+ +
PrimeAccess
+
+ +
ProfileEmbed
+
+ +
Progression
+
+ +
Raid
+
+ +
RaidStatEmbed
+
+ +
Reload
+
+ +
RemoveRole
+
+ +
Rename
+
+ +
Resize
+
+ +
Roles
+
+ +
Roles
+
+ +
RolesEmbed
+
+ +
RollInline
+
+ +
SalesEmbed
+
+ +
ServerInfo
+
+ +
ServerInfoEmbed
+
+ +
Servers
+
+ +
SettingsEmbed
+
+ +
ShieldEmbed
+
+ +
Shields
+
+ +
Show
+
+ +
Simaris
+
+ +
SimarisEmbed
+
+ +
SortieEmbed
+
+ +
Sorties
+
+ +
StringManager
+
+ +
SyndicateEmbed
+
+ +
Syndicates
+
+ +
Track
+
+ +
Tracker
+
+ +
Unlock
+
+ +
Untrack
+
+ +
Untrack
+
+ +
Untrack
+
+ +
Untrack
+
+ +
Untrack
+
+ +
Updates
+
+ +
UserInfo
+
+ +
UserInfoEmbed
+
+ +
Username
+
+ +
VoidTraderEmbed
+
+ +
VulgarNameHandle
+
+ +
WeaponEmbed
+
+ +
WeaponStats
+
+ +
WelcomeHandler
+
+ +
Whatsin
+
+ +
WhatsinEmbed
+
+ +
Whereis
+
+ +
WhereisEmbed
+
+ +
Wiki
+
+ +
WikiEmbed
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/fonts/glyphicons-halflings-regular.eot b/docs/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64 GIT binary patch literal 20127 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/fonts/glyphicons-halflings-regular.ttf b/docs/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b GIT binary patch literal 45404 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 G`u_lkUM?>H literal 0 HcmV?d00001 diff --git a/docs/fonts/glyphicons-halflings-regular.woff2 b/docs/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0 GIT binary patch literal 18028 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 literal 0 HcmV?d00001 diff --git a/docs/global.html b/docs/global.html new file mode 100644 index 000000000..e994aa29e --- /dev/null +++ b/docs/global.html @@ -0,0 +1,6430 @@ + + + + + + + genesis Global + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Global

+
+ +
+ +

+ +

+ + +
+ + +
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + +

Members

+ +
+ +
+
+

<constant> channelNameRegex :RegExp

+ + +
+
+ +
+ Regex describing custom channel names +
+ + + +
Type:
+
    +
  • + +RegExp + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

<constant> client

+ + +
+
+ +
+ Raven client instance for logging errors and debugging events +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

<constant> hiddenRegex :RegExp

+ + +
+
+ +
+ Regex describing channels being hidden +
+ + + +
Type:
+
    +
  • + +RegExp + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

<constant> lockedRegex :RegExp

+ + +
+
+ +
+ Regex describing a locked channel +
+ + + +
Type:
+
    +
  • + +RegExp + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

<constant> Logger :Object

+ + +
+
+ +
+ Logging functions class +
+ + + +
Type:
+
    +
  • + +Object + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

<constant> noTextRegex :RegExp

+ + +
+
+ +
+ Regex describing no text being desired +
+ + + +
Type:
+
    +
  • + +RegExp + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

<constant> publicRegex :RegExp

+ + +
+
+ +
+ Regex describing a public channel +
+ + + +
Type:
+
    +
  • + +RegExp + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

<constant> shownRegex :RegExp

+ + +
+
+ +
+ Regex describing channels being shown +
+ + + +
Type:
+
    +
  • + +RegExp + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

<constant> textRegex :RegExp

+ + +
+
+ +
+ Regex describing text being desired +
+ + + +
Type:
+
    +
  • + +RegExp + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

<constant> useable :Array.<String>

+ + +
+
+ +
+ Array of useable channel values +
+ + + +
Type:
+
    +
  • + +Array.<String> + + + +
  • +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+
+

armorAtLevel(baseArmor, baseLevel, currentLevel)

+ + +
+
+ + +
+ Calculates an enemy armor at a given level +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
baseArmor + + +number + + + + + The enemy's armor at the base level
baseLevel + + +number + + + + + The enemy's base level
currentLevel + + +number + + + + + The level to calculate armor at
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +number + + + +
+
+ + + + + +
+ + + +
+
+

armorStrip(armor)

+ + +
+
+ + +
+ Calculates the number of corrosive procs that would be needed to completely +strip armor from an enemy +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
armor + + +number + + + + + The enemy's armor
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +number + + + +
+
+ + + + + +
+ + + +
+
+

<async> checkPrivateRooms(self, shardId)

+ + +
+
+ + +
+ Check if private rooms have expired and are empty. If not, do nothing. +If so, delete the corresponding channels. +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
self + + +Genesis + + + + + Bot instance
shardId + + +number + + + + + shard identifier
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + +
+
+

damageReduction(currentArmor)

+ + +
+
+ + +
+ Calculates the damage reduction for a given armor value +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
currentArmor + + +number + + + + + The enemy's armor
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +number + + + +
+
+ + + + + +
+ + + +
+
+

formatTime(n)

+ + +
+
+ + +
+ Format time from number to string +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
n + + +number + + + + + time as a number
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ time as a string +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ + + +
+
+

fromNow(d [, now])

+ + +
+
+ + +
+ Returns the number of milliseconds between now and a given date +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
d + + +Date + + + + + + + + + + + The date from which the current time will be subtracted
now + + +function + + + + + + + <optional>
+ + + + + +
A function that returns the current UNIX time in milliseconds
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +number + + + +
+
+ + + + + +
+ + + +
+
+

fromNow(d [, now])

+ + +
+
+ + +
+ Returns the number of milliseconds between now and a given date +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
d + + +string + + + + + + + + + + + The date from which the current time will be subtracted
now + + +function + + + + + + + <optional>
+ + + + + +
A function that returns the current UNIX time in milliseconds
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +number + + + +
+
+ + + + + +
+ + + +
+
+

getAverageTime(times)

+ + +
+
+ + +
+ Get the average time for a list of times +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
times + + +Array.<number> + + + + + Array of times for the player
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ Average time as a string +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ + + +
+
+

getBestTime(times)

+ + +
+
+ + +
+ Get the lowest time of the user's times. +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
times + + +Array.<number> + + + + + Array of times for the player
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ Average time as a string +
+ + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ + + +
+
+

getChannel(channelsParam, message, channels)

+ + +
+
+ + +
+ Get the list of channels to enable commands in based on the parameters +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
channelsParam + + +string +| + +Array.<Channel> + + + + + parameter for determining channels
message + + +Message + + + + + Discord message to get information on channels
channels + + +Collection.<Channel> + + + + + Channels allowed to be searched through
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ channel ids to enable commands in +
+ + + +
+
+ Type +
+
+ +Array.<string> + + + +
+
+ + + + + +
+ + + +
+
+

getChannels(channelsParam, message)

+ + +
+
+ + +
+ Get the list of channels to enable commands in based on the parameters +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
channelsParam + + +string +| + +Array.<Channel> + + + + + parameter for determining channels
message + + +Message + + + + + Discord message to get information on channels
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ channel ids to enable commands in +
+ + + +
+
+ Type +
+
+ +Array.<string> + + + +
+
+ + + + + +
+ + + +
+
+

getRoleForString(string, message)

+ + +
+
+ + +
+ Get a role from the matching string +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
string + + +string + + + + + String to use to search for role
message + + +Message + + + + + Originating message
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ Role +
+ + + +
+
+ Type +
+
+ +Role +| + +null + + + +
+
+ + + + + +
+ + + +
+
+

getRoleForString(string, message)

+ + +
+
+ + +
+ Get a role from the matching string +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
string + + +string + + + + + String to use to search for role
message + + +Message + + + + + originating message
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ Role +
+ + + +
+
+ Type +
+
+ +Role +| + +null + + + +
+
+ + + + + +
+ + + +
+
+

getRoleForString(string, message)

+ + +
+
+ + +
+ Get a role from the matching string +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
string + + +string + + + + + String to use to search for role
message + + +Message + + + + + originating message
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ Role +
+ + + +
+
+ Type +
+
+ +Role +| + +null + + + +
+
+ + + + + +
+ + + +
+
+

getRoleForString(string, message)

+ + +
+
+ + +
+ Get a role from the matching string +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
string + + +string + + + + + String to use to search for role
message + + +Message + + + + + originating message
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ Role +
+ + + +
+
+ Type +
+
+ +Role +| + +null + + + +
+
+ + + + + +
+ + + +
+
+

getTarget(targetParam, roleMentions, userMentions, message)

+ + +
+
+ + +
+ Get the target role or user from the parameter string + or role mentions or user mentions, preferring the latter 2. +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
targetParam + + +string + + + + + string from the command to determine the user or role
roleMentions + + +Array.<Role> + + + + + role mentions from the command
userMentions + + +Array.<User> + + + + + user mentions from the command
message + + +Message + + + + + message to get information on users and roles
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ target or user to disable commands for +
+ + + +
+
+ Type +
+
+ +Role +| + +User + + + +
+
+ + + + + +
+ + + +
+
+

getUsersForCall(message, excludeAuthor)

+ + +
+
+ + +
+ Gets the list of users from the mentions in the call +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + +Message + + + + + Channel message
excludeAuthor + + +boolean + + + + + whether or not to exclude the author in the list
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ Array of users to send message +
+ + + +
+
+ Type +
+
+ +Array.<User> + + + +
+
+ + + + + +
+ + + +
+
+

safeNumber(value)

+ + +
+
+ + +
+ Checks number value and returns 0 if number is NaN +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
value + + +? + + + + + Value to check
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ Either the passed value or 0 +
+ + + +
+
+ Type +
+
+ +number +| + +? + + + +
+
+ + + + + +
+ + + +
+
+

sortNumber(a, b)

+ + +
+
+ + +
+ Sort numbers +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
a + + +number + + + + + First number
b + + +number + + + + + Second number
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ 1 if more, 0 if equal, -1 if less +
+ + + +
+
+ Type +
+
+ +number + + + +
+
+ + + + + +
+ + + +
+
+

timeDeltaToString(millis)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
millis + + +number + + + + + The number of milliseconds in the time delta
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +string + + + +
+
+ + + + + +
+ + + +
+
+

timeToSeconds(time)

+ + +
+
+ + +
+ Convert a time string to the seconds it comprises +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
time + + +string + + + + + Time as a string
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ Time as a Number +
+ + + +
+
+ Type +
+
+ +number + + + +
+
+ + + + + +
+ + + +
+
+

<async> updatePresence(self)

+ + +
+
+ + +
+ Perform actions when the bot is ready +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
self + + +Bot + + + + + the bot
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +

Type Definitions

+ +
+ +
+
+

CommandOptions

+ + +
+
+ +
+ Options for a command +
+ + + +
Type:
+
    +
  • + +Object + + + +
  • +
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
prefix + + +string + + + + + Prefix for the command
regexPrefix + + +string + + + + + Escaped prefix for use in regular expressions
commandHandler + + +CommandHandler + + + + + The bot's command handler
markdownSettings + + +MarkdownSettings + + + + + Markdown settings
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

DbConnectionOptions

+ + +
+
+ +
+ Connection options for the database +
+ + + +
Type:
+
    +
  • + +Object + + + +
  • +
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDefaultDescription
host + + +string + + + + + + + <optional>
+ + + +
+ + localhost + + The hostname of the database
port + + +number + + + + + + + <optional>
+ + + +
+ + 3306 + + The port number to connect to
user + + +string + + + + + + + + + + + The user to authenticate as
password + + +string + + + + + + + + + + + The password for that user
database + + +string + + + + + + + + + + + The database to use
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

LFG

+ + +
+
+ +
+ A collection of strings that are used by the parser to produce markdown-formatted text +
+ + + +
Type:
+
    +
  • + +Object.<string> + + + +
  • +
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
author + + +Discord.User + + + + + LFG Author
location + + +string + + + + + Where people would like to group
duration + + +string + + + + + How long to go for
goal + + +string + + + + + Goal to farm for
platform + + +string + + + + + What platform to recruit on
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

Log

+ + +
+
+ +
+ A collection of configurables for a log +
+ + + +
Type:
+
    +
  • + +Object.<string> + + + +
  • +
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
color + + +int + + + + + Log Embed color
title + + +string + + + + + Log Embed Title
fields + + +Array.<Object> + + + + + Field objects
footer + + +string + + + + + String for the footer
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ + + +
+
+

MarkdownSettings

+ + +
+
+ +
+ A collection of strings that are used by the parser to produce markdown-formatted text +
+ + + +
Type:
+
    +
  • + +Object.<string> + + + +
  • +
+ + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
lineEnd + + +string + + + + + Line return character
blockEnd + + +string + + + + + Block end string
doubleReturn + + +string + + + + + Double line return string
linkBegin + + +string + + + + + Link begin string
linkMid + + +string + + + + + Link middle string
linkEnd + + +string + + + + + Link end string
bold + + +string + + + + + String for denoting bold text
italic + + +string + + + + + String for denoting italicized text
underline + + +string + + + + + String for denoting underlined text
strike + + +string + + + + + String for denoting striked-through text
codeLine + + +string + + + + + String for denoting in-line code
codeBlock + + +string + + + + + String for denoting multi-line code blocks
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + +
+ +
+ + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/global.html#Logger b/docs/global.html#Logger new file mode 100644 index 000000000..cb3af34ca --- /dev/null +++ b/docs/global.html#Logger @@ -0,0 +1,566 @@ + + + + + + + genesis Class: Logger + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Logger

+
+ +
+ +

+ Logger +

+ +
A collection of methods for logging
+ + +
+ + +
+
+ + +
+
+

new Logger(ravenClient)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
ravenClient + + +Raven + + + + + client for logging errors and fatal errors
+ + + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
debug + + +function + + + + + Logs a debug message
info + + +function + + + + + Logs an info message
warning + + +function + + + + + Logs a warning message
error + + +function + + + + + Logs an error message
fatal + + +function + + + + + Logs a fatal message. The program should terminate after such + an error
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/img/glyphicons-halflings-white.png b/docs/img/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf6484a29d8da269f9bc874b25493a45fae3bae GIT binary patch literal 8777 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 B7G?kd literal 0 HcmV?d00001 diff --git a/docs/img/glyphicons-halflings.png b/docs/img/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..a9969993201f9cee63cf9f49217646347297b643 GIT binary patch literal 12799 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 literal 0 HcmV?d00001 diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 000000000..13b83221d --- /dev/null +++ b/docs/index.html @@ -0,0 +1,417 @@ + + + + + + + genesis Index + + + + + + + + + + + + + +
+
+ + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+

Project Genesis Genesis Avatar

Greenkeeper badge

+

Supported by Warframe Community Developers

+

A Discord.js bot for tracking Warframe alerts, invasions and more.

Contribute

Stories in Ready +Crowdin +Codacy Badge +Discord Bots +Discord Bots +Discord Bots

+

Feel free to submit a pull request. We are working on build checks and tests, and we use aribnb's codestyle and eslint configuration. Plugins for auto-linting on save are available for many popular editors.

+

Thanks Discord, Legalese things

Due to the New Discord T.O.S , if you continue to use, participate, be in, or not leave Cephalon Sanctuary, you agree to allowing me, any person, user, or member, any bot, service, app, and anything to collect, use, transmit, or any data related to your user account, any data made available by Discord in the API or SDK, any metadata from your user account, any messages and or content you send, and anything else you do or give by staying in Cephalon Sanctuary, or by using my bot.

+

If you do not agree to letting Genesis, Oratoris, or any other bot there do so, please kick Genesis from your clan or depart from Cephalon Sanctuary.

+

Get Help on Discord

Try Genesis on Discord!

+

Installation

    +
  1. Clone this repo

    +
     # For SSH
    + git clone git@github.wfcd/genesis.git
    +
    + # For HTTPS
    + git clone https://github.com/WFCD/genesis.git
  2. +
  3. Install mysql server and configure a database to store settings and data

    +
  4. +
  5. Run npm i

    +
  6. +
  7. Start bot with pm2 using a copy of the provided pm2.json file.

    +
  8. +
  9. See below for available config / commands

    +
  10. +
+

Configuration

Genesis requires a MySQL server. It uses the MYSQL_* environment variables for determining where to connect to

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Environment VariableDescriptionExampleDefault
TOKENDiscord connection tokenmfa.234089sdfasdf20dfada,f.asdN\A
LOCATION_MAX_CACHED_TIMEMaximum amount of time to cache location data60000060000
NEXUSSTATS_MAX_CACHED_TIMEMaximum amount of time to cache nexus stats data60000060000
LOG_LEVELLogging level of the bot, including info, debug, error, fatalDEBUGERROR
MYSQL_DBMySQL database name, used for connecting to data provider and storagegenesisgenesis
MYSQL_PASSWORDMySQL database connection passwordpasswordN\A
MYSQL_USERMySQL database connection usergenesisgenesis
MYSQL_PORTMySQL database connection port33063306
MYSQL_HOSTHostname for conneting to MySQLlocalhostlocalhost
SHARD_OFFSETOffset of the first shard id for the local shards, default 020
LOCAL_SHARDSNumber of shards locally21
SHARDSTotal number of shards11
OWNERID of the person owning/running the bot, used for checking permissions
DISCORD_BOTS_WEB_TOKENToken used to update bots.discord.pw bot statisticsas;dofiahsdfN\A
DISCORD_BOTS_WEB_USERBot user id on bots.discord.pw to update with server count6456514654966321321N\A
DISCORD_CARBON_TOKENCarbonitex bot token for posting server data to Carbonitexas;dofiahsdfN\A
PREFIXDefault prefix to use for the instance\\
RAVEN_URLDSN url for logging data to Sentry`'https://:@sentry.io/***'N\A
+

Commands

Honestly too many to put here

+

Throughput

Throughput Graph

+

License

License: Apache 2.0

+
+ + + + + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/main.js.html b/docs/main.js.html new file mode 100644 index 000000000..2bb45ed26 --- /dev/null +++ b/docs/main.js.html @@ -0,0 +1,308 @@ + + + + + + + genesis Source: main.js + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Source: main.js

+ +
+
+
'use strict';
+
+const cluster = require('cluster');
+const Cache = require('json-fetch-cache');
+const Raven = require('raven');
+
+const Genesis = require('./src/bot.js');
+const ClusterManager = require('./src/ClusterManager.js');
+
+/**
+ * Raven client instance for logging errors and debugging events
+ */
+const client = Raven.config(process.env.RAVEN_URL, {
+  autoBreadcrumbs: true,
+});
+
+/**
+ * Logging functions class
+ * @type {Object}
+ */
+const Logger = require('./src/Logger.js');
+
+client.install();
+client.on('error', (error) => {
+  //  eslint-disable-next-line no-console
+  console.error(`Could not report the following error to Sentry: ${error.message}`);
+});
+
+const logger = new Logger(client);
+process.on('uncaughtException', (err) => {
+  logger.error(err);
+});
+process.on('unhandledRejection', (err) => {
+  logger.error(err);
+});
+
+
+const caches = {
+  pc: new Cache('https://api.warframestat.us/pc', 60000),
+  xb1: new Cache('https://api.warframestat.us/xb1', 60000),
+  ps4: new Cache('https://api.warframestat.us/ps4', 60000),
+};
+
+if (cluster.isMaster) {
+  const localShards = parseInt(process.env.LOCAL_SHARDS, 10) || 1;
+  const shardOffset = parseInt(process.env.SHARD_OFFSET, 10) || 0;
+
+  const clusterManager = new ClusterManager(cluster, logger, localShards, shardOffset);
+  clusterManager.start();
+} else {
+  const totalShards = parseInt(process.env.SHARDS, 10) || 1;
+  const shard = new Genesis(process.env.TOKEN, logger, {
+    shardId: parseInt(process.env.shard_id, 10),
+    shardCount: totalShards,
+    prefix: process.env.PREFIX,
+    logger,
+    owner: process.env.OWNER,
+    caches,
+  });
+  shard.start();
+}
+
+
+
+ + + + + +
+
+ +
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/quicksearch.html b/docs/quicksearch.html new file mode 100644 index 000000000..9805abc0b --- /dev/null +++ b/docs/quicksearch.html @@ -0,0 +1,31 @@ + + + + + + + + + + + + + diff --git a/docs/scripts/docstrap.lib.js b/docs/scripts/docstrap.lib.js new file mode 100644 index 000000000..09d9272a0 --- /dev/null +++ b/docs/scripts/docstrap.lib.js @@ -0,0 +1,11 @@ +if(!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){function c(a){var b="length"in a&&a.length,c=_.type(a);return"function"!==c&&!_.isWindow(a)&&(!(1!==a.nodeType||!b)||("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a))}function d(a,b,c){if(_.isFunction(b))return _.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return _.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(ha.test(b))return _.filter(b,a,c);b=_.filter(b,a)}return _.grep(a,function(a){return U.call(b,a)>=0!==c})}function e(a,b){for(;(a=a[b])&&1!==a.nodeType;);return a}function f(a){var b=oa[a]={};return _.each(a.match(na)||[],function(a,c){b[c]=!0}),b}function g(){Z.removeEventListener("DOMContentLoaded",g,!1),a.removeEventListener("load",g,!1),_.ready()}function h(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=_.expando+h.uid++}function i(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(ua,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c||"false"!==c&&("null"===c?null:+c+""===c?+c:ta.test(c)?_.parseJSON(c):c)}catch(a){}sa.set(a,b,c)}else c=void 0;return c}function j(){return!0}function k(){return!1}function l(){try{return Z.activeElement}catch(a){}}function m(a,b){return _.nodeName(a,"table")&&_.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function n(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function o(a){var b=Ka.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function p(a,b){for(var c=0,d=a.length;d>c;c++)ra.set(a[c],"globalEval",!b||ra.get(b[c],"globalEval"))}function q(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(ra.hasData(a)&&(f=ra.access(a),g=ra.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)_.event.add(b,e,j[e][c])}sa.hasData(a)&&(h=sa.access(a),i=_.extend({},h),sa.set(b,i))}}function r(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&_.nodeName(a,b)?_.merge([a],c):c}function s(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ya.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function t(b,c){var d,e=_(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:_.css(e[0],"display");return e.detach(),f}function u(a){var b=Z,c=Oa[a];return c||(c=t(a,b),"none"!==c&&c||(Na=(Na||_("