Skip to content

Commit bfe0862

Browse files
authored
func
1 parent d26811d commit bfe0862

File tree

3 files changed

+76
-5
lines changed

3 files changed

+76
-5
lines changed

discord/abc.py

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
from .file import File, VoiceMessage
4949
from .flags import ChannelFlags, MessageFlags
5050
from .invite import Invite
51-
from .iterators import HistoryIterator
51+
from .iterators import HistoryIterator, MessagePinIterator
5252
from .mentions import AllowedMentions
5353
from .partial_emoji import PartialEmoji, _EmojiTag
5454
from .permissions import PermissionOverwrite, Permissions
@@ -1765,6 +1765,10 @@ async def pins(self) -> list[Message]:
17651765
objects returned by this method do not contain complete
17661766
:attr:`.Message.reactions` data.
17671767
1768+
.. warning::
1769+
1770+
Starting from version 3.0, this will return a :class:`discord.MessagePinIterator`. See :func:`fetch_pins` for the new behavior.
1771+
17681772
Returns
17691773
-------
17701774
List[:class:`~discord.Message`]
@@ -1775,12 +1779,72 @@ async def pins(self) -> list[Message]:
17751779
~discord.HTTPException
17761780
Retrieving the pinned messages failed.
17771781
"""
1778-
1782+
utils.warn_deprecated(
1783+
f"Messageable.pins() returning a list of Message",
1784+
since="2.7",
1785+
removed="3.0",
1786+
reference="The behavior of fetch_pins"
1787+
)
17791788
channel = await self._get_channel()
17801789
state = self._state
17811790
data = await state.http.legacy_pins_from(channel.id)
17821791
return [state.create_message(channel=channel, data=m) for m in data]
17831792

1793+
def fetch_pins(
1794+
self,
1795+
*,
1796+
limit: int | None = 50,
1797+
before: SnowflakeTime | None = None,
1798+
) -> MessagePinIterator:
1799+
"""Returns a :class:`~discord.MessagePinIterator` that enables receiving the destination's pinned messages.
1800+
1801+
You must have :attr:`~discord.Permissions.read_message_history` permissions to use this.
1802+
1803+
Parameters
1804+
----------
1805+
limit: Optional[:class:`int`]
1806+
The number of pinned messages to retrieve.
1807+
If ``None``, retrieves every pinned message in the channel.
1808+
before: Optional[Union[:class:`~discord.abc.Snowflake`, :class:`datetime.datetime`]]
1809+
Retrieve messages pinned before this datetime.
1810+
If a datetime is provided, it is recommended to use a UTC aware datetime.
1811+
If the datetime is naive, it is assumed to be local time.
1812+
1813+
Yields
1814+
------
1815+
:class:`~discord.MessagePin`
1816+
The pinned message.
1817+
1818+
Raises
1819+
------
1820+
~discord.Forbidden
1821+
You do not have permissions to get pinned messages.
1822+
~discord.HTTPException
1823+
The request to get pinned messages failed.
1824+
1825+
Examples
1826+
--------
1827+
1828+
Usage ::
1829+
1830+
counter = 0
1831+
async for pin in channel.fetch_pins(limit=250):
1832+
if pin.message.author == client.user:
1833+
counter += 1
1834+
1835+
Flattening into a list: ::
1836+
1837+
pins = await channel.fetch_pins(limit=None).flatten()
1838+
# pins is now a list of MessagePin...
1839+
1840+
All parameters are optional.
1841+
"""
1842+
return MessagePinIterator(
1843+
self,
1844+
limit=limit,
1845+
before=before,
1846+
)
1847+
17841848
def can_send(self, *objects) -> bool:
17851849
"""Returns a :class:`bool` indicating whether you have the permissions to send the object(s).
17861850

discord/iterators.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
from .channel import MessageableChannel
6060
from .guild import BanEntry, Guild
6161
from .member import Member
62-
from .message import Message
62+
from .message import Message, MessagePin
6363
from .monetization import Entitlement, Subscription
6464
from .scheduled_events import ScheduledEvent
6565
from .threads import Thread
@@ -1209,7 +1209,7 @@ def __init__(
12091209
limit: int | None,
12101210
before: Snowflake | datetime.datetime | None = None,
12111211
):
1212-
self.channel = channel
1212+
self._channel = channel
12131213
self.limit = limit
12141214
self.http = channel._state.http
12151215

@@ -1245,8 +1245,12 @@ async def fill_queue(self) -> None:
12451245
if not self.has_more:
12461246
raise NoMoreItems()
12471247

1248+
if not hasattr(self, "channel"):
1249+
channel = await self._channel._get_channel()
1250+
self.channel = channel
1251+
12481252
limit = 50 if self.limit is None else max(self.limit, 50)
1249-
data = await self.endpoint(self.channel_id, before=self.before, limit=limit)
1253+
data = await self.endpoint(self.channel.id, before=self.before, limit=limit)
12501254

12511255
pins: list[MessagePinPayload] = data.get("items", [])
12521256
for d in pins:

discord/message.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -822,6 +822,9 @@ def pinned_at(self) -> datetime.datetime:
822822
"""An aware timestamp of when the message was pinned."""
823823
return self._pinned_at
824824

825+
def __repr__(self) -> str:
826+
return f"<MessagePin pinned_at={self.pinned_at!r} message={self.message!r}>"
827+
825828

826829
@flatten_handlers
827830
class Message(Hashable):

0 commit comments

Comments
 (0)