2025-04-30 03:42:38 -04:00
|
|
|
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,
|
2025-04-30 20:11:17 -04:00
|
|
|
Password TEXT,
|
|
|
|
Styled_Username TEXT,
|
|
|
|
API_Key TEXT
|
2025-04-30 03:42:38 -04:00
|
|
|
)
|
|
|
|
''')
|
|
|
|
|
|
|
|
|
2025-04-30 20:11:17 -04:00
|
|
|
def add_user(username, password, api_key):
|
2025-04-30 03:42:38 -04:00
|
|
|
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:
|
2025-04-30 20:11:17 -04:00
|
|
|
cursor.execute('INSERT INTO user_info (Username, Password, Styled_Username, API_Key) VALUES (?, ?, ?, ?)', (username.lower(), hashed_pw, username, api_key))
|
2025-04-30 03:42:38 -04:00
|
|
|
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()
|
2025-04-30 20:11:17 -04:00
|
|
|
cursor.execute('SELECT Password FROM user_info WHERE Username = ?', (username.lower(),))
|
2025-04-30 03:42:38 -04:00
|
|
|
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
|
2025-04-30 20:11:17 -04:00
|
|
|
|
|
|
|
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
|