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