import re import sqlite3 as db import sys import uuid import db_setup from game import money_amount from util import debug connection = None cursor = None db_name = None def query_save_name(): global db_name if debug: db_name = 'test.db' return while True: save_name = input('Name of the savegame: ') if re.match(r"[A-Za-z0-9.-]{0,50}", save_name): db_name = save_name + '.db' return def connect(reconnect=False): global connection global cursor global db_name if reconnect: connection.commit() connection.close() cursor = None connection = None db_name = None if connection is None or cursor is None: query_save_name() try: connection = db.connect(db_name) cursor = connection.cursor() except db.Error as e: print("Database error %s:" % e.args[0]) sys.exit(1) # finally: # if con is not None: # con.close() def setup(): connect() db_setup.setup() connection.commit() def login(username, password): connect() # do not allow login as bank if password == '': return None cursor.execute(''' SELECT rowid FROM users WHERE username = ? AND password = ? ''', (username, password)) user_id = cursor.fetchone() if user_id: return new_session(user_id) else: return None def register(username, password, game_key): connect() if username == '': return False if password == '': return False cursor.execute(''' INSERT INTO users (username, password) VALUES (? , ?) ''', (username, password)) if game_key is not None: if game_key in unused_keys(): cursor.execute(''' UPDATE keys WHERE used_by_user_id IS NULL AND key = ? SET used_by_user_id = ( SELECT rowid FROM users WHERE username = ? ) ''', (game_key, username)) if cursor.fetchone()[0]!=1: raise AssertionError() # TODO: assign some money form bank return True def new_session(user_id): connect() session_id = str(uuid.uuid4()) cursor.execute(''' INSERT INTO SESSIONS (user_id, session_id) VALUES (? , ?) ''', (user_id[0], session_id)) return session_id def save_key(key): connect() cursor.execute(''' INSERT INTO keys (key) VALUES (?) ''', (key,)) def drop_old_sessions(): connect() # TODO: test cursor.execute(''' DELETE FROM sessions s1 WHERE (SELECT COUNT(*) as newer FROM sessions s2 WHERE s1.user_id = s2.user_id AND s1.rowid < s2.rowid) >= 10 ''') def user_exists(username): connect() cursor.execute(''' SELECT rowid FROM users WHERE username = ? ''', (username,)) if cursor.fetchone(): return True else: return False def unused_keys(): connect() cursor.execute(''' SELECT key FROM keys WHERE used_by_user_id IS NULL ''') return [str(key[0]).strip().upper() for key in cursor.fetchall()]