Merge branch 'master' into indev-prism

This commit is contained in:
Schuyler Cebulskie
2016-12-30 16:49:35 -05:00
7 changed files with 91 additions and 82 deletions

View File

@@ -268,7 +268,7 @@ class ClientUser extends User {
*/
createGuild(name, region, icon = null) {
if (!icon) return this.client.rest.methods.createGuild({ name, icon, region });
if (icon.startsWith('data:')) {
if (typeof icon === 'string' && icon.startsWith('data:')) {
return this.client.rest.methods.createGuild({ name, icon, region });
} else {
return this.client.resolver.resolveBuffer(icon).then(data =>

View File

@@ -45,6 +45,7 @@ class DMChannel extends Channel {
fetchMessage() { return; }
fetchMessages() { return; }
fetchPinnedMessages() { return; }
search() { return; }
startTyping() { return; }
stopTyping() { return; }
get typing() { return; }
@@ -53,7 +54,6 @@ class DMChannel extends Channel {
awaitMessages() { return; }
bulkDelete() { return; }
_cacheMessage() { return; }
search() { return; }
}
TextBasedChannel.applyToClass(DMChannel, true);

View File

@@ -129,6 +129,7 @@ class GroupDMChannel extends Channel {
fetchMessage() { return; }
fetchMessages() { return; }
fetchPinnedMessages() { return; }
search() { return; }
startTyping() { return; }
stopTyping() { return; }
get typing() { return; }
@@ -137,7 +138,6 @@ class GroupDMChannel extends Channel {
awaitMessages() { return; }
bulkDelete() { return; }
_cacheMessage() { return; }
search() { return; }
}
TextBasedChannel.applyToClass(GroupDMChannel, true);

View File

@@ -362,6 +362,25 @@ class Guild {
});
}
/**
* Performs a search within the entire guild.
* @param {MessageSearchOptions} [options={}] Options to pass to the search
* @returns {Promise<Array<Message[]>>}
* An array containing arrays of messages. Each inner array is a search context cluster.
* The message which has triggered the result will have the `hit` property set to `true`.
* @example
* guild.search({
* content: 'discord.js',
* before: '2016-11-17'
* }).then(res => {
* const hit = res[0].find(m => m.hit).content;
* console.log(`I found: **${hit}**`);
* }).catch(console.error);
*/
search(options) {
return this.client.rest.methods.search(this, options);
}
/**
* The data for editing a guild
* @typedef {Object} GuildEditData
@@ -600,9 +619,48 @@ class Guild {
return create.then(role => role.edit(data));
}
/**
* Set the position of a role in this guild
* @param {string|Role} role the role to edit, can be a role object or a role ID.
* @param {number} position the new position of the role
* @returns {Promise<Guild>}
*/
setRolePosition(role, position) {
if (typeof role === 'string') {
role = this.roles.get(role);
if (!role) return Promise.reject(new Error('Supplied role is not a role or string.'));
}
position = Number(position);
if (isNaN(position)) return Promise.reject(new Error('Supplied position is not a number.'));
const lowestAffected = Math.min(role.position, position);
const highestAffected = Math.max(role.position, position);
const rolesToUpdate = this.roles.filter(r => r.position >= lowestAffected && r.position <= highestAffected);
// stop role positions getting stupidly inflated
if (position > role.position) {
position = rolesToUpdate.first().position;
} else {
position = rolesToUpdate.last().position;
}
const updatedRoles = [];
for (const uRole of rolesToUpdate.values()) {
updatedRoles.push({
id: uRole.id,
position: uRole.id === role.id ? position : uRole.position + (position < role.position ? 1 : -1),
});
}
return this.client.rest.methods.setRolePositions(this.id, updatedRoles);
}
/**
* Creates a new custom emoji in the guild.
* @param {BufferResolvable} attachment The image for the emoji.
* @param {BufferResolvable|Base64Resolvable} attachment The image for the emoji.
* @param {string} name The name for the emoji.
* @returns {Promise<Emoji>} The created emoji.
* @example
@@ -618,7 +676,7 @@ class Guild {
*/
createEmoji(attachment, name) {
return new Promise(resolve => {
if (attachment.startsWith('data:')) {
if (typeof attachment === 'string' && attachment.startsWith('data:')) {
resolve(this.client.rest.methods.createEmoji(this, attachment, name));
} else {
this.client.resolver.resolveBuffer(attachment).then(data =>
@@ -664,66 +722,6 @@ class Guild {
return this.client.rest.methods.deleteGuild(this);
}
/**
* Set the position of a role in this guild
* @param {string|Role} role the role to edit, can be a role object or a role ID.
* @param {number} position the new position of the role
* @returns {Promise<Guild>}
*/
setRolePosition(role, position) {
if (typeof role === 'string') {
role = this.roles.get(role);
if (!role) return Promise.reject(new Error('Supplied role is not a role or string.'));
}
position = Number(position);
if (isNaN(position)) return Promise.reject(new Error('Supplied position is not a number.'));
const lowestAffected = Math.min(role.position, position);
const highestAffected = Math.max(role.position, position);
const rolesToUpdate = this.roles.filter(r => r.position >= lowestAffected && r.position <= highestAffected);
// stop role positions getting stupidly inflated
if (position > role.position) {
position = rolesToUpdate.first().position;
} else {
position = rolesToUpdate.last().position;
}
const updatedRoles = [];
for (const uRole of rolesToUpdate.values()) {
updatedRoles.push({
id: uRole.id,
position: uRole.id === role.id ? position : uRole.position + (position < role.position ? 1 : -1),
});
}
return this.client.rest.methods.setRolePositions(this.id, updatedRoles);
}
/**
* Performs a search
* @param {MessageSearchOptions} [options={}] Options to pass to the search
* @returns {Promise<Array<Message[]>>}
* An array containing arrays of messages. Each inner array is a search context cluster.
* The message which has triggered the result will have the `hit` property set to `true`.
* @example
* guild.search({
* content: 'discord.js',
* before: '2016-11-17'
* })
* .then(res => {
* const hit = res[0].find(m => m.hit).content;
* console.log(`I found: **${hit}**`);
* })
* .catch(console.error);
*/
search(options) {
return this.client.rest.methods.search(this, options);
}
/**
* Whether this Guild equals another Guild. It compares all properties, so for most operations
* it is advisable to just compare `guild.id === guild2.id` as it is much faster and is often

View File

@@ -53,7 +53,7 @@ class TextChannel extends GuildChannel {
/**
* Create a webhook for the channel.
* @param {string} name The name of the webhook.
* @param {BufferResolvable} avatar The avatar for the webhook.
* @param {BufferResolvable|Base64Resolvable} avatar The avatar for the webhook.
* @returns {Promise<Webhook>} webhook The created webhook.
* @example
* channel.createWebhook('Snek', 'http://snek.s3.amazonaws.com/topSnek.png')
@@ -62,7 +62,7 @@ class TextChannel extends GuildChannel {
*/
createWebhook(name, avatar) {
return new Promise(resolve => {
if (avatar.startsWith('data:')) {
if (typeof avatar === 'string' && avatar.startsWith('data:')) {
resolve(this.client.rest.methods.createWebhook(this, name, avatar));
} else {
this.client.resolver.resolveBuffer(avatar).then(data =>
@@ -81,6 +81,7 @@ class TextChannel extends GuildChannel {
fetchMessage() { return; }
fetchMessages() { return; }
fetchPinnedMessages() { return; }
search() { return; }
startTyping() { return; }
stopTyping() { return; }
get typing() { return; }
@@ -89,7 +90,6 @@ class TextChannel extends GuildChannel {
awaitMessages() { return; }
bulkDelete() { return; }
_cacheMessage() { return; }
search() { return; }
}
TextBasedChannel.applyToClass(TextChannel, true);

View File

@@ -214,7 +214,7 @@ class TextBasedChannel {
}
/**
* Performs a search
* Performs a search within the channel.
* @param {MessageSearchOptions} [options={}] Options to pass to the search
* @returns {Promise<Array<Message[]>>}
* An array containing arrays of messages. Each inner array is a search context cluster.
@@ -223,12 +223,10 @@ class TextBasedChannel {
* channel.search({
* content: 'discord.js',
* before: '2016-11-17'
* })
* .then(res => {
* }).then(res => {
* const hit = res[0].find(m => m.hit).content;
* console.log(`I found: **${hit}**`);
* })
* .catch(console.error);
* }).catch(console.error);
*/
search(options) {
return this.client.rest.methods.search(this, options);