Add the token refresher.

Signed-off-by: Jan Losinski <losinski@wh2.tu-dresden.de>
This commit is contained in:
Jan Losinski 2018-03-21 05:14:20 +01:00
parent b956f1bf9c
commit cbb9d3ac1c
1 changed files with 42 additions and 0 deletions

42
refresher.py Normal file
View File

@ -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)