import calendar
import os
+import re
import requests
import string
import time
def set_instance(self, instance):
self.instance = instance
self.urls = {
+ None: '',
'auth': "https://" + instance + "/oauth/",
'api': "https://" + instance + "/api/v1/",
}
self.log_response = log_response
- def method(self, method, path, base, params):
+ def method(self, method, path, base, params, links={}):
headers = {}
if self.bearer_token is not None:
headers['Authorization'] = 'Bearer ' + self.bearer_token
self.log_response(rsp)
if rsp.status_code != 200:
raise HTTPError(rsp)
+ linkhdr = rsp.headers.get('Link', '')
+ while len(linkhdr) > 0:
+ m = re.match(r'<([^>]+)>\s*;\s*rel="([^"]+)"(?:,\s*)?', linkhdr)
+ if m is None:
+ break
+ links[m.group(2)] = m.group(1)
+ linkhdr = linkhdr[m.end():]
return rsp.json()
def get(self, path, base='api', **params):
def post(self, path, base='api', **params):
return self.method(requests.post, path, base, params)
+ def get_incremental(self, path, base='api', **params):
+ params.setdefault('limit', 32)
+ while True:
+ links = {}
+ data = self.method(requests.get, path, base, params, links)
+ yield from data
+ if 'next' not in links:
+ break
+ base, path = None, links['next']
+
def get_url(self, path, base='api', **params):
r = requests.Request(method="GET", url=self.urls[base] + path,
params=params)
class MentionsUI(client.Client):
def run(self):
- for item in reversed(self.get("notifications", limit=40)):
+ g = self.get_incremental("notifications")
+ things = []
+ for item in g:
if item['type'] != 'mention':
continue
p = client.Status(item['status'])
+ things.append(p)
+ if len(things) >= 40:
+ break
+ for p in reversed(things):
for thing in p.text():
for line in thing.render(80):
print(line.ecma48())