Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add category param to clone #9941

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 18 additions & 1 deletion discord/abc.py
Original file line number Diff line number Diff line change
Expand Up @@ -1005,11 +1005,15 @@ async def _clone_impl(
base_attrs: Dict[str, Any],
*,
name: Optional[str] = None,
category: Optional[CategoryChannel] = None,
reason: Optional[str] = None,
) -> Self:
base_attrs['permission_overwrites'] = [x._asdict() for x in self._overwrites]
base_attrs['parent_id'] = self.category_id
base_attrs['name'] = name or self.name
if category is not None:
base_attrs['parent_id'] = category.id

guild_id = self.guild.id
cls = self.__class__
data = await self._state.http.create_channel(guild_id, self.type.value, reason=reason, **base_attrs)
Expand All @@ -1019,7 +1023,13 @@ async def _clone_impl(
self.guild._channels[obj.id] = obj # type: ignore # obj is a GuildChannel
return obj

async def clone(self, *, name: Optional[str] = None, reason: Optional[str] = None) -> Self:
async def clone(
self,
*,
name: Optional[str] = None,
category: Optional[CategoryChannel] = None,
reason: Optional[str] = None,
) -> Self:
"""|coro|

Clones this channel. This creates a channel with the same properties
Expand All @@ -1029,11 +1039,18 @@ async def clone(self, *, name: Optional[str] = None, reason: Optional[str] = Non

.. versionadded:: 1.1

.. versionchanged:: 2.5

The ``category`` keyword-only parameter was added.

Parameters
------------
name: Optional[:class:`str`]
The name of the new channel. If not provided, defaults to this
channel name.
category: Optional[:class:`~discord.CategoryChannel`]
The category the new channel belongs to.
This parameter is ignored if cloning a category channel.
reason: Optional[:class:`str`]
The reason for cloning this channel. Shows up on the audit log.

Expand Down
56 changes: 47 additions & 9 deletions discord/channel.py
Original file line number Diff line number Diff line change
Expand Up @@ -395,9 +395,18 @@ async def edit(self, *, reason: Optional[str] = None, **options: Any) -> Optiona
return self.__class__(state=self._state, guild=self.guild, data=payload) # type: ignore

@utils.copy_doc(discord.abc.GuildChannel.clone)
async def clone(self, *, name: Optional[str] = None, reason: Optional[str] = None) -> TextChannel:
async def clone(
self,
*,
name: Optional[str] = None,
category: Optional[CategoryChannel] = None,
reason: Optional[str] = None,
) -> TextChannel:
return await self._clone_impl(
{'topic': self.topic, 'nsfw': self.nsfw, 'rate_limit_per_user': self.slowmode_delay}, name=name, reason=reason
{'topic': self.topic, 'nsfw': self.nsfw, 'rate_limit_per_user': self.slowmode_delay},
name=name,
category=category,
reason=reason,
)

async def delete_messages(self, messages: Iterable[Snowflake], *, reason: Optional[str] = None) -> None:
Expand Down Expand Up @@ -1344,8 +1353,16 @@ def type(self) -> Literal[ChannelType.voice]:
return ChannelType.voice

@utils.copy_doc(discord.abc.GuildChannel.clone)
async def clone(self, *, name: Optional[str] = None, reason: Optional[str] = None) -> VoiceChannel:
return await self._clone_impl({'bitrate': self.bitrate, 'user_limit': self.user_limit}, name=name, reason=reason)
async def clone(
self,
*,
name: Optional[str] = None,
category: Optional[CategoryChannel] = None,
reason: Optional[str] = None,
) -> VoiceChannel:
return await self._clone_impl(
{'bitrate': self.bitrate, 'user_limit': self.user_limit}, name=name, category=category, reason=reason
)

@overload
async def edit(self) -> None:
Expand Down Expand Up @@ -1589,8 +1606,14 @@ def type(self) -> Literal[ChannelType.stage_voice]:
return ChannelType.stage_voice

@utils.copy_doc(discord.abc.GuildChannel.clone)
async def clone(self, *, name: Optional[str] = None, reason: Optional[str] = None) -> StageChannel:
return await self._clone_impl({}, name=name, reason=reason)
async def clone(
self,
*,
name: Optional[str] = None,
category: Optional[CategoryChannel] = None,
reason: Optional[str] = None,
) -> StageChannel:
return await self._clone_impl({}, name=name, category=category, reason=reason)

@property
def instance(self) -> Optional[StageInstance]:
Expand Down Expand Up @@ -1869,7 +1892,13 @@ def is_nsfw(self) -> bool:
return self.nsfw

@utils.copy_doc(discord.abc.GuildChannel.clone)
async def clone(self, *, name: Optional[str] = None, reason: Optional[str] = None) -> CategoryChannel:
async def clone(
self,
*,
name: Optional[str] = None,
category: Optional[CategoryChannel] = None,
reason: Optional[str] = None,
) -> CategoryChannel:
return await self._clone_impl({'nsfw': self.nsfw}, name=name, reason=reason)

@overload
Expand Down Expand Up @@ -2386,9 +2415,18 @@ def is_media(self) -> bool:
return self._type == ChannelType.media.value

@utils.copy_doc(discord.abc.GuildChannel.clone)
async def clone(self, *, name: Optional[str] = None, reason: Optional[str] = None) -> ForumChannel:
async def clone(
self,
*,
name: Optional[str] = None,
category: Optional[CategoryChannel],
reason: Optional[str] = None,
) -> ForumChannel:
return await self._clone_impl(
{'topic': self.topic, 'nsfw': self.nsfw, 'rate_limit_per_user': self.slowmode_delay}, name=name, reason=reason
{'topic': self.topic, 'nsfw': self.nsfw, 'rate_limit_per_user': self.slowmode_delay},
name=name,
category=category,
reason=reason,
)

@overload
Expand Down
Loading