model.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import re
  2. import sqlite3 as db
  3. import sys
  4. import uuid
  5. import db_setup
  6. from game import money_amount
  7. from util import debug
  8. connection = None
  9. cursor = None
  10. db_name = None
  11. def query_save_name():
  12. global db_name
  13. if debug:
  14. db_name = 'test.db'
  15. return
  16. while True:
  17. save_name = input('Name of the savegame: ')
  18. if re.match(r"[A-Za-z0-9.-]{0,50}", save_name):
  19. db_name = save_name + '.db'
  20. return
  21. def connect(reconnect=False):
  22. global connection
  23. global cursor
  24. global db_name
  25. if reconnect:
  26. connection.commit()
  27. connection.close()
  28. cursor = None
  29. connection = None
  30. db_name = None
  31. if connection is None or cursor is None:
  32. query_save_name()
  33. try:
  34. connection = db.connect(db_name)
  35. cursor = connection.cursor()
  36. except db.Error as e:
  37. print("Database error %s:" % e.args[0])
  38. sys.exit(1)
  39. # finally:
  40. # if con is not None:
  41. # con.close()
  42. def setup():
  43. connect()
  44. db_setup.setup()
  45. connection.commit()
  46. def login(username, password):
  47. connect()
  48. # do not allow login as bank
  49. if password == '':
  50. return None
  51. cursor.execute('''
  52. SELECT rowid
  53. FROM users
  54. WHERE username = ?
  55. AND password = ?
  56. ''', (username, password))
  57. user_id = cursor.fetchone()
  58. if user_id:
  59. return new_session(user_id)
  60. else:
  61. return None
  62. def register(username, password, game_key):
  63. connect()
  64. if username == '':
  65. return False
  66. if password == '':
  67. return False
  68. cursor.execute('''
  69. INSERT INTO users
  70. (username, password)
  71. VALUES (? , ?)
  72. ''', (username, password))
  73. if game_key is not None:
  74. if game_key in unused_keys():
  75. cursor.execute('''
  76. UPDATE keys
  77. WHERE used_by_user_id IS NULL
  78. AND key = ?
  79. SET used_by_user_id = (
  80. SELECT rowid
  81. FROM users
  82. WHERE username = ?
  83. )
  84. ''', (game_key, username))
  85. if cursor.fetchone()[0]!=1:
  86. raise AssertionError()
  87. # TODO: assign some money form bank
  88. return True
  89. def new_session(user_id):
  90. connect()
  91. session_id = str(uuid.uuid4())
  92. cursor.execute('''
  93. INSERT INTO SESSIONS
  94. (user_id, session_id)
  95. VALUES (? , ?)
  96. ''', (user_id[0], session_id))
  97. return session_id
  98. def save_key(key):
  99. connect()
  100. cursor.execute('''
  101. INSERT INTO keys
  102. (key)
  103. VALUES (?)
  104. ''', (key,))
  105. def drop_old_sessions():
  106. connect()
  107. # TODO: test
  108. cursor.execute('''
  109. DELETE FROM sessions s1
  110. WHERE
  111. (SELECT COUNT(*) as newer
  112. FROM sessions s2
  113. WHERE s1.user_id = s2.user_id
  114. AND s1.rowid < s2.rowid) >= 10
  115. ''')
  116. def user_exists(username):
  117. connect()
  118. cursor.execute('''
  119. SELECT rowid
  120. FROM users
  121. WHERE username = ?
  122. ''', (username,))
  123. if cursor.fetchone():
  124. return True
  125. else:
  126. return False
  127. def unused_keys():
  128. connect()
  129. cursor.execute('''
  130. SELECT key
  131. FROM keys
  132. WHERE used_by_user_id IS NULL
  133. ''')
  134. return [str(key[0]).strip().upper() for key in cursor.fetchall()]