Files
discord.js/src/client/ClientDataResolver.js
Schuyler Cebulskie 68acf37fd4 Add stricter/better ESLint config (#589)
* Add stricter/better ESLint config

* Remove more unnecessary @returns
2016-09-03 20:45:23 +01:00

215 lines
5.2 KiB
JavaScript

const path = require('path');
const fs = require('fs');
const request = require('superagent');
const getStructure = name => require(`../structures/${name}`);
const User = getStructure('User');
const Message = getStructure('Message');
const Guild = getStructure('Guild');
const Channel = getStructure('Channel');
const GuildMember = getStructure('GuildMember');
/**
* The DataResolver identifies different objects and tries to resolve a specific piece of information from them, e.g.
* extracting a User from a Message object.
* @private
*/
class ClientDataResolver {
constructor(client) {
this.client = client;
}
/**
* Data that resolves to give a User object. This can be:
* * A User object
* * A User ID
* * A Message (resolves to the message author)
* * A Guild (owner of the guild)
* * A Guild Member
* @typedef {User|string|Message|Guild|GuildMember} UserResolvable
*/
/**
* Resolves a UserResolvable to a User object
* @param {UserResolvable} user the UserResolvable to identify
* @returns {?User}
*/
resolveUser(user) {
if (user instanceof User) {
return user;
} else if (typeof user === 'string') {
return this.client.users.get(user);
} else if (user instanceof Message) {
return user.author;
} else if (user instanceof Guild) {
return user.owner;
} else if (user instanceof GuildMember) {
return user.user;
}
return null;
}
/**
* Data that resolves to give a Guild object. This can be:
* * A Guild object
* @typedef {Guild} GuildResolvable
*/
/**
* Resolves a GuildResolvable to a Guild object
* @param {GuildResolvable} guild the GuildResolvable to identify
* @returns {?Guild}
*/
resolveGuild(guild) {
if (guild instanceof Guild) {
return guild;
}
if (typeof guild === 'string') {
return this.client.guilds.get(guild);
}
return null;
}
/**
* Data that resolves to give a GuildMember object. This can be:
* * A GuildMember object
* * A User object
* @typedef {Guild} GuildMemberResolvable
*/
/**
* Resolves a GuildMemberResolvable to a GuildMember object
* @param {GuildResolvable} guild the guild that the member is part of
* @param {UserResolvable} user the user that is part of the guild
* @returns {?GuildMember}
*/
resolveGuildMember(guild, user) {
if (user instanceof GuildMember) {
return user;
}
guild = this.resolveGuild(guild);
user = this.resolveUser(user);
if (!guild || !user) {
return null;
}
return guild.members.get(user.id);
}
/**
* Data that resolves to give a Base64 string, typically for image uploading. This can be:
* * A Buffer
* * A Base64 string
* @typedef {Buffer|string} Base64Resolvable
*/
/**
* Resolves a Base64Resolvable to a Base 64 image
* @param {Base64Resolvable} data the base 64 resolvable you want to resolve
* @returns {?string}
*/
resolveBase64(data) {
if (data instanceof Buffer) {
return `data:image/jpg;base64,${data.toString('base64')}`;
}
return data;
}
/**
* Data that can be resolved to give a Channel. This can be:
* * An instance of a Channel
* * An ID of a Channel
* @typedef {Channel|string} ChannelResolvable
*/
/**
* Resolves a ChannelResolvable to a Channel object
* @param {ChannelResolvable} channel the channel resolvable to resolve
* @returns {?Channel}
*/
resolveChannel(channel) {
if (channel instanceof Channel) {
return channel;
}
if (typeof channel === 'string') {
return this.client.channels.get(channel.id);
}
return null;
}
/**
* Data that can be resolved to give a string. This can be:
* * A string
* * An Array (joined with a new line delimiter to give a string)
* * Any object
* @typedef {string|Array|Object} StringResolvable
*/
/**
* Resolves a StringResolvable to a string
* @param {StringResolvable} data the string resolvable to resolve
* @returns {string}
*/
resolveString(data) {
if (typeof data === 'string') {
return data;
}
if (data instanceof Array) {
return data.join('\n');
}
return String(data);
}
/**
* Data that can be resolved to give a Buffer. This can be:
* * A Buffer
* * The path to a local file
* * A URL
* @typedef {string|Buffer} FileResolvable
*/
/**
* Resolves a FileResolvable to a Buffer
* @param {FileResolvable} resource the file resolvable to resolve
* @returns {string|Buffer}
*/
resolveFile(resource) {
if (typeof resource === 'string') {
return new Promise((resolve, reject) => {
if (/^https?:\/\//.test(resource)) {
request.get(resource)
.set('Content-Type', 'blob')
.end((err, res) => err ? reject(err) : resolve(res.body));
} else {
const file = path.resolve(resource);
const stat = fs.statSync(file);
if (!stat.isFile()) {
reject(new Error(`The file could not be found: ${file}`));
return;
}
fs.readFile(file, (err, data) => {
if (err) reject(err); else resolve(data);
});
}
});
}
return Promise.resolve(resource);
}
}
module.exports = ClientDataResolver;