model.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. import re
  2. import sqlite3 as db
  3. import sys
  4. import uuid
  5. from game import money_amount
  6. from util import debug
  7. connection = None
  8. cursor = None
  9. db_name = None
  10. def query_save_name():
  11. global db_name
  12. if debug:
  13. db_name = 'test.db'
  14. return
  15. while True:
  16. save_name = input('Name of the savegame: ')
  17. if re.match(r"[A-Za-z0-9.-]{0,50}", save_name):
  18. db_name = save_name + '.db'
  19. return
  20. def connect(reconnect=False):
  21. global connection
  22. global cursor
  23. global db_name
  24. if reconnect:
  25. connection.commit()
  26. connection.close()
  27. cursor = None
  28. connection = None
  29. db_name = None
  30. if connection is None or cursor is None:
  31. query_save_name()
  32. try:
  33. connection = db.connect(db_name)
  34. cursor = connection.cursor()
  35. except db.Error as e:
  36. print("Database error %s:" % e.args[0])
  37. sys.exit(1)
  38. # finally:
  39. # if con is not None:
  40. # con.close()
  41. def setup():
  42. connect()
  43. print('Database setup...')
  44. replace = False
  45. if replace:
  46. print(' Dropping old tables...')
  47. cursor.execute("DROP TABLE IF EXISTS users")
  48. cursor.execute("DROP TABLE IF EXISTS ownables")
  49. cursor.execute("DROP TABLE IF EXISTS ownership")
  50. cursor.execute("DROP TABLE IF EXISTS sessions")
  51. cursor.execute("DROP TABLE IF EXISTS transactions")
  52. print(' Creating tables...')
  53. cursor.execute('''
  54. CREATE TABLE IF NOT EXISTS users(
  55. username VARCHAR(10) UNIQUE NOT NULL,
  56. password VARCHAR(6) NOT NULL)
  57. ''')
  58. cursor.execute('''
  59. CREATE TABLE IF NOT EXISTS ownables(
  60. name VARCHAR(10) UNIQUE NOT NULL,
  61. total_amount INTEGER NOT NULL)
  62. ''')
  63. cursor.execute('''
  64. CREATE TABLE IF NOT EXISTS ownership(
  65. user_id INTEGER NOT NULL,
  66. stock_id INTEGER NOT NULL,
  67. amount INTEGER NOT NULL DEFAULT 0,
  68. FOREIGN KEY (user_id) REFERENCES users(rowid),
  69. FOREIGN KEY (stock_id) REFERENCES ownables(rowid),
  70. UNIQUE (user_id, stock_id)
  71. )
  72. ''')
  73. cursor.execute('''
  74. CREATE TABLE IF NOT EXISTS sessions(
  75. user_id INTEGER NOT NULL,
  76. session_id STRING NOT NULL,
  77. FOREIGN KEY (user_id) REFERENCES users(rowid)
  78. )
  79. ''')
  80. cursor.execute('''
  81. CREATE TABLE IF NOT EXISTS sessions(
  82. user_id INTEGER NOT NULL,
  83. session_id STRING NOT NULL,
  84. FOREIGN KEY (user_id) REFERENCES users(rowid)
  85. )
  86. ''')
  87. if replace:
  88. print(' Adding initial data...')
  89. cursor.execute('''
  90. INSERT INTO users
  91. (username, password)
  92. VALUES ("bank", "")
  93. ''')
  94. cursor.execute('''
  95. SELECT rowid
  96. FROM users
  97. WHERE username = "bank"
  98. ''')
  99. bank_id = cursor.fetchone()[0]
  100. cursor.execute('''
  101. INSERT INTO ownables
  102. (name, total_amount)
  103. VALUES ("Kollar", ?)
  104. ''', (money_amount,))
  105. cursor.execute('''
  106. SELECT rowid
  107. FROM users
  108. WHERE username = "bank"
  109. ''')
  110. kollar_id = cursor.fetchone()[0]
  111. cursor.execute('''
  112. INSERT INTO ownership
  113. (user_id, stock_id, amount)
  114. VALUES (?, ?, ?)
  115. ''', (bank_id, kollar_id, money_amount))
  116. def login(username, password):
  117. connect()
  118. # do not allow login as bank
  119. if password == '':
  120. return None
  121. cursor.execute('''
  122. SELECT rowid
  123. FROM users
  124. WHERE username = ?
  125. AND password = ?
  126. ''', (username, password))
  127. user_id = cursor.fetchone()
  128. if user_id:
  129. return new_session(user_id)
  130. else:
  131. return None
  132. def register(username, password):
  133. connect()
  134. if username == '':
  135. return False
  136. if password == '':
  137. return False
  138. cursor.execute('''
  139. INSERT INTO users
  140. (username, password)
  141. VALUES (? , ?)
  142. ''', (username, password))
  143. return True
  144. def new_session(user_id):
  145. connect()
  146. session_id = str(uuid.uuid4())
  147. cursor.execute('''
  148. INSERT INTO SESSIONS
  149. (user_id, session_id)
  150. VALUES (? , ?)
  151. ''', (user_id[0], session_id))
  152. return session_id
  153. def drop_old_sessions():
  154. connect()
  155. # TODO: test
  156. cursor.execute('''
  157. DELETE FROM sessions s1
  158. WHERE
  159. (SELECT COUNT(*) as newer
  160. FROM sessions s2
  161. WHERE s1.user_id = s2.user_id
  162. AND s1.rowid < s2.rowid) >= 10
  163. ''')
  164. def user_exists(username):
  165. connect()
  166. cursor.execute('''
  167. SELECT rowid
  168. FROM users
  169. WHERE username = ?
  170. ''', (username,))
  171. if cursor.fetchone():
  172. return True
  173. else:
  174. return False
  175. def move_money(username):
  176. connect()
  177. cursor.execute()