VisionApp/features/rules.py

92 lines
3.4 KiB
Python
Raw Normal View History

from __future__ import annotations
import contextlib
import logging
import discord
from discord import app_commands
from discord.ext import commands
from features import shared
logger = logging.getLogger("vision")
DEFAULT_RULES = [
"Respectez tous les membres du serveur.",
"Pas de spam ni de flood.",
"Pas de contenu NSFW ou gore.",
"Pas de publicité sans autorisation.",
"Utilisez les canaux appropriés.",
"Suivez les instructions du staff.",
]
class RulesAcceptButton(discord.ui.Button):
def __init__(self):
super().__init__(
label="J'accepte le règlement",
style=discord.ButtonStyle.success,
custom_id="rules_accept",
)
async def callback(self, interaction: discord.Interaction):
cfg = shared.section(interaction.guild_id, "rules")
role_id = cfg.get("role_id")
if role_id:
role = interaction.guild.get_role(role_id)
if role:
with contextlib.suppress(discord.HTTPException):
await interaction.user.add_roles(role, reason="Règlement accepté")
await interaction.response.send_message("Merci d'avoir accepté le règlement !", ephemeral=True)
class RulesView(discord.ui.LayoutView):
def __init__(self):
super().__init__(timeout=None)
container = discord.ui.Container()
container.add_item(discord.ui.ActionRow(RulesAcceptButton()))
self.add_item(container)
class Rules(commands.Cog):
def __init__(self, bot: commands.Bot):
self.bot = bot
self.bot.add_view(RulesView())
@app_commands.command(name="rules_setup", description="Configurer et envoyer le règlement")
@app_commands.describe(channel="Canal du règlement", role="Rôle donné après acceptation")
@app_commands.checks.has_permissions(manage_guild=True)
async def rules_setup(self, interaction: discord.Interaction, channel: discord.TextChannel, role: discord.Role):
cfg = shared.get(interaction.guild_id, "rules")
cfg["channel_id"] = channel.id
cfg["role_id"] = role.id
shared.set(interaction.guild_id, "rules", cfg)
rules = cfg.get("rules", DEFAULT_RULES)
rules_text = "\n".join(f"{i + 1}. {r}" for i, r in enumerate(rules))
container = discord.ui.Container()
container.add_item(discord.ui.TextDisplay(f"## Règlement du serveur\n\n{rules_text}"))
container.add_item(discord.ui.Separator())
container.add_item(discord.ui.ActionRow(RulesAcceptButton()))
view = discord.ui.LayoutView()
view.add_item(container)
await channel.send(view=view)
await interaction.response.send_message(f"Règlement publié dans {channel.mention}", ephemeral=True)
@app_commands.command(name="rules_set", description="Modifier les règles")
@app_commands.describe(rule1="Règle 1", rule2="Règle 2", rule3="Règle 3")
@app_commands.checks.has_permissions(manage_guild=True)
async def rules_set(self, interaction: discord.Interaction, rule1: str, rule2: str = "", rule3: str = ""):
rules = [r for r in [rule1, rule2, rule3] if r]
cfg = shared.get(interaction.guild_id, "rules")
cfg["rules"] = rules
shared.set(interaction.guild_id, "rules", cfg)
await interaction.response.send_message(f"{len(rules)} règles mises à jour.", ephemeral=True)
async def setup(bot: commands.Bot):
await bot.add_cog(Rules(bot))