import disnake
from disnake.ext import commands, tasks
from disnake.interactions import ComponentContext
bot = commands.Bot(command_prefix='!', intents=disnake.Intents.all())
@bot.slash_command(name='timeout', description='Поставить пользователя на таймаут прям сейчас')
async def timeout(ctx, user: disnake.Member, duration: int = 5):
mute_role = disnake.utils.get(ctx.guild.roles, name="Muted") # Предположим, у тебя есть роль Muted и исходя от этого... вот это выходит:
if not mute_role:
mute_role = await ctx.guild.create_role(name="Muted", reason="Во имя использования команды таймаут")
for channel in ctx.guild.channels:
await channel.set_permissions(mute_role, send_messages=False)
await user.add_roles(mute_role)
await ctx.send(f'Пользователь {user.mention} получил жёсткий таймаут на {duration} минут!')
bot.loop.create_task(unmute_after(user, duration, mute_role))
async def unmute_after(user, duration, mute_role):
await disnake.sleep(duration * 60)
await user.remove_roles(mute_role)
@bot.event
async def on_ready():
print(f'{bot.user} готов к работе! Жду...')
bot.run('YOUR_TOKEN')
UDP.
Конечно, можно. В реальном Discord боте для таймаута участника устанавливается время, через которое он сможет снова писать в определённом канале. Вот как-то так:
import disnake
from disnake.ext import commands, tasks
bot = commands.Bot(command_prefix='!', intents=disnake.Intents.all())
@bot.slash_command(name='timeout', description='Поставить пользователя на таймаут прям сейчас в этом канале')
async def timeout(ctx, user: disnake.Member, duration: int = 5):
await ctx.channel.set_permissions(user, send_messages=False, reason=f"Таймаут на {duration} минут")
await ctx.send(f'Пользователь {user.mention} получил очень жёсткий таймаут в этом канале на {duration} минут!')
bot.loop.create_task(untimeout_after(ctx.channel, user, duration))
async def untimeout_after(channel, user, duration):
await disnake.sleep(duration * 60)
await channel.set_permissions(user, send_messages=None) #удаляем специфические разрешения для пользователя
@bot.event
async def on_ready():
print(f'{bot.user} готов к работе! Жду...')
bot.run('YOUR_TOKEN')
Таким образом, после использования команды /timeout пользователь не сможет отправлять сообщения только в том канале, в котором была использована команда. После истечения времени ограничение будет снято.