1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
'use strict';
const { userMention } = require('@discordjs/builders');
const { ChannelType } = require('discord-api-types/v10');
const { BaseChannel } = require('./BaseChannel');
const TextBasedChannel = require('./interfaces/TextBasedChannel');
const DMMessageManager = require('../managers/DMMessageManager');
const Partials = require('../util/Partials');
/**
* Represents a direct message channel between two users.
* @extends {BaseChannel}
* @implements {TextBasedChannel}
*/
class DMChannel extends BaseChannel {
constructor(client, data) {
super(client, data);
// Override the channel type so partials have a known type
this.type = ChannelType.DM;
/**
* A manager of the messages belonging to this channel
* @type {DMMessageManager}
*/
this.messages = new DMMessageManager(this);
}
_patch(data) {
super._patch(data);
if (data.recipients) {
const recipient = data.recipients[0];
/**
* The recipient's id
* @type {Snowflake}
*/
this.recipientId = recipient.id;
if ('username' in recipient || this.client.options.partials.includes(Partials.User)) {
this.client.users._add(recipient);
}
}
if ('last_message_id' in data) {
/**
* The channel's last message id, if one was sent
* @type {?Snowflake}
*/
this.lastMessageId = data.last_message_id;
}
if ('last_pin_timestamp' in data) {
/**
* The timestamp when the last pinned message was pinned, if there was one
* @type {?number}
*/
this.lastPinTimestamp = Date.parse(data.last_pin_timestamp);
} else {
this.lastPinTimestamp ??= null;
}
}
/**
* Whether this DMChannel is a partial
* @type {boolean}
* @readonly
*/
get partial() {
return this.lastMessageId === undefined;
}
/**
* The recipient on the other end of the DM
* @type {?User}
* @readonly
*/
get recipient() {
return this.client.users.resolve(this.recipientId);
}
/**
* Fetch this DMChannel.
* @param {boolean} [force=true] Whether to skip the cache check and request the API
* @returns {Promise<DMChannel>}
*/
fetch(force = true) {
return this.client.users.createDM(this.recipientId, { force });
}
/**
* When concatenated with a string, this automatically returns the recipient's mention instead of the
* DMChannel object.
* @returns {string}
* @example
* // Logs: Hello from <@123456789012345678>!
* console.log(`Hello from ${channel}!`);
*/
toString() {
return userMention(this.recipientId);
}
// These are here only for documentation purposes - they are implemented by TextBasedChannel
/* eslint-disable no-empty-function */
get lastMessage() {}
get lastPinAt() {}
send() {}
sendTyping() {}
createMessageCollector() {}
awaitMessages() {}
createMessageComponentCollector() {}
awaitMessageComponent() {}
// Doesn't work on DM channels; bulkDelete() {}
// Doesn't work on DM channels; fetchWebhooks() {}
// Doesn't work on DM channels; createWebhook() {}
// Doesn't work on DM channels; setRateLimitPerUser() {}
// Doesn't work on DM channels; setNSFW() {}
}
TextBasedChannel.applyToClass(DMChannel, true, [
'bulkDelete',
'fetchWebhooks',
'createWebhook',
'setRateLimitPerUser',
'setNSFW',
]);
module.exports = DMChannel;
|