import discord
from discord.ext import commands
import os
import random
import logging
import tkinter as tk
from tkinter import filedialog
import datetime
import re
import json # JSON dosyasını kullanacağız
# Bot token ve diğer ayarlar
DISCORD_TOKEN = "" # Botunuzun token'ını buraya yazın
CHANNEL_ID = # Botun mesaj göndereceği kanal ID'si
DOMAIN_REGEX = re.compile(r'^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$')
# Üyelik rol ve geri dönüş rol ID'leri
MEMBER_ROLE_ID = # Üyelik rolü ID'si
BACK_ROLE_ID = # Geri dönüş rolü ID'si
# JSON dosyası yolu (üyelik bilgileri için)
MEMBERSHIP_FILE = "memberships.json"
# Bot ve komutları
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix="!", intents=intents)
# Üyelik bilgilerini tutma
user_memberships = {}
# Üyelik verilerini yükleme
def load_memberships():
"""Üyelik bilgilerini JSON dosyasından yükler."""
global user_memberships
if os.path.exists(MEMBERSHIP_FILE):
try:
with open(MEMBERSHIP_FILE, "r") as f:
user_memberships = json.load(f)
logging.info("Üyelik bilgileri başarıyla yüklendi.")
except json.JSONDecodeError:
logging.error("JSON dosyası bozuk, veriler yüklenemedi.")
user_memberships = {}
else:
logging.info("JSON dosyası bulunamadı, yeni üyelik bilgisi oluşturulacak.")
user_memberships = {}
# Üyelik verilerini kaydetme
def save_memberships():
"""Üyelik bilgilerini JSON dosyasına kaydeder."""
try:
with open(MEMBERSHIP_FILE, "w") as f:
json.dump(user_memberships, f, indent=4)
logging.info("Üyelik bilgileri başarıyla kaydedildi.")
except Exception as e:
logging.error(f"Üyelik bilgileri kaydedilemedi: {e}")
# Dosya seçim penceresi açma
def select_file():
"""Tek bir dosya seçme penceresi açar ve dosya yolunu döner."""
root = tk.Tk()
root.withdraw() # Ana pencereyi gizle
file_path = filedialog.askopenfilename(title="Bir dosya seçin", filetypes=[("Text files", "*.txt")])
return file_path
# Dosya içeriklerini oku
def load_file(file_path):
"""Seçilen dosyayı okur ve satırları bir liste olarak döner."""
with open(file_path, "r", encoding="utf-8") as file:
lines = file.readlines()
return lines
# Bot hazır olduğunda yapılacak işlemler
@bot.event
async def on_ready():
print(f'{bot.user} olarak giriş yapıldı.')
logging.info(f"{bot.user} giriş yaptı.")
# Üyelik bilgilerini yükle
load_memberships()
# Dosya seçme ve içerik okuma
file_path = select_file()
if file_path:
global lines
lines = load_file(file_path)
logging.info(f"{file_path} başarıyla yüklendi.")
else:
logging.error("Dosya seçilmedi.")
# @everyone mesajı gönderme
channel = bot.get_channel(CHANNEL_ID)
if channel:
await channel.send("@everyone Bot aktif! Yardım için !help komutunu kullanabilirsiniz.")
# Domain arama komutu
@bot.command(name="gen")
async def domain_search(ctx, domain: str):
"""Kullanıcıya domain adı araması yapar ve sonucu DM olarak gönderir."""
# Domain adı kontrolü
if DOMAIN_REGEX.match(domain):
matched_lines = [line.strip() for line in lines if domain.lower() in line.lower()]
if matched_lines:
random_matches = random.sample(matched_lines, min(5, len(matched_lines)))
result = "\n".join(random_matches)
else:
result = f"{domain} ile ilgili veri bulunamadı."
# Sonucu DM olarak gönder
await ctx.author.send(f"**Domain Arama Sonuçları**:\n{result}")
logging.info(f"{ctx.author} için domain araması yapıldı: {domain}")
else:
await ctx.author.send("Lütfen geçerli bir domain adı girin. (Örnek: example.com)")
logging.info(f"{ctx.author} geçersiz domain girmeye çalıştı: {domain}")
# Üyelik kontrolü
@bot.command(name="sorgu")
async def check_membership(ctx):
"""Kullanıcıya üyelik süresi hakkında bilgi verir."""
if ctx.author.id in user_memberships:
expiration_time_str = user_memberships[ctx.author.id]
expiration_time = datetime.datetime.strptime(expiration_time_str, "%Y-%m-%d %H:%M:%S")
time_left = expiration_time - datetime.datetime.utcnow()
# Süreyi gün, saat, dakika olarak formatla
days_left = time_left.days
hours_left = time_left.seconds // 3600
minutes_left = (time_left.seconds // 60) % 60
if days_left > 0:
await ctx.send(f"Üyeliğinizin süresi: {days_left} gün, {hours_left} saat, {minutes_left} dakika kaldı.")
else:
await ctx.send(f"Üyeliğinizin süresi: {hours_left} saat, {minutes_left} dakika kaldı.")
else:
await ctx.send("Üyeliğiniz bulunmuyor veya süreniz dolmuş.")
# Üyelik verme komutu
@bot.command(name="üyelik")
async def give_membership(ctx, member: discord.Member, days: int):
"""Bir kullanıcıya üyelik verilir ve süresi belirtilir."""
# Yetki kontrolü (Bu örnekte komut sadece yetkili kullanıcılar için)
if not any(role.id == MEMBER_ROLE_ID for role in ctx.author.roles):
await ctx.send("Bu komutu kullanma yetkiniz yok.")
logging.warning(f"{ctx.author.name} yetkisiz bir işlem yapmak istedi: Üyelik verme.")
return
expiration_time = datetime.datetime.utcnow() + datetime.timedelta(days=days)
user_memberships[member.id] = expiration_time.strftime("%Y-%m-%d %H:%M:%S")
# Kullanıcıya üyelik rolünü ver
role = ctx.guild.get_role(MEMBER_ROLE_ID)
if role:
await member.add_roles(role)
logging.info(f"{member.name} kullanıcısına {days} gün üyelik verildi ve rol atandı.")
await ctx.send(f"{member.name} kullanıcısına {days} gün üyelik verildi. Üyelik {expiration_time} tarihinde sona erecek.")
# Üyelik bilgilerini dosyaya kaydet
save_memberships()
# Botu çalıştırma
bot.run(DISCORD_TOKEN)