Skip to content

Commit 31465b2

Browse files
committed
feat: polls
1 parent 6cc5fa2 commit 31465b2

File tree

15 files changed

+406
-0
lines changed

15 files changed

+406
-0
lines changed

packages/discord.js/src/client/actions/ActionsManager.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ class ActionsManager {
5454
this.register(require('./MessageCreate'));
5555
this.register(require('./MessageDelete'));
5656
this.register(require('./MessageDeleteBulk'));
57+
this.register(require('./MessagePollVoteAdd'));
58+
this.register(require('./MessagePollVoteRemove'));
5759
this.register(require('./MessageReactionAdd'));
5860
this.register(require('./MessageReactionRemove'));
5961
this.register(require('./MessageReactionRemoveAll'));
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
'use strict';
2+
3+
const Action = require('./Action');
4+
5+
class MessagePollVoteAddAction extends Action {
6+
handle(data) {
7+
const channel = this.getChannel(data);
8+
if (!channel?.isTextBased()) return false;
9+
10+
const message = this.getMessage(data, channel);
11+
if (!message) return false;
12+
13+
const { poll } = message;
14+
15+
const answer = poll.answers.get(data.answer_id);
16+
if (!answer) {
17+
console.log('???');
18+
return false;
19+
}
20+
21+
/**
22+
* Emitted whenever a user votes in a poll.
23+
* @event Client#messagePollVoteAdd
24+
* @param {PollAnswer} answer The answer that was voted on
25+
* @param {Snowflake} userId The id of the user that voted
26+
*/
27+
this.client.emit('messagePollVoteAdd', answer, data.user_id);
28+
29+
return { poll };
30+
}
31+
}
32+
33+
module.exports = MessagePollVoteAddAction;
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
'use strict';
2+
3+
const Action = require('./Action');
4+
5+
class MessagePollVoteRemoveAction extends Action {
6+
handle(data) {
7+
const channel = this.getChannel(data);
8+
if (!channel?.isTextBased()) return false;
9+
10+
const message = this.getMessage(data, channel);
11+
if (!message) return false;
12+
13+
const { poll } = message;
14+
15+
const answer = poll.answers.get(data.answer_id);
16+
if (!answer) {
17+
console.log('???');
18+
return false;
19+
}
20+
21+
/**
22+
* Emitted whenever a user removes their vote in a poll.
23+
* @event Client#messagePollVoteRemove
24+
* @param {PollAnswer} answer The answer where the vote was removed
25+
* @param {Snowflake} userId The id of the user that removed their vote
26+
*/
27+
this.client.emit('messagePollVoteRemove', answer, data.user_id);
28+
29+
return { poll };
30+
}
31+
}
32+
33+
module.exports = MessagePollVoteRemoveAction;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
'use strict';
2+
3+
module.exports = (client, packet) => {
4+
client.actions.MessagePollVoteAdd.handle(packet.d);
5+
};
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
'use strict';
2+
3+
module.exports = (client, packet) => {
4+
client.actions.MessagePollVoteRemove.handle(packet.d);
5+
};

packages/discord.js/src/client/websocket/handlers/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ const handlers = Object.fromEntries([
4040
['MESSAGE_CREATE', require('./MESSAGE_CREATE')],
4141
['MESSAGE_DELETE', require('./MESSAGE_DELETE')],
4242
['MESSAGE_DELETE_BULK', require('./MESSAGE_DELETE_BULK')],
43+
['MESSAGE_POLL_VOTE_ADD', require('./MESSAGE_POLL_VOTE_ADD')],
44+
['MESSAGE_POLL_VOTE_REMOVE', require('./MESSAGE_POLL_VOTE_REMOVE')],
4345
['MESSAGE_REACTION_ADD', require('./MESSAGE_REACTION_ADD')],
4446
['MESSAGE_REACTION_REMOVE', require('./MESSAGE_REACTION_REMOVE')],
4547
['MESSAGE_REACTION_REMOVE_ALL', require('./MESSAGE_REACTION_REMOVE_ALL')],

packages/discord.js/src/errors/ErrorCodes.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,8 @@
176176
* @property {'SweepFilterReturn'} SweepFilterReturn
177177
178178
* @property {'EntitlementCreateInvalidOwner'} EntitlementCreateInvalidOwner
179+
180+
* @property {'PollAlreadyExpired'} PollAlreadyExpired
179181
*/
180182

181183
const keys = [
@@ -329,6 +331,8 @@ const keys = [
329331
'GuildForumMessageRequired',
330332

331333
'EntitlementCreateInvalidOwner',
334+
335+
'PollAlreadyExpired',
332336
];
333337

334338
// JSDoc for IntelliSense purposes

packages/discord.js/src/errors/Messages.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,8 @@ const Messages = {
169169

170170
[DjsErrorCodes.EntitlementCreateInvalidOwner]:
171171
'You must provide either a guild or a user to create an entitlement, but not both',
172+
173+
[DjsErrorCodes.PollAlreadyExpired]: 'This poll has already expired.',
172174
};
173175

174176
module.exports = Messages;

packages/discord.js/src/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,9 @@ exports.NewsChannel = require('./structures/NewsChannel');
168168
exports.OAuth2Guild = require('./structures/OAuth2Guild');
169169
exports.PartialGroupDMChannel = require('./structures/PartialGroupDMChannel');
170170
exports.PermissionOverwrites = require('./structures/PermissionOverwrites');
171+
exports.Poll = require('./structures/Poll');
172+
exports.PollAnswer = require('./structures/PollAnswer');
173+
exports.PollAnswerResult = require('./structures/PollAnswerResult');
171174
exports.Presence = require('./structures/Presence').Presence;
172175
exports.ReactionCollector = require('./structures/ReactionCollector');
173176
exports.ReactionEmoji = require('./structures/ReactionEmoji');

packages/discord.js/src/structures/Message.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const Embed = require('./Embed');
1717
const InteractionCollector = require('./InteractionCollector');
1818
const Mentions = require('./MessageMentions');
1919
const MessagePayload = require('./MessagePayload');
20+
const { Poll } = require('./Poll.js');
2021
const ReactionCollector = require('./ReactionCollector');
2122
const { Sticker } = require('./Sticker');
2223
const { DiscordjsError, ErrorCodes } = require('../errors');
@@ -406,6 +407,16 @@ class Message extends Base {
406407
} else {
407408
this.interaction ??= null;
408409
}
410+
411+
if (data.poll) {
412+
/**
413+
* The poll that was sent with the message
414+
* @type {?Poll}
415+
*/
416+
this.poll = new Poll(this.client, data.poll, this);
417+
} else {
418+
this.poll ??= null;
419+
}
409420
}
410421

411422
/**

0 commit comments

Comments
 (0)