Fix setting guild role positions (#751)

This commit is contained in:
Amish Shah
2016-10-26 14:19:36 +01:00
parent add52ce62d
commit 0c4a4023ce
6 changed files with 72 additions and 2 deletions

View File

@@ -23,6 +23,7 @@ class ActionsManager {
this.register('GuildEmojiCreate');
this.register('GuildEmojiDelete');
this.register('GuildEmojiUpdate');
this.register('GuildRolesPositionUpdate');
}
register(name) {

View File

@@ -0,0 +1,30 @@
const Action = require('./Action');
class GuildRolesPositionUpdate extends Action {
handle(data) {
const client = this.client;
const guild = client.guilds.get(data.guild_id);
if (guild) {
for (const partialRole of data.roles) {
const role = guild.roles.get(partialRole.id);
if (role) {
role.position = partialRole.position;
}
}
}
return {
guild,
};
}
}
/**
* Emitted whenever a guild role is created.
* @event Client#guildRoleCreate
* @param {Guild} guild The guild that the role was created in.
* @param {Role} role The role that was created.
*/
module.exports = GuildRolesPositionUpdate;

View File

@@ -677,6 +677,19 @@ class RESTMethods {
}).catch(reject);
});
}
setRolePositions(guildID, roles) {
return new Promise((resolve, reject) => {
this.rest.makeRequest('patch', Constants.Endpoints.guildRoles(guildID), true, roles)
.then(() => {
resolve(this.rest.client.actions.GuildRolesPositionUpdate.handle({
guild_id: guildID,
roles,
}).guild);
})
.catch(reject);
});
}
}
module.exports = RESTMethods;

View File

@@ -630,6 +630,32 @@ 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 (role instanceof Role) {
role = role.id;
} else if (typeof role !== 'string') {
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 updatedRoles = this.roles.array().map(r => ({
id: r.id,
position: r.id === role ? position : (r.position < position ? r.position : r.position + 1),
}));
return this.client.rest.methods.setRolePositions(this.id, updatedRoles);
}
/**
* 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

@@ -230,7 +230,7 @@ class Role {
* .catch(console.error);
*/
setPosition(position) {
return this.client.rest.methods.updateGuildRole(this, { position });
return this.guild.setRolePosition(this, position);
}
/**

View File

@@ -8,7 +8,7 @@ const client = new Discord.Client({ fetchAllMembers: false, apiRequestMethod: 's
const { email, password, token, usertoken, song } = require('./auth.json');
client.login(usertoken).then(atoken => console.log('logged in with token ' + atoken)).catch(console.error);
client.login(token).then(atoken => console.log('logged in with token ' + atoken)).catch(console.error);
client.ws.on('send', console.log);