/
Interaction.js
155 lines (134 loc) · 3.48 KB
/
Interaction.js
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
'use strict';
const Base = require('./Base');
const { InteractionTypes, MessageComponentTypes } = require('../util/Constants');
const SnowflakeUtil = require('../util/SnowflakeUtil');
/**
* Represents an interaction.
* @extends {Base}
*/
class Interaction extends Base {
constructor(client, data) {
super(client);
/**
* The type of this interaction
* @type {InteractionType}
*/
this.type = InteractionTypes[data.type];
/**
* The ID of this interaction
* @type {Snowflake}
*/
this.id = data.id;
/**
* The token of this interaction
* @type {string}
* @name Interaction#token
* @readonly
*/
Object.defineProperty(this, 'token', { value: data.token });
/**
* The ID of the application
* @type {Snowflake}
*/
this.applicationID = data.application_id;
/**
* The ID of the channel this interaction was sent in
* @type {?Snowflake}
*/
this.channelID = data.channel_id ?? null;
/**
* The ID of the guild this interaction was sent in
* @type {?Snowflake}
*/
this.guildID = data.guild_id ?? null;
/**
* The user which sent this interaction
* @type {User}
*/
this.user = this.client.users.add(data.user ?? data.member.user);
/**
* If this interaction was sent in a guild, the member which sent it
* @type {?GuildMember|APIGuildMember}
*/
this.member = data.member ? this.guild?.members.add(data.member) ?? data.member : null;
/**
* The version
* @type {number}
*/
this.version = data.version;
}
/**
* The timestamp the interaction was created at
* @type {number}
* @readonly
*/
get createdTimestamp() {
return SnowflakeUtil.deconstruct(this.id).timestamp;
}
/**
* The time the interaction was created at
* @type {Date}
* @readonly
*/
get createdAt() {
return new Date(this.createdTimestamp);
}
/**
* The channel this interaction was sent in
* @type {?Channel}
* @readonly
*/
get channel() {
return this.client.channels.cache.get(this.channelID) ?? null;
}
/**
* The guild this interaction was sent in
* @type {?Guild}
* @readonly
*/
get guild() {
return this.client.guilds.cache.get(this.guildID) ?? null;
}
/**
* Indicates whether this interaction is received from a guild.
* @returns {boolean}
*/
inGuild() {
return Boolean(this.guildID && this.member);
}
/**
* Indicates whether this interaction is a command interaction.
* @returns {boolean}
*/
isCommand() {
return InteractionTypes[this.type] === InteractionTypes.APPLICATION_COMMAND;
}
/**
* Indicates whether this interaction is a message component interaction.
* @returns {boolean}
*/
isMessageComponent() {
return InteractionTypes[this.type] === InteractionTypes.MESSAGE_COMPONENT;
}
/**
* Indicates whether this interaction is a button interaction.
* @returns {boolean}
*/
isButton() {
return (
InteractionTypes[this.type] === InteractionTypes.MESSAGE_COMPONENT &&
MessageComponentTypes[this.componentType] === MessageComponentTypes.BUTTON
);
}
/**
* Indicates whether this interaction is a select menu interaction.
* @returns {boolean}
*/
isSelectMenu() {
return (
InteractionTypes[this.type] === InteractionTypes.MESSAGE_COMPONENT &&
MessageComponentTypes[this.componentType] === MessageComponentTypes.SELECT_MENU
);
}
}
module.exports = Interaction;