muskytape
Version:
Framework não oficial do Discord.js
70 lines (63 loc) • 2.4 kB
JavaScript
const ArgumentType = require('./base');
const { disambiguation } = require('../util');
const { escapeMarkdown } = require('discord.js');
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;
if(arg.oneOf && !arg.oneOf.includes(user.id)) return false;
return true;
} catch(err) {
return false;
}
}
if(!msg.guild) return false;
const search = val.toLowerCase();
let members = msg.guild.members.cache.filter(memberFilterInexact(search));
if(members.size === 0) return false;
if(members.size === 1) {
if(arg.oneOf && !arg.oneOf.includes(members.first().id)) return false;
return true;
}
const exactMembers = members.filter(memberFilterExact(search));
if(exactMembers.size === 1) {
if(arg.oneOf && !arg.oneOf.includes(exactMembers.first().id)) return false;
return true;
}
if(exactMembers.size > 0) members = exactMembers;
return members.size <= 15 ?
`${disambiguation(
members.map(mem => `${escapeMarkdown(mem.user.username)}#${mem.user.discriminator}`), 'users', null
)}\n` :
'Multiple users found. Please be more specific.';
}
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.user.username.toLowerCase()}#${mem.user.discriminator}` === search;
}
function memberFilterInexact(search) {
return mem => mem.user.username.toLowerCase().includes(search) ||
(mem.nickname && mem.nickname.toLowerCase().includes(search)) ||
`${mem.user.username.toLowerCase()}#${mem.user.discriminator}`.includes(search);
}
module.exports = UserArgumentType;