import sqlite3 import os import bcrypt def create_user_database(): os.makedirs(f'{os.getcwd()}/databases/sql', exist_ok=True) with sqlite3.connect(f'{os.getcwd()}/databases/sql/users.db') as conn: cursor = conn.cursor() cursor.execute(''' CREATE TABLE IF NOT EXISTS user_info ( Username TEXT PRIMARY KEY, Password TEXT, Styled_Username TEXT, API_Key TEXT ) ''') def add_user(username, password, api_key): hashed_pw = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()) with sqlite3.connect(f'{os.getcwd()}/databases/sql/users.db') as conn: cursor = conn.cursor() try: cursor.execute('INSERT INTO user_info (Username, Password, Styled_Username, API_Key) VALUES (?, ?, ?, ?)', (username.lower(), hashed_pw, username, api_key)) conn.commit() return True except sqlite3.IntegrityError: return False def verify_user(username, password): with sqlite3.connect(f'{os.getcwd()}/databases/sql/users.db') as conn: cursor = conn.cursor() cursor.execute('SELECT Password FROM user_info WHERE Username = ?', (username.lower(),)) result = cursor.fetchone() if result: stored_hash = result[0] # Ensure stored_hash is bytes; decode if it's still a string (SQLite may store as TEXT) if isinstance(stored_hash, str): stored_hash = stored_hash.encode('utf-8') return bcrypt.checkpw(password.encode('utf-8'), stored_hash) else: return False def fetch_api_key(username): with sqlite3.connect(f'{os.getcwd()}/databases/sql/users.db') as conn: cursor = conn.cursor() cursor.execute('SELECT API_Key FROM user_info WHERE Username = ?', (username.lower(),)) result = cursor.fetchone() if result: return result[0] else: return None def change_password(username, new_password): # Hash the new password new_hashed_pw = bcrypt.hashpw(new_password.encode('utf-8'), bcrypt.gensalt()) # Update the password in the database with sqlite3.connect(f'{os.getcwd()}/databases/sql/users.db') as conn: cursor = conn.cursor() cursor.execute('UPDATE user_info SET Password = ? WHERE Username = ?', (new_hashed_pw, username.lower())) conn.commit() return True def change_api_key(username, new_api_key): # Update the API key in the database with sqlite3.connect(f'{os.getcwd()}/databases/sql/users.db') as conn: cursor = conn.cursor() cursor.execute('UPDATE user_info SET API_Key = ? WHERE Username = ?', (new_api_key, username.lower())) conn.commit() return True def fetch_styled_username(username): with sqlite3.connect(f'{os.getcwd()}/databases/sql/users.db') as conn: cursor = conn.cursor() cursor.execute('SELECT Styled_Username FROM user_info WHERE Username = ?', (username.lower(),)) result = cursor.fetchone() if result: return result[0] else: return None def fetch_username_by_api_key(api_key): with sqlite3.connect(f'{os.getcwd()}/databases/sql/users.db') as conn: cursor = conn.cursor() cursor.execute('SELECT Username FROM user_info WHERE API_Key = ?', (api_key,)) result = cursor.fetchone() if result: return result[0] # Return the username else: return None # If no user is found for the API key