aboutsummaryrefslogtreecommitdiffstats
path: root/cogs/cron.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/cron.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 '')
-rw-r--r--cogs/cron.py103
1 files changed, 71 insertions, 32 deletions
diff --git a/cogs/cron.py b/cogs/cron.py
index 4a63e3a..b4f494a 100644
--- a/cogs/cron.py
+++ b/cogs/cron.py
@@ -4,9 +4,7 @@
4# https://codeberg.org/salmonik/senator-sperma 4# https://codeberg.org/salmonik/senator-sperma
5 5
6import asyncio 6import asyncio
7import json
8import logging 7import logging
9import os
10from datetime import datetime 8from datetime import datetime
11from venv import logger 9from venv import logger
12 10
@@ -16,37 +14,74 @@ from discord.ext import commands
16 14
17from cogs.utils import file_search as search_utils 15from cogs.utils import file_search as search_utils
18from cogs.voice import get_voice_manager 16from cogs.voice import get_voice_manager
17from cogs.utils.database import get_connection, init_database
19 18
20logger = logging.getLogger(__name__) 19logger = logging.getLogger(__name__)
21 20
21init_database()
22
22 23
23class Cron(commands.Cog): 24class Cron(commands.Cog):
24 def __init__(self, bot): 25 def __init__(self, bot):
25 self.bot = bot 26 self.bot = bot
26 self.scheduled_tasks = [] 27 self.scheduled_tasks = []
27 self.cron_file = "data/cron_jobs.json"
28 self.load_tasks() 28 self.load_tasks()
29 self.task = bot.loop.create_task(self.schedule_checker()) 29 self.task = bot.loop.create_task(self.schedule_checker())
30 30
31 def load_tasks(self): 31 def load_tasks(self):
32 """Load scheduled tasks from file"""
33 try: 32 try:
34 if os.path.exists(self.cron_file): 33 conn = get_connection()
35 with open(self.cron_file, "r") as f: 34 try:
36 self.scheduled_tasks = json.load(f) 35 c = conn.cursor()
37 logger.info(f"Loaded {len(self.scheduled_tasks)} cron jobs") 36 c.execute("SELECT id, cron_expression, type, channel_id, active, audio_filename, message FROM cron_jobs")
38 else: 37 rows = c.fetchall()
39 self.scheduled_tasks = [] 38 finally:
39 conn.close()
40
41 self.scheduled_tasks = [
42 {
43 "id": row[0],
44 "cron_expression": row[1],
45 "type": row[2],
46 "channel_id": row[3],
47 "active": bool(row[4]),
48 "audio_filename": row[5],
49 "message": row[6],
50 }
51 for row in rows
52 ]
53 logger.info(f"Loaded {len(self.scheduled_tasks)} cron jobs from database")
40 except Exception as e: 54 except Exception as e:
41 logger.error(f"Error loading cron jobs: {e}") 55 logger.error(f"Error loading cron jobs: {e}")
42 self.scheduled_tasks = [] 56 self.scheduled_tasks = []
43 57
44 def save_tasks(self): 58 def save_tasks(self):
45 """Save scheduled tasks to file"""
46 try: 59 try:
47 os.makedirs(os.path.dirname(self.cron_file), exist_ok=True) 60 conn = get_connection()
48 with open(self.cron_file, "w") as f: 61 try:
49 json.dump(self.scheduled_tasks, f, indent=2) 62 c = conn.cursor()
63 c.execute("PRAGMA foreign_keys = ON")
64
65 c.execute("DELETE FROM cron_jobs")
66
67 for task in self.scheduled_tasks:
68 c.execute(
69 """INSERT INTO cron_jobs (id, cron_expression, type, channel_id, active, audio_filename, message)
70 VALUES (?, ?, ?, ?, ?, ?, ?)""",
71 (
72 task.get("id"),
73 task["cron_expression"],
74 task["type"],
75 task["channel_id"],
76 int(task.get("active", True)),
77 task.get("audio_filename"),
78 task.get("message"),
79 ),
80 )
81
82 conn.commit()
83 finally:
84 conn.close()
50 except Exception as e: 85 except Exception as e:
51 logger.error(f"Error saving cron jobs: {e}") 86 logger.error(f"Error saving cron jobs: {e}")
52 87
@@ -132,11 +167,13 @@ class Cron(commands.Cog):
132 while voice_client.is_playing(): 167 while voice_client.is_playing():
133 await asyncio.sleep(1) 168 await asyncio.sleep(1)
134 169
170 logger.info("Audio playback finished normally - disconnecting")
135 await voice_client.disconnect() 171 await voice_client.disconnect()
136 logger.info(f"Finished playing audio: {audio_url}") 172 logger.info(f"Finished playing audio: {audio_url}")
137 except Exception as e: 173 except Exception as e:
138 logger.error(f"Error playing audio: {e}") 174 logger.error(f"Error playing audio: {e}")
139 if voice_client.is_connected(): 175 if voice_client.is_connected():
176 logger.info("Audio playback failed - disconnecting")
140 await voice_client.disconnect() 177 await voice_client.disconnect()
141 if channel.guild.system_channel: 178 if channel.guild.system_channel:
142 await channel.guild.system_channel.send( 179 await channel.guild.system_channel.send(
@@ -176,8 +213,19 @@ class Cron(commands.Cog):
176 else [discord.OptionChoice(name="Brak wyników", value="")] 213 else [discord.OptionChoice(name="Brak wyników", value="")]
177 ) 214 )
178 215
179 @commands.slash_command( 216 def _get_baseurl(self):
180 name="cron_dodaj_audio", description="Dodaj nowe zadanie cron audio" 217 """Get base URL from settings"""
218 try:
219 from cogs.utils.settings import get_baseurl
220
221 return get_baseurl()
222 except Exception:
223 return ""
224
225 trigger_group = discord.SlashCommandGroup("cron", "komendy cron")
226
227 @trigger_group.command(
228 name="dodaj_audio", description="Dodaj nowe zadanie cron audio"
181 ) 229 )
182 async def cron_add_audio( 230 async def cron_add_audio(
183 self, 231 self,
@@ -227,8 +275,8 @@ class Cron(commands.Cog):
227 f"Zadanie cron dodane. ID: {task_id}\nSkładnia: `{cron_expression}`\nAkcja: audio\nKanał: <#{channel.id}>" 275 f"Zadanie cron dodane. ID: {task_id}\nSkładnia: `{cron_expression}`\nAkcja: audio\nKanał: <#{channel.id}>"
228 ) 276 )
229 277
230 @commands.slash_command( 278 @trigger_group.command(
231 name="cron_dodaj_wiadomość", description="Dodaj nowe zadanie cron wiadomość" 279 name="dodaj_wiadomość", description="Dodaj nowe zadanie cron wiadomość"
232 ) 280 )
233 async def cron_add_message( 281 async def cron_add_message(
234 self, 282 self,
@@ -272,17 +320,8 @@ class Cron(commands.Cog):
272 f"Zadanie cron dodane. ID: {task_id}\nSkładnia: `{cron_expression}`\nAkcja: wiadomość\nKanał: <#{channel.id}>" 320 f"Zadanie cron dodane. ID: {task_id}\nSkładnia: `{cron_expression}`\nAkcja: wiadomość\nKanał: <#{channel.id}>"
273 ) 321 )
274 322
275 def _get_baseurl(self): 323 @trigger_group.command(
276 """Get base URL from settings""" 324 name="pokaż", description="Pokaż wszystkie zadania cron"
277 try:
278 from cogs.utils.settings import get_baseurl
279
280 return get_baseurl()
281 except Exception:
282 return ""
283
284 @commands.slash_command(
285 name="cron_pokaż", description="Pokaż wszystkie zadania cron"
286 ) 325 )
287 async def cron_list(self, ctx): 326 async def cron_list(self, ctx):
288 """List all cron jobs""" 327 """List all cron jobs"""
@@ -313,7 +352,7 @@ class Cron(commands.Cog):
313 352
314 await ctx.respond(embed=embed) 353 await ctx.respond(embed=embed)
315 354
316 @commands.slash_command(name="cron_usuń", description="Usuń zadanie cron z ID") 355 @trigger_group.command(name="usuń", description="Usuń zadanie cron z ID")
317 async def cron_remove( 356 async def cron_remove(
318 self, 357 self,
319 ctx, 358 ctx,
@@ -331,7 +370,7 @@ class Cron(commands.Cog):
331 370
332 await ctx.respond(f"Nie znaleziono zadania cron z ID {job_id}") 371 await ctx.respond(f"Nie znaleziono zadania cron z ID {job_id}")
333 372
334 @commands.slash_command(name="cron_pauza", description="Zapauzuj zadanie cron z ID") 373 @trigger_group.command(name="pauza", description="Zapauzuj zadanie cron z ID")
335 async def cron_pause( 374 async def cron_pause(
336 self, 375 self,
337 ctx, 376 ctx,
@@ -349,7 +388,7 @@ class Cron(commands.Cog):
349 388
350 await ctx.respond(f"Nie znaleziono zadania cron z ID {job_id}") 389 await ctx.respond(f"Nie znaleziono zadania cron z ID {job_id}")
351 390
352 @commands.slash_command(name="cron_wznów", description="Wznów zadanie cron z ID") 391 @trigger_group.command(name="wznów", description="Wznów zadanie cron z ID")
353 async def cron_resume( 392 async def cron_resume(
354 self, 393 self,
355 ctx, 394 ctx,