Framework Rewrite

This commit is contained in:
Dragon Fire
2021-06-05 12:17:33 -04:00
parent 5c9f237321
commit 7917766ce3
48 changed files with 1101 additions and 294 deletions
+21
View File
@@ -0,0 +1,21 @@
const ArgumentType = require('../ArgumentType');
module.exports = class BooleanArgumentType extends ArgumentType {
constructor(client) {
super(client, 'boolean');
this.truthy = new Set(['true', 't', 'yes', 'y', 'on', 'enable', 'enabled', '1', '+']);
this.falsy = new Set(['false', 'f', 'no', 'n', 'off', 'disable', 'disabled', '0', '-']);
}
validate(val) {
const lc = val.toLowerCase();
return this.truthy.has(lc) || this.falsy.has(lc);
}
parse(val) {
const lc = val.toLowerCase();
if (this.truthy.has(lc)) return true;
if (this.falsy.has(lc)) return false;
throw new RangeError('Unknown boolean value.');
}
}
+39
View File
@@ -0,0 +1,39 @@
const ArgumentType = require('../ArgumentType');
module.exports = class ChannelArgumentType extends ArgumentType {
constructor(client) {
super(client, 'channel');
}
validate(val, msg) {
const matches = val.match(/^(?:<#)?([0-9]+)>?$/);
if (matches) return msg.guild.channels.cache.has(matches[1]);
const search = val.toLowerCase();
const channels = msg.guild.channels.cache.filter(nameFilterInexact(search));
if (channels.size === 0) return false;
if (channels.size === 1) return true;
const exactChannels = channels.filter(nameFilterExact(search));
if (exactChannels.size === 1) return true;
return false;
}
parse(val, msg) {
const matches = val.match(/^(?:<#)?([0-9]+)>?$/);
if (matches) return msg.guild.channels.cache.get(matches[1]) || null;
const search = val.toLowerCase();
const channels = msg.guild.channels.cache.filter(nameFilterInexact(search));
if (channels.size === 0) return null;
if (channels.size === 1) return channels.first();
const exactChannels = channels.filter(nameFilterExact(search));
if (exactChannels.size === 1) return exactChannels.first();
return null;
}
}
function nameFilterExact(search) {
return thing => thing.name.toLowerCase() === search;
}
function nameFilterInexact(search) {
return thing => thing.name.toLowerCase().includes(search);
}
+17
View File
@@ -0,0 +1,17 @@
const ArgumentType = require('../ArgumentType');
module.exports = class CommandArgumentType extends ArgumentType {
constructor(client) {
super(client, 'command');
}
validate(val) {
const commands = this.client.registry.findCommands(val);
if (commands.size === 1) return true;
return false;
}
parse(val) {
return this.client.registry.findCommands(val).first();
}
}
+40
View File
@@ -0,0 +1,40 @@
const ArgumentType = require('../ArgumentType');
module.exports = class CustomEmojiArgumentType extends ArgumentType {
constructor(client) {
super(client, 'custom-emoji');
}
validate(value, msg) {
const matches = value.match(/^(?:<a?:([a-zA-Z0-9_]+):)?([0-9]+)>?$/);
if (matches && msg.client.emojis.cache.has(matches[2])) return true;
if (!msg.guild) return false;
const search = value.toLowerCase();
const emojis = msg.guild.emojis.cache.filter(nameFilterInexact(search));
if (!emojis.size) return false;
if (emojis.size === 1) return true;
const exactEmojis = emojis.filter(nameFilterExact(search));
if (exactEmojis.size === 1) return true;
return false;
}
parse(value, msg) {
const matches = value.match(/^(?:<a?:([a-zA-Z0-9_]+):)?([0-9]+)>?$/);
if (matches) return msg.client.emojis.cache.get(matches[2]) || null;
const search = value.toLowerCase();
const emojis = msg.guild.emojis.cache.filter(nameFilterInexact(search));
if (!emojis.size) return null;
if (emojis.size === 1) return emojis.first();
const exactEmojis = emojis.filter(nameFilterExact(search));
if (exactEmojis.size === 1) return exactEmojis.first();
return null;
}
}
function nameFilterExact(search) {
return emoji => emoji.name.toLowerCase() === search;
}
function nameFilterInexact(search) {
return emoji => emoji.name.toLowerCase().includes(search);
}
+18
View File
@@ -0,0 +1,18 @@
const ArgumentType = require('../ArgumentType');
const emojiRegex = require('emoji-regex/RGI_Emoji.js');
module.exports = class DefaultEmojiArgumentType extends ArgumentType {
constructor(client) {
super(client, 'default-emoji');
this.regex = new RegExp(`^(?:${emojiRegex().source})$`);
}
validate(value) {
if (!this.regex.test(value)) return false;
return true;
}
parse(value) {
return value;
}
}
+20
View File
@@ -0,0 +1,20 @@
const ArgumentType = require('../ArgumentType');
module.exports = class FloatArgumentType extends ArgumentType {
constructor(client) {
super(client, 'float');
}
validate(val, msg, arg) {
const float = Number.parseFloat(val);
if (Number.isNaN(float)) return false;
if (arg.oneOf && !arg.oneOf.includes(float)) return false;
if (arg.min !== null && typeof arg.min !== 'undefined' && float < arg.min) return false;
if (arg.max !== null && typeof arg.max !== 'undefined' && float > arg.max) return false;
return true;
}
parse(val) {
return Number.parseFloat(val);
}
}
+17
View File
@@ -0,0 +1,17 @@
const ArgumentType = require('../ArgumentType');
module.exports = class GroupArgumentType extends ArgumentType {
constructor(client) {
super(client, 'group');
}
validate(val) {
const groups = this.client.registry.findGroups(val);
if (groups.size === 1) return true;
return false;
}
parse(val) {
return this.client.registry.findGroups(val).first();
}
}
+20
View File
@@ -0,0 +1,20 @@
const ArgumentType = require('../ArgumentType');
module.exports = class IntegerArgumentType extends ArgumentType {
constructor(client) {
super(client, 'integer');
}
validate(val, msg, arg) {
const int = Number.parseInt(val);
if (Number.isNaN(int)) return false;
if (arg.oneOf && !arg.oneOf.includes(int)) return false;
if (arg.min !== null && typeof arg.min !== 'undefined' && int < arg.min) return false;
if (arg.max !== null && typeof arg.max !== 'undefined' && int > arg.max) return false;
return true;
}
parse(val) {
return Number.parseInt(val);
}
}
+51
View File
@@ -0,0 +1,51 @@
const ArgumentType = require('../ArgumentType');
module.exports = class MemberArgumentType extends ArgumentType {
constructor(client) {
super(client, 'member');
}
async validate(val, msg) {
const matches = val.match(/^(?:<@!?)?([0-9]+)>?$/);
if (matches) {
try {
const member = await msg.guild.members.fetch(await this.client.users.fetch(matches[1]));
if (!member) return false;
return true;
} catch (err) {
return false;
}
}
const search = val.toLowerCase();
const members = msg.guild.members.cache.filter(memberFilterInexact(search));
if (members.size === 0) return false;
if (members.size === 1) return true;
const exactMembers = members.filter(memberFilterExact(search));
if (exactMembers.size === 1) return true;
return false;
}
parse(val, msg) {
const matches = val.match(/^(?:<@!?)?([0-9]+)>?$/);
if (matches) return msg.guild.members.resolve(matches[1]) || null;
const search = val.toLowerCase();
const members = msg.guild.members.cache.filter(memberFilterInexact(search));
if (members.size === 0) return null;
if (members.size === 1) return members.first();
const exactMembers = members.filter(memberFilterExact(search));
if (exactMembers.size === 1) return exactMembers.first();
return null;
}
}
function memberFilterExact(search) {
return mem => mem.user.username.toLowerCase() === search ||
(mem.nickname && mem.nickname.toLowerCase() === search) ||
mem.tag.toLowerCase() === search;
}
function memberFilterInexact(search) {
return mem => mem.user.username.toLowerCase().includes(search) ||
(mem.nickname && mem.nickname.toLowerCase().includes(search)) ||
mem.tag.toLowerCase().includes(search);
}
+16
View File
@@ -0,0 +1,16 @@
const ArgumentType = require('../ArgumentType');
module.exports = class MessageArgumentType extends ArgumentType {
constructor(client) {
super(client, 'message');
}
async validate(val, msg) {
if (!/^[0-9]+$/.test(val)) return false;
return Boolean(await msg.channel.messages.fetch(val).catch(() => null));
}
parse(val, msg) {
return msg.channel.messages.cache.get(val);
}
}
+39
View File
@@ -0,0 +1,39 @@
const ArgumentType = require('../ArgumentType');
module.exports = class RoleArgumentType extends ArgumentType {
constructor(client) {
super(client, 'role');
}
validate(val, msg) {
const matches = val.match(/^(?:<@&)?([0-9]+)>?$/);
if (matches) return msg.guild.roles.cache.has(matches[1]);
const search = val.toLowerCase();
const roles = msg.guild.roles.cache.filter(nameFilterInexact(search));
if (roles.size === 0) return false;
if (roles.size === 1) return true;
const exactRoles = roles.filter(nameFilterExact(search));
if (exactRoles.size === 1) return true;
return false;
}
parse(val, msg) {
const matches = val.match(/^(?:<@&)?([0-9]+)>?$/);
if (matches) return msg.guild.roles.cache.get(matches[1]) || null;
const search = val.toLowerCase();
const roles = msg.guild.roles.cache.filter(nameFilterInexact(search));
if (roles.size === 0) return null;
if (roles.size === 1) return roles.first();
const exactRoles = roles.filter(nameFilterExact(search));
if (exactRoles.size === 1) return exactRoles.first();
return null;
}
}
function nameFilterExact(search) {
return thing => thing.name.toLowerCase() === search;
}
function nameFilterInexact(search) {
return thing => thing.name.toLowerCase().includes(search);
}
+18
View File
@@ -0,0 +1,18 @@
const ArgumentType = require('../ArgumentType');
module.exports = class StringArgumentType extends ArgumentType {
constructor(client) {
super(client, 'string');
}
validate(val, msg, arg) {
if (arg.oneOf && !arg.oneOf.includes(val.toLowerCase())) return false;
if (arg.min !== null && typeof arg.min !== 'undefined' && val.length < arg.min) return false;
if (arg.max !== null && typeof arg.max !== 'undefined' && val.length > arg.max) return false;
return true;
}
parse(val) {
return val;
}
}
+53
View File
@@ -0,0 +1,53 @@
const ArgumentType = require('../ArgumentType');
module.exports = class UserArgumentType extends ArgumentType {
constructor(client) {
super(client, 'user');
}
async validate(val, msg, arg) {
const matches = val.match(/^(?:<@!?)?([0-9]+)>?$/);
if (matches) {
try {
const user = await msg.client.users.fetch(matches[1]);
if (!user) return false;
return true;
} catch (err) {
return false;
}
}
if (!msg.guild) return false;
const search = val.toLowerCase();
const members = msg.guild.members.cache.filter(memberFilterInexact(search));
if (members.size === 0) return false;
if (members.size === 1) return true;
const exactMembers = members.filter(memberFilterExact(search));
if (exactMembers.size === 1) return true;
return false;
}
parse(val, msg) {
const matches = val.match(/^(?:<@!?)?([0-9]+)>?$/);
if (matches) return msg.client.users.cache.get(matches[1]) || null;
if (!msg.guild) return null;
const search = val.toLowerCase();
const members = msg.guild.members.cache.filter(memberFilterInexact(search));
if (members.size === 0) return null;
if (members.size === 1) return members.first().user;
const exactMembers = members.filter(memberFilterExact(search));
if (exactMembers.size === 1) return exactMembers.first().user;
return null;
}
}
function memberFilterExact(search) {
return mem => mem.user.username.toLowerCase() === search ||
(mem.nickname && mem.nickname.toLowerCase() === search) ||
mem.tag.toLowerCase() === search;
}
function memberFilterInexact(search) {
return mem => mem.user.username.toLowerCase().includes(search) ||
(mem.nickname && mem.nickname.toLowerCase().includes(search)) ||
mem.tag.toLowerCase().includes(search);
}