Hilmany / cogs /logs.py
HilmanBey's picture
Upload 64 files
cbb05ec verified
Raw
History Blame Contribute Delete
20.5 kB
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))