import discord from discord.ext import commands, tasks import json import os import logging from datetime import datetime, timezone from database import Database # Loglamayı Yapılandır logging.basicConfig(level=logging.INFO, format='%(asctime)s:%(levelname)s:%(name)s: %(message)s') # Konfigürasyonu Yükle CONFIG_PATH = os.path.join(os.path.dirname(__file__), "config.json") with open(CONFIG_PATH, "r", encoding="utf-8") as f: config = json.load(f) token = config.get("discord_bot_token", "") prefix = config.get("prefix", "!") class ArazTree(discord.app_commands.CommandTree): async def interaction_check(self, interaction: discord.Interaction) -> bool: if not interaction.guild: return True if interaction.command: binding = getattr(interaction.command, "binding", None) if binding and isinstance(binding, commands.Cog): cog_name = binding.qualified_name if cog_name.lower() == "sistem": return True is_active = await Database.modul_aktif_mi(interaction.guild.id, cog_name) if not is_active: try: if not interaction.response.is_done(): await interaction.response.send_message( f"❌ **{cog_name}** modülü bu sunucuda devre dışı bırakılmıştır.", ephemeral=True ) else: await interaction.followup.send( f"❌ **{cog_name}** modülü bu sunucuda devre dışı bırakılmıştır.", ephemeral=True ) except: pass return False return await super().interaction_check(interaction) # Bütün yetkileri aktif et (Anti-raid ve üye takibi için gereklidir) intents = discord.Intents.all() class HilmanBot(commands.Bot): def __init__(self): super().__init__( command_prefix=commands.when_mentioned_or(prefix), intents=intents, help_command=None, # Özelleştirilmiş help komutu ekleyeceğiz tree_cls=ArazTree ) import random self.instance_id = random.randint(1000, 9999) self.initial_extensions = [ "cogs.sistem", "cogs.moderation", "cogs.anti_raid", "cogs.ai", "cogs.partnership", "cogs.fun", "cogs.logs", "cogs.stats", "cogs.ticket", "cogs.welcome", "cogs.level", "cogs.giveaway", "cogs.suggestion", "cogs.poll", "cogs.reaction_roles", "cogs.autorole", "cogs.verification", "cogs.temp_channels", "cogs.economy", "cogs.birthday", "cogs.counting", "cogs.reminders", "cogs.custom_commands", "cogs.stream_alerts", "cogs.translate", "cogs.weather", "cogs.qr", "cogs.timezone", "cogs.itibar", ] async def setup_hook(self): # Global prefix/hybrid check @self.check async def global_cooldown_and_module_check(ctx: commands.Context): if not ctx.guild: return True if ctx.command and ctx.command.cog: cog_name = ctx.command.cog.qualified_name if cog_name.lower() == "sistem": return True is_active = await Database.modul_aktif_mi(ctx.guild.id, cog_name) if not is_active: try: await ctx.send(f"❌ **{cog_name}** modülü bu sunucuda devre dışı bırakılmıştır.", delete_after=10) except: pass return False return True # 1. Partnerlik persistent (kalıcı) görünümünü ekle (bot resetlense bile buton çalışmaya devam eder) from cogs.partnership import PartnerTetikleyiciView self.add_view(PartnerTetikleyiciView()) # 1.2 Ticket persistent view (panel butonu ve kontrol paneli) try: from cogs.ticket import TicketPanelView, TicketControlView self.add_view(TicketPanelView()) self.add_view(TicketControlView()) except Exception as e: logging.warning(f"Ticket persistent view eklenemedi: {e}") # 1.3 Doğrulama butonu persistent (verify_btn custom id) try: verify_view = discord.ui.View(timeout=None) verify_view.add_item(discord.ui.Button(label="Doğrula", style=discord.ButtonStyle.success, custom_id="verify_btn", emoji="✅")) self.add_view(verify_view) except Exception as e: logging.warning(f"Verification persistent view eklenemedi: {e}") # 1.4 Popülerlik bildirim butonu persistent (toggle_populerlik_notif custom id) try: from cogs.itibar import PopulerlikNotificationToggleView self.add_view(PopulerlikNotificationToggleView()) except Exception as e: logging.warning(f"Populerlik persistent view eklenemedi: {e}") # 2. Cog uzantılarını yükle for ext in self.initial_extensions: try: await self.load_extension(ext) logging.info(f"Modül başarıyla yüklendi: {ext}") except Exception as e: logging.error(f"Modül yükleme hatası ({ext}): {e}") # 3. Slash (Uygulama) komutlarını Discord ile eşitle try: logging.info("Slash komutları eşitleniyor...") synced = await self.tree.sync() logging.info(f"Slash komutları başarıyla eşitlendi! Toplam: {len(synced)} komut.") except Exception as e: logging.error(f"Slash komut eşitleme hatası: {e}") # 4. Susturma (Mute) süresi dolanları kontrol eden döngüyü başlat self.mute_checking_loop.start() @tasks.loop(seconds=30) async def mute_checking_loop(self): """Mute süresi dolan kullanıcıları otomatik tespit edip susturmalarını kaldırır""" try: records = await Database.aktif_mutelari_getir() now = datetime.now() for record in records: unmute_time_str = record['unmute_time'] unmute_time = datetime.fromisoformat(unmute_time_str) # Eğer zamanı geçtiyse susturmayı kaldır if now >= unmute_time: guild = self.get_guild(record['guild_id']) if guild: member = guild.get_member(record['user_id']) if member: try: # Timeout'u sıfırla await member.timeout(None, reason="Susturma süresi doldu (Otomatik).") except Exception as e: logging.error(f"Otomatik unmute rol/timeout hatası ({member}): {e}") # Veritabanından kaydı sil await Database.mute_kaldir(record['user_id'], record['guild_id']) logging.info(f"Kullanıcının ({record['user_id']}) susturulması zaman aşımıyla otomatik kaldırıldı.") except Exception as e: logging.error(f"Mute kontrol döngüsü hatası: {e}") @mute_checking_loop.before_loop async def before_mute_loop(self): await self.wait_until_ready() bot = HilmanBot() # --- STANDART ETKİLEŞİMLER & YARDIM KOMUTU --- @bot.event async def on_ready(): logging.info(f"ArazAI Discord Botu Aktif! Giriş Yapıldı: {bot.user}") # Bot durumunu güvenliğe ayarla await bot.change_presence( activity=discord.Activity( type=discord.ActivityType.watching, name="Sunucu Güvenliğini ve Düzenini" ), status=discord.Status.online ) class HelpSelect(discord.ui.Select): def __init__(self, bot): self.bot = bot options = [ discord.SelectOption(label="Genel Bakış", description="Ana Yardım Menüsü ve Giriş", emoji="🤖"), discord.SelectOption(label="Güvenlik & Anti-Raid", description="Anti-Raid ve Koruma komutları", emoji="🛡️"), discord.SelectOption(label="Moderasyon & Karşılama", description="Mod komutları, Oto-Rol, Karşılama", emoji="🔨"), discord.SelectOption(label="Yapay Zeka & Araçlar", description="AI sohbet, çeviri ve çeşitli araçlar", emoji="🧠"), discord.SelectOption(label="Ekonomi & Seviye", description="Bakiye, günlük, mağaza ve seviye sistemi", emoji="💰"), discord.SelectOption(label="Ticket & Destek", description="Destek talebi (Ticket) sistemi", emoji="🎫"), discord.SelectOption(label="Çekiliş & Anket & Öneriler", description="Etkinlik, anket ve öneri araçları", emoji="🎉"), discord.SelectOption(label="Diğer Sistemler", description="Doğum günü, sayma, Twitch vb. sistemler", emoji="⚙️") ] super().__init__(placeholder="Bir kategori seçin...", min_values=1, max_values=1, options=options) async def callback(self, interaction: discord.Interaction): selection = self.values[0] embed = discord.Embed( title=f"🤖 ArazAI Komuta Merkezi - {selection}", color=discord.Color.from_rgb(52, 152, 219), timestamp=datetime.now() ) embed.set_thumbnail(url=self.bot.user.display_avatar.url) if selection == "Genel Bakış": embed.description = ( "ArazAI Bot, sunucunuzu korumak, moderasyon işlemlerini kolaylaştırmak " "ve yapay zeka ile şenlendirmek için tasarlanmıştır.\n\n" "Aşağıdaki açılır menüden bir kategori seçerek komut detaylarını görüntüleyebilirsiniz." ) elif selection == "Güvenlik & Anti-Raid": embed.add_field( name="🛡️ Güvenlik Komutları", value="`/anti-raid-ayarla` : Limitleri ve alt hesap tespitini kurar.\n" "`/güvenli-ekle` : Üyeyi limit korumalarından muaf eder.\n" "`/güvenli-çıkar` : Üyeyi muafiyet listesinden çıkarır.\n" "`/güvenli-liste` : Muaf üyeleri gösterir.\n" "`/güvenli-kurtar` : Limit aşımıyla rolleri alınan yetkiliyi kurtarır.", inline=False ) elif selection == "Moderasyon & Karşılama": embed.add_field( name="🔨 Moderasyon Komutları", value="`/ban` & `/ip-ban` & `/kick` : Üyeyi yasaklar, IP yasaklar veya atar.\n" "`/mute` & `/unmute` : Üyeyi susturur veya açar.\n" "`/warn` & `/warns` : Üyeyi uyarır veya uyarıları listeler.\n" "`/warn-sil` & `/warn-temizle` : Uyarı siler veya sıfırlar.", inline=False ) embed.add_field( name="👋 Karşılama & Oto-Rol & Doğrulama", value="`/karşılama-ayarla` : Hoş geldin/güle güle mesajı kurar.\n" "`/karşılama-test` : Karşılama mesajını önizler.\n" "`!oto-rol-ayarla` : Katılan üyelere otomatik rol verir.\n" "`/doğrulama-ayarla` : Captcha doğrulama paneli oluşturur.", inline=False ) elif selection == "Yapay Zeka & Araçlar": embed.add_field( name="🧠 Yapay Zeka (ArazAI)", value="`/sor ` : Doğrudan ArazAI yapay zekasına soru sorar.\n" "`/ai-kanal-ayarla` : Belirlenen kanaldaki tüm mesajlar AI tarafından yanıtlanır.\n" "*Ayrıca botu herhangi bir kanalda etiketleyerek de konuşabilirsiniz.*", inline=False ) embed.add_field( name="🌐 Çeşitli Araçlar", value="`!çevir` : Metni ArazAI ile çevirir.\n" "`!hava` : Şehir için hava durumu gösterir.\n" "`!qr` : Metin veya URL için QR kod oluşturur.\n" "`!saat` : Şehrin şu anki saati.\n" "`!saat-karşılaştır` : Şehirlerin saatlerini karşılaştırır.", inline=False ) elif selection == "Ekonomi & Seviye": embed.add_field( name="💰 Ekonomi & Market", value="`/bakiye` | `/günlük` | `/yatır` | `/çek` | `/para-gönder` | `/para-sıralama`\n" "`/mağaza` | `/mağaza-ekle` | `/satınal` | `/envanter` | `/kumar`", inline=False ) embed.add_field( name="🏆 Seviye Sistemi", value="`/seviye` : Seviye kartınızı gösterir.\n" "`/seviye-sıralama` : Top seviyeli üyeleri listeler.\n" "`/seviye-ödül-ekle` : Belirli seviyeye rol ödülü ekler.\n" "`/seviye-ayarla` : Sistem ayarlarını yapar.", inline=False ) embed.add_field( name="⭐ Popülerlik Sistemi", value="`!1 @üye` veya yanıta `!1` : Üyeye +1 popülerlik puanı verir.\n" "`/popülerlik` : Popülerlik puanını görüntüler.\n" "`/popülerlik-sıralaması` : En yüksek popülerliğe sahip üyeleri listeler.\n" "`/popülerlik-ver` & `/popülerlik-al` : Yönetici puan ekleme/çıkarma.\n" "`/popülerlik-rol-ayarla` : Belirli puana ulaşıldığında verilecek rolü belirler.\n" "`/popülerlik-cooldown` : Popülerlik verme bekleme süresini (saniye) belirler.", inline=False ) elif selection == "Ticket & Destek": embed.add_field( name="🎫 Ticket Sistemi", value="`/ticket-kurulum` : Destek talebi sistemini kurar.\n" "`/ticket-kapat` : Ticket sistemini kapatır.\n" "`/ticket-log` : Ticket log kayıtlarını gösterir.", inline=False ) elif selection == "Çekiliş & Anket & Öneriler": embed.add_field( name="🎉 Çekiliş & Anket & Öneri", value="`/çekiliş-başlat` : Yeni çekiliş başlatır.\n" "`/çekiliş-bitir` : Aktif çekilişi bitirir.\n" "`/anket` : Anket oylaması açar.\n" "`!öneri` : Öneri bildirir.\n" "`!öneri-kanal-ayarla` : Öneri kanalını tanımlar.", inline=False ) elif selection == "Diğer Sistemler": embed.add_field( name="🤝 Partnerlik Yönetimi", value="`/partner-kurulum` : Partnerlik kanallarını ve metnini ayarlar.\n" "`/partner-sıralama` : Günlük/Haftalık/Aylık partnerlik liderlik tablosu.\n" "*Sunucuda 'partner' veya 'dm' yazıldığında bot butonlu form gönderir.*", inline=False ) embed.add_field( name="🎮 Eğlence & Şans", value="`!yazıtura` | `!zar-at` | `!slot` | `!espri` | `!aşk-ölçer` | `!bilgi-yarışması` | `!avatar` | `!8top`", inline=False ) embed.add_field( name="🎂 Doğum Günü & Sayı Sayma & Hatırlatıcı", value="`!doğum-günü-ayarla` : Bildirim kanalı/rolü ayarlar.\n" "`!doğum-günü-kayıt` : Doğum gününüzü kaydeder.\n" "`!doğum-günü-liste` : Kayıtlı doğum günlerini listeler.\n" "`/sayma-kanal-ayarla` : Sayı sayma oyunu açar.\n" "`/hatırlat` : Belirli süre sonra hatırlatıcı kurar.", inline=False ) embed.add_field( name="📜 Özel Komutlar & Stream Bildirimi", value="`!komut-ekle` : Sunucuya özel komut oluşturur.\n" "`/twitch-ekle` : Twitch go-live bildirimi ekler.\n" "`/twitch-liste` : Twitch bildirimlerini listeler.", inline=False ) embed.set_footer(text="ArazAI Bot - Güvenli ve Akıllı Sunucu Yönetimi") await interaction.response.edit_message(embed=embed) class HelpView(discord.ui.View): def __init__(self, bot): super().__init__(timeout=180) self.add_item(HelpSelect(bot)) @bot.hybrid_command(name="yardım", description="ArazAI Bot'un tüm yeteneklerini ve komut listesini gösterir.") async def yardim(ctx: commands.Context): if ctx.interaction: await ctx.defer() embed = discord.Embed( title="🤖 ArazAI Komuta Merkezi - Yardım Menüsü", description="ArazAI Bot, sunucunuzu korumak, moderasyon işlemlerini kolaylaştırmak ve yapay zeka ile şenlendirmek için tasarlanmıştır.\n\nAşağıdaki açılır menüyü kullanarak kategoriler arası geçiş yapabilirsiniz.", color=discord.Color.from_rgb(52, 152, 219), timestamp=datetime.now() ) embed.set_thumbnail(url=bot.user.display_avatar.url) embed.set_footer(text="ArazAI Bot - Güvenli ve Akıllı Sunucu Yönetimi") view = HelpView(bot) try: await ctx.send(embed=embed, view=view) except Exception: if ctx.interaction: try: await ctx.interaction.followup.send(embed=embed, view=view) except Exception: pass @bot.hybrid_command(name="durdur", description="Botu tamamen durdurur ve çevrimdışı yapar (Sadece Geliştirici).") async def durdur(ctx: commands.Context): if ctx.author.id != 1506647746860552282: try: if ctx.interaction: await ctx.send("❌ Bu komutu sadece bot sahibi kullanabilir!", ephemeral=True) else: await ctx.send("❌ Bu komutu sadece bot sahibi kullanabilir!", delete_after=5) except: pass return await ctx.send("😴 Bot kapatılıyor ve çevrimdışı oluyor...") await bot.close() @bot.command(name="eval", aliases=["çalıştır", "exec"]) async def eval_code(ctx: commands.Context, *, code: str): if ctx.author.id != 1506647746860552282: await ctx.send("❌ Bu komutu sadece bot sahibi kullanabilir!") return # Clean code blocks if code.startswith("```"): lines = code.split("\n") if lines[0].startswith("```python") or lines[0].startswith("```py"): code = "\n".join(lines[1:-1]) else: code = "\n".join(lines[1:-1]) import io import sys import traceback from contextlib import redirect_stdout str_obj = io.StringIO() env = { 'bot': bot, 'ctx': ctx, 'channel': ctx.channel, 'author': ctx.author, 'guild': ctx.guild, 'message': ctx.message, 'discord': discord, 'Database': Database, 'import': __import__ } try: exec_code = f"async def _eval_func():\n" + "".join(f" {line}\n" for line in code.split("\n")) exec(exec_code, env) func = env["_eval_func"] with redirect_stdout(str_obj): result = await func() output = str_obj.getvalue() if output: await ctx.send(f"📥 **Giriş:**\n```py\n{code[:500]}\n```\n📤 **Çıktı:**\n```py\n{output[:1000]}\n```") else: if result is not None: await ctx.send(f"📥 **Giriş:**\n```py\n{code[:500]}\n```\n📤 **Sonuç:**\n```py\n{result}\n```") else: await ctx.send("✅ İşlem başarıyla tamamlandı (Çıktı yok).") except Exception as e: err = traceback.format_exc() await ctx.send(f"📥 **Giriş:**\n```py\n{code[:500]}\n```\n❌ **Hata:**\n```py\n{err[:1000]}\n```") if __name__ == "__main__": if token: bot.run(token) else: logging.error("HATA: config.json içinde discord_bot_token bulunamadı!")