Advertisement
Guest User

Untitled

a guest
Feb 28th, 2016
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 25.91 KB | None | 0 0
  1. from peewee import *
  2. from playhouse.postgres_ext import *
  3. from datetime import *
  4. from dateutil.relativedelta import relativedelta
  5. from flask import request
  6. from steam import SteamAPI
  7. from util import human_readable, convert_steamid
  8. from util.impulse import Entity
  9.  
  10. from util.badges import Badge, BADGE_BETA_TESTER
  11.  
  12. import config
  13.  
  14. import bcrypt, json, redis, random, string, time, logging
  15.  
  16.  
  17. log = logging.getLogger(__name__)
  18. db = PostgresqlExtDatabase('ns2pug', user="b1n", password="b1n", threadlocals=True, port=5433)
  19. redis = redis.Redis()
  20. steam = SteamAPI.new()
  21.  
  22. attrs = ['years', 'months', 'days', 'hours', 'minutes', 'seconds']
  23.  
  24. SESSION_ID_SIZE = 32
  25. get_random_number = lambda size: ''.join([random.choice(string.ascii_letters + string.digits)
  26. for i in range(size)])
  27.  
  28. class BaseModel(Model):
  29. class Meta:
  30. database = db
  31.  
  32. class UserLevel(object):
  33. USER_LEVEL_BASE = 0
  34. USER_LEVEL_MOD = 90
  35. USER_LEVEL_ADMIN = 100
  36.  
  37. DEFAULT_ADMINS = [
  38. "76561198037632722"
  39. ]
  40.  
  41. class User(BaseModel, Entity):
  42. username = CharField()
  43. description = TextField(default="")
  44. email = CharField(null=True)
  45. steamid = CharField(null=True)
  46.  
  47. active = BooleanField(default=True)
  48. join_date = DateTimeField(default=datetime.utcnow)
  49. last_login = DateTimeField(default=datetime.utcnow)
  50.  
  51. ips = ArrayField(CharField, default=[])
  52. blocked = ArrayField(CharField, default=[])
  53.  
  54. # Permissions
  55. level = IntegerField(default=UserLevel.USER_LEVEL_BASE)
  56.  
  57. # Settings
  58. settings = JSONField(default={
  59. "notifications": {
  60. "sound": True,
  61. "desktop": True,
  62. }
  63. })
  64.  
  65. # Rank and impulse
  66. rank = IntegerField(default=0)
  67. impulse = FloatField(default=0)
  68. stats = JSONField(default={
  69. "achieve": {}
  70. })
  71.  
  72. # Badges
  73. badges = ArrayField(IntegerField, default=[])
  74.  
  75. @classmethod
  76. def get_level(self, s):
  77. if s == "admin":
  78. return UserLevel.USER_LEVEL_ADMIN
  79.  
  80. @classmethod
  81. def steamGetOrCreate(cls, id):
  82. """
  83. Gets or creates a user based on a steamid. Raises an exception if
  84. the user is banned.
  85. """
  86. # We do not allow players with an "active" VAC ban on record to play
  87. ban = steam.getBanInfo(id)
  88. if ban is not None and ban < 365:
  89. raise Exception("User has VAC ban that is newer than a year!")
  90.  
  91. # During beta, only allow a set list of hardcoded steam id's
  92. if config.IS_BETA:
  93. allowed = steam.getGroupMembers("goplaymm")
  94. if str(id) not in allowed:
  95. raise Exception("This user is not authorized to join the private beta!")
  96.  
  97. try:
  98. u = User.get(User.steamid == str(id))
  99. except User.DoesNotExist:
  100. data = steam.getUserInfo(id)
  101. u = User()
  102. u.username = data['personaname']
  103. u.steamid = id
  104.  
  105. # Default admin level (for beta)
  106. if str(id) in DEFAULT_ADMINS:
  107. u.level = UserLevel.USER_LEVEL_ADMIN
  108.  
  109. u.save()
  110.  
  111. if config.IS_BETA:
  112. u.award_badge(BADGE_BETA_TESTER)
  113.  
  114. return u
  115.  
  116. def award_badge(self, badge):
  117. if not isinstance(badge, Badge):
  118. raise Exception("Value %s is not a badge!" % badge)
  119.  
  120. if badge in self.badges:
  121. log.warning("Cannot award previously awarded badge %s to %s",
  122. badge, self.id)
  123. return
  124.  
  125. self.badges.append(badge.id)
  126. self.save()
  127.  
  128. def updateName(self):
  129. """
  130. Updates a username based on the users steam profile name
  131. """
  132. data = steam.getUserInfo(self.steamid)
  133. self.username = data['personaname']
  134. self.save()
  135.  
  136. def getActiveBansQuery(self):
  137. return (Ban.getActiveBanQuery() &
  138. ((Ban.user == self.id) | (Ban.steamid == self.steamid)))
  139.  
  140. def getActiveBans(self):
  141. """
  142. Returns an active ban query which returns all active bans for this user,
  143. in order of the end date.
  144. """
  145. return Ban.select().where(self.getActiveBansQuery()).order_by(Ban.end)
  146.  
  147. def isOnline(self):
  148. """
  149. Returns true if the user is considered online by the system.
  150. """
  151. value = redis.get("user:%s:ping" % self.id) or 0
  152. if (time.time() - float(value)) < 30:
  153. return True
  154. return False
  155.  
  156. def checkPassword(self, pw):
  157. return bcrypt.hashpw(pw, self.password) == self.password
  158.  
  159. def login(self):
  160. self.last_login = datetime.utcnow()
  161. if request.remote_addr not in self.ips:
  162. self.ips.append(request.remote_addr)
  163. self.save()
  164. return Session.create(self, request.remote_addr)
  165.  
  166. def format(self, with_friendship=None):
  167. base = {
  168. "id": self.id,
  169. "steamid": self.steamid,
  170. "username": self.username
  171. }
  172.  
  173. if with_friendship:
  174. base['friendship'] = {}
  175. base['friendship']['id'] = with_friendship.id
  176. base['friendship']['started'] = with_friendship.created
  177.  
  178. return base
  179.  
  180. def getFriendsWithQuery(self, user):
  181. return Friendship.select().where(
  182. (((Friendship.usera == user) & (Friendship.userb == self)) |
  183. ((Friendship.usera == self) & (Friendship.userb == user)))
  184. & Friendship.active == True)
  185.  
  186. def getFriendsQuery(self):
  187. return Friendship.select().where(((Friendship.usera == self) | (Friendship.userb == self))
  188. & (Friendship.active == True))
  189.  
  190. def isFriendsWith(self, user):
  191. return bool(self.getFriendsWithQuery(user).count())
  192.  
  193. def getFriendRequests(self):
  194. return Invite.select().where(
  195. (Invite.invitetype == InviteType.INVITE_TYPE_FRIEND) &
  196. (Invite.to_user == self) &
  197. (Invite.state == InviteState.INVITE_WAITING))
  198.  
  199. def getStats(self):
  200. DAY = (60 * 60 * 24)
  201. a, b = [], []
  202. for i, day in enumerate(xrange(0, 30)):
  203. a.append([(time.time() - (DAY * day)) * 1000, random.randint(1, 10)])
  204. b.append([(time.time() - (DAY * day)) * 1000, random.randint(1, 5)])
  205.  
  206. return {"skill": a, "kd": b}
  207.  
  208. def push(self, data):
  209. redis.publish("user:%s:push" % self.id, json.dumps(data))
  210.  
  211. class ServerType():
  212. SERVER_MATCH = 1
  213. SERVER_DEV = 2
  214. SERVER_PRIV = 3
  215. SERVER_OTHER = 4
  216.  
  217. class ServerRegion():
  218. REGION_NA = 0
  219. REGION_NA_IL = 1
  220.  
  221. class Server(BaseModel):
  222. name = CharField()
  223. region = IntegerField(default=ServerRegion.REGION_NA)
  224. hash = CharField()
  225. hostname = CharField()
  226. hosts = ArrayField(CharField)
  227.  
  228. lastping = DateTimeField(default=datetime.utcnow)
  229.  
  230. mode = IntegerField(default=ServerType.SERVER_MATCH)
  231.  
  232. owner = ForeignKeyField(User)
  233. active = BooleanField()
  234.  
  235. @classmethod
  236. def getFreeServer(cls):
  237. free = []
  238. for server in Server.select().where((Server.mode == ServerType.SERVER_MATCH) &
  239. (Server.active == True)):
  240. if Match.select().where((Match.server == server) &
  241. MatchState.getValidStateQuery()).count():
  242. continue
  243. free.append(server)
  244. return free
  245.  
  246. def setup(self, match):
  247. map_name = match.mapp.name
  248. redis.publish("server-%s" % self.id, json.dumps({
  249. "tag": "match",
  250. "map": map_name,
  251. "id": match.id,
  252. "players": "|".join(map(lambda i: str(convert_steamid(i.steamid)), match.getPlayers())),
  253. "teama": "|".join(map(lambda i: str(convert_steamid(i.steamid)), match.getTeamA())),
  254. "teamb": "|".join(map(lambda i: str(convert_steamid(i.steamid)), match.getTeamB()))
  255. }))
  256.  
  257. def findWaitingMatch(self):
  258. return Match.get((Match.server == self) & (Match.state == MatchState.MATCH_STATE_PRE))
  259.  
  260. def format(self):
  261. return {
  262. "id": self.id,
  263. "region": self.region,
  264. "ip": self.hostsname,
  265. }
  266.  
  267. class LobbyState(object):
  268. LOBBY_STATE_CREATE = 1
  269. LOBBY_STATE_IDLE = 2
  270. LOBBY_STATE_SEARCH = 3
  271. LOBBY_STATE_PLAY = 4
  272. LOBBY_STATE_UNUSED = 5
  273.  
  274. class Lobby(BaseModel):
  275. owner = ForeignKeyField(User)
  276. private = BooleanField(default=True)
  277. state = IntegerField(default=LobbyState.LOBBY_STATE_CREATE)
  278. created = DateTimeField(default=datetime.utcnow)
  279. queuedat = DateTimeField(default=datetime.utcnow)
  280. members = ArrayField(IntegerField, 5, default=[])
  281. config = JSONField()
  282.  
  283. @staticmethod
  284. def getNew(user, maps=[]):
  285. self = Lobby()
  286. self.owner = user
  287.  
  288. # Default Config
  289. self.config = {
  290. "type": "ranked",
  291. "region": 0,
  292. "ringer": False
  293. }
  294. self.setMaps(maps)
  295. self.save()
  296. self.joinLobby(user)
  297. return self
  298.  
  299. def getMembers(self):
  300. for member in self.members:
  301. yield User.get(User.id == member)
  302.  
  303. def getMatch(self):
  304. try:
  305. return Match.get(Match.lobbies.contains(self.id) &
  306. (Match.state == MatchState.MATCH_STATE_PRE) &
  307. (Match.mtype == MatchType.MATCH_TYPE_LOBBY))
  308. except Match.DoesNotExist:
  309. return None
  310.  
  311. def setMaps(self, maps=[]):
  312. maps = [Map.get(Map.name == i).id for i in maps]
  313. self.config['maps'] = maps or [i.id for i in
  314. Map.select().where(Map.level == self.owner.level)]
  315.  
  316. def canJoin(self, user):
  317. if self.owner == user:
  318. return True
  319.  
  320. # This is here to handle cases where users refresh the lobby page
  321. # and we don't want to query the penis off of invites.
  322. if user.id in self.members:
  323. return True
  324.  
  325. for i in Invite.select().where((Invite.ref == self.id) & (Invite.to_user == user)):
  326. if i.valid():
  327. return True
  328.  
  329. return False
  330.  
  331. def format(self, tiny=True):
  332. base = {
  333. "id": self.id,
  334. "state": self.state,
  335. "members": [User.get(User.id == i).format() for i in self.members],
  336. "owner": self.owner.id,
  337. "queuedat": self.queuedat
  338. }
  339. if tiny: return base
  340. base['config'] = self.config
  341. return base
  342.  
  343. def sendChat(self, user, msg):
  344. self.sendAction({
  345. "msg": msg,
  346. "from": user.username,
  347. "id": user.id,
  348. "type": "chat"
  349. })
  350.  
  351. def sendAction(self, action):
  352. action['lobby'] = self.id
  353. for user in self.members:
  354. redis.publish("user:%s:push" % user, json.dumps(action))
  355.  
  356. def startQueue(self):
  357. if self.state == LobbyState.LOBBY_STATE_SEARCH: return
  358. self.state = LobbyState.LOBBY_STATE_SEARCH
  359. self.queuedat = datetime.utcnow()
  360. self.save()
  361. self.sendAction({
  362. "type": "state",
  363. "state": self.state,
  364. "msg": "Queue started"
  365. })
  366. redis.publish("lobby-queue", json.dumps({
  367. "tag": "match",
  368. "id": self.id
  369. }))
  370.  
  371. def stopQueue(self):
  372. if self.state == LobbyState.LOBBY_STATE_IDLE: return
  373. self.state = LobbyState.LOBBY_STATE_IDLE
  374. self.save()
  375. self.sendAction({
  376. "type": "state",
  377. "state": self.state,
  378. "msg": "Queue stopped"
  379. })
  380.  
  381. def cleanup(self):
  382. self.stopQueue()
  383. self.sendAction({"type": "delete"})
  384.  
  385. def joinLobby(self, u):
  386. if u.id not in self.members:
  387. self.members.append(u.id)
  388. self.save()
  389. self.sendAction({
  390. "type": "join",
  391. "member": u.format(),
  392. "msg": "%s joined the lobby" % u.username
  393. })
  394. redis.set("user:%s:lobby:%s:ping" % (u.id, self.id), time.time())
  395.  
  396. def userLeave(self, u, msg="%s has left the lobby"):
  397. self.sendAction({
  398. "type": "quit",
  399. "member": u.id,
  400. "msg": msg % u.username
  401. })
  402.  
  403. if u.id in self.members:
  404. self.members.remove(u.id)
  405. self.save()
  406.  
  407. if self.state == LobbyState.LOBBY_STATE_SEARCH:
  408. self.stopQueue()
  409.  
  410. def kickUser(self, u):
  411. # Delete from members
  412. if u.id in self.members:
  413. self.members.remove(u.id)
  414. self.save()
  415.  
  416. self.sendAction({
  417. "type": "kick",
  418. "member": u.id,
  419. "msg": "%s was kicked from the lobby" % u.username
  420. })
  421. for i in Invite.select().where((Invite.ref == self.id) & (Invite.to_user == u)):
  422. if i.valid():
  423. i.state = InviteState.INVITE_EXPIRED
  424. i.save()
  425.  
  426. def getSkill(self):
  427. return map(lambda i: i.rank, self.getMembers()) / len(self.members)
  428.  
  429. class InviteType(object):
  430. INVITE_TYPE_LOBBY = 1
  431. INVITE_TYPE_RINGER = 2
  432. INVITE_TYPE_FRIEND = 3
  433. INVITE_TYPE_TEAM = 4 # Hint of future plans
  434.  
  435. class InviteState(object):
  436. INVITE_WAITING = 1
  437. INVITE_EXPIRED = 2
  438. INVITE_ACCEPTED = 3
  439. INVITE_DENIED = 4
  440.  
  441. class Invite(BaseModel):
  442. state = IntegerField(default=InviteState.INVITE_WAITING)
  443. from_user = ForeignKeyField(User, related_name="invites_from")
  444. to_user = ForeignKeyField(User, related_name="invites_to")
  445. invitetype = IntegerField()
  446. ref = IntegerField(null=True)
  447. created = DateTimeField(default=datetime.utcnow)
  448. duration = IntegerField(default=0)
  449. expiresat = DateTimeField(null=True)
  450.  
  451. def valid(self):
  452. if self.duration:
  453. if (self.created + relativedelta(seconds=self.duration)) < datetime.utcnow():
  454. return False
  455. if self.expiresat:
  456. if self.expiresat < datetime.utcnow():
  457. return False
  458. if self.state != InviteState.INVITE_WAITING:
  459. return False
  460. return True
  461.  
  462. @classmethod
  463. def getQuery(cls, a, b):
  464. return (((Invite.from_user == a) & (Invite.to_user == b)) |
  465. ((Invite.from_user == b) & (Invite.to_user == a)))
  466.  
  467. def getMsg(self):
  468. if self.invitetype == InviteType.INVITE_TYPE_LOBBY:
  469. return "%s has invited you to a lobby!" % (self.from_user.username)
  470. elif self.invitetype == InviteType.INVITE_TYPE_FRIEND:
  471. return "%s has invited you to be their friend!" % (self.from_user.username)
  472. return ""
  473.  
  474. def getUrl(self):
  475. if self.invitetype == InviteType.INVITE_TYPE_LOBBY:
  476. return "/lobby/%s" % self.ref
  477. elif self.invitetype == InviteType.INVITE_TYPE_FRIEND:
  478. return "/friends"
  479. return ""
  480.  
  481. @classmethod
  482. def createLobbyInvite(cls, fromu, tou, lobby):
  483. self = cls()
  484. self.from_user = fromu
  485. self.to_user = tou
  486. self.invitetype = InviteType.INVITE_TYPE_LOBBY
  487. self.ref = lobby.id
  488. self.save()
  489. return self
  490.  
  491. @classmethod
  492. def createFriendRequest(cls, usera, userb):
  493. i = Invite()
  494. i.from_user = usera
  495. i.to_user = userb
  496. i.invitetype = InviteType.INVITE_TYPE_FRIEND
  497. i.save()
  498. i.notify()
  499. return i
  500.  
  501. def notify(self):
  502. self.to_user.push({
  503. "type": "invite",
  504. "data": {
  505. "msg": self.getMsg(),
  506. "url": self.getUrl()
  507. }
  508. })
  509.  
  510. def format(self):
  511. return {
  512. "id": self.id,
  513. "from": self.from_user.format(),
  514. "to": self.to_user.format(),
  515. "type": self.invitetype,
  516. "ref": self.ref,
  517. }
  518.  
  519. class Friendship(BaseModel):
  520. usera = ForeignKeyField(User, related_name="friendshipa")
  521. userb = ForeignKeyField(User, related_name="friendshipb")
  522. created = DateTimeField(default=datetime.utcnow)
  523. active = BooleanField(default=True)
  524.  
  525. @classmethod
  526. def create(cls, a, b, invite=None):
  527. self = cls()
  528. self.usera = a
  529. self.userb = b
  530. self.save()
  531. return self
  532.  
  533. def format(self):
  534. return {
  535. "usera": self.usera.format(),
  536. "userb": self.userb.format(),
  537. "active": self.active,
  538. }
  539.  
  540. def getNot(self, u):
  541. return self.usera if self.usera != u else self.userb
  542.  
  543. class MapType(BaseModel):
  544. MAP_TYPE_BOMB = 1
  545. MAP_TYPE_HOSTAGE = 2
  546.  
  547. class Map(BaseModel):
  548. title = CharField()
  549. name = CharField()
  550. image = CharField()
  551.  
  552. custom = BooleanField(default=False)
  553. level = IntegerField(default=0)
  554. mtype = IntegerField()
  555.  
  556. def format(self):
  557. return {
  558. "title": self.title,
  559. "name": self.name,
  560. "id": self.id,
  561. "custom": self.custom
  562. }
  563.  
  564. class Session(object):
  565. db = redis
  566.  
  567. LIFETIME = (60 * 60 * 24) * 14 # 14 days
  568.  
  569. @classmethod
  570. def create(cls, user, source_ip):
  571. while True:
  572. id = get_random_number(SESSION_ID_SIZE)
  573. if not cls.db.exists("us:%s" % id):
  574. break
  575.  
  576. cls.db.set("us:%s" % id, json.dumps(
  577. {
  578. "user": user.id,
  579. "time": time.time(),
  580. "ip": source_ip,
  581. }))
  582. cls.db.expire("us:%s" % id, cls.LIFETIME)
  583.  
  584. return id
  585.  
  586. @classmethod
  587. def find(cls, id):
  588. data = cls.db.get("us:%s" % id)
  589. if not data:
  590. return None
  591. return json.loads(data)
  592.  
  593. @classmethod
  594. def expire(cls, id):
  595. return cls.db.delete("us:%s" % id)
  596.  
  597. class MatchType(object):
  598. MATCH_TYPE_LOBBY = 1
  599.  
  600. class MatchState(object):
  601. MATCH_STATE_INVALID = 0
  602. # Accepting
  603. MATCH_STATE_PRE = 1
  604. # Waiting for joins
  605. MATCH_STATE_SETUP = 2
  606. # Playing
  607. MATCH_STATE_PLAY = 3
  608. # It's over m8
  609. MATCH_STATE_FINISH = 4
  610. # LOL WAT
  611. MATCH_STATE_OTHER = 5
  612.  
  613. @staticmethod
  614. def getValidStateQuery():
  615. return ((Match.state != MatchState.MATCH_STATE_INVALID) &
  616. (Match.state != MatchState.MATCH_STATE_OTHER))
  617.  
  618. class Match(BaseModel):
  619. lobbies = ArrayField(IntegerField)
  620. config = JSONField()
  621. server = ForeignKeyField(Server)
  622. mapp = ForeignKeyField(Map)
  623. mtype = IntegerField(default=MatchType.MATCH_TYPE_LOBBY)
  624. state = IntegerField(default=MatchState.MATCH_STATE_PRE)
  625. size = IntegerField(default=10)
  626. level = IntegerField(default=0)
  627. created = DateTimeField(default=datetime.utcnow)
  628. result = JSONField(default={})
  629.  
  630. teama = ArrayField(IntegerField)
  631. teamb = ArrayField(IntegerField)
  632.  
  633. def getLobbies(self):
  634. for lob in self.lobbies:
  635. yield Lobby.get(Lobby.id == lob)
  636.  
  637. def cleanup(self):
  638. redis.delete("match:%s:accepted" % self.id)
  639.  
  640. def getAccepted(self):
  641. return redis.smembers("match:%s:accepted" % self.id)
  642.  
  643. def accept(self, u):
  644. redis.sadd("match:%s:accepted" % self.id, u.id)
  645.  
  646. def getPlayers(self):
  647. for lobby in self.getLobbies():
  648. for player in lobby.members:
  649. yield User.get(User.id == player)
  650.  
  651. def getTeam(self, team):
  652. t = self.teama if team.lower() == "a" else self.teamb
  653. for lobby in t:
  654. lobby = Lobby.get(Lobby.id == lobby)
  655. for player in lobby.members:
  656. yield User.get(User.id == player)
  657.  
  658. def getTeamA(self): return self.getTeam("a")
  659.  
  660. def getTeamB(self): return self.getTeam("b")
  661.  
  662. def setDefaultConfig(self):
  663. self.config = {
  664. "map": self.mapp.name
  665. }
  666.  
  667. def format(self, forServer=False):
  668. data = {
  669. "players": [i.steamid for i in self.getPlayers()],
  670. "state": self.state,
  671. "id": self.id
  672. }
  673. if forServer:
  674. data['players'] = ','.join(data['players'])
  675. else:
  676. data['server'] = self.server.format()
  677.  
  678. data.update(self.config)
  679. return data
  680.  
  681. class Ban(BaseModel):
  682. user = ForeignKeyField(User, null=True)
  683. steamid = IntegerField(null=True)
  684.  
  685. created = DateTimeField(default=datetime.utcnow)
  686. start = DateTimeField(default=datetime.utcnow)
  687. end = DateTimeField(null=True)
  688.  
  689. reason = CharField()
  690. active = BooleanField()
  691.  
  692. source = CharField()
  693.  
  694. # Match Reference
  695. match = ForeignKeyField(Match, null=True)
  696.  
  697. @classmethod
  698. def getActiveBanQuery(cls, ref=()):
  699. return (Ban.active == True) & ((Ban.end >> None) | (Ban.end < datetime.utcnow()))
  700.  
  701. def getDurationString(self):
  702. return human_readable(self.end-self.start) if self.end and self.start else "forever"
  703.  
  704. def format(self):
  705. return {
  706. "id": self.id,
  707. "user": self.user.format(),
  708. "steamid": self.steamid,
  709. "created": int(self.start.strftime("%s")),
  710. "start": int(self.start.strftime("%s")) if self.start else "",
  711. "end": int(self.end.strftime("%s")) if self.end else "",
  712. "reason": self.reason,
  713. "source": self.source,
  714. "duration": self.getDurationString()
  715. }
  716.  
  717. @classmethod
  718. def forUser(cls, u, reason, source):
  719. self = cls()
  720. self.user = u
  721. self.steamid = u.steamid
  722. self.reason = reason
  723. self.source = source
  724. self.active = True
  725. self.save()
  726. return self
  727.  
  728. class ReportState(object):
  729. REPORT_STATE_OPEN = 1
  730. REPORT_STATE_CLOSED = 2
  731. REPORT_STATE_INVALID = 3
  732. REPORT_STATE_VALID = 4
  733. REPORT_STATE_OTHER = 5
  734.  
  735. class ReportType(object):
  736. REPORT_TYPE_GENERIC = 1
  737. REPORT_TYPE_CHEAT = 2
  738. REPORT_TYPE_GRIEF = 3
  739. REPORT_TYPE_EXPLOIT = 4
  740. REPORT_TYPE_MALICIOUS = 5
  741.  
  742. class Report(BaseModel):
  743. ufrom = ForeignKeyField(User, "reports_from")
  744. uto = ForeignKeyField(User, "reports_to")
  745. ref = IntegerField()
  746. msg = TextField()
  747. state = IntegerField(default=ReportState.REPORT_STATE_OPEN)
  748. rtype = IntegerField(default=ReportType.REPORT_TYPE_GENERIC)
  749. created = DateTimeField(default=datetime.utcnow)
  750.  
  751. class Forum(BaseModel):
  752. title = CharField()
  753. perm_view = IntegerField(default=0)
  754. perm_post = IntegerField(default=0)
  755. order = IntegerField()
  756. parent = ForeignKeyField("self", "children", null=True)
  757. category = BooleanField(default=False)
  758.  
  759. @classmethod
  760. def getPermQuery(cls, view):
  761. return (Forum.perm_view <= view)
  762.  
  763. def format(self, as_level=0):
  764. data = {
  765. "title": self.title,
  766. "perms": {
  767. "view": self.perm_view,
  768. "post": self.perm_post
  769. },
  770. "order": self.order,
  771. "posts": ForumPost.select().where(ForumPost.forum == self).count()
  772. }
  773.  
  774. if self.parent:
  775. data['parent'] = self.parent.id
  776.  
  777. data['children'] = []
  778. for child in self.children:
  779. if child.perm_view > as_level: continue
  780. data['children'].append(child.format())
  781. return data
  782.  
  783. class ForumPost(BaseModel):
  784. author = ForeignKeyField(User)
  785. forum = ForeignKeyField(Forum)
  786. thread = ForeignKeyField("self")
  787. title = CharField(null=True)
  788. content = TextField()
  789. created = DateTimeField(default=datetime.utcnow)
  790. updated = DateTimeField(default=datetime.utcnow)
  791.  
  792. locked = BooleanField(default=False)
  793. hidden = BooleanField(default=False)
  794. deleted = BooleanField(default=False)
  795.  
  796. @classmethod
  797. def getThreadParentQuery(cls):
  798. return (ForumPost.thread >> None)
  799.  
  800. @classmethod
  801. def getValidQuery(cls):
  802. return ((ForumPost.locked == False) & (ForumPost.hidden == False))
  803.  
  804. def format(self, level):
  805. return {
  806. "author": self.author.id,
  807. "forum": self.forum.id,
  808. "thread": self.thread.id,
  809. "title": self.title,
  810. "content": self.content,
  811. "created": self.created,
  812. "updated": self.updated,
  813. "deleted": self.deleted
  814. }
  815.  
  816. class Diagnostic(BaseModel):
  817. ip = CharField()
  818. user = ForeignKeyField(User, null=True)
  819. data = JSONField(default={})
  820.  
  821. def load_default_maps():
  822. print "Loading default maps..."
  823. with open("content/maps.json", "r") as f:
  824. data = json.load(f)
  825. for item in data:
  826. m = Map()
  827. m.title = item['title']
  828. m.name = item['name']
  829. m.image = item['image']
  830. m.mtype = item['mtype']
  831. m.save()
  832. print " Loaded map %s, %s" % (m.title, m.id)
  833.  
  834. def create_forums():
  835. cat1 = Forum(title="GoPlayMM", perm_view=0, perm_post=100, order=0, category=True)
  836. cat1.save()
  837.  
  838. f1 = Forum(title="News & Updates", perm_view=0, perm_post=100, order=0, parent=cat1)
  839. f1.save()
  840. f2 = Forum(title="General Discussion", perm_view=0, perm_post=1, order=0, parent=cat1)
  841. f2.save()
  842.  
  843. TABLES = [
  844. User, Server, Ban, Lobby, Invite, Friendship,
  845. Map, Match, Report, Forum, ForumPost, Diagnostic
  846. ]
  847.  
  848. if __name__ == "__main__":
  849. for table in TABLES:
  850. table.drop_table(True, cascade=True)
  851. table.create_table(True)
  852.  
  853. load_default_maps()
  854. create_forums()
  855.  
  856. u = User()
  857. u.username = "test"
  858. u.steamid = 1337
  859. u.save()
  860.  
  861. u1 = User()
  862. u1.username = "Yolo Swaggings"
  863. u1.steamid = 1333337
  864. u1.save()
  865. Invite.createFriendRequest(u1, u)
  866.  
  867. b = Ban.forUser(u1, "yoloing and swagging way too hard", "b1n")
  868.  
  869. s = Server()
  870. s.name = "Test Server #1"
  871. s.region = ServerRegion.REGION_NA_IL
  872. s.hash = '1'
  873. s.hostname = "localhost"
  874. s.hosts = ["127.0.0.1", "localhost"]
  875. s.owner = u
  876. s.active = True
  877. s.save()
  878.  
  879. from worker import task_load_workshop_maps
  880. task_load_workshop_maps()
  881.  
  882. print "Server: %s | %s" % (s.id, s.hash)
  883. print "Test User: %s" % u.id
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement