credential.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import time
  2. import logging
  3. from typing import Dict, Optional
  4. from .errors import LoginFailed
  5. from ._plugin import Plugin
  6. from .utils import serialize
  7. from .utils.login import login
  8. from .utils.db import Mongo
  9. logger = logging.getLogger(__name__)
  10. class CredentialManager(Plugin):
  11. def __init__(self, runner):
  12. super(CredentialManager, self).__init__(runner)
  13. self._bnet_user_cred: Optional[Dict] = None
  14. @property
  15. def raw_cred(self) -> Dict:
  16. return serialize.fromstr(Mongo.db.user.find_one({'_id': self._id})['credential'])
  17. @property
  18. def bnet_user_cred(self) -> str:
  19. # Here, self.last_updated_at records if the bnet_user_cred outdated ( 1 hr expiration)
  20. # Different from the lastUpdatedAt field in mongodb
  21. if self._bnet_user_cred is None or time.time() - self.last_updated_at > 60*55:
  22. try:
  23. bnet_user_cred, new_cred = login(self.raw_cred)
  24. except LoginFailed:
  25. logger.info('[%s] login failed')
  26. return
  27. self._bnet_user_cred = bnet_user_cred
  28. self.update_raw_cred(new_cred)
  29. logger.info('[%s] Updated credential', self._id)
  30. self.last_updated_at = time.time()
  31. return self._bnet_user_cred
  32. def update_raw_cred(self, new_cred: Dict) -> None:
  33. Mongo.db.user.update_one({'_id': self._id}, {
  34. '$set': {
  35. 'credential': serialize.tostr(new_cred),
  36. },
  37. '$currentDate': {
  38. 'lastUpdatedAt': True
  39. }
  40. })