import discord from discord.ext import commands from discord import app_commands from datetime import datetime CYBER_BLUE = discord.Color.from_rgb(52, 152, 219) CYBER_RED = discord.Color.from_rgb(231, 76, 60) CYBER_ORANGE = discord.Color.from_rgb(230, 126, 34) CYBER_GREEN = discord.Color.from_rgb(46, 204, 113) class Logs(commands.Cog): def __init__(self, bot): self.bot = bot async def _send_log(self, guild: discord.Guild, embed: discord.Embed): """Yardımcı fonksiyon: Belirtilen log kanalına embed gönderir""" log_channel_id = await Database.log_kanali_getir(guild.id) if not log_channel_id: return channel = guild.get_channel(log_channel_id) if channel: try: await channel.send(embed=embed) except: pass @commands.hybrid_command(name="log-kanal-ayarla", description="Sunucu olaylarının kaydedileceği log kanalını belirler.") @commands.has_permissions(administrator=True) @app_commands.describe(kanal="Logların gönderileceği metin kanalı (Boş bırakılırsa log sistemi kapatılır)") async def log_kanal_ayarla(self, ctx: commands.Context, kanal: discord.TextChannel = None): if ctx.interaction: await ctx.defer() kanal_id = kanal.id if kanal else 0 try: await Database.log_kanali_ayarla(ctx.guild.id, kanal_id) if kanal: await ctx.send(f"✅ Olay log kanalı {kanal.mention} olarak ayarlandı.") else: await ctx.send("✅ Olay loglama sistemi devre dışı bırakıldı.") except Exception as e: await ctx.send(f"❌ Log kanalı ayarlanırken bir veritabanı hatası oluştu: {e}", ephemeral=True) # 1. --- SİLİNEN MESAJ LOGLARI --- @commands.Cog.listener() async def on_message_delete(self, message: discord.Message): if message.author.bot or not message.guild: return if not await Database.modul_aktif_mi(message.guild.id, "Logs"): return embed = discord.Embed( title="🗑️ Mesaj Silindi", description=f"**Kanal:** {message.channel.mention}\n" f"**Yazar:** {message.author.mention} (`{message.author.id}`)", color=CYBER_RED, timestamp=datetime.now() ) if message.content: embed.add_field(name="Mesaj İçeriği", value=message.content[:1024], inline=False) else: embed.add_field(name="Mesaj İçeriği", value="*İçerik boş veya sadece görsel/ek içeriyordu.*", inline=False) if message.attachments: image_url = None for a in message.attachments: is_image = (a.content_type and a.content_type.startswith("image")) or a.filename.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.webp')) if is_image: image_url = a.url break if image_url: embed.set_image(url=image_url) attachments_str = ", ".join([f"[{a.filename}]({a.url})" for a in message.attachments]) embed.add_field(name="Ekler (Dosyalar)", value=attachments_str[:1024], inline=False) await self._send_log(message.guild, embed) # 2. --- DÜZENLENEN MESAJ LOGLARI --- @commands.Cog.listener() async def on_message_edit(self, before: discord.Message, after: discord.Message): if after.author.bot or not after.guild: return if not await Database.modul_aktif_mi(after.guild.id, "Logs"): return if before.content == after.content: return embed = discord.Embed( title="📝 Mesaj Düzenlendi", description=f"**Kanal:** {after.channel.mention}\n" f"**Yazar:** {after.author.mention} (`{after.author.id}`)\n" f"**Mesaja Git:** [Tıkla]({after.jump_url})", color=CYBER_ORANGE, timestamp=datetime.now() ) embed.add_field(name="Eski İçerik", value=(before.content or "*Boş*")[:1024], inline=False) embed.add_field(name="Yeni İçerik", value=(after.content or "*Boş*")[:1024], inline=False) await self._send_log(after.guild, embed) # 3. --- SES KANALI LOGLARI --- @commands.Cog.listener() async def on_voice_state_update(self, member: discord.Member, before: discord.VoiceState, after: discord.VoiceState): if member.bot or not member.guild: return if not await Database.modul_aktif_mi(member.guild.id, "Logs"): return embed = discord.Embed( description=f"**Kullanıcı:** {member.mention} (`{member.id}`)", timestamp=datetime.now() ) embed.set_author(name=member.display_name, icon_url=member.display_avatar.url) if before.channel is None and after.channel is not None: embed.title = "🔊 Ses Kanalına Katıldı" embed.description += f"\n**Katıldığı Kanal:** {after.channel.name} (`{after.channel.id}`)" embed.color = CYBER_GREEN await self._send_log(member.guild, embed) elif before.channel is not None and after.channel is None: embed.title = "🔇 Ses Kanalından Ayrıldı" embed.description += f"\n**Ayrıldığı Kanal:** {before.channel.name} (`{before.channel.id}`)" embed.color = CYBER_RED await self._send_log(member.guild, embed) elif before.channel is not None and after.channel is not None and before.channel.id != after.channel.id: embed.title = "🔄 Ses Kanalı Değiştirdi" embed.description += f"\n**Eski Kanal:** {before.channel.name}\n**Yeni Kanal:** {after.channel.name}" embed.color = CYBER_BLUE await self._send_log(member.guild, embed) # 4. --- ÜYE GÜNCELLEME / NICK / ROL LOGLARI --- @commands.Cog.listener() async def on_member_update(self, before: discord.Member, after: discord.Member): if before.bot or not after.guild: return if not await Database.modul_aktif_mi(after.guild.id, "Logs"): return embed = discord.Embed( description=f"**Kullanıcı:** {after.mention} (`{after.id}`)", timestamp=datetime.now() ) embed.set_author(name=after.display_name, icon_url=after.display_avatar.url) if before.roles != after.roles: added_roles = [r for r in after.roles if r not in before.roles] removed_roles = [r for r in before.roles if r not in after.roles] if added_roles or removed_roles: embed.title = "🛡️ Rolleri Güncellendi" embed.color = CYBER_BLUE if added_roles: embed.add_field(name="Verilen Roller", value=", ".join([r.mention for r in added_roles]), inline=False) if removed_roles: embed.add_field(name="Alınan Roller", value=", ".join([r.mention for r in removed_roles]), inline=False) await self._send_log(after.guild, embed) return if before.nick != after.nick: embed.title = "👤 Sunucu Takma Adı Değiştirildi" embed.color = CYBER_ORANGE embed.add_field(name="Eski Ad", value=before.nick or before.name, inline=True) embed.add_field(name="Yeni Ad", value=after.nick or after.name, inline=True) await self._send_log(after.guild, embed) # 5. --- KANAL OLUŞTURMA / SİLME LOGLARI --- @commands.Cog.listener() async def on_guild_channel_create(self, channel: discord.abc.GuildChannel): if not await Database.modul_aktif_mi(channel.guild.id, "Logs"): return embed = discord.Embed( title="🆕 Yeni Kanal Oluşturuldu", description=f"**Kanal Adı:** {channel.name}\n**Tür:** `{str(channel.type)}`\n**ID:** `{channel.id}`", color=CYBER_GREEN, timestamp=datetime.now() ) await self._send_log(channel.guild, embed) @commands.Cog.listener() async def on_guild_channel_delete(self, channel: discord.abc.GuildChannel): if not await Database.modul_aktif_mi(channel.guild.id, "Logs"): return embed = discord.Embed( title="🗑️ Kanal Silindi", description=f"**Kanal Adı:** {channel.name}\n**Tür:** `{str(channel.type)}`\n**ID:** `{channel.id}`", color=CYBER_RED, timestamp=datetime.now() ) await self._send_log(channel.guild, embed) # 6. --- ROL OLUŞTURMA / SİLME LOGLARI --- @commands.Cog.listener() async def on_guild_role_create(self, role: discord.Role): if not await Database.modul_aktif_mi(role.guild.id, "Logs"): return embed = discord.Embed( title="🆕 Yeni Rol Oluşturuldu", description=f"**Rol Adı:** {role.mention}\n**ID:** `{role.id}`", color=CYBER_GREEN, timestamp=datetime.now() ) await self._send_log(role.guild, embed) @commands.Cog.listener() async def on_guild_role_delete(self, role: discord.Role): if not await Database.modul_aktif_mi(role.guild.id, "Logs"): return embed = discord.Embed( title="🗑️ Rol Silindi", description=f"**Rol Adı:** {role.name}\n**ID:** `{role.id}`", color=CYBER_RED, timestamp=datetime.now() ) await self._send_log(role.guild, embed) # 7. --- YASAKLAMA / YASAK KALDIRMA LOGLARI --- @commands.Cog.listener() async def on_member_ban(self, guild: discord.Guild, user: discord.User): if not await Database.modul_aktif_mi(guild.id, "Logs"): return embed = discord.Embed( title="🔨 Üye Yasaklandı (Ban)", description=f"**Kullanıcı:** {user.mention} (`{user.id}`)\n**Hesap Açılış Tarihi:** {user.created_at.strftime('%d.%m.%Y')}", color=CYBER_RED, timestamp=datetime.now() ) embed.set_thumbnail(url=user.display_avatar.url) await self._send_log(guild, embed) @commands.Cog.listener() async def on_member_unban(self, guild: discord.Guild, user: discord.User): if not await Database.modul_aktif_mi(guild.id, "Logs"): return embed = discord.Embed( title="🔓 Üye Yasağı Kaldırıldı (Unban)", description=f"**Kullanıcı:** {user.mention} (`{user.id}`)", color=CYBER_GREEN, timestamp=datetime.now() ) embed.set_thumbnail(url=user.display_avatar.url) await self._send_log(guild, embed) # 8. --- ÜYE KATILIM & AYRILMA LOGLARI --- @commands.Cog.listener() async def on_member_join(self, member: discord.Member): if not await Database.modul_aktif_mi(member.guild.id, "Logs"): return embed = discord.Embed( title="📥 Üye Sunucuya Katıldı", description=f"**Kullanıcı:** {member.mention} (`{member.id}`)\n" f"**Hesap Açılış Tarihi:** {member.created_at.strftime('%d.%m.%Y %H:%M:%S')}\n" f"**Toplam Üye:** `{member.guild.member_count}`", color=CYBER_GREEN, timestamp=datetime.now() ) embed.set_thumbnail(url=member.display_avatar.url) await self._send_log(member.guild, embed) @commands.Cog.listener() async def on_member_remove(self, member: discord.Member): if not await Database.modul_aktif_mi(member.guild.id, "Logs"): return embed = discord.Embed( title="📤 Üye Sunucudan Ayrıldı", description=f"**Kullanıcı:** {member.mention} (`{member.id}`)\n" f"**Toplam Üye:** `{member.guild.member_count}`", color=CYBER_RED, timestamp=datetime.now() ) embed.set_thumbnail(url=member.display_avatar.url) await self._send_log(member.guild, embed) # 9. --- DAVET OLUŞTURMA & SİLME LOGLARI --- @commands.Cog.listener() async def on_invite_create(self, invite: discord.Invite): if not await Database.modul_aktif_mi(invite.guild.id, "Logs"): return embed = discord.Embed( title="🎫 Davet Bağlantısı Oluşturuldu", description=f"**Oluşturan:** {invite.inviter.mention if invite.inviter else 'Bilinmiyor'} (`{invite.inviter.id if invite.inviter else ''}`)\n" f"**Kod:** `{invite.code}`\n" f"**Kanal:** {invite.channel.mention if invite.channel else 'Belirsiz'}\n" f"**Maksimum Kullanım:** `{invite.max_uses if invite.max_uses else 'Sınırsız'}`\n" f"**Süre:** `{invite.max_age if invite.max_age else 'Süresiz'}` saniye", color=CYBER_GREEN, timestamp=datetime.now() ) await self._send_log(invite.guild, embed) @commands.Cog.listener() async def on_invite_delete(self, invite: discord.Invite): if not await Database.modul_aktif_mi(invite.guild.id, "Logs"): return embed = discord.Embed( title="🗑️ Davet Bağlantısı Silindi", description=f"**Kod:** `{invite.code}`\n**Kanal:** {invite.channel.mention if invite.channel else 'Belirsiz'}", color=CYBER_RED, timestamp=datetime.now() ) await self._send_log(invite.guild, embed) # 10. --- SUNUCU (GUILD) GÜNCELLEME LOGLARI --- @commands.Cog.listener() async def on_guild_update(self, before: discord.Guild, after: discord.Guild): if not await Database.modul_aktif_mi(after.id, "Logs"): return embed = discord.Embed( title="⚙️ Sunucu Ayarları Güncellendi", color=CYBER_ORANGE, timestamp=datetime.now() ) changes = [] if before.name != after.name: changes.append(f"**Sunucu Adı Değişti:** `{before.name}` ➡️ `{after.name}`") if before.afk_channel != after.afk_channel: changes.append(f"**AFK Kanalı Değişti:** `{before.afk_channel.name if before.afk_channel else 'Yok'}` ➡️ `{after.afk_channel.name if after.afk_channel else 'Yok'}`") if before.verification_level != after.verification_level: changes.append(f"**Doğrulama Seviyesi:** `{before.verification_level}` ➡️ `{after.verification_level}`") if before.premium_tier != after.premium_tier: changes.append(f"**Takviye Seviyesi:** `Seviye {before.premium_tier}` ➡️ `Seviye {after.premium_tier}` (Toplam Takviye: `{after.premium_subscription_count}`)") if not changes: return embed.description = "\n".join(changes) await self._send_log(after, embed) # 11. --- ROL GÜNCELLEME LOGLARI --- @commands.Cog.listener() async def on_guild_role_update(self, before: discord.Role, after: discord.Role): if not await Database.modul_aktif_mi(after.guild.id, "Logs"): return embed = discord.Embed( title="🛡️ Rol Ayarları Güncellendi", description=f"**Rol:** {after.mention} (`{after.id}`)", color=CYBER_ORANGE, timestamp=datetime.now() ) changes = [] if before.name != after.name: changes.append(f"**Adı Değişti:** `{before.name}` ➡️ `{after.name}`") if before.color != after.color: changes.append(f"**Rengi Değişti:** `{before.color}` ➡️ `{after.color}`") if before.permissions != after.permissions: changes.append(f"**Yetkileri Değiştirildi.** (Farklılıklar tespit edildi)") if not changes: return embed.description += "\n\n" + "\n".join(changes) await self._send_log(after.guild, embed) # 12. --- KANAL AYARI GÜNCELLEME LOGLARI --- @commands.Cog.listener() async def on_guild_channel_update(self, before: discord.abc.GuildChannel, after: discord.abc.GuildChannel): if not await Database.modul_aktif_mi(after.guild.id, "Logs"): return embed = discord.Embed( title="⚙️ Kanal Ayarları Güncellendi", description=f"**Kanal:** {after.mention if hasattr(after, 'mention') else after.name} (`{after.id}`)", color=CYBER_ORANGE, timestamp=datetime.now() ) changes = [] if before.name != after.name: changes.append(f"**Adı Değişti:** `{before.name}` ➡️ `{after.name}`") if hasattr(before, 'topic') and hasattr(after, 'topic') and before.topic != after.topic: changes.append(f"**Konusu Değişti:**\n*Eski:* {before.topic or 'Yok'}\n*Yeni:* {after.topic or 'Yok'}") if hasattr(before, 'slowmode_delay') and hasattr(after, 'slowmode_delay') and before.slowmode_delay != after.slowmode_delay: changes.append(f"**Yavaş Mod Değişti:** `{before.slowmode_delay}s` ➡️ `{after.slowmode_delay}s`") if not changes: return embed.description += "\n\n" + "\n".join(changes) await self._send_log(after.guild, embed) # 13. --- EMOJI & STICKER GÜNCELLEME LOGLARI --- @commands.Cog.listener() async def on_guild_emojis_update(self, guild: discord.Guild, before: list[discord.Emoji], after: list[discord.Emoji]): if not await Database.modul_aktif_mi(guild.id, "Logs"): return embed = discord.Embed( title="🎨 Emojiler Güncellendi", color=CYBER_ORANGE, timestamp=datetime.now() ) if len(before) < len(after): added = [e for e in after if e not in before][0] embed.description = f"➕ **Yeni Emoji Eklendi:** {added} (`{added.name}` | ID: `{added.id}`)" embed.color = CYBER_GREEN elif len(before) > len(after): removed = [e for e in before if e not in after][0] embed.description = f"➖ **Emoji Silindi:** `{removed.name}` (ID: `{removed.id}`)" embed.color = CYBER_RED else: # Emoji ismi değişmiş olabilir for e_before in before: for e_after in after: if e_before.id == e_after.id and e_before.name != e_after.name: embed.description = f"✏️ **Emoji Adı Değiştirildi:** `{e_before.name}` ➡️ `{e_after.name}` {e_after}" break if not embed.description: return await self._send_log(guild, embed) @commands.Cog.listener() async def on_guild_stickers_update(self, guild: discord.Guild, before: list[discord.GuildSticker], after: list[discord.GuildSticker]): if not await Database.modul_aktif_mi(guild.id, "Logs"): return embed = discord.Embed( title="🖼️ Çıkartmalar (Stickers) Güncellendi", color=CYBER_ORANGE, timestamp=datetime.now() ) if len(before) < len(after): added = [s for s in after if s not in before][0] embed.description = f"➕ **Yeni Çıkartma Eklendi:** `{added.name}` (ID: `{added.id}`)" embed.color = CYBER_GREEN elif len(before) > len(after): removed = [s for s in before if s not in after][0] embed.description = f"➖ **Çıkartma Silindi:** `{removed.name}` (ID: `{removed.id}`)" embed.color = CYBER_RED else: for s_before in before: for s_after in after: if s_before.id == s_after.id and s_before.name != s_after.name: embed.description = f"✏️ **Çıkartma Adı Değiştirildi:** `{s_before.name}` ➡️ `{s_after.name}`" break if not embed.description: return await self._send_log(guild, embed) from database import Database async def setup(bot): await bot.add_cog(Logs(bot))