profile.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import logging
  2. import pymongo
  3. from . import api
  4. from ._plugin import Plugin
  5. from .utils.db import Mongo
  6. from .utils import reformat
  7. gamedata = api.get_gamedata()
  8. logger = logging.getLogger(__name__)
  9. class Profile(Plugin):
  10. def __init__(self, runner, func):
  11. super(Profile, self).__init__(runner)
  12. self._func = func
  13. # Lazy
  14. self._raw = None
  15. self._formatted = None
  16. @property
  17. def raw(self):
  18. if self._raw is None:
  19. self._raw = self._func(self)
  20. return self._raw
  21. @property
  22. def formatted(self):
  23. if self._formatted is None:
  24. self._formatted = {
  25. 'career': reformat.detailed_mapping(gamedata, self.raw),
  26. 'heroComparison': reformat.hero_comparison_mapping(gamedata, self.raw),
  27. 'player': self.raw['player'],
  28. }
  29. return self._formatted
  30. def refresh(self):
  31. self._raw = None
  32. self._formatted = None
  33. def to_db_record(self):
  34. return {
  35. 'user': self._id,
  36. **self.raw
  37. }
  38. def __gt__(self, other):
  39. # since it is gt, other will always be latest_profile,
  40. # if it is None, there's no record in db,
  41. # Init it
  42. if other.raw is None:
  43. return True
  44. return self.raw['lastUpdate'].__gt__(other.raw['lastUpdate'])
  45. @property
  46. def basic(self):
  47. data = self.raw['player']
  48. return {
  49. 'battleTag': data['displayName'],
  50. 'level': data['level'],
  51. 'gamewon': data['gameWon'],
  52. 'endorsement': data['endorsement'],
  53. 'currentSR': data['ranked']['level'],
  54. 'highestSR': data['ranked']['highestLevel']
  55. }
  56. class DBProfile(Profile):
  57. def __init__(self, runner):
  58. def _retriever(self):
  59. return Mongo.db.profile.find_one({
  60. 'user': self._id
  61. }, sort=[
  62. ('_id', pymongo.DESCENDING)
  63. ])
  64. super(DBProfile, self).__init__(runner, _retriever)
  65. class RemoteProfile(Profile):
  66. def __init__(self, runner):
  67. def _retriever(self):
  68. return api.get_profile(self.root.credential.bnet_user_cred)
  69. super(RemoteProfile, self).__init__(runner, _retriever)