💾 Archived View for pantasya.mooo.com › cgi-bin › db.py captured on 2023-09-08 at 16:03:38.

View Raw

More Information

-=-=-=-=-=-=-

import sqlite3
from sqlite3 import Error
import os
import urllib.parse

dir_name = os.path.dirname(__file__)
db_name = r"boggle.sqlite3"
db_file = os.path.join(dir_name, db_name)

def create_connection():
    """ create a database connection to the SQLite database
        specified by db_file
    :return: Connection object or None
    """
    conn = None
    try:
        conn = sqlite3.connect(db_file)
    except Error as e:
        print(e)
    return conn

def add_user(conn):
    """
    Create a new user record
    :param conn: database connection object
    :return: user id
    """
    sql = ''' INSERT INTO users DEFAULT VALUES '''
    cur = conn.cursor()
    try:
        cur.execute(sql)
        conn.commit()
    except:
        return 'error in insert'
    return cur.lastrowid

def add_hash(conn, tls_client_hash, user_id):
    """
    Create a new record for this cert
    :param conn: database connection object
    :param tls_client_hash:
    :param user_id:
    :return: certificate id
    """
    sql = ''' INSERT OR REPLACE INTO certs(hash,user_id) VALUES(?,?) '''
    cur = conn.cursor()
    cur.execute(sql, (tls_client_hash, user_id))
    conn.commit()
    return cur.lastrowid

def get_user(conn, tls_client_hash):
    """
    Get user id matching tls_client_hash if it exists
    :param conn: database connection object
    :param tls_client_hash:
    :return: user id or None
    """
    cur = conn.cursor()
    cur.execute("SELECT user_id FROM certs WHERE hash=?", (tls_client_hash,))
    row = cur.fetchone()
    if row is None:
        return None
    else:
        return row[0] # user_id

def get_user_by_keycode(conn, key_code):
    """
    Get user id of tls_client_hash if it exists
    :param conn: database connection object
    :param key_code: authorization key code
    :return: user id or None
    """
    cur = conn.cursor()
    cur.execute("SELECT id FROM users WHERE add_key_code=?", (key_code,))
    row = cur.fetchone()
    if row is None:
        return None
    else:
        return row[0] # user_id

def check_hash(tls_client_hash):
    """
    Check for existing user with hash or add a new one
    :param conn:
    :param tls_client_hash:
    :return: user id
    """
    conn = create_connection()
    with conn:
        user_id = get_user(conn, tls_client_hash)
        if (user_id is None):
            user_id = add_user(conn)
            add_hash(conn, tls_client_hash, user_id)
        return user_id

def get_name(user_id):
    """
    Get user name if it exists
    :param user_id:
    :return: user name
    """
    conn = create_connection()
    with conn:
        cur = conn.cursor()
        cur.execute("SELECT name FROM users WHERE id=?", (user_id,))
        row = cur.fetchone()
        if row is None:
            return None
        else:
            return row[0] # user_name

def set_name(user_id, user_name):
    """
    Update or set name on user
    :param user_id:
    :param user_name:
    """
    conn = create_connection()
    with conn:
        sql = ''' UPDATE users SET name=(?) WHERE id=? '''
        cur = conn.cursor()
        cur.execute(sql, (urllib.parse.unquote(user_name), user_id))
        conn.commit()
        return cur.lastrowid



def set_add_key_code(user_id, key_code):
    """
    Update or set key code on user
    :param user_id:
    :param key_code:
    """
    conn = create_connection()
    with conn:
        """ There should probably be a check here to ensure no user
            has this key_code already
        """
        sql = ''' UPDATE users SET add_key_code=(?) WHERE id=? '''
        cur = conn.cursor()
        cur.execute(sql, (key_code, user_id))
        conn.commit()
        return cur.lastrowid

def add_cert_to_user(key_code, tls_client_hash):
    """
    Check for existing user with hash or add a new one
    :param conn:
    :param key_code:
    :param tls_client_hash:
    :return: true if added, false if not found
    """
    conn = create_connection()
    with conn:
        user_id = get_user_by_keycode(conn, key_code)
        if (user_id is None):
            return False
        add_hash(conn, tls_client_hash, user_id)
        return True



def create_new_game(conn,board,words,graph):
    """
    Create a new game record
    :param conn: database connection object
    :param board: game board 
    :param words: found words
    :param graph: word guessed list
    :return: game id
    """
    sql = ''' INSERT INTO games(board,words,graph,stats) VALUES(?,?,?,?) '''
    cur = conn.cursor()
    cur.execute(sql,
      (board,words,graph,"PLAY")
    )
    conn.commit()
    return cur.lastrowid

def set_current_game(user_id,game_id):
    conn = create_connection()
    with conn:
        cur = conn.cursor()
        cur.execute("UPDATE users SET game_id=? WHERE id=?", (game_id,user_id))


def get_game_id(user_id):
    """
    Get game id if it exists
    :param user_id:.
    :return: game id
    """
    conn = create_connection()
    with conn:
        cur = conn.cursor()
        cur.execute("SELECT game_id FROM users WHERE id=?", (user_id,))
        row = cur.fetchone()
        if row is None:
            return None
        else:
            return row[0] # game_id

def get_words(game_id,user_id):
    """
    Get game id if it exists
    :param user_id:.
    :return: game id
    """
    conn = create_connection()
    with conn:
        cur = conn.cursor()
        cur.execute("SELECT words FROM plays WHERE game_id=? and user_id=?", (game_id,user_id,))
        row = cur.fetchone()
        if row is None:
            return None
        else:
            return row[0] # game_id

def add_plays(game_id,user_id,words):
    conn = create_connection()
    with conn:
        cur = conn.cursor()
        cur.execute("INSERT OR REPLACE INTO plays(game_id,user_id,words) values(?,?,?)", (game_id,user_id,words))

def set_game_graph(game_id,graph):
    conn = create_connection()
    with conn:
        cur = conn.cursor()
        cur.execute("UPDATE games SET graph=? WHERE id=?", (graph,game_id))

def get_game_graph(game_id):
    conn = create_connection()
    with conn:
        cur = conn.cursor()
        cur.execute("SELECT graph FROM games WHERE id=?", (game_id,))
        row = cur.fetchone()
        if row is None:
            return None
        else:
            return row[0] # game_id


def set_game_stats(game_id,stats):
    conn = create_connection()
    with conn:
        cur = conn.cursor()
        cur.execute("UPDATE games SET stats=? WHERE id=?", (stats,game_id))

def get_game_stats(game_id):
    conn = create_connection()
    with conn:
        cur = conn.cursor()
        cur.execute("SELECT stats FROM games WHERE id=?", (game_id,))
        row = cur.fetchone()
        if row is None:
            return None
        else:
            return row[0] # game_id

def add_score(user_id,points):
    conn = create_connection()
    with conn:
        cur = conn.cursor()
        cur.execute("UPDATE users SET score=score+? WHERE id=?", (points,user_id))

def get_score(user_id):
    conn = create_connection()
    with conn:
        cur = conn.cursor()
        cur.execute("SELECT score FROM users WHERE id=?", (user_id,))
        row = cur.fetchone()
        if row is None:
            return None
        else:
            return row[0] # game_id



#vim:fenc=utf-8:ts=4:sw=4:sta:noet:sts=4:fdm=marker:ai