From 38701dc8a65113a04711af204eed5fbed2852e62 Mon Sep 17 00:00:00 2001 From: Xiaochuan Yu Date: Tue, 28 Apr 2020 10:39:32 -0400 Subject: [PATCH] Make users.list accept pagination args --- examples/list.py | 36 ++++++++++++++++++++---------------- slacker/__init__.py | 11 +++++++++-- 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/examples/list.py b/examples/list.py index 3cb6344..9a6f5da 100755 --- a/examples/list.py +++ b/examples/list.py @@ -5,31 +5,35 @@ # https://api.slack.com/methods import os +import functools from slacker import Slacker +def paginated(list_func): + # See https://api.slack.com/docs/pagination + next_cursor = None + while True: + response = list_func(cursor=next_cursor) + yield response + next_cursor = response.body['response_metadata']['next_cursor'] + if not next_cursor: + break + + def list_slack(): """List channels & users in slack.""" try: token = os.environ['SLACK_TOKEN'] slack = Slacker(token) - # Get channel list - response = slack.channels.list() - channels = response.body['channels'] - for channel in channels: - print(channel['id'], channel['name']) - # if not channel['is_archived']: - # slack.channels.join(channel['name']) - print() - - # Get users list - response = slack.users.list() - users = response.body['members'] - for user in users: - if not user['deleted']: - print(user['id'], user['name'], user['is_admin'], user[ - 'is_owner']) + # Get users list, with pagination + for response in paginated(functools.partial(slack.users.list, limit=150)): + print("=== page === ") + users = response.body['members'] + for user in users: + if not user['deleted']: + print(user['id'], user['name'], user['is_admin'], user[ + 'is_owner']) print() except KeyError as ex: print('Environment variable %s not set.' % str(ex)) diff --git a/slacker/__init__.py b/slacker/__init__.py index cc06892..e0da3ef 100644 --- a/slacker/__init__.py +++ b/slacker/__init__.py @@ -327,8 +327,15 @@ def info(self, user, include_locale=False): return self.get('users.info', params={'user': user, 'include_locale': include_locale}) - def list(self, presence=False): - return self.get('users.list', params={'presence': int(presence)}) + def list(self, presence=False, cursor=None, limit=None): + return self.get( + 'users.list', + params={ + 'presence': int(presence), + 'cursor': cursor, + 'limit': limit, + } + ) def identity(self): return self.get('users.identity')