DotaNoobs main site.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 lines
3.6 KiB

  1. import simplejson as json
  2. from random import choice
  3. from flask.ext.sqlalchemy import SQLAlchemy
  4. from sqlalchemy.ext.mutable import Mutable
  5. from time import time
  6. from app import db
  7. from utils import parse_valve_heropedia, complete_hero_data
  8. # Get a little of that Mongoness back
  9. class Json(db.TypeDecorator):
  10. impl = db.Text
  11. def process_bind_param(self, value, dialect):
  12. if value is not None:
  13. value = json.dumps(value)
  14. return value
  15. def process_result_value(self, value, dialect):
  16. if value is not None:
  17. value = json.loads(value)
  18. return value
  19. class MutableDict(Mutable, dict):
  20. @classmethod
  21. def coerce(cls, key, value):
  22. if not isinstance(value, MutableDict):
  23. if isinstance(value, dict):
  24. return MutableDict(value)
  25. return Mutable.coerce(key,value)
  26. else:
  27. return value
  28. def __delitem__(self, key):
  29. dict.__delitem__(self, key)
  30. self.changed()
  31. def __setitem__(self, key, value):
  32. dict.__setitem__(self, key, value)
  33. self.changed()
  34. def __getstate__(self):
  35. return dict(self)
  36. def __setstate__(self, state):
  37. self.update(self)
  38. class User(db.Model):
  39. id = db.Column(db.Integer, primary_key=True)
  40. steam_id = db.Column(db.String(40), unique=True)
  41. nickname = db.Column(db.String(80))
  42. avatar = db.Column(db.String(255))
  43. random_heroes = db.Column(MutableDict.as_mutable(Json))
  44. bio_text = db.Column(db.String(4096))
  45. last_seen = db.Column(db.DateTime)
  46. twitch = db.Column(db.String(60))
  47. @staticmethod
  48. def get_or_create(steam_id):
  49. rv = User.query.filter_by(steam_id=steam_id).first()
  50. if rv is None:
  51. rv = User()
  52. rv.steam_id = steam_id
  53. rv.random_heroes = {'current':None, 'completed':[]}
  54. bio_text = ''
  55. db.session.add(rv)
  56. return rv
  57. @property
  58. def random_hero(self):
  59. if not self.random_heroes['current']:
  60. heroes = []
  61. for (tavern_name, tavern) in parse_valve_heropedia():
  62. heroes.extend([complete_hero_data('name', entry['name']) for entry in tavern])
  63. if heroes:
  64. self.random_heroes['current'] = choice(heroes)
  65. self.random_heroes = self.random_heroes
  66. db.session.commit()
  67. return self.random_heroes['current']
  68. @random_hero.setter
  69. def random_hero(self, herodata):
  70. self.random_heroes['current'] = herodata
  71. self.random_heroes = self.random_heroes
  72. db.session.commit()
  73. @property
  74. def random_completed(self):
  75. return self.random_heroes['completed']
  76. def random_success(self):
  77. self.random_heroes['completed'].append(self.random_heroes['current']['name'])
  78. self.random_heroes['current'] = None
  79. self.random_heroes = self.random_heroes
  80. db.session.commit()
  81. return self.random_hero
  82. def random_skip(self):
  83. self.random_heroes['current'] = None
  84. self.random_heroes = self.random_heroes
  85. db.session.commit()
  86. return self.random_hero
  87. def __repr__(self):
  88. return '<User {}>'.format(self.nickname)
  89. class TeamspeakData(db.Model):
  90. id = db.Column(db.Integer, primary_key=True)
  91. time = db.Column(db.Float())
  92. clients = db.Column(Json())
  93. def __init__(self, clientlist):
  94. self.time = time()
  95. self.clients = clientlist