Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как сделать TimeOut (просьба скинуть код) (Discord Bot,Disnake,Python,Slash Command)

Дима Иванов Ученик (64), на голосовании 1 год назад
Как сделать TimeOut (просьба скинуть код)
Голосование за лучший ответ
Kotakasi Мыслитель (7671) 1 год назад
 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 пользователь не сможет отправлять сообщения только в том канале, в котором была использована команда. После истечения времени ограничение будет снято.
Дима ИвановУченик (64) 1 год назад
спасибо но нельзя сделать TimeOut как в настоящем дискорде?
Kotakasi Мыслитель (7671) Ответил в UDP.
Ахмед Чушпан Ученик (102) 7 месяцев назад
Task exception was never retrieved
future: <Task finished name='Task-20' coro=<unmute_after() done, defined at C:\Users\PC\Desktop\TrotilGuad\Starter.py:21> exception=AttributeError("module 'disnake' has no attribute 'sleep'")>
Traceback (most recent call last):
File "C:\Users\PC\Desktop\TrotilGuad\Starter.py", line 22, in unmute_after
await disnake.sleep(duration * 60)
^^^^^^^^^^^^^
AttributeError: module 'disnake' has no attribute 'sleep'
Ахмед ЧушпанУченик (102) 7 месяцев назад
Не туда написал, забейте
Похожие вопросы