aboutsummaryrefslogtreecommitdiff
path: root/discord/iterators.py
diff options
context:
space:
mode:
Diffstat (limited to 'discord/iterators.py')
-rw-r--r--discord/iterators.py37
1 files changed, 18 insertions, 19 deletions
diff --git a/discord/iterators.py b/discord/iterators.py
index 015620bc..73216ccf 100644
--- a/discord/iterators.py
+++ b/discord/iterators.py
@@ -28,10 +28,12 @@ import asyncio
import datetime
from .errors import NoMoreItems
-from .utils import time_snowflake, maybe_coroutine
+from .utils import DISCORD_EPOCH, time_snowflake, maybe_coroutine
from .object import Object
from .audit_logs import AuditLogEntry
+OLDEST_MESSAGE = Object(id=0)
+
class _AsyncIterator:
__slots__ = ()
@@ -196,14 +198,13 @@ class HistoryIterator(_AsyncIterator):
around: :class:`abc.Snowflake`
Message around which all messages must be. Limit max 101. Note that if
limit is an even number, this will return at most limit+1 messages.
- reverse: :class:`bool`
- If set to true, return messages in oldest->newest order. Recommended
- when using with "after" queries with limit over 100, otherwise messages
- will be out of order.
+ oldest_first: :class:`bool`
+ If set to true, return messages in oldest->newest order. Defaults to
+ True if ``after`` is specified, otherwise False.
"""
def __init__(self, messageable, limit,
- before=None, after=None, around=None, reverse=None):
+ before=None, after=None, around=None, oldest_first=None):
if isinstance(before, datetime.datetime):
before = Object(id=time_snowflake(before, high=False))
@@ -212,17 +213,17 @@ class HistoryIterator(_AsyncIterator):
if isinstance(around, datetime.datetime):
around = Object(id=time_snowflake(around))
+ if oldest_first is None:
+ self.reverse = after is not None
+ else:
+ self.reverse = oldest_first
+
self.messageable = messageable
self.limit = limit
self.before = before
- self.after = after
+ self.after = after or OLDEST_MESSAGE
self.around = around
- if reverse is None:
- self.reverse = after is not None
- else:
- self.reverse = reverse
-
self._filter = None # message dict -> bool
self.state = self.messageable._state
@@ -246,17 +247,15 @@ class HistoryIterator(_AsyncIterator):
self._filter = lambda m: int(m['id']) < self.before.id
elif self.after:
self._filter = lambda m: self.after.id < int(m['id'])
- elif self.before and self.after:
+ else:
if self.reverse:
self._retrieve_messages = self._retrieve_messages_after_strategy
- self._filter = lambda m: int(m['id']) < self.before.id
+ if (self.before):
+ self._filter = lambda m: int(m['id']) < self.before.id
else:
self._retrieve_messages = self._retrieve_messages_before_strategy
- self._filter = lambda m: int(m['id']) > self.after.id
- elif self.after:
- self._retrieve_messages = self._retrieve_messages_after_strategy
- else:
- self._retrieve_messages = self._retrieve_messages_before_strategy
+ if (self.after and self.after != OLDEST_MESSAGE):
+ self._filter = lambda m: int(m['id']) > self.after.id
async def next(self):
if self.messages.empty():