diff --git a/discord/client.py b/discord/client.py index f3830f8f3..5f0a84958 100644 --- a/discord/client.py +++ b/discord/client.py @@ -938,6 +938,24 @@ class Client: log.debug(request_success_log.format(response=response, json=payload, data=data)) return Message(channel=channel, **data) + @asyncio.coroutine + def _logs_from(self, channel, limit=100, before=None, after=None): + url = '{}/{}/messages'.format(endpoints.CHANNELS, channel.id) + params = { + 'limit': limit + } + + if before: + params['before'] = before.id + if after: + params['after'] = after.id + + response = yield from self.session.get(url, params=params, headers=self.headers) + log.debug(request_logging_format.format(method='GET', response=response)) + yield from utils._verify_successful_response(response) + messages = yield from response.json() + return messages + @asyncio.coroutine def logs_from(self, channel, limit=100, *, before=None, after=None): """|coro| @@ -981,25 +999,20 @@ class Client: yield from client.edit_message(message, 'goodbye') """ - def generator_wrapper(data): + def generator(data): for message in data: yield Message(channel=channel, **message) - url = '{}/{}/messages'.format(endpoints.CHANNELS, channel.id) - params = { - 'limit': limit - } + result = [] + while limit > 0: + retrieve = limit if limit <= 100 else 100 + data = yield from self._logs_from(channel, retrieve, before, after) + limit -= retrieve + result.extend(data) + before = Object(id=data[-1]['id']) - if before: - params['before'] = before.id - if after: - params['after'] = after.id + return generator(result) - response = yield from self.session.get(url, params=params, headers=self.headers) - log.debug(request_logging_format.format(method='GET', response=response)) - yield from utils._verify_successful_response(response) - messages = yield from response.json() - return generator_wrapper(messages) # Member management