import discord from discord.ext import commands, tasks from discord import app_commands from datetime import datetime from database import Database import re CYBER_BLUE = discord.Color.from_rgb(52, 152, 219) CYBER_GREEN = discord.Color.from_rgb(46, 204, 113) CYBER_ORANGE = discord.Color.from_rgb(230, 126, 34) def parse_reminder_duration(duration_str: str): """Süre: '10s', '5m', '2h', '1d', '1w' -> datetime (şimdi + delta)""" duration_str = duration_str.lower().strip() multipliers = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400, 'w': 604800} match = re.match(r"^(\d+)([smhdw])$", duration_str) if not match: return None value = int(match.group(1)) unit = match.group(2) from datetime import timedelta return datetime.now() + timedelta(seconds=value * multipliers[unit]) class Reminders(commands.Cog): def __init__(self, bot): self.bot = bot self.reminder_loop.start() def cog_unload(self): self.reminder_loop.cancel() @tasks.loop(seconds=5) async def reminder_loop(self): try: now = datetime.now() records = await Database.fetch_all( "SELECT * FROM hatirlaticilar WHERE bitis_zamani <= ?", (now.isoformat(),) ) for r in records: guild = self.bot.get_guild(r['guild_id']) if not guild: await Database.execute("DELETE FROM hatirlaticilar WHERE id = ?", (r['id'],)) continue channel = guild.get_channel(r['kanal_id']) if not channel: await Database.execute("DELETE FROM hatirlaticilar WHERE id = ?", (r['id'],)) continue member = guild.get_member(r['user_id']) mention = member.mention if member else f"<@{r['user_id']}>" embed = discord.Embed( title="⏰ Hatırlatıcı!", description=f"Merhaba {mention}! Hatırlatmanız geldi:\n\n**{r['mesaj']}**", color=CYBER_ORANGE, timestamp=datetime.now() ) embed.set_footer(text="ArazAI Hatırlatıcı Sistemi") try: await channel.send(content=mention, embed=embed) except: pass await Database.execute("DELETE FROM hatirlaticilar WHERE id = ?", (r['id'],)) except Exception as e: print(f"Reminder loop hatası: {e}") @reminder_loop.before_loop async def before_reminder_loop(self): await self.bot.wait_until_ready() @commands.hybrid_command(name="hatırlat", description="Size belirli bir süre sonra hatırlatma gönderir.") @app_commands.describe( sure="Süre (örn: 10s, 5m, 2h, 1d, 1w)", mesaj="Hatırlatıcı mesajı" ) async def hatirlat(self, ctx: commands.Context, sure: str, *, mesaj: str): if ctx.interaction: await ctx.defer() bitis = parse_reminder_duration(sure) if not bitis: await ctx.send("❌ Geçersiz süre. Örnek: `10s`, `5m`, `2h`, `1d`, `1w`", ephemeral=True) return await Database.execute( "INSERT INTO hatirlaticilar (guild_id, kanal_id, user_id, mesaj, bitis_zamani) VALUES (?, ?, ?, ?, ?)", (ctx.guild.id, ctx.channel.id, ctx.author.id, mesaj, bitis.isoformat()) ) embed = discord.Embed( title="✅ Hatırlatıcı Kuruldu!", description=( f"**Mesaj:** {mesaj}\n" f"**Süre:** {sure}\n" f"**Bitiş:** ()" ), color=CYBER_GREEN, timestamp=datetime.now() ) await ctx.send(embed=embed) @commands.hybrid_command(name="hatırlatıcılar", description="Aktif hatırlatıcılardan ilk 10 tanesini listeler.") async def hatirlaticilar(self, ctx: commands.Context): if ctx.interaction: await ctx.defer() records = await Database.fetch_all( "SELECT * FROM hatirlaticilar WHERE guild_id = ? AND user_id = ? ORDER BY bitis_zamani ASC LIMIT 10", (ctx.guild.id, ctx.author.id) ) if not records: await ctx.send("ℹ️ Aktif hatırlatıcınız bulunmuyor.") return embed = discord.Embed(title="⏰ Aktif Hatırlatıcılar", color=CYBER_ORANGE, timestamp=datetime.now()) desc = "" for r in records: bitis = datetime.fromisoformat(r['bitis_zamani']) desc += f"• **#{r['id']}** | | {r['mesaj'][:50]}\n" embed.description = desc embed.set_footer(text="Silmek için: /hatırlatıcı-sil ") await ctx.send(embed=embed) @commands.hybrid_command(name="hatırlatıcı-sil", description="Bir hatırlatıcıyı ID ile siler.") @app_commands.describe(id="Hatırlatıcı ID") async def hatirlatici_sil(self, ctx: commands.Context, id: int): if ctx.interaction: await ctx.defer() rows = await Database.execute( "DELETE FROM hatirlaticilar WHERE id = ? AND guild_id = ? AND user_id = ?", (id, ctx.guild.id, ctx.author.id) ) if rows > 0: await ctx.send(f"✅ #{id} hatırlatıcısı silindi.") else: await ctx.send("❌ Hatırlatıcı bulunamadı veya size ait değil.", ephemeral=True) async def setup(bot): await bot.add_cog(Reminders(bot))