|
|
|
@ -1,15 +1,32 @@ |
|
|
|
|
from random import choices |
|
|
|
|
import sqlite3 |
|
|
|
|
import config |
|
|
|
|
|
|
|
|
|
DB_PATH = config.DB_PATH |
|
|
|
|
CONNECTION: sqlite3.Connection |
|
|
|
|
CURSOR: sqlite3.Cursor |
|
|
|
|
|
|
|
|
|
# Database functions |
|
|
|
|
|
|
|
|
|
def get_db_connection(): |
|
|
|
|
def connect() -> None: |
|
|
|
|
'''Creates a connection to the database''' |
|
|
|
|
conn = sqlite3.connect(DB_PATH) |
|
|
|
|
conn.row_factory = sqlite3.Row |
|
|
|
|
return conn |
|
|
|
|
print('Connecting to the database...') |
|
|
|
|
global CONNECTION |
|
|
|
|
global CURSOR |
|
|
|
|
CONNECTION = sqlite3.connect(DB_PATH, autocommit=True) |
|
|
|
|
CONNECTION.row_factory = sqlite3.Row |
|
|
|
|
CURSOR = CONNECTION.cursor() |
|
|
|
|
|
|
|
|
|
def get_random_character(): |
|
|
|
|
''' Gets a random character from the database''' |
|
|
|
|
CURSOR.execute('SELECT * FROM characters') |
|
|
|
|
characters = CURSOR.fetchall() |
|
|
|
|
|
|
|
|
|
if not characters: |
|
|
|
|
return None, None, None, None |
|
|
|
|
|
|
|
|
|
weights = [c['weight'] for c in characters] |
|
|
|
|
chosen = choices(characters, weights=weights, k=1)[0] |
|
|
|
|
|
|
|
|
|
return chosen['id'], chosen['name'], chosen['file_id'], chosen['rarity'] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# User functions |
|
|
|
@ -17,64 +34,53 @@ def get_db_connection(): |
|
|
|
|
def get_or_create_user(username): |
|
|
|
|
'''Retrieves an ID for a given user, if the user does not exist, it will be |
|
|
|
|
created.''' |
|
|
|
|
conn = get_db_connection() |
|
|
|
|
conn.row_factory = sqlite3.Row |
|
|
|
|
cur = conn.cursor() |
|
|
|
|
cur.execute('SELECT id FROM users WHERE username = ?', (username,)) |
|
|
|
|
user = cur.fetchone() |
|
|
|
|
CURSOR.execute('SELECT id FROM users WHERE username = ?', (username,)) |
|
|
|
|
user = CURSOR.fetchone() |
|
|
|
|
if user: |
|
|
|
|
conn.close() |
|
|
|
|
return user[0] |
|
|
|
|
|
|
|
|
|
# New user starts with has_rolled = False |
|
|
|
|
cur.execute( |
|
|
|
|
CURSOR.execute( |
|
|
|
|
'INSERT INTO users (username, has_rolled) VALUES (?, ?)', |
|
|
|
|
(username, False) |
|
|
|
|
) |
|
|
|
|
conn.commit() |
|
|
|
|
user_id = cur.lastrowid |
|
|
|
|
conn.close() |
|
|
|
|
user_id = CURSOR.lastrowid |
|
|
|
|
return user_id |
|
|
|
|
|
|
|
|
|
def insert_character(name: str, rarity: int, weight: float, file_id: str) -> int: |
|
|
|
|
'''Inserts a character''' |
|
|
|
|
CURSOR.execute( |
|
|
|
|
'INSERT INTO characters (name, rarity, weight, file_id) VALUES (?, ?, ?, ?)', |
|
|
|
|
(name, rarity, weight, file_id) |
|
|
|
|
) |
|
|
|
|
character_id = CURSOR.lastrowid |
|
|
|
|
return character_id if character_id else 0 |
|
|
|
|
|
|
|
|
|
# Gameplay functions |
|
|
|
|
|
|
|
|
|
def add_pull(user_id, character_id): |
|
|
|
|
def insert_pull(user_id, character_id): |
|
|
|
|
'''Creates a pull in the database''' |
|
|
|
|
conn = get_db_connection() |
|
|
|
|
cur = conn.cursor() |
|
|
|
|
cur.execute('INSERT INTO pulls (user_id, character_id) VALUES (?, ?)', (user_id, character_id)) |
|
|
|
|
conn.commit() |
|
|
|
|
conn.close() |
|
|
|
|
CURSOR.execute( |
|
|
|
|
'INSERT INTO pulls (user_id, character_id) VALUES (?, ?)', |
|
|
|
|
(user_id, character_id) |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
def get_last_rolled_at(user_id): |
|
|
|
|
'''Gets the timestamp when the user last rolled''' |
|
|
|
|
conn = get_db_connection() |
|
|
|
|
cur = conn.cursor() |
|
|
|
|
cur.execute("SELECT timestamp FROM pulls WHERE user_id = ? ORDER BY timestamp DESC", \ |
|
|
|
|
CURSOR.execute("SELECT timestamp FROM pulls WHERE user_id = ? ORDER BY timestamp DESC", \ |
|
|
|
|
(user_id,)) |
|
|
|
|
row = cur.fetchone() |
|
|
|
|
conn.close() |
|
|
|
|
row = CURSOR.fetchone() |
|
|
|
|
return row[0] if row else None |
|
|
|
|
|
|
|
|
|
# Configuration |
|
|
|
|
|
|
|
|
|
def get_config(key): |
|
|
|
|
'''Reads the value for a specified config key from the db''' |
|
|
|
|
conn = get_db_connection() |
|
|
|
|
cur = conn.cursor() |
|
|
|
|
cur.execute("SELECT value FROM config WHERE key = ?", (key,)) |
|
|
|
|
row = cur.fetchone() |
|
|
|
|
conn.close() |
|
|
|
|
CURSOR.execute("SELECT value FROM config WHERE key = ?", (key,)) |
|
|
|
|
row = CURSOR.fetchone() |
|
|
|
|
return row[0] if row else None |
|
|
|
|
|
|
|
|
|
def set_config(key, value): |
|
|
|
|
'''Writes the value for a specified config key to the db''' |
|
|
|
|
conn = get_db_connection() |
|
|
|
|
cur = conn.cursor() |
|
|
|
|
cur.execute("INSERT OR REPLACE INTO config (key, value) VALUES (?, ?)", (key, value)) |
|
|
|
|
conn.commit() |
|
|
|
|
conn.close() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Character stat functions |
|
|
|
|