116 lines
6.6 KiB
Python
116 lines
6.6 KiB
Python
# ╔══════════════════════════════════════════════════════════════════╗
|
|
# ║ ║
|
|
# ║ ░█▀▀░█▀█░█▀▄░█▀▀░█░█ ░█▀▄░█▀▀░█░█░█▀▀ ║
|
|
# ║ ░█░░░█░█░█░█░█▀▀░▄▀▄ ░█░█░█▀▀░▀▄▀░▀▀█ ║
|
|
# ║ ░▀▀▀░▀▀▀░▀▀░░▀▀▀░▀░▀ ░▀▀░░▀▀▀░░▀░░▀▀▀ ║
|
|
# ║ ║
|
|
# ║ © 2026 CodeX Devs — All Rights Reserved ║
|
|
# ║ ║
|
|
# ║ discord ── https://discord.gg/codexdev ║
|
|
# ║ youtube ── https://youtube.com/@CodeXDevs ║
|
|
# ║ github ── https://github.com/RayExo ║
|
|
# ║ ║
|
|
# ╚══════════════════════════════════════════════════════════════════╝
|
|
|
|
import discord
|
|
import aiosqlite
|
|
import json
|
|
import re
|
|
import asyncio
|
|
from discord.ext import commands
|
|
|
|
class greet(commands.Cog):
|
|
def __init__(self, bot):
|
|
self.bot = bot
|
|
self.join_queue = {}
|
|
self.processing = set()
|
|
|
|
async def safe_format(self, text, placeholders):
|
|
placeholders_lower = {k.lower(): v for k, v in placeholders.items()}
|
|
def replace_var(match):
|
|
var_name = match.group(1).lower()
|
|
return str(placeholders_lower.get(var_name, f"{{{var_name}}}"))
|
|
return re.sub(r"\{(\w+)\}", replace_var, text or "")
|
|
|
|
@commands.Cog.listener()
|
|
async def on_member_join(self, member):
|
|
if member.guild.id not in self.join_queue:
|
|
self.join_queue[member.guild.id] = []
|
|
self.join_queue[member.guild.id].append(member)
|
|
if member.guild.id not in self.processing:
|
|
self.processing.add(member.guild.id)
|
|
await self.process_queue(member.guild)
|
|
|
|
async def process_queue(self, guild):
|
|
while self.join_queue[guild.id]:
|
|
member = self.join_queue[guild.id].pop(0)
|
|
async with aiosqlite.connect("db/welcome.db") as db:
|
|
async with db.execute("SELECT welcome_type, welcome_message, channel_id, embed_data, auto_delete_duration FROM welcome WHERE guild_id = ?", (guild.id,)) as cursor:
|
|
row = await cursor.fetchone()
|
|
if row is None:
|
|
continue
|
|
welcome_type, welcome_message, channel_id, embed_data, auto_delete_duration = row
|
|
welcome_channel = self.bot.get_channel(channel_id)
|
|
if not welcome_channel:
|
|
continue
|
|
placeholders = {
|
|
"user": member.mention,
|
|
"user_avatar": member.avatar.url if member.avatar else member.default_avatar.url,
|
|
"user_name": member.name,
|
|
"user_id": member.id,
|
|
"user_nick": member.display_name,
|
|
"user_joindate": member.joined_at.strftime("%a, %b %d, %Y"),
|
|
"user_createdate": member.created_at.strftime("%a, %b %d, %Y"),
|
|
"server_name": guild.name,
|
|
"server_id": guild.id,
|
|
"server_membercount": guild.member_count,
|
|
"server_icon": guild.icon.url if guild.icon else "https://cdn.discordapp.com/embed/avatars/0.png",
|
|
"timestamp": discord.utils.format_dt(discord.utils.utcnow())
|
|
}
|
|
try:
|
|
if welcome_type == "simple" and welcome_message:
|
|
content = await self.safe_format(welcome_message, placeholders)
|
|
sent_message = await welcome_channel.send(content=content)
|
|
elif welcome_type == "embed" and embed_data:
|
|
embed_info = json.loads(embed_data)
|
|
color_value = embed_info.get("color", None)
|
|
embed_color = 0x2f3136
|
|
if color_value and isinstance(color_value, str) and color_value.startswith("#"):
|
|
embed_color = discord.Color(int(color_value.lstrip("#"), 16))
|
|
elif isinstance(color_value, int):
|
|
embed_color = discord.Color(color_value)
|
|
content = await self.safe_format(embed_info.get("message", ""), placeholders) or None
|
|
embed = discord.Embed(
|
|
title=await self.safe_format(embed_info.get("title", ""), placeholders),
|
|
description=await self.safe_format(embed_info.get("description", ""), placeholders),
|
|
color=embed_color
|
|
)
|
|
embed.timestamp = discord.utils.utcnow()
|
|
if embed_info.get("footer_text"):
|
|
embed.set_footer(
|
|
text=await self.safe_format(embed_info["footer_text"], placeholders),
|
|
icon_url=await self.safe_format(embed_info.get("footer_icon", ""), placeholders)
|
|
)
|
|
if embed_info.get("author_name"):
|
|
embed.set_author(
|
|
name=await self.safe_format(embed_info["author_name"], placeholders),
|
|
icon_url=await self.safe_format(embed_info.get("author_icon", ""), placeholders)
|
|
)
|
|
if embed_info.get("thumbnail"):
|
|
embed.set_thumbnail(url=await self.safe_format(embed_info["thumbnail"], placeholders))
|
|
if embed_info.get("image"):
|
|
embed.set_image(url=await self.safe_format(embed_info["image"], placeholders))
|
|
sent_message = await welcome_channel.send(content=content, embed=embed)
|
|
if auto_delete_duration:
|
|
await sent_message.delete(delay=auto_delete_duration)
|
|
except discord.Forbidden:
|
|
continue
|
|
except discord.HTTPException as e:
|
|
if e.code == 50035 or e.status == 429:
|
|
await asyncio.sleep(1)
|
|
self.join_queue[guild.id].append(member)
|
|
continue
|
|
await asyncio.sleep(2)
|
|
self.processing.remove(guild.id)
|
|
|