test / bot /cogs /verification.py
mtaaz's picture
Upload 93 files
e699b46 verified
from __future__ import annotations
import discord
from discord.ext import commands
from bot.i18n import get_cmd_desc
from bot.emojis import ui
from bot.emojis import ui
class VerifyView(discord.ui.View):
def __init__(self, bot: commands.Bot) -> None:
super().__init__(timeout=None)
self.bot = bot
@discord.ui.button(label="Verify", emoji=ui("lock"), style=discord.ButtonStyle.success, custom_id="verify:member")
async def verify_member(self, interaction: discord.Interaction, _: discord.ui.Button) -> None:
guild_id = interaction.guild.id if interaction.guild else None
if not interaction.response.is_done():
try:
await interaction.response.defer(ephemeral=True, thinking=False)
except (discord.NotFound, discord.HTTPException, discord.InteractionResponded):
return
if not interaction.guild:
await interaction.followup.send(await self.bot.get_text(guild_id, "common.server_only"), ephemeral=True)
return
row = await self.bot.db.fetchone(
"SELECT verify_role_id, welcome_channel_id FROM guild_config WHERE guild_id = ?",
interaction.guild.id,
)
if not row or not row[0]:
await interaction.followup.send(await self.bot.get_text(guild_id, "welcome.verify_role_missing"), ephemeral=True)
return
role = interaction.guild.get_role(row[0])
if not role:
await interaction.followup.send(await self.bot.get_text(guild_id, "welcome.verify_role_deleted"), ephemeral=True)
return
member = interaction.user if isinstance(interaction.user, discord.Member) else interaction.guild.get_member(interaction.user.id)
if not member:
await interaction.followup.send(await self.bot.get_text(guild_id, "welcome.verify_member_missing"), ephemeral=True)
return
if role in member.roles:
await interaction.followup.send(await self.bot.get_text(guild_id, "welcome.verify_already_done"), ephemeral=True)
return
await member.add_roles(role, reason="Member completed verification")
# Send success message with redirect link to welcome channel
welcome_channel_id = row[1] if row else None
redirect_text = ""
if welcome_channel_id:
welcome_ch = interaction.guild.get_channel(welcome_channel_id)
if welcome_ch:
redirect_text = f"\n\n➡️ {await self.bot.get_text(guild_id, 'welcome.redirect_text', channel=welcome_ch.mention)}"
success_msg = await self.bot.get_text(guild_id, "welcome.verify_success")
await interaction.followup.send(f"{success_msg}{redirect_text}", ephemeral=True)
await self.bot.log_to_guild(
interaction.guild,
await self.bot.get_text(guild_id, "welcome.verify_log_title"),
await self.bot.get_text(guild_id, "welcome.verify_log_desc", member=member.mention, role=role.mention),
color=discord.Color.green(),
)
async def localize(self, guild_id: int | None) -> "VerifyView":
for item in self.children:
if isinstance(item, discord.ui.Button) and item.custom_id == "verify:member":
item.label = await self.bot.get_text(guild_id, "welcome.verify_button")
item.emoji = self.bot.get_custom_emoji("admin", fallback="🔐")
return self
class Verification(commands.Cog):
def __init__(self, bot: commands.Bot) -> None:
self.bot = bot
async def cog_load(self) -> None:
self.bot.add_view(VerifyView(self))
@commands.hybrid_command(name="verify", description=get_cmd_desc("commands.tools.verify_desc"))
async def verify(self, ctx: commands.Context) -> None:
await self.verify_config(ctx)
@commands.hybrid_group(name="verify_config", fallback="panel", description="Verification system controls")
async def verify_config(self, ctx: commands.Context) -> None:
"""Open the verification panel."""
if not ctx.guild:
await ctx.reply(await self.bot.get_text(None, "common.server_only"))
return
embed = await self._build_verify_panel(ctx.guild.id)
await ctx.reply(embed=embed, view=await VerifyView(self.bot).localize(ctx.guild.id))
@verify_config.command(name="setup", description="Configure verification system and lock channels")
@commands.has_permissions(administrator=True)
async def verify_setup(
self,
ctx: commands.Context,
role: discord.Role,
verify_channel: discord.TextChannel,
welcome_channel: discord.TextChannel,
) -> None:
guild = ctx.guild
await self.bot.db.execute(
"""
INSERT INTO guild_config(guild_id, verify_role_id, verify_channel_id, welcome_channel_id)
VALUES (?, ?, ?, ?)
ON CONFLICT(guild_id) DO UPDATE SET
verify_role_id = excluded.verify_role_id,
verify_channel_id = excluded.verify_channel_id,
welcome_channel_id = excluded.welcome_channel_id
""",
guild.id,
role.id,
verify_channel.id,
welcome_channel.id,
)
everyone = guild.default_role
for channel in guild.channels:
if channel.id == verify_channel.id:
await channel.set_permissions(everyone, view_channel=True, send_messages=False)
await channel.set_permissions(role, view_channel=True, send_messages=False)
else:
await channel.set_permissions(everyone, view_channel=False)
await channel.set_permissions(role, view_channel=True)
embed = discord.Embed(
title="🔐 Verification Enabled",
description=(
"تم تفعيل نظام التحقق الاحترافي.\n"
f"- قناة التحقق: {verify_channel.mention}\n"
f"- قناة الترحيب: {welcome_channel.mention}\n"
f"- رتبة التحقق: {role.mention}\n"
"كل القنوات أصبحت مخفية حتى يقوم العضو بالتحقق."
),
color=discord.Color.blurple(),
)
panel = discord.Embed(
title=await self.bot.get_text(guild.id, "welcome.verify_title"),
description=await self.bot.get_text(guild.id, "welcome.verify_body"),
color=discord.Color.green(),
)
panel.add_field(name=await self.bot.get_text(guild.id, "welcome.verify_benefits_title"), value=await self.bot.get_text(guild.id, "welcome.verify_benefits_body"), inline=False)
panel.set_footer(text=await self.bot.get_text(guild.id, "welcome.verify_footer"))
await verify_channel.send(embed=panel, view=await VerifyView(self.bot).localize(guild.id))
await ctx.reply(embed=embed)
@commands.hybrid_command(name="verifysetup", description=get_cmd_desc("commands.tools.verifysetup_desc"), with_app_command=False)
@commands.has_permissions(administrator=True)
async def verify_setup_legacy(
self,
ctx: commands.Context,
role: discord.Role,
verify_channel: discord.TextChannel,
welcome_channel: discord.TextChannel,
) -> None:
await self.verify_setup(
ctx,
role=role,
verify_channel=verify_channel,
welcome_channel=welcome_channel,
)
async def _build_verify_panel(self, guild_id: int) -> discord.Embed:
lock = self.bot.get_custom_emoji("admin", fallback="🔐")
unlock = self.bot.get_custom_emoji("admin", fallback="🔓")
divider = "⛩️ ━━━ 🏮 ━━━ ⛩️"
embed = discord.Embed(
title=f"{lock} {await self.bot.get_text(guild_id, 'welcome.verify_title')}",
description=f"{divider}\n{await self.bot.get_text(guild_id, 'welcome.verify_body')}\n{divider}",
color=discord.Color.green(),
)
embed.add_field(
name=f"{unlock} {await self.bot.get_text(guild_id, 'welcome.verify_benefits_title')}",
value=await self.bot.get_text(guild_id, "welcome.verify_benefits_body"),
inline=False,
)
embed.set_footer(text=await self.bot.get_text(guild_id, "welcome.verify_footer"))
return embed
async def setup(bot: commands.Bot) -> None:
await bot.add_cog(Verification(bot))