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))