profile.py 2.3 KB

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