From be89cc3acd0229d02c0e0f042291aa738c339986 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20L=27abb=C3=A9?= Date: Sun, 31 May 2026 11:16:44 +0000 Subject: [PATCH] Refactor database management and schema initialization - Removed the old npc_memory.db file. - Updated time.txt with a new timestamp. - Refactored transaction recording in bank_functions.py to use parameterized queries. - Enhanced DatabaseManager in sql_commands.py to support singleton pattern and improved table creation logic. - Added methods for sanitizing SQL identifiers and parsing insert columns for upsert operations. - Improved error handling and connection management in execute_query, fetch_one, fetch_all, and fetch_as_dataframe methods. - Introduced a new bootstrap_database.py script for initializing the database schema. - Updated app.py to use the new initialize_database function for database management. --- bootstrap_database.py | 6 + bot.py | 3 +- bot_development.py | 2 + cogs/customCommands.py | 2 +- database.log | 1974 +++++++++++++++++++++++++++ npc_memory.db | Bin 20480 -> 0 bytes time.txt | 2 +- utils/bank_functions.py | 5 +- utils/sql_commands.py | 228 +++- web/__pycache__/app.cpython-312.pyc | Bin 14783 -> 14798 bytes web/app.py | 6 +- 11 files changed, 2175 insertions(+), 53 deletions(-) create mode 100644 bootstrap_database.py delete mode 100644 npc_memory.db diff --git a/bootstrap_database.py b/bootstrap_database.py new file mode 100644 index 0000000..3b7f9fb --- /dev/null +++ b/bootstrap_database.py @@ -0,0 +1,6 @@ +from utils.sql_commands import initialize_database + + +if __name__ == "__main__": + initialize_database() + print("Database initialization complete.") diff --git a/bot.py b/bot.py index 2f6d4b0..a9c7813 100755 --- a/bot.py +++ b/bot.py @@ -4,6 +4,7 @@ from discord.ext import commands import os from dotenv import load_dotenv from web.app import app +from utils.sql_commands import initialize_database import threading import itertools @@ -50,9 +51,9 @@ class Client(commands.Bot): def main(): load_dotenv() + initialize_database() client = Client() token = os.getenv("TOKEN") - print(token) if token is not None: threading.Thread(target=run_web, daemon=True).start() client.run(token) diff --git a/bot_development.py b/bot_development.py index fe65a94..f6b6905 100755 --- a/bot_development.py +++ b/bot_development.py @@ -4,6 +4,7 @@ from discord.ext import commands import os from dotenv import load_dotenv from web.app import app +from utils.sql_commands import initialize_database import threading @@ -58,6 +59,7 @@ class Client(commands.Bot): def main(): load_dotenv() + initialize_database() client = Client() token = os.getenv("TOKEN") if token is not None: diff --git a/cogs/customCommands.py b/cogs/customCommands.py index 88113c3..3f7b089 100755 --- a/cogs/customCommands.py +++ b/cogs/customCommands.py @@ -63,7 +63,7 @@ class CustomCommandsCog(commands.Cog): ) self.invalidate_cache(guild_id) # Invalidate cache after change - if deleted_rows is not None and len(deleted_rows) > 0: + if deleted_rows and deleted_rows > 0: await ctx.send(f"Custom command `{command_name}` has been deleted!") else: await ctx.send(f"Custom command `{command_name}` not found.") diff --git a/database.log b/database.log index 8cfc419..04656ca 100644 --- a/database.log +++ b/database.log @@ -15688,3 +15688,1977 @@ Loop thread traceback (most recent call last): 2025-10-02 10:14:38,171 - INFO - XP: 475, Level: 4 2025-10-02 10:14:38,411 - INFO - Executed query: INSERT INTO users (ID, XP, LEVEL) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE XP = %s, LEVEL = %s with params: (601579326714019840, 486, 4, 486, 4) 2025-10-02 10:59:20,063 - INFO - Shard ID None has successfully RESUMED session 68d9048b6dab9a1f2b4cb71a61433b0d. +2026-04-01 12:51:55,771 - INFO - Loaded environment variables from .env +2026-04-01 12:51:55,840 - INFO - Database connection pool created. +2026-04-01 12:51:55,873 - INFO - Executed query: CREATE TABLE IF NOT EXISTS feedback ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + ) with params: None +2026-04-01 12:51:55,875 - INFO - Ensured table feedback exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + +2026-04-01 12:51:55,885 - INFO - Executed query: CREATE TABLE IF NOT EXISTS afk_status ( + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + ) with params: None +2026-04-01 12:51:55,887 - INFO - Ensured table afk_status exists with schema: + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + +2026-04-01 12:51:55,905 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_tickets ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + ) with params: None +2026-04-01 12:51:55,907 - INFO - Ensured table lottery_tickets exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + +2026-04-01 12:51:55,932 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_results ( + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + ) with params: None +2026-04-01 12:51:55,934 - INFO - Ensured table lottery_results exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + +2026-04-01 12:51:55,957 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_state ( + id INT PRIMARY KEY, + jackpot INT NOT NULL + ) with params: None +2026-04-01 12:51:55,962 - INFO - Ensured table lottery_state exists with schema: + id INT PRIMARY KEY, + jackpot INT NOT NULL + +2026-04-01 12:51:56,000 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_draw_time ( + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + ) with params: None +2026-04-01 12:51:56,005 - INFO - Ensured table lottery_draw_time exists with schema: + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + +2026-04-01 12:51:56,042 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_luck ( + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + ) with params: None +2026-04-01 12:51:56,045 - INFO - Ensured table lottery_luck exists with schema: + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + +2026-04-01 12:51:56,079 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_groups ( + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + ) with params: None +2026-04-01 12:51:56,082 - INFO - Ensured table lottery_groups exists with schema: + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + +2026-04-01 12:51:56,101 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_group_members ( + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + ) with params: None +2026-04-01 12:51:56,106 - INFO - Ensured table lottery_group_members exists with schema: + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + +2026-04-01 12:51:56,125 - INFO - Executed query: CREATE TABLE IF NOT EXISTS gamble_rooms ( + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + ) with params: None +2026-04-01 12:51:56,130 - INFO - Ensured table gamble_rooms exists with schema: + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + +2026-04-01 12:51:56,144 - WARNING - PyNaCl is not installed, voice will NOT be supported +2026-04-01 12:51:56,146 - INFO - logging in using static token +2026-04-01 12:51:56,152 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:8080 + * Running on http://172.17.0.4:8080 +2026-04-01 12:51:56,152 - INFO - Press CTRL+C to quit +2026-04-01 12:51:56,790 - INFO - Loaded environment variables from .env +2026-04-01 12:51:56,862 - INFO - Database connection pool created. +2026-04-01 12:51:56,873 - INFO - Executed query: CREATE TABLE IF NOT EXISTS feedback ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + ) with params: None +2026-04-01 12:51:56,875 - INFO - Ensured table feedback exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + +2026-04-01 12:51:56,886 - INFO - Executed query: CREATE TABLE IF NOT EXISTS afk_status ( + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + ) with params: None +2026-04-01 12:51:56,889 - INFO - Ensured table afk_status exists with schema: + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + +2026-04-01 12:51:56,898 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_tickets ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + ) with params: None +2026-04-01 12:51:56,901 - INFO - Ensured table lottery_tickets exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + +2026-04-01 12:51:56,910 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_results ( + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + ) with params: None +2026-04-01 12:51:56,913 - INFO - Ensured table lottery_results exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + +2026-04-01 12:51:56,922 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_state ( + id INT PRIMARY KEY, + jackpot INT NOT NULL + ) with params: None +2026-04-01 12:51:56,924 - INFO - Ensured table lottery_state exists with schema: + id INT PRIMARY KEY, + jackpot INT NOT NULL + +2026-04-01 12:51:56,937 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_draw_time ( + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + ) with params: None +2026-04-01 12:51:56,941 - INFO - Ensured table lottery_draw_time exists with schema: + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + +2026-04-01 12:51:56,950 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_luck ( + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + ) with params: None +2026-04-01 12:51:56,953 - INFO - Ensured table lottery_luck exists with schema: + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + +2026-04-01 12:51:56,965 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_groups ( + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + ) with params: None +2026-04-01 12:51:56,967 - INFO - Ensured table lottery_groups exists with schema: + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + +2026-04-01 12:51:56,977 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_group_members ( + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + ) with params: None +2026-04-01 12:51:56,980 - INFO - Ensured table lottery_group_members exists with schema: + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + +2026-04-01 12:51:56,989 - INFO - Executed query: CREATE TABLE IF NOT EXISTS gamble_rooms ( + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + ) with params: None +2026-04-01 12:51:56,991 - INFO - Ensured table gamble_rooms exists with schema: + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + +2026-04-01 12:51:57,006 - INFO - Loaded environment variables from .env +2026-04-01 12:51:57,064 - INFO - Database connection pool created. +2026-04-01 12:51:57,074 - INFO - Executed query: CREATE TABLE IF NOT EXISTS feedback ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + ) with params: None +2026-04-01 12:51:57,077 - INFO - Ensured table feedback exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + +2026-04-01 12:51:57,086 - INFO - Executed query: CREATE TABLE IF NOT EXISTS afk_status ( + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + ) with params: None +2026-04-01 12:51:57,088 - INFO - Ensured table afk_status exists with schema: + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + +2026-04-01 12:51:57,098 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_tickets ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + ) with params: None +2026-04-01 12:51:57,100 - INFO - Ensured table lottery_tickets exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + +2026-04-01 12:51:57,110 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_results ( + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + ) with params: None +2026-04-01 12:51:57,112 - INFO - Ensured table lottery_results exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + +2026-04-01 12:51:57,124 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_state ( + id INT PRIMARY KEY, + jackpot INT NOT NULL + ) with params: None +2026-04-01 12:51:57,126 - INFO - Ensured table lottery_state exists with schema: + id INT PRIMARY KEY, + jackpot INT NOT NULL + +2026-04-01 12:51:57,135 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_draw_time ( + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + ) with params: None +2026-04-01 12:51:57,138 - INFO - Ensured table lottery_draw_time exists with schema: + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + +2026-04-01 12:51:57,147 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_luck ( + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + ) with params: None +2026-04-01 12:51:57,150 - INFO - Ensured table lottery_luck exists with schema: + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + +2026-04-01 12:51:57,159 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_groups ( + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + ) with params: None +2026-04-01 12:51:57,161 - INFO - Ensured table lottery_groups exists with schema: + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + +2026-04-01 12:51:57,171 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_group_members ( + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + ) with params: None +2026-04-01 12:51:57,173 - INFO - Ensured table lottery_group_members exists with schema: + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + +2026-04-01 12:51:57,182 - INFO - Executed query: CREATE TABLE IF NOT EXISTS gamble_rooms ( + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + ) with params: None +2026-04-01 12:51:57,185 - INFO - Ensured table gamble_rooms exists with schema: + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + +2026-04-01 12:51:57,189 - INFO - Loaded environment variables from .env +2026-04-01 12:51:57,247 - INFO - Database connection pool created. +2026-04-01 12:51:57,257 - INFO - Executed query: CREATE TABLE IF NOT EXISTS feedback ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + ) with params: None +2026-04-01 12:51:57,259 - INFO - Ensured table feedback exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + +2026-04-01 12:51:57,271 - INFO - Executed query: CREATE TABLE IF NOT EXISTS afk_status ( + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + ) with params: None +2026-04-01 12:51:57,274 - INFO - Ensured table afk_status exists with schema: + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + +2026-04-01 12:51:57,285 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_tickets ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + ) with params: None +2026-04-01 12:51:57,288 - INFO - Ensured table lottery_tickets exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + +2026-04-01 12:51:57,297 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_results ( + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + ) with params: None +2026-04-01 12:51:57,299 - INFO - Ensured table lottery_results exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + +2026-04-01 12:51:57,308 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_state ( + id INT PRIMARY KEY, + jackpot INT NOT NULL + ) with params: None +2026-04-01 12:51:57,311 - INFO - Ensured table lottery_state exists with schema: + id INT PRIMARY KEY, + jackpot INT NOT NULL + +2026-04-01 12:51:57,321 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_draw_time ( + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + ) with params: None +2026-04-01 12:51:57,323 - INFO - Ensured table lottery_draw_time exists with schema: + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + +2026-04-01 12:51:57,332 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_luck ( + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + ) with params: None +2026-04-01 12:51:57,335 - INFO - Ensured table lottery_luck exists with schema: + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + +2026-04-01 12:51:57,344 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_groups ( + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + ) with params: None +2026-04-01 12:51:57,347 - INFO - Ensured table lottery_groups exists with schema: + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + +2026-04-01 12:51:57,357 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_group_members ( + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + ) with params: None +2026-04-01 12:51:57,359 - INFO - Ensured table lottery_group_members exists with schema: + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + +2026-04-01 12:51:57,368 - INFO - Executed query: CREATE TABLE IF NOT EXISTS gamble_rooms ( + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + ) with params: None +2026-04-01 12:51:57,371 - INFO - Ensured table gamble_rooms exists with schema: + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + +2026-04-01 12:51:57,389 - INFO - Loaded environment variables from .env +2026-04-01 12:51:57,448 - INFO - Database connection pool created. +2026-04-01 12:51:57,458 - INFO - Executed query: CREATE TABLE IF NOT EXISTS feedback ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + ) with params: None +2026-04-01 12:51:57,460 - INFO - Ensured table feedback exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + +2026-04-01 12:51:57,470 - INFO - Executed query: CREATE TABLE IF NOT EXISTS afk_status ( + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + ) with params: None +2026-04-01 12:51:57,473 - INFO - Ensured table afk_status exists with schema: + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + +2026-04-01 12:51:57,500 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_tickets ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + ) with params: None +2026-04-01 12:51:57,506 - INFO - Ensured table lottery_tickets exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + +2026-04-01 12:51:57,521 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_results ( + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + ) with params: None +2026-04-01 12:51:57,526 - INFO - Ensured table lottery_results exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + +2026-04-01 12:51:57,544 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_state ( + id INT PRIMARY KEY, + jackpot INT NOT NULL + ) with params: None +2026-04-01 12:51:57,547 - INFO - Ensured table lottery_state exists with schema: + id INT PRIMARY KEY, + jackpot INT NOT NULL + +2026-04-01 12:51:57,557 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_draw_time ( + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + ) with params: None +2026-04-01 12:51:57,559 - INFO - Ensured table lottery_draw_time exists with schema: + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + +2026-04-01 12:51:57,569 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_luck ( + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + ) with params: None +2026-04-01 12:51:57,571 - INFO - Ensured table lottery_luck exists with schema: + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + +2026-04-01 12:51:57,581 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_groups ( + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + ) with params: None +2026-04-01 12:51:57,584 - INFO - Ensured table lottery_groups exists with schema: + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + +2026-04-01 12:51:57,595 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_group_members ( + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + ) with params: None +2026-04-01 12:51:57,597 - INFO - Ensured table lottery_group_members exists with schema: + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + +2026-04-01 12:51:57,607 - INFO - Executed query: CREATE TABLE IF NOT EXISTS gamble_rooms ( + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + ) with params: None +2026-04-01 12:51:57,609 - INFO - Ensured table gamble_rooms exists with schema: + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + +2026-04-01 12:51:57,619 - INFO - Executed query: SELECT * FROM gamble_rooms with params: None +2026-04-01 12:51:57,647 - INFO - Loaded environment variables from .env +2026-04-01 12:51:57,707 - INFO - Database connection pool created. +2026-04-01 12:51:57,716 - INFO - Executed query: CREATE TABLE IF NOT EXISTS feedback ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + ) with params: None +2026-04-01 12:51:57,719 - INFO - Ensured table feedback exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + +2026-04-01 12:51:57,728 - INFO - Executed query: CREATE TABLE IF NOT EXISTS afk_status ( + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + ) with params: None +2026-04-01 12:51:57,731 - INFO - Ensured table afk_status exists with schema: + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + +2026-04-01 12:51:57,740 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_tickets ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + ) with params: None +2026-04-01 12:51:57,743 - INFO - Ensured table lottery_tickets exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + +2026-04-01 12:51:57,752 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_results ( + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + ) with params: None +2026-04-01 12:51:57,755 - INFO - Ensured table lottery_results exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + +2026-04-01 12:51:57,765 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_state ( + id INT PRIMARY KEY, + jackpot INT NOT NULL + ) with params: None +2026-04-01 12:51:57,767 - INFO - Ensured table lottery_state exists with schema: + id INT PRIMARY KEY, + jackpot INT NOT NULL + +2026-04-01 12:51:57,776 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_draw_time ( + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + ) with params: None +2026-04-01 12:51:57,779 - INFO - Ensured table lottery_draw_time exists with schema: + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + +2026-04-01 12:51:57,789 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_luck ( + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + ) with params: None +2026-04-01 12:51:57,791 - INFO - Ensured table lottery_luck exists with schema: + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + +2026-04-01 12:51:57,801 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_groups ( + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + ) with params: None +2026-04-01 12:51:57,803 - INFO - Ensured table lottery_groups exists with schema: + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + +2026-04-01 12:51:57,813 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_group_members ( + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + ) with params: None +2026-04-01 12:51:57,815 - INFO - Ensured table lottery_group_members exists with schema: + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + +2026-04-01 12:51:57,825 - INFO - Executed query: CREATE TABLE IF NOT EXISTS gamble_rooms ( + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + ) with params: None +2026-04-01 12:51:57,827 - INFO - Ensured table gamble_rooms exists with schema: + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + +2026-04-01 12:51:57,833 - INFO - Loaded environment variables from .env +2026-04-01 12:51:57,892 - INFO - Database connection pool created. +2026-04-01 12:51:58,292 - INFO - Executed query: CREATE TABLE IF NOT EXISTS feedback ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + ) with params: None +2026-04-01 12:51:58,294 - INFO - Ensured table feedback exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + +2026-04-01 12:51:58,305 - INFO - Executed query: CREATE TABLE IF NOT EXISTS afk_status ( + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + ) with params: None +2026-04-01 12:51:58,308 - INFO - Ensured table afk_status exists with schema: + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + +2026-04-01 12:51:58,319 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_tickets ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + ) with params: None +2026-04-01 12:51:58,322 - INFO - Ensured table lottery_tickets exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + +2026-04-01 12:51:58,332 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_results ( + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + ) with params: None +2026-04-01 12:51:58,336 - INFO - Ensured table lottery_results exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + +2026-04-01 12:51:58,346 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_state ( + id INT PRIMARY KEY, + jackpot INT NOT NULL + ) with params: None +2026-04-01 12:51:58,348 - INFO - Ensured table lottery_state exists with schema: + id INT PRIMARY KEY, + jackpot INT NOT NULL + +2026-04-01 12:51:58,358 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_draw_time ( + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + ) with params: None +2026-04-01 12:51:58,361 - INFO - Ensured table lottery_draw_time exists with schema: + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + +2026-04-01 12:51:58,372 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_luck ( + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + ) with params: None +2026-04-01 12:51:58,375 - INFO - Ensured table lottery_luck exists with schema: + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + +2026-04-01 12:51:58,386 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_groups ( + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + ) with params: None +2026-04-01 12:51:58,389 - INFO - Ensured table lottery_groups exists with schema: + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + +2026-04-01 12:51:58,400 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_group_members ( + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + ) with params: None +2026-04-01 12:51:58,403 - INFO - Ensured table lottery_group_members exists with schema: + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + +2026-04-01 12:51:58,413 - INFO - Executed query: CREATE TABLE IF NOT EXISTS gamble_rooms ( + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + ) with params: None +2026-04-01 12:51:58,417 - INFO - Ensured table gamble_rooms exists with schema: + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + +2026-04-01 12:51:58,429 - INFO - Loaded environment variables from .env +2026-04-01 12:51:58,501 - INFO - Database connection pool created. +2026-04-01 12:51:58,511 - INFO - Executed query: CREATE TABLE IF NOT EXISTS feedback ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + ) with params: None +2026-04-01 12:51:58,514 - INFO - Ensured table feedback exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + +2026-04-01 12:51:58,523 - INFO - Executed query: CREATE TABLE IF NOT EXISTS afk_status ( + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + ) with params: None +2026-04-01 12:51:58,526 - INFO - Ensured table afk_status exists with schema: + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + +2026-04-01 12:51:58,537 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_tickets ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + ) with params: None +2026-04-01 12:51:58,539 - INFO - Ensured table lottery_tickets exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + +2026-04-01 12:51:58,549 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_results ( + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + ) with params: None +2026-04-01 12:51:58,551 - INFO - Ensured table lottery_results exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + +2026-04-01 12:51:58,567 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_state ( + id INT PRIMARY KEY, + jackpot INT NOT NULL + ) with params: None +2026-04-01 12:51:58,571 - INFO - Ensured table lottery_state exists with schema: + id INT PRIMARY KEY, + jackpot INT NOT NULL + +2026-04-01 12:51:58,581 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_draw_time ( + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + ) with params: None +2026-04-01 12:51:58,583 - INFO - Ensured table lottery_draw_time exists with schema: + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + +2026-04-01 12:51:58,593 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_luck ( + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + ) with params: None +2026-04-01 12:51:58,596 - INFO - Ensured table lottery_luck exists with schema: + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + +2026-04-01 12:51:58,614 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_groups ( + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + ) with params: None +2026-04-01 12:51:58,618 - INFO - Ensured table lottery_groups exists with schema: + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + +2026-04-01 12:51:58,638 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_group_members ( + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + ) with params: None +2026-04-01 12:51:58,643 - INFO - Ensured table lottery_group_members exists with schema: + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + +2026-04-01 12:51:58,652 - INFO - Executed query: CREATE TABLE IF NOT EXISTS gamble_rooms ( + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + ) with params: None +2026-04-01 12:51:58,655 - INFO - Ensured table gamble_rooms exists with schema: + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + +2026-04-01 12:51:58,681 - INFO - Loaded environment variables from .env +2026-04-01 12:51:58,746 - INFO - Database connection pool created. +2026-04-01 12:51:58,755 - INFO - Executed query: CREATE TABLE IF NOT EXISTS feedback ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + ) with params: None +2026-04-01 12:51:58,757 - INFO - Ensured table feedback exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + +2026-04-01 12:51:58,766 - INFO - Executed query: CREATE TABLE IF NOT EXISTS afk_status ( + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + ) with params: None +2026-04-01 12:51:58,769 - INFO - Ensured table afk_status exists with schema: + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + +2026-04-01 12:51:58,778 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_tickets ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + ) with params: None +2026-04-01 12:51:58,780 - INFO - Ensured table lottery_tickets exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + +2026-04-01 12:51:58,790 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_results ( + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + ) with params: None +2026-04-01 12:51:58,792 - INFO - Ensured table lottery_results exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + +2026-04-01 12:51:58,802 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_state ( + id INT PRIMARY KEY, + jackpot INT NOT NULL + ) with params: None +2026-04-01 12:51:58,804 - INFO - Ensured table lottery_state exists with schema: + id INT PRIMARY KEY, + jackpot INT NOT NULL + +2026-04-01 12:51:58,813 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_draw_time ( + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + ) with params: None +2026-04-01 12:51:58,815 - INFO - Ensured table lottery_draw_time exists with schema: + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + +2026-04-01 12:51:58,825 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_luck ( + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + ) with params: None +2026-04-01 12:51:58,827 - INFO - Ensured table lottery_luck exists with schema: + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + +2026-04-01 12:51:58,837 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_groups ( + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + ) with params: None +2026-04-01 12:51:58,839 - INFO - Ensured table lottery_groups exists with schema: + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + +2026-04-01 12:51:58,849 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_group_members ( + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + ) with params: None +2026-04-01 12:51:58,851 - INFO - Ensured table lottery_group_members exists with schema: + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + +2026-04-01 12:51:58,860 - INFO - Executed query: CREATE TABLE IF NOT EXISTS gamble_rooms ( + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + ) with params: None +2026-04-01 12:51:58,863 - INFO - Ensured table gamble_rooms exists with schema: + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + +2026-04-01 12:51:59,895 - INFO - Shard ID None has connected to Gateway (Session ID: 91c39aca0f08c10d093323da1b9223fc). +2026-04-01 12:56:08,917 - INFO - Executed query: REPLACE INTO gamble_rooms (channel_id, host_id, invited, inactivity) VALUES (%s, %s, %s, %s) with params: (1381059068805910728, 601579326714019840, '601579326714019840', 10) +2026-04-01 12:56:08,930 - INFO - Executed query: REPLACE INTO gamble_rooms (channel_id, host_id, invited, inactivity) VALUES (%s, %s, %s, %s) with params: (1381286558401040384, 1380335174901960725, '1380335174901960725', 10) +2026-04-01 12:56:08,941 - INFO - Executed query: REPLACE INTO gamble_rooms (channel_id, host_id, invited, inactivity) VALUES (%s, %s, %s, %s) with params: (1488879425222348953, 601579326714019840, '601579326714019840', 10) +2026-04-01 12:56:08,953 - INFO - Executed query: REPLACE INTO gamble_rooms (channel_id, host_id, invited, inactivity) VALUES (%s, %s, %s, %s) with params: (1488880216276467823, 601579326714019840, '601579326714019840', 10) +2026-04-01 12:56:11,124 - INFO - Loaded environment variables from .env +2026-04-01 12:56:11,469 - INFO - Database connection pool created. +2026-04-01 12:56:11,479 - INFO - Executed query: CREATE TABLE IF NOT EXISTS feedback ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + ) with params: None +2026-04-01 12:56:11,488 - INFO - Ensured table feedback exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + +2026-04-01 12:56:11,499 - INFO - Executed query: CREATE TABLE IF NOT EXISTS afk_status ( + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + ) with params: None +2026-04-01 12:56:11,502 - INFO - Ensured table afk_status exists with schema: + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + +2026-04-01 12:56:11,514 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_tickets ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + ) with params: None +2026-04-01 12:56:11,517 - INFO - Ensured table lottery_tickets exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + +2026-04-01 12:56:11,527 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_results ( + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + ) with params: None +2026-04-01 12:56:11,530 - INFO - Ensured table lottery_results exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + +2026-04-01 12:56:11,540 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_state ( + id INT PRIMARY KEY, + jackpot INT NOT NULL + ) with params: None +2026-04-01 12:56:11,543 - INFO - Ensured table lottery_state exists with schema: + id INT PRIMARY KEY, + jackpot INT NOT NULL + +2026-04-01 12:56:11,553 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_draw_time ( + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + ) with params: None +2026-04-01 12:56:11,555 - INFO - Ensured table lottery_draw_time exists with schema: + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + +2026-04-01 12:56:11,565 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_luck ( + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + ) with params: None +2026-04-01 12:56:11,567 - INFO - Ensured table lottery_luck exists with schema: + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + +2026-04-01 12:56:11,578 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_groups ( + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + ) with params: None +2026-04-01 12:56:11,580 - INFO - Ensured table lottery_groups exists with schema: + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + +2026-04-01 12:56:11,590 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_group_members ( + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + ) with params: None +2026-04-01 12:56:11,593 - INFO - Ensured table lottery_group_members exists with schema: + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + +2026-04-01 12:56:11,603 - INFO - Executed query: CREATE TABLE IF NOT EXISTS gamble_rooms ( + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + ) with params: None +2026-04-01 12:56:11,605 - INFO - Ensured table gamble_rooms exists with schema: + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + +2026-04-01 12:56:11,613 - WARNING - PyNaCl is not installed, voice will NOT be supported +2026-04-01 12:56:11,618 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:8080 + * Running on http://172.17.0.4:8080 +2026-04-01 12:56:11,618 - INFO - Press CTRL+C to quit +2026-04-01 12:57:16,835 - INFO - logging in using static token +2026-04-01 12:57:17,591 - INFO - Loaded environment variables from .env +2026-04-01 12:57:17,671 - INFO - Database connection pool created. +2026-04-01 12:57:17,683 - INFO - Executed query: CREATE TABLE IF NOT EXISTS feedback ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + ) with params: None +2026-04-01 12:57:17,686 - INFO - Ensured table feedback exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + +2026-04-01 12:57:17,700 - INFO - Executed query: CREATE TABLE IF NOT EXISTS afk_status ( + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + ) with params: None +2026-04-01 12:57:17,704 - INFO - Ensured table afk_status exists with schema: + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + +2026-04-01 12:57:17,718 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_tickets ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + ) with params: None +2026-04-01 12:57:17,724 - INFO - Ensured table lottery_tickets exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + +2026-04-01 12:57:17,737 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_results ( + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + ) with params: None +2026-04-01 12:57:17,739 - INFO - Ensured table lottery_results exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + +2026-04-01 12:57:17,750 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_state ( + id INT PRIMARY KEY, + jackpot INT NOT NULL + ) with params: None +2026-04-01 12:57:17,752 - INFO - Ensured table lottery_state exists with schema: + id INT PRIMARY KEY, + jackpot INT NOT NULL + +2026-04-01 12:57:17,762 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_draw_time ( + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + ) with params: None +2026-04-01 12:57:17,765 - INFO - Ensured table lottery_draw_time exists with schema: + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + +2026-04-01 12:57:17,774 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_luck ( + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + ) with params: None +2026-04-01 12:57:17,777 - INFO - Ensured table lottery_luck exists with schema: + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + +2026-04-01 12:57:17,787 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_groups ( + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + ) with params: None +2026-04-01 12:57:17,789 - INFO - Ensured table lottery_groups exists with schema: + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + +2026-04-01 12:57:17,799 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_group_members ( + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + ) with params: None +2026-04-01 12:57:17,801 - INFO - Ensured table lottery_group_members exists with schema: + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + +2026-04-01 12:57:17,811 - INFO - Executed query: CREATE TABLE IF NOT EXISTS gamble_rooms ( + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + ) with params: None +2026-04-01 12:57:17,814 - INFO - Ensured table gamble_rooms exists with schema: + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + +2026-04-01 12:57:17,817 - INFO - Loaded environment variables from .env +2026-04-01 12:57:17,882 - INFO - Database connection pool created. +2026-04-01 12:57:17,892 - INFO - Executed query: CREATE TABLE IF NOT EXISTS feedback ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + ) with params: None +2026-04-01 12:57:17,895 - INFO - Ensured table feedback exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + +2026-04-01 12:57:17,907 - INFO - Executed query: CREATE TABLE IF NOT EXISTS afk_status ( + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + ) with params: None +2026-04-01 12:57:17,909 - INFO - Ensured table afk_status exists with schema: + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + +2026-04-01 12:57:17,920 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_tickets ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + ) with params: None +2026-04-01 12:57:17,923 - INFO - Ensured table lottery_tickets exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + +2026-04-01 12:57:17,934 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_results ( + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + ) with params: None +2026-04-01 12:57:17,937 - INFO - Ensured table lottery_results exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + +2026-04-01 12:57:17,948 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_state ( + id INT PRIMARY KEY, + jackpot INT NOT NULL + ) with params: None +2026-04-01 12:57:17,950 - INFO - Ensured table lottery_state exists with schema: + id INT PRIMARY KEY, + jackpot INT NOT NULL + +2026-04-01 12:57:17,962 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_draw_time ( + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + ) with params: None +2026-04-01 12:57:17,965 - INFO - Ensured table lottery_draw_time exists with schema: + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + +2026-04-01 12:57:17,975 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_luck ( + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + ) with params: None +2026-04-01 12:57:17,978 - INFO - Ensured table lottery_luck exists with schema: + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + +2026-04-01 12:57:17,989 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_groups ( + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + ) with params: None +2026-04-01 12:57:17,992 - INFO - Ensured table lottery_groups exists with schema: + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + +2026-04-01 12:57:18,002 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_group_members ( + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + ) with params: None +2026-04-01 12:57:18,004 - INFO - Ensured table lottery_group_members exists with schema: + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + +2026-04-01 12:57:18,014 - INFO - Executed query: CREATE TABLE IF NOT EXISTS gamble_rooms ( + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + ) with params: None +2026-04-01 12:57:18,017 - INFO - Ensured table gamble_rooms exists with schema: + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + +2026-04-01 12:57:18,021 - INFO - Loaded environment variables from .env +2026-04-01 12:57:18,088 - INFO - Database connection pool created. +2026-04-01 12:57:18,099 - INFO - Executed query: CREATE TABLE IF NOT EXISTS feedback ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + ) with params: None +2026-04-01 12:57:18,101 - INFO - Ensured table feedback exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + +2026-04-01 12:57:18,112 - INFO - Executed query: CREATE TABLE IF NOT EXISTS afk_status ( + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + ) with params: None +2026-04-01 12:57:18,115 - INFO - Ensured table afk_status exists with schema: + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + +2026-04-01 12:57:18,125 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_tickets ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + ) with params: None +2026-04-01 12:57:18,128 - INFO - Ensured table lottery_tickets exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + +2026-04-01 12:57:18,140 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_results ( + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + ) with params: None +2026-04-01 12:57:18,143 - INFO - Ensured table lottery_results exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + +2026-04-01 12:57:18,154 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_state ( + id INT PRIMARY KEY, + jackpot INT NOT NULL + ) with params: None +2026-04-01 12:57:18,157 - INFO - Ensured table lottery_state exists with schema: + id INT PRIMARY KEY, + jackpot INT NOT NULL + +2026-04-01 12:57:18,167 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_draw_time ( + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + ) with params: None +2026-04-01 12:57:18,170 - INFO - Ensured table lottery_draw_time exists with schema: + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + +2026-04-01 12:57:18,181 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_luck ( + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + ) with params: None +2026-04-01 12:57:18,184 - INFO - Ensured table lottery_luck exists with schema: + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + +2026-04-01 12:57:18,195 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_groups ( + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + ) with params: None +2026-04-01 12:57:18,197 - INFO - Ensured table lottery_groups exists with schema: + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + +2026-04-01 12:57:18,208 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_group_members ( + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + ) with params: None +2026-04-01 12:57:18,211 - INFO - Ensured table lottery_group_members exists with schema: + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + +2026-04-01 12:57:18,223 - INFO - Executed query: CREATE TABLE IF NOT EXISTS gamble_rooms ( + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + ) with params: None +2026-04-01 12:57:18,226 - INFO - Ensured table gamble_rooms exists with schema: + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + +2026-04-01 12:57:18,232 - INFO - Loaded environment variables from .env +2026-04-01 12:57:18,302 - INFO - Database connection pool created. +2026-04-01 12:57:18,313 - INFO - Executed query: CREATE TABLE IF NOT EXISTS feedback ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + ) with params: None +2026-04-01 12:57:18,317 - INFO - Ensured table feedback exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + +2026-04-01 12:57:18,331 - INFO - Executed query: CREATE TABLE IF NOT EXISTS afk_status ( + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + ) with params: None +2026-04-01 12:57:18,335 - INFO - Ensured table afk_status exists with schema: + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + +2026-04-01 12:57:18,352 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_tickets ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + ) with params: None +2026-04-01 12:57:18,357 - INFO - Ensured table lottery_tickets exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + +2026-04-01 12:57:18,376 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_results ( + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + ) with params: None +2026-04-01 12:57:18,380 - INFO - Ensured table lottery_results exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + +2026-04-01 12:57:18,398 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_state ( + id INT PRIMARY KEY, + jackpot INT NOT NULL + ) with params: None +2026-04-01 12:57:18,401 - INFO - Ensured table lottery_state exists with schema: + id INT PRIMARY KEY, + jackpot INT NOT NULL + +2026-04-01 12:57:18,410 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_draw_time ( + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + ) with params: None +2026-04-01 12:57:18,413 - INFO - Ensured table lottery_draw_time exists with schema: + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + +2026-04-01 12:57:18,423 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_luck ( + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + ) with params: None +2026-04-01 12:57:18,425 - INFO - Ensured table lottery_luck exists with schema: + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + +2026-04-01 12:57:18,435 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_groups ( + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + ) with params: None +2026-04-01 12:57:18,437 - INFO - Ensured table lottery_groups exists with schema: + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + +2026-04-01 12:57:18,447 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_group_members ( + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + ) with params: None +2026-04-01 12:57:18,450 - INFO - Ensured table lottery_group_members exists with schema: + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + +2026-04-01 12:57:18,460 - INFO - Executed query: CREATE TABLE IF NOT EXISTS gamble_rooms ( + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + ) with params: None +2026-04-01 12:57:18,463 - INFO - Ensured table gamble_rooms exists with schema: + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + +2026-04-01 12:57:18,473 - INFO - Executed query: SELECT * FROM gamble_rooms with params: None +2026-04-01 12:57:18,487 - INFO - Loaded environment variables from .env +2026-04-01 12:57:18,551 - INFO - Database connection pool created. +2026-04-01 12:57:18,561 - INFO - Executed query: CREATE TABLE IF NOT EXISTS feedback ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + ) with params: None +2026-04-01 12:57:18,563 - INFO - Ensured table feedback exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + +2026-04-01 12:57:18,574 - INFO - Executed query: CREATE TABLE IF NOT EXISTS afk_status ( + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + ) with params: None +2026-04-01 12:57:18,577 - INFO - Ensured table afk_status exists with schema: + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + +2026-04-01 12:57:18,588 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_tickets ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + ) with params: None +2026-04-01 12:57:18,591 - INFO - Ensured table lottery_tickets exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + +2026-04-01 12:57:18,602 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_results ( + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + ) with params: None +2026-04-01 12:57:18,605 - INFO - Ensured table lottery_results exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + +2026-04-01 12:57:18,619 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_state ( + id INT PRIMARY KEY, + jackpot INT NOT NULL + ) with params: None +2026-04-01 12:57:18,623 - INFO - Ensured table lottery_state exists with schema: + id INT PRIMARY KEY, + jackpot INT NOT NULL + +2026-04-01 12:57:18,642 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_draw_time ( + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + ) with params: None +2026-04-01 12:57:18,646 - INFO - Ensured table lottery_draw_time exists with schema: + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + +2026-04-01 12:57:18,665 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_luck ( + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + ) with params: None +2026-04-01 12:57:18,670 - INFO - Ensured table lottery_luck exists with schema: + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + +2026-04-01 12:57:18,686 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_groups ( + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + ) with params: None +2026-04-01 12:57:18,692 - INFO - Ensured table lottery_groups exists with schema: + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + +2026-04-01 12:57:18,704 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_group_members ( + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + ) with params: None +2026-04-01 12:57:18,707 - INFO - Ensured table lottery_group_members exists with schema: + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + +2026-04-01 12:57:18,724 - INFO - Executed query: CREATE TABLE IF NOT EXISTS gamble_rooms ( + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + ) with params: None +2026-04-01 12:57:18,728 - INFO - Ensured table gamble_rooms exists with schema: + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + +2026-04-01 12:57:18,731 - INFO - Loaded environment variables from .env +2026-04-01 12:57:19,134 - INFO - Executed query: REPLACE INTO gamble_rooms (channel_id, host_id, invited, inactivity) VALUES (%s, %s, %s, %s) with params: (1381059068805910728, 601579326714019840, '601579326714019840', 10) +2026-04-01 12:57:19,168 - ERROR - Unclosed connector +connections: ['[(, 1203049.726301456)]'] +connector: +2026-04-01 12:57:23,248 - INFO - Loaded environment variables from .env +2026-04-01 12:57:23,732 - INFO - Database connection pool created. +2026-04-01 12:57:23,745 - INFO - Executed query: CREATE TABLE IF NOT EXISTS feedback ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + ) with params: None +2026-04-01 12:57:23,748 - INFO - Ensured table feedback exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + +2026-04-01 12:57:23,759 - INFO - Executed query: CREATE TABLE IF NOT EXISTS afk_status ( + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + ) with params: None +2026-04-01 12:57:23,762 - INFO - Ensured table afk_status exists with schema: + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + +2026-04-01 12:57:23,778 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_tickets ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + ) with params: None +2026-04-01 12:57:23,782 - INFO - Ensured table lottery_tickets exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + +2026-04-01 12:57:23,795 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_results ( + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + ) with params: None +2026-04-01 12:57:23,799 - INFO - Ensured table lottery_results exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + +2026-04-01 12:57:23,809 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_state ( + id INT PRIMARY KEY, + jackpot INT NOT NULL + ) with params: None +2026-04-01 12:57:23,812 - INFO - Ensured table lottery_state exists with schema: + id INT PRIMARY KEY, + jackpot INT NOT NULL + +2026-04-01 12:57:23,824 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_draw_time ( + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + ) with params: None +2026-04-01 12:57:23,827 - INFO - Ensured table lottery_draw_time exists with schema: + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + +2026-04-01 12:57:23,841 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_luck ( + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + ) with params: None +2026-04-01 12:57:23,845 - INFO - Ensured table lottery_luck exists with schema: + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + +2026-04-01 12:57:23,858 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_groups ( + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + ) with params: None +2026-04-01 12:57:23,861 - INFO - Ensured table lottery_groups exists with schema: + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + +2026-04-01 12:57:23,871 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_group_members ( + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + ) with params: None +2026-04-01 12:57:23,874 - INFO - Ensured table lottery_group_members exists with schema: + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + +2026-04-01 12:57:23,884 - INFO - Executed query: CREATE TABLE IF NOT EXISTS gamble_rooms ( + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + ) with params: None +2026-04-01 12:57:23,887 - INFO - Ensured table gamble_rooms exists with schema: + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + +2026-04-01 12:57:23,902 - WARNING - PyNaCl is not installed, voice will NOT be supported +2026-04-01 12:57:23,941 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:8080 + * Running on http://172.17.0.4:8080 +2026-04-01 12:57:23,942 - INFO - Press CTRL+C to quit +2026-04-01 12:57:23,944 - INFO - * Restarting with stat +2026-04-01 12:57:24,837 - INFO - Loaded environment variables from .env +2026-04-01 12:57:25,319 - INFO - Database connection pool created. +2026-04-01 12:57:25,331 - INFO - Executed query: CREATE TABLE IF NOT EXISTS feedback ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + ) with params: None +2026-04-01 12:57:25,335 - INFO - Ensured table feedback exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USER VARCHAR(100), + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + CONTENT TEXT + +2026-04-01 12:57:25,346 - INFO - Executed query: CREATE TABLE IF NOT EXISTS afk_status ( + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + ) with params: None +2026-04-01 12:57:25,348 - INFO - Ensured table afk_status exists with schema: + USERID BIGINT, + GUILDID BIGINT, + TIMESTAMP VARCHAR(32), + REASON TEXT, + PRIMARY KEY (USERID, GUILDID) + +2026-04-01 12:57:25,361 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_tickets ( + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + ) with params: None +2026-04-01 12:57:25,364 - INFO - Ensured table lottery_tickets exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TIMESTAMP DATETIME NOT NULL, + TICKET_TYPE VARCHAR(32) NOT NULL, + group_id VARCHAR(32) DEFAULT NULL + +2026-04-01 12:57:25,373 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_results ( + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + ) with params: None +2026-04-01 12:57:25,376 - INFO - Ensured table lottery_results exists with schema: + ID INT AUTO_INCREMENT PRIMARY KEY, + WINNER_ID BIGINT NOT NULL, + AMOUNT INT NOT NULL, + DRAW_TIME DATETIME NOT NULL, + CLAIMED BOOLEAN DEFAULT 0, + WIN_TYPE VARCHAR(16) DEFAULT 'user' + +2026-04-01 12:57:25,386 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_state ( + id INT PRIMARY KEY, + jackpot INT NOT NULL + ) with params: None +2026-04-01 12:57:25,388 - INFO - Ensured table lottery_state exists with schema: + id INT PRIMARY KEY, + jackpot INT NOT NULL + +2026-04-01 12:57:25,398 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_draw_time ( + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + ) with params: None +2026-04-01 12:57:25,400 - INFO - Ensured table lottery_draw_time exists with schema: + id INT PRIMARY KEY, + last_draw DATETIME NOT NULL + +2026-04-01 12:57:25,410 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_luck ( + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + ) with params: None +2026-04-01 12:57:25,413 - INFO - Ensured table lottery_luck exists with schema: + USERID BIGINT PRIMARY KEY, + LUCK INT NOT NULL DEFAULT 0 + +2026-04-01 12:57:25,423 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_groups ( + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + ) with params: None +2026-04-01 12:57:25,426 - INFO - Ensured table lottery_groups exists with schema: + group_id VARCHAR(32) PRIMARY KEY, + creator_id BIGINT NOT NULL + +2026-04-01 12:57:25,436 - INFO - Executed query: CREATE TABLE IF NOT EXISTS lottery_group_members ( + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + ) with params: None +2026-04-01 12:57:25,439 - INFO - Ensured table lottery_group_members exists with schema: + group_id VARCHAR(32), + user_id BIGINT, + PRIMARY KEY (group_id, user_id) + +2026-04-01 12:57:25,450 - INFO - Executed query: CREATE TABLE IF NOT EXISTS gamble_rooms ( + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + ) with params: None +2026-04-01 12:57:25,453 - INFO - Ensured table gamble_rooms exists with schema: + channel_id BIGINT PRIMARY KEY, + host_id BIGINT NOT NULL, + invited TEXT NOT NULL, + inactivity INT NOT NULL + +2026-04-01 12:57:25,461 - WARNING - PyNaCl is not installed, voice will NOT be supported +2026-04-01 12:57:25,473 - WARNING - * Debugger is active! +2026-04-01 12:57:25,498 - INFO - * Debugger PIN: 235-261-607 diff --git a/npc_memory.db b/npc_memory.db deleted file mode 100644 index 0188f811e93424a3cf5e9e093f2baeae43de74b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 zcmeHPU2hx56_sQwj+LZNkhTGW0-eGSiUEZt^%?V_uAHc~+SpEP1#Sxz#*jPQ9dmbQ zGrLQg0%|lC0u)H!477is|D-Sd9ewK`=u3d2=gg3lNJWMM9%}ow@hibMGv7 z&dr05Kh%{HJ!3OjiH(KV7Zw*6ej&ud!ou75S;o)gwS+epCx77g;)(ZXy?uM3G5F#& z99??tKMOzjH~tB)fIvVXAP^7;2m}NI0s(=5KtLcM5D@qd5%{cFy7bod>x)NMD%nX@ zUUVN>mC8z+yi9aap8DXz`}g;D5B9{t?yV2^#HqvLofR?n;yF4J2YbIgSUYvFNaaY` zvyaPOPv^QCiT%3=d%xPdFFx4&`6*)W ze{%o+-ra*oMC8H2?wyZjVc{42#VcQud&^h8eC5Z>s~6wA@chD?OV7VUI)=nE zy?kk-_2y^G8`-EtR%=t2kIKr*JXUtQ+1lE8P>ZT;F=P)qJ-t!BHm_4MWMZT`*o+Uqx- zUiv=fZ;94syVY!OZa#bCrAt>^ZyoJyj7*)!kE%qg-f7@tt7NsCmO`tHxMoTms<;vn zo+D=ZaW00csx&HEBqNoJT&qeP8e#GdR+>Dv`f*GE9#g8@fWu8E<{9a+cVVL^_>(AcOF0|kFGpo6PL zC1omNtOwTgVXU|#rFGEhQslC#YfHSGqnT0K{UI490IXpZoQ-%1tRsY&8z0gH5lbG_ zG--N-^Wg?TB*3R?tgP%#R_39u65-eJw%A-x1eU=`pGLNp*CBjg(x zQUlwCirkopqkBLz zlEvU6`UtKSAevxd!jR)IcGVdQ4PHH;I21D2KWyqK_@sJfz+sO)-z@HfQo4ecgjGF{?iTtgyQAH*6Ni(-&4 zL#M^tM{7EkbI3=THO*1PrH?m&B?UD}0tmW4IfX^{%mCk*-U9e?ztL`PKf87j<^HEf zk6v8vhY2EI0@hp7_LVBcEyNU+7MYH8OjG11ZrnANKUdfp_i<+8!hUXsrN~A|jS;GU z&SmcjYGFF!hdl?V=+u>?kIBJbR$NS(iG9(9cPKr&kHP_pm8^TKh(2;ZHC=G7LfN&T z#V}VEOG~1$YGx>9uvTZHE>*8ix$6h~St5{&BY?+kK&*{i46N!ZjnWOy6g-#Tu+sUZ zv5BSe+3Od8)gPXj7h`pDIq=SvH$_SZI%DuU1n=fP77pH?$&|PV2P@qwB`ocltiW2b z=5WEMsBe-#-A`)?1DSRuA#&gn#;%n;e2w%FyV+(!)esNip=0q--A7011`G=Lv4cBS2`dVB-!H>#C0gZ@fwk zV)Mz!998j+>*8g%H-F{N3s?S$f5Iyu5D*9m1Ox&C0fB%(Kp-Fx5C{ka1Ofs9fo~Oo zpD!(Mv=+~|<@wU|@rK{D#HQia_TutYT#rW+lLtqqckGU@JKosh_y5aF&#BG-X(8x?%r6?Ei=T|B1pP?Ei=Tf2eP~jwkH@Ln1KQ-1qXCu>T+S z|HJ-&*#8gv|L5NSU*BnO?(qBng_r)jaQPoE{~f==D{B41SwJU#c#xf>`==%Th!9j>2EGe4w`kvhcBBk8*uTg>#5__YiTYh;y-#kH<=vKpe_GLP3NON6KpDpM%EPZ;M~4WKK9_z-&G1gA_V z9lK10CY!D>3Pp|v%6jy5MAS%1XpUpxBZ}G<2C`2GA4{E~{fe+bQ>odQ(}PeQZ2(`f zxAE*JuP{nSyXTJ5X)n9hxPE~(+#*9qEOSaaDK>RdV)RzB3x?JlM{wco}7TzTT0e4p6Kh%%*DsBk*y~3HK301jz;QMC|-z zJy~`&8hW5;KGq%2!?WFPZvLgcLU{i6$8*CoOJX+b+*S}(J4@$+POa;hv5YPirtk@G z`{Zl}%8#Jt-KSm^3T&a$x`b-HAwE);>R*R;Br!O#^?gyq&qL;s0*cT(GBFg3* zBt2om3{U{a35`VCiiR>5`smS^B;>x+G$UUsokP(JXwb}tKC&m28ADD?_V{$15Q0WB zALsJ;nBm&>H|h#)CFg6`qP-835nHx~F1Rkvk{7C5ryAX3X!%2D!A)^M z>{&97n_Q-p_PTbOiHd}cNwj&PES=T;bsk{Zd^2Gd0j+b84XSx(fUhXfKck-znEA>F9=tO~LO+}Dg^F}&is3&U;=6B_jC5s@|xkbN6dS;QCf6z`h z_A3{aaq%EXtmn|)(<0KE%O^GcXv$$3V^biy`P`B|S)}11vKcErTNH5J$$Agtk@T)! h&agT`Y)?eXxalxD->`S5MmOcxNvFBB75%>J{{v1GAT$5~ diff --git a/time.txt b/time.txt index dac28c7..af56c70 100755 --- a/time.txt +++ b/time.txt @@ -1 +1 @@ -1759391917.148779 \ No newline at end of file +1775047922.8093011 \ No newline at end of file diff --git a/utils/bank_functions.py b/utils/bank_functions.py index 2d83001..f7a10a5 100755 --- a/utils/bank_functions.py +++ b/utils/bank_functions.py @@ -40,7 +40,10 @@ async def record_transaction( transaction_type: The type of transaction performed. amount: The amount of the transaction. """ - db.insert("transactions", (user_id, transaction_type, amount)) + db.execute_query( + "INSERT INTO transactions (USERID, TYPE, AMOUNT) VALUES (%s, %s, %s)", + (user_id, transaction_type, amount), + ) async def update_money( diff --git a/utils/sql_commands.py b/utils/sql_commands.py index 0ab7056..6aa6d82 100755 --- a/utils/sql_commands.py +++ b/utils/sql_commands.py @@ -3,11 +3,11 @@ from mysql.connector import pooling from dotenv import load_dotenv import os import random +import re import time from datetime import datetime, timedelta import logging import pandas as pd -from copy import copy # Configure logging @@ -20,16 +20,33 @@ logger = logging.getLogger(__name__) class DatabaseManager: + _instances = {} + + def __new__(cls, env="development"): + instance_key = env or "default" + if instance_key in cls._instances: + return cls._instances[instance_key] + instance = super().__new__(cls) + cls._instances[instance_key] = instance + return instance + def __init__(self, env="development"): - # Load environment variables based on environment - self.load_env(env) + if getattr(self, "_initialized", False): + return + self._initialized = True + + env_file = f".env.{env}" if env else ".env" + if not os.path.exists(env_file): + env_file = ".env" + self.load_env(env_file) self.config = { "host": os.getenv("SQLHOST", "localhost"), "user": os.getenv("SQLUSER", "root"), "password": os.getenv("SQLPASS", ""), "database": os.getenv("SQLDB", "testdb"), - "pool_reset_session": bool(os.getenv("POOL_RESET_SESSION", False)), + "pool_reset_session": os.getenv("POOL_RESET_SESSION", "false").lower() + in ("true", "1", "yes"), } self.pool = pooling.MySQLConnectionPool( @@ -124,26 +141,122 @@ class DatabaseManager: inactivity INT NOT NULL """, ) + self.create_table_if_not_exists( + "economy", + """ + ID BIGINT PRIMARY KEY, + WALLET BIGINT NOT NULL DEFAULT 0, + BANK BIGINT NOT NULL DEFAULT 0, + DAILY DOUBLE DEFAULT 0 + """, + ) + self.create_table_if_not_exists( + "transactions", + """ + ID INT AUTO_INCREMENT PRIMARY KEY, + USERID BIGINT NOT NULL, + TYPE VARCHAR(50), + AMOUNT DECIMAL(18,2), + TIME DATETIME DEFAULT CURRENT_TIMESTAMP + """, + ) + self.create_table_if_not_exists( + "custom_commands", + """ + ID INT AUTO_INCREMENT PRIMARY KEY, + GUILDID VARCHAR(32) NOT NULL, + COMMANDNAME VARCHAR(100) NOT NULL, + RESPONSE TEXT NOT NULL, + MATCHTYPE VARCHAR(20) NOT NULL DEFAULT 'exact' + """, + ) + self.create_table_if_not_exists( + "guilds", + """ + GUILD BIGINT PRIMARY KEY, + WELCOME BIGINT DEFAULT NULL, + RULES BIGINT DEFAULT NULL, + GUIDE BIGINT DEFAULT NULL, + INTRODUCTIONS BIGINT DEFAULT NULL, + EVENTS BIGINT DEFAULT NULL, + MEMBERCOUNT BIGINT DEFAULT NULL, + LOGGING BIGINT DEFAULT NULL, + TICKETING BIGINT DEFAULT NULL + """, + ) + self.create_table_if_not_exists( + "rewards", + """ + ID INT AUTO_INCREMENT PRIMARY KEY, + type VARCHAR(50) NOT NULL, + amount INT NOT NULL DEFAULT 0, + description TEXT DEFAULT NULL + """, + ) + self.create_table_if_not_exists( + "logs", + """ + ID INT AUTO_INCREMENT PRIMARY KEY, + guild_id BIGINT NOT NULL, + user_id BIGINT NOT NULL, + type VARCHAR(50) NOT NULL, + message TEXT NOT NULL, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP + """, + ) + self.create_table_if_not_exists( + "gamble_limits", + """ + USERID BIGINT PRIMARY KEY, + DAILY_LIMIT BIGINT DEFAULT NULL, + EXCLUDED_UNTIL DATETIME DEFAULT NULL + """, + ) + self.create_table_if_not_exists( + "users", + """ + ID BIGINT PRIMARY KEY, + XP INT DEFAULT 0, + LEVEL INT DEFAULT 0, + birthday VARCHAR(10) DEFAULT NULL + """, + ) - def load_env(self, env): - env_file = f".env" + def load_env(self, env_file): load_dotenv(env_file) logger.info(f"Loaded environment variables from {env_file}") def get_connection(self): return self.pool.get_connection() + def _sanitize_identifier(self, identifier: str) -> str: + if not re.match(r"^[A-Za-z0-9_]+$", identifier): + raise ValueError(f"Invalid SQL identifier: {identifier}") + return identifier + + def _parse_insert_columns(self, query: str) -> list[str]: + match = re.search( + r"INSERT\s+INTO\s+\S+\s*\(([^)]+)\)\s*VALUES", + query, + re.IGNORECASE, + ) + if not match: + raise ValueError( + "Insert query must contain a column list for overwrite upsert support." + ) + return [col.strip() for col in match.group(1).split(",") if col.strip()] + def execute_query(self, query, params=None, retries=3, delay=1): - cursor = None connection = None + cursor = None for attempt in range(retries): try: connection = self.get_connection() cursor = connection.cursor(dictionary=True, buffered=True) cursor.execute(query, params or ()) - logger.info(f"Executed query: {query} with params: {params}") connection.commit() - return copy(cursor) + logger.info(f"Executed query: {query} with params: {params}") + return cursor.rowcount except mysql.connector.Error as err: logger.warning(f"Attempt {attempt + 1} failed: {err}") time.sleep(delay * (2**attempt)) @@ -163,7 +276,7 @@ class DatabaseManager: Args: query (str): The SQL query to execute. params (tuple): The parameters to pass into the query. - overwrite (bool, optional): Whether to perform an upsert operation. Defaults to False. + overwrite (bool, optional): Whether to perform an upsert operation. Defaults to True. Raises: ValueError: If no parameters are provided. @@ -171,37 +284,29 @@ class DatabaseManager: if not params: raise ValueError("Params must be provided for the insert operation.") - try: - if overwrite: - columns = [ - col.split("=")[0].strip() - for col in query.split("VALUES")[0] - .split("(")[1] - .split(")")[0] - .split(",") - ] - update_set = ", ".join(f"{col} = VALUES({col})" for col in columns) - query = f"{query} ON DUPLICATE KEY UPDATE {update_set}" + if overwrite: + columns = self._parse_insert_columns(query) + update_set = ", ".join(f"{col} = VALUES({col})" for col in columns) + query = f"{query} ON DUPLICATE KEY UPDATE {update_set}" - cursor = self.execute_query(query, params) - if cursor: - logger.info(f"Insert completed with query: {query}.") - except mysql.connector.Error as err: - logger.error(f"Insert failed with query: {query}. Error: {err}") + rowcount = self.execute_query(query, params) + if rowcount is None: + logger.error(f"Insert failed with query: {query}.") + else: + logger.info(f"Insert completed with query: {query}.") def bulk_insert(self, query, params=None): if not params: logger.warning("No data provided for bulk insert.") return - # Assuming params is a list of dictionaries if not isinstance(params, list) or not all(isinstance(d, dict) for d in params): raise ValueError("Params must be a list of dictionaries for bulk insert.") - keys = params[0].keys() + keys = list(params[0].keys()) placeholders = ", ".join(["%s"] * len(keys)) query = f"{query} ({', '.join(keys)}) VALUES ({placeholders})" - values = [tuple(data.values()) for data in params] + values = [tuple(data[key] for key in keys) for data in params] connection = None cursor = None @@ -216,7 +321,7 @@ class DatabaseManager: except mysql.connector.Error as err: logger.error(f"Bulk insert failed: {err}") if connection: - connection.rollback() # Roll back on error + connection.rollback() finally: if cursor: cursor.close() @@ -225,34 +330,60 @@ class DatabaseManager: def delete(self, table_name: str, condition: dict) -> None: """Deletes a record from the specified table based on the condition provided.""" + table_name = self._sanitize_identifier(table_name) condition_column, condition_value = next(iter(condition.items())) + condition_column = self._sanitize_identifier(condition_column) query = f"DELETE FROM {table_name} WHERE {condition_column} = %s" self.execute_query(query, (condition_value,)) def fetch_one(self, query, params=None): - cursor = self.execute_query(query, params) - return cursor.fetchone() if cursor else {} + connection = None + cursor = None + try: + connection = self.get_connection() + cursor = connection.cursor(dictionary=True, buffered=True) + cursor.execute(query, params or ()) + return cursor.fetchone() + finally: + if cursor: + cursor.close() + if connection: + connection.close() def fetch_all(self, query, params=None): - cursor = self.execute_query(query, params) - return cursor.fetchall() if cursor else [] + connection = None + cursor = None + try: + connection = self.get_connection() + cursor = connection.cursor(dictionary=True, buffered=True) + cursor.execute(query, params or ()) + return cursor.fetchall() + finally: + if cursor: + cursor.close() + if connection: + connection.close() def fetch_as_dataframe(self, query, params=None): - cursor = self.execute_query(query, params) - if cursor: - try: - # Ensure cursor has a result to fetch - if cursor.with_rows: - results = cursor.fetchall() - return pd.DataFrame(results) if results else pd.DataFrame() - else: - logger.warning("No result set to fetch from.") - return pd.DataFrame() - finally: + connection = None + cursor = None + try: + connection = self.get_connection() + cursor = connection.cursor(dictionary=True, buffered=True) + cursor.execute(query, params or ()) + if cursor.with_rows: + results = cursor.fetchall() + return pd.DataFrame(results) if results else pd.DataFrame() + logger.warning("No result set to fetch from.") + return pd.DataFrame() + finally: + if cursor: cursor.close() - return pd.DataFrame() + if connection: + connection.close() def create_table_if_not_exists(self, table_name, schema): + table_name = self._sanitize_identifier(table_name) query = f"CREATE TABLE IF NOT EXISTS {table_name} ({schema})" self.execute_query(query) logger.info(f"Ensured table {table_name} exists with schema: {schema}") @@ -275,6 +406,11 @@ class DatabaseManager: return f"{base_query} WHERE {conditions}", list(filters.values()) +def initialize_database(env="development"): + """Initialize the database schema and return a shared DatabaseManager.""" + return DatabaseManager(env) + + # SQL scripts to create tables create_feedback_table = """ CREATE TABLE IF NOT EXISTS feedback ( diff --git a/web/__pycache__/app.cpython-312.pyc b/web/__pycache__/app.cpython-312.pyc index ac5b267c3980df5cbaba5cbaa359f6d5487497b5..4c2f0661b37edecc1370c533e385852f11c9ae21 100644 GIT binary patch delta 2800 zcmaJ@YiJ|a6`m`N9@bd0wyURQ*|HL^to1{-*YdXB)~UlfyV;GKHrqf}Nsz~yYgzVa zM!7S}#-^bULd!x+F}IMGLK+H79t)vC5C};dTG|vED1oJaCWKN5FEGkL-jh2eAwZAC!vz4wVjGOdhDepJ^*K zg-AwNlQdZ$Xh&)hR{}iINsWl#!P+4F26TRrWFKiKY6&6%AJmiWR4pawke+U5Y8gQj zJzL9)eZ#e3pF~sF(F6Dp3Ah-|T_-MI8v&l|Ec5XbiOIf@j?_opWeL@l{^r`)q4Mg) z@nZvh?ONf8G~!9eZ%dPkCoO7&wR>)_RHNR?y&#>S1v*ZPO@Ci%g+Y2ki}m>*5IVB+ zFbDhmO2W!KDlp}74+1ysaaa5)Wkwr@-LszTx<3`IXbW2Y zIZ~VRr2l|@^By-Oj|LVzZcR=FPI;Uqj|3Jy?j_KydfbO{YG{e(w3*#WNn%Nmn<9#2 z;NFtY89J-l>ZWSZb=6RtlsU&+M$2xgdTXE7wZpaE#X!)f#NlGtmk>hyiO^^wa)oYI z)J|u%v*!eKv)M9OhF=T)X)FgimJgs%U}^Yql!j{5RZXjJnl>BbSHp`W+xuNO5g_CI zM)cpL%-@YYPIA0B^v(OQU>#XyO^fA$WP=DHgfN0|;uuosi4$h@sV=o_%aJ>#WwRuI zeJFim0N2L=%276sG(;}3G5~I{I;LS!HpTxrR0vjZWt1o4l~NT*D+*9J`f(!&H&k8U zR2#c&wYL-hkv~3*`^4rcq^g`G#;Qdi%K?Vw9e>B{+~xc$63e2p$Vm_~W_E41#ve^= zkSu>Av3^Fu)w2k<^#h!H zFan0rvLe5leihvRB$Vx~XL5w(c`Lh;5h2E#)UJ0S)%8tPSB(Z`8~mMYBZ|T8hbmVf zrPSuXnN0Du;n#F@=2q&m*)6Dy77WuaK!%!BE3}MRmO)z>!@lBfo87kCdfCTB2%*FC z%b_Fw-&Hspc!CH5Ht~8cn-D=fhGK*_;cGp}Z%)tgw{!U*`q=REe}xkKKe<;)lfN+X zt&Awh%dp}MY*D+hU55zDVfF+MP~HE_Kj6P#T*oHp3;!M2GMUY` zkv9=q2;yS4fZ9Jcad~EYcN9?f!{$c5laDTs^oFs0Od-umyxKn{{(F4{-=ywg$!Y&8O@&iE9 z+(8h<3+Tsdv7fsPc7$Um&10_5%NS z{%lH=M6B6u=~~^Qw%sz|CA!vIUDzWq=H5EhBeUFGEPop((*9tFnOiNLiZXqLh}7OO zMDH3x=oEViz`{R4hXoKiJcPZ>KUq8vMyl0CMf4gDi1L@YUER1Gz?~Sg6WG#KYnKI4 z;LT_^QKABc4Ycb7HPfcX(+uA`Q%b*Sd>Z}dGBd;bNega zS}J}QV-@cyTSaOO;T!_qINLzL5h@0Z+x+-UiBe|IBXteoWdO&|y2f2k+^z6e+osml z=?eP;s9l-`|`Q}2BpAx!fU6$CTDI0hI_v}UGT|S G*ztcSvv%|V delta 2841 zcmaJ@U1%fM71p(8Bw1tmrz^>_Y}vAR8(a3;^7>~t$<~{Yb+`HRZqg()Xlb-#&9$xF z(TsBLXuWm=E+x=HN>lgJurDnwEKQSz{-B2vC=}D?DNR`jeaHk#9@>Wn0;LcF`_T5B zJNDRFnh5mip1*s~&pqerFX9iP`<+xO8Ntspd+*fWpV{rsvB>WDSk&Q>-JfN4&Ak$f zI58_?X?ABLSxK@8u9?j$O#K=a1Ale9tC6b6OKjkxlE>_HBU8z!b==N2`YZkWcDYJU z*$q?%IwCxCn@+|Liy)Qa`P(d@D}zY0tM|*kW5?vXEIBe*Ed-JXX(kWsD#M3*eVw88 z$RSrwcO>J*Lpo!GTBBB1W$aM0mrRjg~ju1~1oKi$i(2E^01VkGNiWldqP| zW^<;wNmm~D(WcwHC!#kZkRxT4s2HZv zZF#UPFQ>1tocw)yui{Hr`n{FT|mh$ewCBoj{M!o-#q)CF@8rISNeBZ zxfYQxPN&;fGEcIM@{mk`0)sNaoZQQvenBlCBl-z~6$C$yNx9BJY(qQW;wmEbM>3d)B3@!;d=&xeD5WNY%)(9<~;qUJxkub<6a)@ME6qnYMriZ9$urGM}FWYAaYI@DThc_6nqErLWnp>G{dJ zs5`=w`q=ywdFN|(U3k8Bjc?&e*G(I{EJ&gecoLi{Yh&knRW#%{Y!cj%za2{l#U^(_ zwC{}lH9GOxM8Nk*w1nVy)!atIbgZglHaI*e-@Wgp9l9mky)-iRg+UgKFAmU;HMqCo zTE4dCLIYHlQv3$5wLD(MIRRTi2wD&Voer;%3n}2i45)hih9|TW$fSPXA74lOfFGjh zKll~DlRuxFl|vJ+V5NUKF~NfF4=W8z^25^eSJdG7e}n9>Amk?41P9$hYvtUJ=%6S< z=u3*qa*z}OQr?{0MhA{f6_{}(!}9FO=PD8nzo;?P!9O6S4nKKNgu11YbF?k|Zi{2% z@q=UGHTls=j;B5~ZA6!joQhk)6vDQK&qEPrY1#MCX5HIB)0X3jB@eI)CrPhF!ex1} zCntY1JKakK_Y>}>gPn;k%*l^uhld^~op_nrRg{6+@h&?a%%>;i_^HVqbvFH3@RNb5 zxa&-g`07PCjV9{xfct6n0BxyTtwvKog&3+b zMo<(w)Hm=cs}?r6iEpBSbENYS!A$~k0DdArKDC@xW4(L5Rky9G;GS1^@L{{v{@UCY z!?ChA-^MZ5S}1*!hQoGO6Wq1B9ZcFcm@33)rt3YEjl6lQsE$5!M@NVKO4cBVf{2c6|3ME3kg?~Q&6=jTl5J`R@GiM%6{7swt ZBo@)