stat.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. from ._plugin import Plugin
  2. from .utils.db import Mongo
  3. import logging
  4. logger = logging.getLogger(__name__)
  5. class CompetitiveStat(Plugin):
  6. def get_stats(self):
  7. return ({
  8. 'gamePlayed': round(i['career']['ranked']['所有英雄']['比赛场次']),
  9. 'won': round(i['career']['ranked']['所有英雄']['比赛胜利']),
  10. 'lost': round(i['career']['ranked']['所有英雄']['比赛战败']),
  11. 'draw': round(i['career']['ranked']['所有英雄']['比赛战平']),
  12. 'skillRate': i['career']['player']['ranked']['level'],
  13. } for i in (self.root.latest_profile.formatted, self.root.new_profile.formatted))
  14. def calc(self):
  15. old, new = self.get_stats()
  16. if old['gamePlayed'] == new['gamePlayed']:
  17. return
  18. try:
  19. assert new['gamePlayed'] - old['gamePlayed'] == 1, 'GameMissed'
  20. sr_diff = new['skillRate'] - old['skillRate']
  21. # basically, self.record(sign(sr_diff), sr_diff)
  22. # But with assertion
  23. if sr_diff > 0:
  24. assert new['won'] - old['won'] == 1, 'WonWrong'
  25. self.record(1, sr_diff, new)
  26. elif sr_diff < 0:
  27. assert new['lost'] - old['lost'] == 1, 'LostWrong'
  28. self.record(-1, sr_diff, new)
  29. elif sr_diff == 0:
  30. assert new['draw'] - old['draw'] == 1, 'DrawWrong'
  31. self.record(-1, sr_diff, new)
  32. except AssertionError as e:
  33. logging.error('[%s] calced error, [%s]', self._id, *e.args)
  34. def record(self, status, sr_diff, stats):
  35. Mongo.db.stats.insert({
  36. 'user': self._id,
  37. 'time': self.root.latest.raw['lastUpdate'],
  38. 'gameStatus': status,
  39. 'skillRateDifference': sr_diff,
  40. **stats
  41. })