| 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) |
|
|
| |
| @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) |
|
|
| |
| @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) |
|
|
| |
| @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) |
|
|
| |
| @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) |
|
|
| |
| @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) |
|
|
| |
| @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) |
|
|
| |
| @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) |
|
|
| |
| @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) |
|
|
| |
| @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) |
|
|
| |
| @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) |
|
|
| |
| @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) |
|
|
| |
| @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) |
|
|
| |
| @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: |
| |
| 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)) |
|
|