diff --git a/package.json b/package.json index 1626ea1..2e937b7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wump", - "version": "1.2.0", + "version": "1.3.1", "displayName": "Wump", "description": "A multi-platform bot written in Node.js", "author": "Wessel \"wesselgame\" T ", diff --git a/src/_application.yml b/src/_application.yml index 146a902..f19c4e4 100644 --- a/src/_application.yml +++ b/src/_application.yml @@ -43,12 +43,15 @@ discord : messagecreate: true messagedelete: true commands : + # Category : CORE + locale : true # Category : UTILITY ping : true math : true snipe : true # Category : INFORMATION stats : true + guild : true commands : true # Category : IMAGE cat : true diff --git a/src/assets/config/emotes.yml b/src/assets/config/emotes.yml index 34fa375..0426276 100644 --- a/src/assets/config/emotes.yml +++ b/src/assets/config/emotes.yml @@ -12,7 +12,7 @@ core : 5 : <:ok_hand:497396122416054287> # Updated (guild) 6 : <:ok_hand:497396122416054287> # Updated (user) 7 : <:sad:500719642403405824> # Invalid locale - 8 : + 8 : <:sad:500719642403405824> # Missing permissions (guild) util : ping : @@ -27,6 +27,22 @@ util : snipe: <:snipe:508653323788877825> # No snipes found info: + guild : + 0 : <:search:542368817163010057> # Guild Name + 1 : <:wumpus_flag:495525134220787713> # Guild region + 2 : <:cloud:542368816911613963> # Guild creation + 3 : <:alert:542367222279176202> # Content filter + 4 : <:exclamation:542368036255039509> # Verification level + 5 : <:hashtag:542367004024242176> # Channels + 6 : <:owner:542365741844922368> # Owner tag + 7 : <:early:542366345795207178> # Owner creation + 8 : <:store:542366547180781588> # Owner avatar + 9 : <:bot:473670328334155805> # Total bots + 10 : <:member:542362747896201218> # Total users + 11 : <:offline:362670805441708032> # Total offline members + 12 : <:online:362670805051768833> # Total online members + 13 : <:dnd:362670805676720128> # Total DnD members + 14 : <:idle:362670805760475136> # Total idle members commands : 0 : <:blueberry:506201160382939141> # Guild prefix 1 : <:spirit:332131321759399937> # More info diff --git a/src/assets/i18n/en_us/strings.yml b/src/assets/i18n/en_us/strings.yml index 79a2ff4..35a8b2d 100644 --- a/src/assets/i18n/en_us/strings.yml +++ b/src/assets/i18n/en_us/strings.yml @@ -74,10 +74,38 @@ info : - '**Cooldown**: $[command:cooldown#formatted]' - '**Arguments**: $[command:arguments]' fields: + - 'Core' - 'Information' - 'Image' - 'Utility' - 'Developer' + guild: + fields: + guild: + name: '❯ Guild Information' + value: + - '$[emoji#0] **Name**: $[guild:name] (`$[guild:id]`)' + - '$[emoji#1] **Region**: $[guild:region]' + - '$[emoji#2] **Creation**: $[guild:created@precise] ago (`$[guild:created@exact]`)' + - '$[emoji#3] **Content Filter**: $[guild:explicity]' + - '$[emoji#4] **Verification Level**: $[guild:verification]' + - '$[emoji#5] **Channels [`Text` / `Voice`]**: $[guild:fullChannels]' + owner: + name: '❯ Owner Information' + value: + - '$[emoji#6] **Tag**: $[guild:owner#tag] (`$[guild:owner#id]`)' + - '$[emoji#7] **Creation**: $[guild:owner#created@precise] ago (`$[guild:owner#created@exact]`)' + - '$[emoji#8] **Avatar**: [Click here]($[guild:owner#avatar])' + members: + name: '❯ Member Counts' + value: + - '$[emoji#9] Bots **⤏** $[guild:users#bot]' + - '$[emoji#10] Members **⤏** $[guild:users#total]' + - '**_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\__**' + - '$[emoji#12] Online **⤏** `$[guild:users#online]`' + - '$[emoji#14] Idle **⤏** `$[guild:users#idle]`' + - '$[emoji#13] DnD **⤏** `$[guild:users#dnd]`' + - '$[emoji#11] Offline **⤏** `$[guild:users#offline]`' image: fetching : '$[emoji#0] Fetching a random image, this may take some time...' diff --git a/src/assets/i18n/nl/strings.yml b/src/assets/i18n/nl/strings.yml index 44c060e..c0b37eb 100644 --- a/src/assets/i18n/nl/strings.yml +++ b/src/assets/i18n/nl/strings.yml @@ -73,10 +73,38 @@ info : - '**Cooldown**: $[command:cooldown#formatted]' - '**Argumenten**: $[command:arguments]' fields: + - 'Kern' - 'Informatie' - 'Plaatjes' - 'Overig' - 'Ontwikkelaar' + guild: + fields: + guild: + name: '❯ Gilde Informatie' + value: + - '$[emoji#0] **Naam**: $[guild:name] (`$[guild:id]`)' + - '$[emoji#1] **Regio**: $[guild:region]' + - '$[emoji#2] **Creatie**: $[guild:created@precise] ago (`$[guild:created@exact]`)' + - '$[emoji#3] **Inhoudsfilter**: $[guild:explicity]' + - '$[emoji#4] **Verificatieniveau**: $[guild:verification]' + - '$[emoji#5] **Kanalen [`Tekst` / `Stem`]**: $[guild:fullChannels]' + owner: + name: '❯ Eigenaar Informatie' + value: + - '$[emoji#6] **Label**: $[guild:owner#tag] (`$[guild:owner#id]`)' + - '$[emoji#7] **Creatie**: $[guild:owner#created@precise] ago (`$[guild:owner#created@exact]`)' + - '$[emoji#8] **Avatar**: [Click here]($[guild:owner#avatar])' + members: + name: '❯ Leden Nummers' + value: + - '$[emoji#9] Robots **⤏** $[guild:users#bot]' + - '$[emoji#10] Leden **⤏** $[guild:users#total]' + - '**_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\__**' + - '$[emoji#12] Online **⤏** `$[guild:users#online]`' + - '$[emoji#14] Idle **⤏** `$[guild:users#idle]`' + - '$[emoji#13] DnD **⤏** `$[guild:users#dnd]`' + - '$[emoji#11] Offline **⤏** `$[guild:users#offline]`' image: fetching : '$[emoji#0] Een willekeurig plaatje aan het ophalen, dit kan enige tijd duren...' diff --git a/src/commands/Discord/Information/commands.js b/src/commands/Discord/Information/commands.js index bbdd06a..19e6d61 100644 --- a/src/commands/Discord/Information/commands.js +++ b/src/commands/Discord/Information/commands.js @@ -45,21 +45,26 @@ module.exports = class Commands extends DiscordCommand { fields : [ { name : msg.author.locale['info']['commands']['fields'][0], - value : this.bot.cmds.filter((v) => v.extData.category.toLowerCase() === 'information' && !v.extData.hidden).map((v) => `**•** [\`${msg.prefix}${v.extData.name}\`](https://discordapp.com/channels/${msg.channel.guild.id}/${msg.channel.id}/${msg.id}) ${v.extData.description ? `**-** ${v.extData.description}` : ''}`).join('\n'), + value : this.bot.cmds.filter((v) => v.extData.category.toLowerCase() === 'core' && !v.extData.hidden).map((v) => `**•** [\`${msg.prefix}${v.extData.name}\`](https://discordapp.com/channels/${msg.channel.guild.id}/${msg.channel.id}/${msg.id}) ${v.extData.description ? `**-** ${v.extData.description}` : ''}`).join('\n'), inline: true }, { name : msg.author.locale['info']['commands']['fields'][1], - value : this.bot.cmds.filter((v) => v.extData.category.toLowerCase() === 'image' && !v.extData.hidden).map((v) => `**•** [\`${msg.prefix}${v.extData.name}\`](https://discordapp.com/channels/${msg.channel.guild.id}/${msg.channel.id}/${msg.id}) ${v.extData.description ? `**-** ${v.extData.description}` : ''}`).join('\n'), + value : this.bot.cmds.filter((v) => v.extData.category.toLowerCase() === 'information' && !v.extData.hidden).map((v) => `**•** [\`${msg.prefix}${v.extData.name}\`](https://discordapp.com/channels/${msg.channel.guild.id}/${msg.channel.id}/${msg.id}) ${v.extData.description ? `**-** ${v.extData.description}` : ''}`).join('\n'), inline: true }, { name : msg.author.locale['info']['commands']['fields'][2], - value : this.bot.cmds.filter((v) => v.extData.category.toLowerCase() === 'utility' && !v.extData.hidden).map((v) => `**•** [\`${msg.prefix}${v.extData.name}\`](https://discordapp.com/channels/${msg.channel.guild.id}/${msg.channel.id}/${msg.id}) ${v.extData.description ? `**-** ${v.extData.description}` : ''}`).join('\n'), + value : this.bot.cmds.filter((v) => v.extData.category.toLowerCase() === 'image' && !v.extData.hidden).map((v) => `**•** [\`${msg.prefix}${v.extData.name}\`](https://discordapp.com/channels/${msg.channel.guild.id}/${msg.channel.id}/${msg.id}) ${v.extData.description ? `**-** ${v.extData.description}` : ''}`).join('\n'), inline: true }, { name : msg.author.locale['info']['commands']['fields'][3], + value : this.bot.cmds.filter((v) => v.extData.category.toLowerCase() === 'utility' && !v.extData.hidden).map((v) => `**•** [\`${msg.prefix}${v.extData.name}\`](https://discordapp.com/channels/${msg.channel.guild.id}/${msg.channel.id}/${msg.id}) ${v.extData.description ? `**-** ${v.extData.description}` : ''}`).join('\n'), + inline: true + }, + { + name : msg.author.locale['info']['commands']['fields'][4], value : this.bot.cmds.filter((v) => v.extData.category.toLowerCase() === 'developer' && !v.extData.hidden).map((v) => `**•** [\`${msg.prefix}${v.extData.name}\`](https://discordapp.com/channels/${msg.channel.guild.id}/${msg.channel.id}/${msg.id}) ${v.extData.description ? `**-** ${v.extData.description}` : ''}`).join('\n'), inline: true } diff --git a/src/commands/Discord/Information/guild.js b/src/commands/Discord/Information/guild.js new file mode 100644 index 0000000..9c09ced --- /dev/null +++ b/src/commands/Discord/Information/guild.js @@ -0,0 +1,118 @@ +const { DiscordCommand } = require('../../../core'); + +const moment = require('moment'); require('../../../util/moment/diff.js'); + +module.exports = class name extends DiscordCommand { + constructor(bot) { + super(bot, { + name : 'guild', + syntax : 'guild <...guild:string>', + aliases : [ '<...guild:string>' ], + argument : [], + description : 'Get a guild\'s information', + + hidden : false, + enabled : true, + cooldown : 1000, + category : 'Information', + ownerOnly : false, + guildOnly : false, + permissions : [ 'embedLinks' ] + }); + + this.verifications = { '0': 'none', '1': 'low', '2': 'medium', '3': '(╯°□°)╯︵ ┻━┻', '4': '┻━┻ ミヽ(ಠ益ಠ)ノ彡┻━┻' }; + this.explicits = { '0': 'off', '1': 'everyone without roles', '2': 'everyone' }; + this.flags = { 'eu-central': '🇪🇺', 'london': '🇬🇧', 'amsterdam': '🇳🇱', 'japan': '🇯🇵', + 'brazil': '🇧🇷', 'us-west': '🇺🇸', 'hongkong': '🇭🇰', 'sydney': '🇦🇺', + 'singapore': '🇸🇬', 'us-central': '🇺🇸', 'eu-west': '🇪🇺', 'us-south': '🇺🇸', + 'us-east': '🇺🇸', 'frankfurt': '🇩🇪', 'russia': '🇷🇺' }; + } + + async execute(msg, args) { + const g = this.bot.REST.getGuild((args.length >= 1 ? args.join(' ') : msg.channel.guild.id)); + + if (!g) return msg.channel.createMessage('INVALID'); + msg.channel.createMessage({ + embed: { + title : g.name, + thumbnail: { url: g.iconURL }, + fields : [ + { + name: msg.author.locale['info']['guild']['fields']['guild']['name'], + value: this.localize(msg.author.locale['info']['guild']['fields']['guild']['value'].join('\n'), { guild: g }), + inline: true + }, + { + name: msg.author.locale['info']['guild']['fields']['owner']['name'], + value: this.localize(msg.author.locale['info']['guild']['fields']['owner']['value'].join('\n'), { guild: g }), + inline: true + }, + { + name: msg.author.locale['info']['guild']['fields']['members']['name'], + value: this.localize(msg.author.locale['info']['guild']['fields']['members']['value'].join('\n'), { guild: g }), + inline: true + } + ] + } + }); + } + + localize(msg, extData) { + if (!msg) return ''; + + if (extData && extData.guild) { + const o = this.bot.users.get(extData.guild.ownerID); + o.c = moment.preciseDiff(new Date(), new Date(o.createdAt), true); + o.cs = [ + o.c.years >= 1 ? `${o.c.years} years` : undefined, + o.c.months >= 1 ? `${o.c.months} months` : undefined, + o.c.days >= 1 ? `${o.c.days} days` : undefined + ].join(' '); + + extData.guild.c = moment.preciseDiff(new Date(), new Date(extData.guild.createdAt), true); + extData.guild.cs = [ + extData.guild.c.years >= 1 ? `${extData.guild.c.years} years` : undefined, + extData.guild.c.months >= 1 ? `${extData.guild.c.months} months` : undefined, + extData.guild.c.days >= 1 ? `${extData.guild.c.days} days` : undefined + ].join(' '); + + msg = msg + .replace(/\$\[guild:id]/g, extData.guild.id) + .replace(/\$\[guild:name]/g, extData.guild.name) + .replace(/\$\[guild:region]/g, `${this.flags[extData.guild.region] ? this.flags[extData.guild.region] : this.bot.emote('info', 'guild', '2')} ${extData.guild.region}`) + .replace(/\$\[guild:explicity]/g, this.explicits[extData.guild.explicitContentFilter]) + .replace(/\$\[guild:verification]/g, this.verifications[extData.guild.verificationLevel]) + .replace(/\$\[guild:fullChannels]/g , `${extData.guild.channels.filter((v) => v.type === 0).length} / ${extData.guild.channels.filter((v) => v.type === 2).length}`) + .replace(/\$\[guild:users#bot]/g, extData.guild.members.filter((v) => v.bot).length) + .replace(/\$\[guild:users#dnd]/g, extData.guild.members.filter((v) => v.status === 'dnd').length) + .replace(/\$\[guild:users#idle]/g, extData.guild.members.filter((v) => v.status === 'idle').length) + .replace(/\$\[guild:users#total]/g, extData.guild.members.filter((v) => !v.bot).length) + .replace(/\$\[guild:users#online]/g, extData.guild.members.filter((v) => v.status === 'online').length) + .replace(/\$\[guild:users#offline]/g, extData.guild.members.filter((v) => v.status === 'offline').length) + .replace(/\$\[guild:created@precise]/g, extData.guild.cs) + .replace(/\$\[guild:created@exact]/g, moment(extData.guild.createdAt).format('YYYY[/]MM[/]DD HH[:]mm')) + .replace(/\$\[guild:owner#id]/g , o.id) + .replace(/\$\[guild:owner#tag]/g , `${o.username}#${o.discriminator}`) + .replace(/\$\[guild:owner#created@precise]/g, o.cs) + .replace(/\$\[guild:owner#created@exact]/g, moment(o.createdAt).format('YYYY[/]MM[/]DD HH[:]mm')) + .replace(/\$\[guild:owner#avatar]/g, o.avatar ? o.avatarURL : o.defaultAvatarURL); + } + + return msg + .replace(/\$\[emoji#0]/g, this.bot.emote('info', 'guild', '0')) + .replace(/\$\[emoji#1]/g, this.bot.emote('info', 'guild', '1')) + .replace(/\$\[emoji#2]/g, this.bot.emote('info', 'guild', '2')) + .replace(/\$\[emoji#3]/g, this.bot.emote('info', 'guild', '3')) + .replace(/\$\[emoji#4]/g, this.bot.emote('info', 'guild', '4')) + .replace(/\$\[emoji#5]/g, this.bot.emote('info', 'guild', '5')) + .replace(/\$\[emoji#6]/g, this.bot.emote('info', 'guild', '6')) + .replace(/\$\[emoji#7]/g, this.bot.emote('info', 'guild', '7')) + .replace(/\$\[emoji#8]/g, this.bot.emote('info', 'guild', '8')) + .replace(/\$\[emoji#9]/g, this.bot.emote('info', 'guild', '9')) + .replace(/\$\[emoji#10]/g, this.bot.emote('info', 'guild', '10')) + .replace(/\$\[emoji#11]/g, this.bot.emote('info', 'guild', '11')) + .replace(/\$\[emoji#12]/g, this.bot.emote('info', 'guild', '12')) + .replace(/\$\[emoji#13]/g, this.bot.emote('info', 'guild', '13')) + .replace(/\$\[emoji#14]/g, this.bot.emote('info', 'guild', '14')); + } +}; \ No newline at end of file diff --git a/src/core/clients/Discord.js b/src/core/clients/Discord.js index f666aec..66826fd 100644 --- a/src/core/clients/Discord.js +++ b/src/core/clients/Discord.js @@ -1,5 +1,6 @@ // Main const Webhook = require('./DiscordWebhook'); +const RESTclient = require('../internal/Discord/rest'); const { Client: Eris } = require('eris'); // Registries const EventRegistry = require('../registry/Discord/Events'); @@ -28,6 +29,7 @@ module.exports = class WumpDiscord extends Eris { this.localeDic = []; this.m = options.db; + this.REST = new RESTclient(this); this.eventRegistry = new EventRegistry(this); this.localeRegistry = new LocaleRegistry(this); this.commandRegistry = new CommandRegistry(this); diff --git a/src/core/internal/Discord/RESTclient.js b/src/core/internal/Discord/RESTclient.js deleted file mode 100644 index 2cbc2de..0000000 --- a/src/core/internal/Discord/RESTclient.js +++ /dev/null @@ -1,37 +0,0 @@ -module.exports = class RESTclient { - constructor(bot) { - this.bot = bot; - } - - resolveGuild(q) { - if (q) return undefined; - - const g = this.bot.guilds.get(q); - if (/^\d+$/.test(q)) return g; - else { - const gs = this.bot.guilds.filter((v) => v.name.toLowerCase().includes(q.toLowerCase())); - if (gs.length > 1) return gs[0]; - else return undefined; - } - } - - resolveUser(q) { - if (!q) return undefined; - - if (/^\d+$/.test(q)) { - const u = this.bot.users.get(q); - if (u) return u; - } else if (/^<@!?(\d+)>$/.test(q)) { - const u = this.bot.users.get(q.match(/^<@!?(\d+)>$/)[1]); - if (u) return u; - } else if (/^(.+)#(\d{4})$/.test(q)) { - const m = q.match(/^(.+)#(\d{4})$/); - const u = this.bot.users.filter((v) => v.username === m[1] && Number(v.discriminator) === Number(m[2])); - if (u.length >= 1) return u[0]; - } else { - const u = this.bot.users.filter((v) => v.username.toLowerCase().includes(q.toLowerCase())); - if (u.length >= 1) return u[0]; - else return undefined; - } - } -}; \ No newline at end of file diff --git a/src/core/internal/Discord/rest.js b/src/core/internal/Discord/rest.js new file mode 100644 index 0000000..dc72da7 --- /dev/null +++ b/src/core/internal/Discord/rest.js @@ -0,0 +1,92 @@ +module.exports = class RESTclient { + constructor(bot) { + this.bot = bot; + } + + getRole($, g) { + if (/^\d+$/.test($) && g.roles.get($)) return $; + else if (/<@%(\d+)>$/.test($)) { + const m = $.match(/^<@&(\d+)>$/); + const r = g.roles.get(m[1]); + if (r) return $; + } else { + const r = g.roles.filter((v) => v.name.toLowerCase().includes($.toLowerCase())); + if (r.length > 0) return r[0]; + } + + return undefined; + } + + getUser($) { + if (/^\d+$/.test($) && this.bot.users.get($)) return this.bot.users.get($); + else if (/^<@!?(\d+)>$/.test($)) { + const u = this.bot.users.get($.match(/^<@!?(\d+)>$/)[1]); + if (u) return u; + }else if (/^(.+)#(\d{4})$/.test($)) { + const m = $.match(/^(.+)#(\d{4})$/); + const u = this.bot.users.filter((u) => u.username === m[1] && Number(u.discriminator) === Number(m[2])); + if (u.length > 0) return u[0]; + } else { + const u = this.bot.users.filter((u) => u.username.toLowerCase().includes($.toLowerCase())); + if (u.length > 0) return u[0]; + } + + return undefined; + } + + getGuild($) { + if (/^\d+$/.test($) && this.bot.guilds.get($)) return this.bot.guilds.get($); + else { + const tmp = this.bot.guilds.filter((v) => v.name.toLowerCase().includes(q.toLowerCase())); + if (tmp.length > 0) return tmp[0]; + } + + return undefined; + } + + getChannel($, g) { + let c; + + if (/^\d+$/.test($)) { + if (g) { + if (!g.channels.has($)) return undefined; + return g.channels.get($); + } else { + c = c in this.bot.channelGuildMap && this.bot.guilds.get(this.bot.channelGuildMap[$]).channels.get($); + if (c) return c; + } + } else if (/^<#(\d+)>$/.test(c)) { + const m = $.match(/^<#(\d+)>$/); + if ($) { + if (!g.channels.has(m[1])) return undefined; + return g.channels.get(m[1]); + } else { + c = m[1] in this.bot.channelGuildMap && this.bot.guilds.get(this.bot.channelGuildMap[m[1]]).channels.get($); + if (c) return c; + } + } else if ($) { + c = g.channels.filter((v) => v.name.toLowerCase().includes($.toLowerCase())); + if (c.length > 0) return c[0]; + } + + return undefined; + } + + getMember($, g, n = false) { + if (/^\d+$/.test($) && g.members.get($)) return g.members.get($); + else if (/^<@!?(\d+)>$/.test($)) { + const m = $.match(/^<@!?(\d+)>$/); + const u = g.members.get(m[1]); + if (u) return u; + } else if (/^(.+)#(\d{4})$/.test($)) { + const m = $.match(/^(.+)#(\d{4})$/); + const u = g.members.filter((v) => v.user.username === m[1] && Number(v.user.discriminator) === Number(m[2])); + if (u.length > 0) return u[0]; + } else if (!n) { + const u = g.members.filter((v) => v.user.username.toLowerCase().includes(v.toLowerCase())); + if (u.length > 0) return u[0]; + } + + return undefined; + } +}; \ No newline at end of file diff --git a/src/util/moment/shorten.js b/src/util/moment/diff.js similarity index 100% rename from src/util/moment/shorten.js rename to src/util/moment/diff.js