Skip to content

Commit d742c77

Browse files
committed
feat: add poll events
1 parent f13f111 commit d742c77

File tree

3 files changed

+111
-0
lines changed

3 files changed

+111
-0
lines changed

interactions/api/events/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
MessageCreate,
4242
MessageDelete,
4343
MessageDeleteBulk,
44+
MessagePollVoteAdd,
45+
MessagePollVoteRemove,
4446
MessageReactionAdd,
4547
MessageReactionRemove,
4648
MessageReactionRemoveAll,
@@ -159,6 +161,8 @@
159161
"MessageCreate",
160162
"MessageDelete",
161163
"MessageDeleteBulk",
164+
"MessagePollVoteAdd",
165+
"MessagePollVoteRemove",
162166
"MessageReactionAdd",
163167
"MessageReactionRemove",
164168
"MessageReactionRemoveAll",

interactions/api/events/discord.py

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ async def an_event_handler(event: ChannelCreate):
7272
"MessageCreate",
7373
"MessageDelete",
7474
"MessageDeleteBulk",
75+
"MessagePollVoteAdd",
76+
"MessagePollVoteRemove",
7577
"MessageReactionAdd",
7678
"MessageReactionRemove",
7779
"MessageReactionRemoveAll",
@@ -115,6 +117,7 @@ async def an_event_handler(event: ChannelCreate):
115117
from interactions.models.discord.entitlement import Entitlement
116118
from interactions.models.discord.guild import Guild, GuildIntegration
117119
from interactions.models.discord.message import Message
120+
from interactions.models.discord.poll import Poll
118121
from interactions.models.discord.reaction import Reaction
119122
from interactions.models.discord.role import Role
120123
from interactions.models.discord.scheduled_event import ScheduledEvent
@@ -588,6 +591,72 @@ class MessageReactionRemoveEmoji(MessageReactionRemoveAll):
588591
"""The emoji that was removed"""
589592

590593

594+
@attrs.define(eq=False, order=False, hash=False, kw_only=False)
595+
class BaseMessagePollEvent(BaseEvent):
596+
user_id: "Snowflake_Type" = attrs.field(repr=False)
597+
"""The ID of the user that voted"""
598+
channel_id: "Snowflake_Type" = attrs.field(repr=False)
599+
"""The ID of the channel the poll is in"""
600+
message_id: "Snowflake_Type" = attrs.field(repr=False)
601+
"""The ID of the message the poll is in"""
602+
answer_id: int = attrs.field(repr=False)
603+
"""The ID of the answer the user voted for"""
604+
guild_id: "Optional[Snowflake_Type]" = attrs.field(repr=False, default=None)
605+
"""The ID of the guild the poll is in"""
606+
607+
def get_message(self) -> "Optional[Message]":
608+
"""Get the message object if it is cached"""
609+
return self.client.cache.get_message(self.channel_id, self.message_id)
610+
611+
def get_user(self) -> "Optional[User]":
612+
"""Get the user object if it is cached"""
613+
return self.client.get_user(self.user_id)
614+
615+
def get_channel(self) -> "Optional[TYPE_ALL_CHANNEL]":
616+
"""Get the channel object if it is cached"""
617+
return self.client.get_channel(self.channel_id)
618+
619+
def get_guild(self) -> "Optional[Guild]":
620+
"""Get the guild object if it is cached"""
621+
return self.client.get_guild(self.guild_id) if self.guild_id is not None else None
622+
623+
def get_poll(self) -> "Optional[Poll]":
624+
"""Get the poll object if it is cached"""
625+
message = self.get_message()
626+
return message.poll if message is not None else None
627+
628+
async def fetch_message(self) -> "Message":
629+
"""Fetch the message the poll is in"""
630+
return await self.client.cache.fetch_message(self.channel_id, self.message_id)
631+
632+
async def fetch_user(self) -> "User":
633+
"""Fetch the user that voted"""
634+
return await self.client.fetch_user(self.user_id)
635+
636+
async def fetch_channel(self) -> "TYPE_ALL_CHANNEL":
637+
"""Fetch the channel the poll is in"""
638+
return await self.client.fetch_channel(self.channel_id)
639+
640+
async def fetch_guild(self) -> "Optional[Guild]":
641+
"""Fetch the guild the poll is in"""
642+
return await self.client.fetch_guild(self.guild_id) if self.guild_id is not None else None
643+
644+
async def fetch_poll(self) -> "Poll":
645+
"""Fetch the poll object"""
646+
message = await self.fetch_message()
647+
return message.poll
648+
649+
650+
@attrs.define(eq=False, order=False, hash=False, kw_only=False)
651+
class MessagePollVoteAdd(BaseMessagePollEvent):
652+
"""Dispatched when a user votes in a poll"""
653+
654+
655+
@attrs.define(eq=False, order=False, hash=False, kw_only=False)
656+
class MessagePollVoteRemove(BaseMessagePollEvent):
657+
"""Dispatched when a user remotes a votes in a poll"""
658+
659+
591660
@attrs.define(eq=False, order=False, hash=False, kw_only=False)
592661
class PresenceUpdate(BaseEvent):
593662
"""A user's presence has changed."""

interactions/api/events/processors/message_events.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,41 @@ async def _on_raw_message_delete_bulk(self, event: "RawGatewayEvent") -> None:
8383
event.data.get("ids"),
8484
)
8585
)
86+
87+
@Processor.define()
88+
async def _on_raw_message_poll_vote_add(self, event: "RawGatewayEvent") -> None:
89+
"""
90+
Process raw message poll vote add event and dispatch a processed poll vote add event.
91+
92+
Args:
93+
event: raw poll vote add event
94+
95+
"""
96+
self.dispatch(
97+
events.MessagePollVoteAdd(
98+
event.data.get("guild_id", None),
99+
event.data["channel_id"],
100+
event.data["message_id"],
101+
event.data["user_id"],
102+
event.data["option"],
103+
)
104+
)
105+
106+
@Processor.define()
107+
async def _on_raw_message_poll_vote_remove(self, event: "RawGatewayEvent") -> None:
108+
"""
109+
Process raw message poll vote remove event and dispatch a processed poll vote remove event.
110+
111+
Args:
112+
event: raw poll vote remove event
113+
114+
"""
115+
self.dispatch(
116+
events.MessagePollVoteRemove(
117+
event.data.get("guild_id", None),
118+
event.data["channel_id"],
119+
event.data["message_id"],
120+
event.data["user_id"],
121+
event.data["option"],
122+
)
123+
)

0 commit comments

Comments
 (0)