aboutsummaryrefslogtreecommitdiffstats
path: root/cogs/utils/database.py
diff options
context:
space:
mode:
authorsalmonik <raisersoft@proton.me>2026-04-28 20:05:36 +0200
committersalmonik <raisersoft@proton.me>2026-04-28 20:05:36 +0200
commit5675dfd20b24f1e0eef06b11d9ec41a894d3a5bf (patch)
treecaad1669db6fce506dd0494aeaf2a43f7e291679 /cogs/utils/database.py
parentbetter UX for web.py (diff)
downloadsenator-sperma-5675dfd20b24f1e0eef06b11d9ec41a894d3a5bf.tar.gz
senator-sperma-5675dfd20b24f1e0eef06b11d9ec41a894d3a5bf.zip
multitude of changes.
but primarly, use db for all data. Signed-off-by: salmonik <raisersoft@proton.me>
Diffstat (limited to 'cogs/utils/database.py')
-rw-r--r--cogs/utils/database.py111
1 files changed, 111 insertions, 0 deletions
diff --git a/cogs/utils/database.py b/cogs/utils/database.py
new file mode 100644
index 0000000..67cbc9f
--- /dev/null
+++ b/cogs/utils/database.py
@@ -0,0 +1,111 @@
1import os
2import sqlite3
3import logging
4
5logger = logging.getLogger(__name__)
6
7DB_PATH = "data/senator.db"
8
9_initialized = False
10
11
12def get_connection():
13 return sqlite3.connect(get_db_path())
14
15
16def get_db_path():
17 return os.getenv("SENATOR_DB_PATH", DB_PATH)
18
19
20def set_db_path(path):
21 global DB_PATH
22 DB_PATH = path
23
24
25def init_database():
26 global _initialized
27 if _initialized:
28 return
29
30 _initialized = True
31
32 db_path = get_db_path()
33 db_dir = os.path.dirname(db_path)
34 if db_dir and not os.path.exists(db_dir):
35 os.makedirs(db_dir)
36
37 conn = sqlite3.connect(db_path)
38 try:
39 c = conn.cursor()
40
41 c.execute("PRAGMA foreign_keys = ON")
42
43 c.execute("""
44 CREATE TABLE IF NOT EXISTS settings (
45 key TEXT PRIMARY KEY,
46 value TEXT
47 )""")
48
49 c.execute("""
50 CREATE TABLE IF NOT EXISTS cron_jobs (
51 id INTEGER PRIMARY KEY AUTOINCREMENT,
52 cron_expression TEXT NOT NULL,
53 type TEXT NOT NULL,
54 channel_id INTEGER NOT NULL,
55 active INTEGER DEFAULT 1,
56 audio_filename TEXT,
57 message TEXT,
58 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
59 )""")
60
61 c.execute("""
62 CREATE TABLE IF NOT EXISTS voice_activity (
63 user_id TEXT PRIMARY KEY,
64 join_time REAL,
65 total_active REAL DEFAULT 0,
66 total_afk REAL DEFAULT 0,
67 is_afk INTEGER DEFAULT 0,
68 afk_start REAL,
69 active_start REAL,
70 channel_name TEXT,
71 last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP
72 )""")
73
74 c.execute("CREATE INDEX IF NOT EXISTS idx_voice_activity_user_id ON voice_activity(user_id)")
75 c.execute("CREATE INDEX IF NOT EXISTS idx_cron_jobs_active ON cron_jobs(active)")
76
77 c.execute("""
78 CREATE TABLE IF NOT EXISTS triggers (
79 id INTEGER PRIMARY KEY AUTOINCREMENT,
80 name TEXT NOT NULL UNIQUE,
81 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
82 last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP
83 )""")
84
85 c.execute("""
86 CREATE TABLE IF NOT EXISTS trigger_keywords (
87 id INTEGER PRIMARY KEY AUTOINCREMENT,
88 trigger_id INTEGER NOT NULL,
89 keyword TEXT NOT NULL,
90 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
91 FOREIGN KEY (trigger_id) REFERENCES triggers(id) ON DELETE CASCADE,
92 UNIQUE(trigger_id, keyword)
93 )""")
94
95 c.execute("""
96 CREATE TABLE IF NOT EXISTS trigger_responses (
97 id INTEGER PRIMARY KEY AUTOINCREMENT,
98 trigger_id INTEGER NOT NULL,
99 response_text TEXT NOT NULL,
100 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
101 FOREIGN KEY (trigger_id) REFERENCES triggers(id) ON DELETE CASCADE
102 )""")
103
104 c.execute("CREATE INDEX IF NOT EXISTS idx_trigger_keywords_trigger_id ON trigger_keywords(trigger_id)")
105 c.execute("CREATE INDEX IF NOT EXISTS idx_trigger_keywords_keyword ON trigger_keywords(keyword)")
106 c.execute("CREATE INDEX IF NOT EXISTS idx_trigger_responses_trigger_id ON trigger_responses(trigger_id)")
107
108 conn.commit()
109 logger.info("Database initialized successfully")
110 finally:
111 conn.close()