From cbb9d3ac1cd11f760c88e9f487d125976cec7575 Mon Sep 17 00:00:00 2001 From: Jan Losinski Date: Wed, 21 Mar 2018 05:14:20 +0100 Subject: [PATCH] Add the token refresher. Signed-off-by: Jan Losinski --- refresher.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 refresher.py diff --git a/refresher.py b/refresher.py new file mode 100644 index 0000000..270ba3a --- /dev/null +++ b/refresher.py @@ -0,0 +1,42 @@ +import asyncio +from datetime import datetime, timedelta + +from logbook import Logger +from sqlalchemy import func + +from models import User + +logger = Logger(__name__) + + +class Refresher: + def __init__(self, session, wallabag): + self.session = session + self.wallabag = wallabag + self.grace = 120 + + def _wait_time(self): + next = self.session.query(func.min(User.token_valid).label("min")).first() + if next is None or next.min is None: + return 3 + delta = next.min - datetime.utcnow() + if delta < timedelta(seconds=self.grace): + return 0 + + calculated = delta - timedelta(seconds=self.grace) + return calculated.total_seconds() + + async def refresh(self): + while True: + await asyncio.sleep(self._wait_time()) + + ts = datetime.utcnow() + timedelta(seconds=self.grace) + refreshes = [self._refresh_user(user) for user + in self.session.query(User).filter(User.token_valid < ts).all()] + await asyncio.gather(*refreshes) + + self.session.commit() + + async def _refresh_user(self, user): + logger.info("Refresh token for {}", user.name) + await self.wallabag.refresh_token(user)