Skip to content

Commit af97fea

Browse files
davidhozicpre-commit-ci[bot]Lulalabyplun1331
authored
feat: ForumChannel default_reaction_emoji attribute (Pycord-Development#2178)
* ForumChannel default_reaction_emoji * style(pre-commit): auto fixes from pre-commit.com hooks * CHANGELOG.md * Changelog * style(pre-commit): auto fixes from pre-commit.com hooks * style(pre-commit): auto fixes from pre-commit.com hooks * .edit support * remove secret file * add missing type * style(pre-commit): auto fixes from pre-commit.com hooks * Fix formatting * Formatting * changelog.md * changelog formatting * changelog * style(pre-commit): auto fixes from pre-commit.com hooks * Update CHANGELOG.md Signed-off-by: Lala Sabathil <[email protected]> --------- Signed-off-by: Lala Sabathil <[email protected]> Signed-off-by: David Hozic <[email protected]> Signed-off-by: plun1331 <[email protected]> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Lala Sabathil <[email protected]> Co-authored-by: plun1331 <[email protected]>
1 parent c1a57fa commit af97fea

File tree

6 files changed

+83
-8
lines changed

6 files changed

+83
-8
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,11 @@ These changes are available on the `master` branch, but have not yet been releas
7777
([#2153](https://github.com/Pycord-Development/pycord/pull/2153))
7878
- Added `VoiceChannel.slowmode_delay`.
7979
([#2112](https://github.com/Pycord-Development/pycord/pull/2112))
80+
- Added `ForumChannel.default_reaction_emoji` attribute.
81+
([#2178](https://github.com/Pycord-Development/pycord/pull/2178))
82+
- Added `default_reaction_emoji` parameter to `Guild.create_forum_channel()` and
83+
`ForumChannel.edit()` methods.
84+
([#2178](https://github.com/Pycord-Development/pycord/pull/2178))
8085

8186
### Changed
8287

discord/abc.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
from .invite import Invite
5151
from .iterators import HistoryIterator
5252
from .mentions import AllowedMentions
53+
from .partial_emoji import PartialEmoji, _EmojiTag
5354
from .permissions import PermissionOverwrite, Permissions
5455
from .role import Role
5556
from .scheduled_events import ScheduledEvent
@@ -507,6 +508,28 @@ async def _edit(
507508
raise InvalidArgument("type field must be of type ChannelType")
508509
options["type"] = ch_type.value
509510

511+
try:
512+
default_reaction_emoji = options["default_reaction_emoji"]
513+
except KeyError:
514+
pass
515+
else:
516+
if isinstance(default_reaction_emoji, _EmojiTag): # Emoji, PartialEmoji
517+
default_reaction_emoji = default_reaction_emoji._to_partial()
518+
elif isinstance(default_reaction_emoji, int):
519+
default_reaction_emoji = PartialEmoji(
520+
name=None, id=default_reaction_emoji
521+
)
522+
elif isinstance(default_reaction_emoji, str):
523+
default_reaction_emoji = PartialEmoji.from_str(default_reaction_emoji)
524+
else:
525+
raise InvalidArgument(
526+
"default_reaction_emoji must be of type: Emoji | int | str"
527+
)
528+
529+
options[
530+
"default_reaction_emoji"
531+
] = default_reaction_emoji._to_forum_reaction_payload()
532+
510533
if options:
511534
return await self._state.http.edit_channel(
512535
self.id, reason=reason, **options

discord/channel.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
from . import utils
3434
from .asset import Asset
35+
from .emoji import Emoji
3536
from .enums import (
3637
ChannelType,
3738
EmbeddedActivity,
@@ -171,7 +172,7 @@ def to_dict(self) -> dict[str, Any]:
171172
payload: dict[str, Any] = {
172173
"name": self.name,
173174
"moderated": self.moderated,
174-
} | self.emoji._to_forum_tag_payload()
175+
} | self.emoji._to_forum_reaction_payload()
175176

176177
if self.id:
177178
payload["id"] = self.id
@@ -195,6 +196,7 @@ class _TextChannel(discord.abc.GuildChannel, Hashable):
195196
"last_message_id",
196197
"default_auto_archive_duration",
197198
"default_thread_slowmode_delay",
199+
"default_reaction_emoji",
198200
"default_sort_order",
199201
"available_tags",
200202
"flags",
@@ -228,7 +230,6 @@ def _update(
228230
self.name: str = data["name"]
229231
self.category_id: int | None = utils._get_as_snowflake(data, "parent_id")
230232
self._type: int = data["type"]
231-
232233
# This data may be missing depending on how this object is being created/updated
233234
if not data.pop("_invoke_flag", False):
234235
self.topic: str | None = data.get("topic")
@@ -1008,6 +1009,10 @@ class ForumChannel(_TextChannel):
10081009
The initial slowmode delay to set on newly created threads in this channel.
10091010
10101011
.. versionadded:: 2.3
1012+
default_reaction_emoji: Optional[:class:`str` | :class:`discord.Emoji`]
1013+
The default forum reaction emoji.
1014+
1015+
.. versionadded:: 2.5
10111016
"""
10121017

10131018
def __init__(
@@ -1022,6 +1027,15 @@ def _update(self, guild: Guild, data: ForumChannelPayload) -> None:
10221027
for tag in (data.get("available_tags") or [])
10231028
]
10241029
self.default_sort_order: SortOrder | None = data.get("default_sort_order", None)
1030+
reaction_emoji_ctx: dict = data.get("default_reaction_emoji")
1031+
if reaction_emoji_ctx is not None:
1032+
emoji_name = reaction_emoji_ctx.get("emoji_name")
1033+
if emoji_name is not None:
1034+
self.default_reaction_emoji = reaction_emoji_ctx["emoji_name"]
1035+
else:
1036+
self.default_reaction_emoji = self._state.get_emoji(
1037+
utils._get_as_snowflake(reaction_emoji_ctx, "emoji_id")
1038+
)
10251039

10261040
@property
10271041
def guidelines(self) -> str | None:
@@ -1061,6 +1075,7 @@ async def edit(
10611075
default_auto_archive_duration: ThreadArchiveDuration = ...,
10621076
default_thread_slowmode_delay: int = ...,
10631077
default_sort_order: SortOrder = ...,
1078+
default_reaction_emoji: Emoji | int | str | None = ...,
10641079
available_tags: list[ForumTag] = ...,
10651080
require_tag: bool = ...,
10661081
overwrites: Mapping[Role | Member | Snowflake, PermissionOverwrite] = ...,
@@ -1113,6 +1128,12 @@ async def edit(self, *, reason=None, **options):
11131128
The default sort order type to use to order posts in this channel.
11141129
11151130
.. versionadded:: 2.3
1131+
default_reaction_emoji: Optional[:class:`discord.Emoji` | :class:`int` | :class:`str`]
1132+
The default reaction emoji.
1133+
Can be a unicode emoji or a custom emoji in the forms:
1134+
:class:`Emoji`, snowflake ID, string representation (eg. '<a:emoji_name:emoji_id>').
1135+
1136+
.. versionadded:: 2.5
11161137
available_tags: List[:class:`ForumTag`]
11171138
The set of tags that can be used in this channel. Must be less than `20`.
11181139

discord/guild.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
from .channel import *
4848
from .channel import _guild_channel_factory, _threaded_guild_channel_factory
4949
from .colour import Colour
50-
from .emoji import Emoji
50+
from .emoji import Emoji, PartialEmoji, _EmojiTag
5151
from .enums import (
5252
AuditLogAction,
5353
AutoModEventType,
@@ -1395,6 +1395,7 @@ async def create_forum_channel(
13951395
slowmode_delay: int = MISSING,
13961396
nsfw: bool = MISSING,
13971397
overwrites: dict[Role | Member, PermissionOverwrite] = MISSING,
1398+
default_reaction_emoji: Emoji | int | str = MISSING,
13981399
) -> ForumChannel:
13991400
"""|coro|
14001401
@@ -1436,6 +1437,12 @@ async def create_forum_channel(
14361437
To mark the channel as NSFW or not.
14371438
reason: Optional[:class:`str`]
14381439
The reason for creating this channel. Shows up on the audit log.
1440+
default_reaction_emoji: Optional[:class:`Emoji` | :class:`int` | :class:`str`]
1441+
The default reaction emoji.
1442+
Can be a unicode emoji or a custom emoji in the forms:
1443+
:class:`Emoji`, snowflake ID, string representation (eg. '<a:emoji_name:emoji_id>').
1444+
1445+
.. versionadded:: v2.5
14391446
14401447
Returns
14411448
-------
@@ -1449,7 +1456,7 @@ async def create_forum_channel(
14491456
HTTPException
14501457
Creating the channel failed.
14511458
InvalidArgument
1452-
The permission overwrite information is not in proper form.
1459+
The argument is not in proper form.
14531460
14541461
Examples
14551462
--------
@@ -1485,6 +1492,24 @@ async def create_forum_channel(
14851492
if nsfw is not MISSING:
14861493
options["nsfw"] = nsfw
14871494

1495+
if default_reaction_emoji is not MISSING:
1496+
if isinstance(default_reaction_emoji, _EmojiTag): # Emoji, PartialEmoji
1497+
default_reaction_emoji = default_reaction_emoji._to_partial()
1498+
elif isinstance(default_reaction_emoji, int):
1499+
default_reaction_emoji = PartialEmoji(
1500+
name=None, id=default_reaction_emoji
1501+
)
1502+
elif isinstance(default_reaction_emoji, str):
1503+
default_reaction_emoji = PartialEmoji.from_str(default_reaction_emoji)
1504+
else:
1505+
raise InvalidArgument(
1506+
"default_reaction_emoji must be of type: Emoji | int | str"
1507+
)
1508+
1509+
options[
1510+
"default_reaction_emoji"
1511+
] = default_reaction_emoji._to_forum_reaction_payload()
1512+
14881513
data = await self._create_channel(
14891514
name,
14901515
overwrites=overwrites,

discord/http.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,6 +1096,7 @@ def create_channel(
10961096
"rtc_region",
10971097
"video_quality_mode",
10981098
"auto_archive_duration",
1099+
"default_reaction_emoji",
10991100
)
11001101
payload.update(
11011102
{k: v for k, v in options.items() if k in valid_keys and v is not None}

discord/partial_emoji.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,11 +160,11 @@ def to_dict(self) -> dict[str, Any]:
160160
def _to_partial(self) -> PartialEmoji:
161161
return self
162162

163-
def _to_forum_tag_payload(
163+
def _to_forum_reaction_payload(
164164
self,
165-
) -> TypedDict("TagPayload", {"emoji_id": int, "emoji_name": None}) | TypedDict(
166-
"TagPayload", {"emoji_id": None, "emoji_name": str}
167-
):
165+
) -> TypedDict(
166+
"ReactionPayload", {"emoji_id": int, "emoji_name": None}
167+
) | TypedDict("ReactionPayload", {"emoji_id": None, "emoji_name": str}):
168168
if self.id is None:
169169
return {"emoji_id": None, "emoji_name": self.name}
170170
else:

0 commit comments

Comments
 (0)