Hilmany / main.py
HilmanBey's picture
Upload 64 files
cbb05ec verified
Raw
History Blame Contribute Delete
20.8 kB
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 <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
# 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ı!")