Update configuration and README for improved setup and security; disable default API and emoji sync, and enhance Discord permission checks in API routes.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
115
bot/cogs/events/greet2.py
Normal file
115
bot/cogs/events/greet2.py
Normal file
@@ -0,0 +1,115 @@
|
||||
# ╔══════════════════════════════════════════════════════════════════╗
|
||||
# ║ ║
|
||||
# ║ ░█▀▀░█▀█░█▀▄░█▀▀░█░█ ░█▀▄░█▀▀░█░█░█▀▀ ║
|
||||
# ║ ░█░░░█░█░█░█░█▀▀░▄▀▄ ░█░█░█▀▀░▀▄▀░▀▀█ ║
|
||||
# ║ ░▀▀▀░▀▀▀░▀▀░░▀▀▀░▀░▀ ░▀▀░░▀▀▀░░▀░░▀▀▀ ║
|
||||
# ║ ║
|
||||
# ║ © 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)
|
||||
|
||||
Reference in New Issue
Block a user