Как создать команду для бота Discord, которая выдает определенную роль и автоматически удаляет все другие роли у пользователя?

Как временно приостановить привилегии участника, который нарушил правила, заменив его роль на "наказан", чтобы впоследствии автоматически вернуть ранее назначенную роль "участника" после истечения указанного срока наказания?
  • 28 февраля 2024 г. 21:28
Ответы на вопрос 2
Для создания команды в боте Discord, которая выдает определенную роль и удаляет все другие роли у пользователя, можно использовать следующий код на языке Python с библиотекой discord.py:

```python
import discord
from discord.ext import commands

intents = discord.Intents.default()
intents.members = True

bot = commands.Bot(command_prefix='!', intents=intents)

@bot.command()
async def assign_role(ctx, role_name: str):
    role = discord.utils.get(ctx.guild.roles, name=role_name)
    member = ctx.author
    if role:
        await member.add_roles(role)
        for r in member.roles:
            if r != role:
                await member.remove_roles(r)
        await ctx.send(f"Role {role_name} assigned successfully.")
    else:
        await ctx.send("Role not found.")

bot.run('TOKEN')
```

Для временного приостановления привилегий участника и автоматического возвращения роли после истечения указанного срока наказания можно использовать библиотеку discord.ext.tasks для планирования событий:

```python
import discord
from discord.ext import commands, tasks

intents = discord.Intents.default()
intents.members = True

bot = commands.Bot(command_prefix='!', intents=intents)

@bot.command()
async def punish(ctx, member: discord.Member, duration: int):
    punish_role = discord.utils.get(ctx.guild.roles, name='Punished')
    member_role = discord.utils.get(ctx.guild.roles, name='Member')
    
    if not punish_role:
        punish_role = await ctx.guild.create_role(name='Punished')
    
    if not member_role:
        await ctx.send("Member role not found.")
        return
    
    await member.add_roles(punish_role)
    await member.remove_roles(member_role)
    
    await ctx.send(f"{member.display_name} has been punished for {duration} hours.")
    
    await asyncio.sleep(duration*3600)
    
    await member.add_roles(member_role)
    await member.remove_roles(punish_role)
    
    await ctx.send(f"{member.display_name} has been unpunished.")

bot.run('TOKEN')
```

Обратите внимание, что вам нужно будет настроить разрешения бота и сервера для корректной работы этих команд.
Список ролей пользователя лежит в Member.roles 
Где-то в БД храните id двух нужных ролей, читаете их оттуда, далее на том же пользователе применяете Member.add_roles и Member.remove_roles
Похожие вопросы