Add full guild emoji functionality (#749)

* all the emoji stuff

* fix things for hydra 😘

* feck i need to stop committing on github

* update docs again

* Butts
This commit is contained in:
Gus Caplan
2016-09-27 19:44:09 -05:00
committed by Schuyler Cebulskie
parent 682e33cad9
commit aed75e1f9a
10 changed files with 112 additions and 8 deletions

File diff suppressed because one or more lines are too long

View File

@@ -3,6 +3,7 @@ const cloneObject = require('../util/CloneObject');
const Guild = require('../structures/Guild');
const User = require('../structures/User');
const DMChannel = require('../structures/DMChannel');
const Emoji = require('../structures/Emoji');
const TextChannel = require('../structures/TextChannel');
const VoiceChannel = require('../structures/VoiceChannel');
const GuildChannel = require('../structures/GuildChannel');
@@ -73,6 +74,26 @@ class ClientDataManager {
return null;
}
newEmoji(data, guild) {
const already = guild.emojis.has(data.id);
if (data && !already) {
let emoji = new Emoji(guild, data);
this.client.emit(Constants.Events.EMOJI_CREATE, emoji);
guild.emojis.set(emoji.id, emoji);
return emoji;
} else if (already) {
return guild.emojis.get(data.id);
}
return null;
}
killEmoji(emoji) {
if (!(emoji instanceof Emoji && emoji.guild)) return;
this.client.emit(Constants.Events.EMOJI_DELETE, emoji);
emoji.guild.emojis.delete(emoji.id);
}
killGuild(guild) {
const already = this.client.guilds.has(guild.id);
this.client.guilds.delete(guild.id);

View File

@@ -20,6 +20,9 @@ class ActionsManager {
this.register('UserGet');
this.register('UserUpdate');
this.register('GuildSync');
this.register('GuildEmojiCreate');
this.register('GuildEmojiDelete');
this.register('GuildEmojiUpdate');
}
register(name) {

View File

@@ -0,0 +1,18 @@
const Action = require('./Action');
class EmojiCreateAction extends Action {
handle(data, guild) {
const client = this.client;
const emoji = client.dataManager.newEmoji(data, guild);
return {
emoji,
};
}
}
/**
* Emitted whenever an emoji is created
* @event Client#guildEmojiCreate
* @param {Emoji} emoji The emoji that was created.
*/
module.exports = EmojiCreateAction;

View File

@@ -0,0 +1,18 @@
const Action = require('./Action');
class EmojiDeleteAction extends Action {
handle(data) {
const client = this.client;
client.dataManager.killEmoji(data);
return {
data,
};
}
}
/**
* Emitted whenever an emoji is deleted
* @event Client#guildEmojiDelete
* @param {Emoji} emoji The emoji that was deleted.
*/
module.exports = EmojiDeleteAction;

View File

@@ -0,0 +1,27 @@
const Action = require('./Action');
const Constants = require('../../util/Constants');
class GuildEmojiUpdateAction extends Action {
handle(data, guild) {
const client = this.client;
for (let emoji of data.emojis) {
const already = guild.emojis.has(emoji.id);
emoji = client.dataManager.newEmoji(emoji, guild);
if (already) client.emit(Constants.Events.GUILD_EMOJI_UPDATE, guild, emoji);
}
for (let emoji of guild.emojis) {
if (!data.emoijs.has(emoji.id)) client.dataManager.killEmoji(emoji);
}
return {
emojis: data.emojis,
};
}
}
/**
* Emitted whenever an emoji is updated
* @event Client#guildEmojiUpdate
* @param {Guild} guild The guild that the emoji was updated in.
* @param {Emoji} emoji The emoji that was updated.
*/
module.exports = GuildEmojiUpdateAction;

View File

@@ -7,7 +7,6 @@ const User = requireStructure('User');
const GuildMember = requireStructure('GuildMember');
const Role = requireStructure('Role');
const Invite = requireStructure('Invite');
const Emoji = requireStructure('Emoji');
class RESTMethods {
constructor(restManager) {
@@ -522,15 +521,17 @@ class RESTMethods {
return new Promise((resolve, reject) => {
this.rest.makeRequest('post', `${Constants.Endpoints.guildEmojis(guild.id)}`, true, { name: name, image: image })
.then(data => {
resolve(new Emoji(guild, data));
resolve(this.rest.client.actions.EmojiCreate.handle(data, guild).emoji);
}).catch(reject);
});
}
deleteEmoji(guild, id) {
deleteEmoji(emoji) {
return new Promise((resolve, reject) => {
this.rest.makeRequest('delete', `${Constants.Endpoints.guildEmojis(guild.id)}/${id}`, true)
.then(resolve).catch(reject);
this.rest.makeRequest('delete', `${Constants.Endpoints.guildEmojis(emoji.guild.id)}/${emoji.id}`, true)
.then(() => {
resolve(this.rest.client.actions.EmojiDelete.handle(emoji).data);
}).catch(reject);
});
}
}

View File

@@ -0,0 +1,13 @@
const AbstractHandler = require('./AbstractHandler');
class GuildEmojiUpdate extends AbstractHandler {
handle(packet) {
const client = this.packetManager.client;
const data = packet.d;
const guild = client.guilds.get(data.guild_id);
if (!guild) return;
client.actions.EmojiUpdate.handle(data, guild);
}
}
module.exports = GuildEmojiUpdate;

View File

@@ -592,8 +592,8 @@ class Guild {
* @returns {Promise}
*/
deleteEmoji(emoji) {
if (emoji instanceof Emoji) emoji = emoji.id;
return this.client.rest.methods.deleteEmoji(this, emoji);
if (!(emoji instanceof Emoji)) emoji = this.emojis.get(emoji);
return this.client.rest.methods.deleteEmoji(emoji);
}
/**

View File

@@ -158,6 +158,9 @@ exports.Events = {
GUILD_ROLE_DELETE: 'guildRoleDelete',
GUILD_ROLE_UPDATE: 'guildRoleUpdate',
GUILD_MEMBER_AVAILABLE: 'guildMemberAvailable',
GUILD_EMOJI_CREATE: 'guildEmojiCreate',
GUILD_EMOJI_DELETE: 'guildEmojiDelete',
GUILD_EMOJI_UPDATE: 'guildEmojiUpdate',
CHANNEL_CREATE: 'channelCreate',
CHANNEL_DELETE: 'channelDelete',
CHANNEL_UPDATE: 'channelUpdate',