From bc443df11dde22f20c0628d7409279e0cc4bc027 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Tue, 3 May 2016 17:50:33 +0100 Subject: [PATCH] Added DM support, DM Creation and DM Deletion --- src/client/rest/RESTMethods.js | 57 +++++++++++++++++--- src/structures/GuildMember.js | 8 +++ src/structures/User.js | 8 +++ src/structures/interface/TextBasedChannel.js | 5 -- test/random.js | 11 +++- 5 files changed, 75 insertions(+), 14 deletions(-) diff --git a/src/client/rest/RESTMethods.js b/src/client/rest/RESTMethods.js index 810b3df58..70a4da882 100644 --- a/src/client/rest/RESTMethods.js +++ b/src/client/rest/RESTMethods.js @@ -2,7 +2,8 @@ const Constants = require('../../util/Constants'); const Structure = name => require('../../structures/' + name); - +const User = Structure('User'); +const GuildMember = Structure('GuildMember'); const Message = Structure('Message'); class RESTMethods{ @@ -39,13 +40,24 @@ class RESTMethods{ SendMessage(channel, content, tts, nonce) { return new Promise((resolve, reject) => { - this.rest.makeRequest('post', Constants.Endpoints.CHANNEL_MESSAGES(channel.id), true, { - content, tts, nonce, - }) - .then(data => { - resolve(this.rest.client.actions.MessageCreate.handle(data).m); - }) - .catch(reject); + + if (channel instanceof User || channel instanceof GuildMember) { + this.CreateDM(channel).then(chan => { + channel = chan; + req(); + }) + .catch(reject); + } + + var _this = this; + + function req() { + _this.rest.makeRequest('post', Constants.Endpoints.CHANNEL_MESSAGES(channel.id), true, { + content, tts, nonce, + }) + .then(data => resolve(_this.rest.client.actions.MessageCreate.handle(data).m)) + .catch(reject); + } }); } @@ -87,8 +99,37 @@ class RESTMethods{ }); } + GetExistingDM(recipient) { + let dmChannel = this.rest.client.store.getAsArray('channels') + .filter(channel => channel.recipient) + .filter(channel => channel.recipient.id === recipient.id); + + return dmChannel[0]; + } + + CreateDM(recipient) { + return new Promise((resolve, reject) => { + + let dmChannel = this.GetExistingDM(recipient); + + if (dmChannel) { + return resolve(dmChannel); + } + + this.rest.makeRequest('post', Constants.Endpoints.USER_CHANNELS(this.rest.client.store.user.id), true, { + recipient_id: recipient.id, + }) + .then(data => resolve(this.rest.client.actions.ChannelCreate.handle(data).channel)) + .catch(reject); + }); + } + DeleteChannel(channel) { return new Promise((resolve, reject) => { + if (channel instanceof User || channel instanceof GuildMember) { + channel = this.GetExistingDM(channel); + } + this.rest.makeRequest('del', Constants.Endpoints.CHANNEL(channel.id), true) .then(data => { data.id = channel.id; diff --git a/src/structures/GuildMember.js b/src/structures/GuildMember.js index 265f0afe6..bacc3a314 100644 --- a/src/structures/GuildMember.js +++ b/src/structures/GuildMember.js @@ -1,5 +1,7 @@ 'use strict'; +const TextBasedChannel = require('./interface/TextBasedChannel'); + class GuildMember { constructor(guild, data) { this.client = guild.client; @@ -56,6 +58,12 @@ class GuildMember { get id() { return this.user.id; } + + deleteDM() { + return this.client.rest.methods.DeleteChannel(this); + } } +TextBasedChannel.applyToClass(GuildMember); + module.exports = GuildMember; diff --git a/src/structures/User.js b/src/structures/User.js index 4d48aed5a..e635f4937 100644 --- a/src/structures/User.js +++ b/src/structures/User.js @@ -1,5 +1,7 @@ 'use strict'; +const TextBasedChannel = require('./interface/TextBasedChannel'); + class User { constructor(client, data) { this.client = client; @@ -22,6 +24,10 @@ class User { return `<@${this.id}>`; } + deleteDM() { + return this.client.rest.methods.DeleteChannel(this); + } + equals(user) { let base = ( this.username === user.username && @@ -45,4 +51,6 @@ class User { } } +TextBasedChannel.applyToClass(User); + module.exports = User; diff --git a/src/structures/interface/TextBasedChannel.js b/src/structures/interface/TextBasedChannel.js index 0656d03f7..a76a855a5 100644 --- a/src/structures/interface/TextBasedChannel.js +++ b/src/structures/interface/TextBasedChannel.js @@ -11,10 +11,5 @@ function sendTTSMessage(content, options) { } exports.applyToClass = structure => { - if (structure.name !== 'TextChannel' && structure.name !== 'DMChannel') { - throw new Error(structure + ' cannot implement TextBasedChannel'); - } - structure.prototype.sendMessage = sendMessage; - }; diff --git a/test/random.js b/test/random.js index 656986c42..6041df9ae 100644 --- a/test/random.js +++ b/test/random.js @@ -70,7 +70,7 @@ client.on('typingStop.', (channel, user, data) => { }); client.on('message', message => { - if (message.author.username === 'hydrabolt') { + if (true) { if (message.content === 'makechann') { if (message.channel.guild) { message.channel.guild.createChannel('hi', 'text').then(console.log); @@ -114,6 +114,15 @@ client.on('message', message => { m += `I am aware of ${message.guild.members.length} members`; message.channel.sendMessage(m); } + + if (message.content === 'messageme!') { + message.author.sendMessage('oh, hi there!').catch(e => console.log(e.stack)); + } + + if (message.content === 'don\'t dm me') { + message.author.deleteDM(); + } + } });