mirror of
https://github.com/arthur-pbty/xiao.git
synced 2026-06-03 23:36:43 +02:00
Framework Rewrite
This commit is contained in:
@@ -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.');
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user