| import discord |
| from discord.ext import commands, tasks |
| import json |
| import os |
| import logging |
| from datetime import datetime, timezone |
| from database import Database |
|
|
| |
| logging.basicConfig(level=logging.INFO, format='%(asctime)s:%(levelname)s:%(name)s: %(message)s') |
|
|
| |
| 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) |
|
|
| |
| 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, |
| 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): |
| |
| @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 |
|
|
| |
| from cogs.partnership import PartnerTetikleyiciView |
| self.add_view(PartnerTetikleyiciView()) |
| |
| 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}") |
|
|
| |
| 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}") |
|
|
| |
| try: |
| from cogs.itibar import PopulerlikNotificationToggleView |
| self.add_view(PopulerlikNotificationToggleView()) |
| except Exception as e: |
| logging.warning(f"Populerlik persistent view eklenemedi: {e}") |
|
|
| |
| 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}") |
|
|
| |
| 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}") |
|
|
| |
| 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) |
| |
| |
| if now >= unmute_time: |
| guild = self.get_guild(record['guild_id']) |
| if guild: |
| member = guild.get_member(record['user_id']) |
| if member: |
| try: |
| |
| await member.timeout(None, reason="Susturma süresi doldu (Otomatik).") |
| except Exception as e: |
| logging.error(f"Otomatik unmute rol/timeout hatası ({member}): {e}") |
| |
| |
| 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() |
|
|
| |
|
|
| @bot.event |
| async def on_ready(): |
| logging.info(f"ArazAI Discord Botu Aktif! Giriş Yapıldı: {bot.user}") |
| |
| 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 <soru>` : 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 |
|
|
| |
| 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ı!") |
|
|