Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何";“临时禁令”;不和谐的人?_Python 3.x_Scheduled Tasks_Discord_Python Asyncio_Discord.py - Fatal编程技术网

Python 3.x 如何";“临时禁令”;不和谐的人?

Python 3.x 如何";“临时禁令”;不和谐的人?,python-3.x,scheduled-tasks,discord,python-asyncio,discord.py,Python 3.x,Scheduled Tasks,Discord,Python Asyncio,Discord.py,我正在用discord.py制作一个管理discord机器人,所以我意识到我需要添加一个命令来临时禁止某人一段时间,这个禁止可以通过角色或将成员踢出频道然后禁止他,但我不知道如何做。有人能帮我吗 这取决于你所说的“临时禁令”是什么意思 您希望该用户在一定时间内被逐出服务器并被禁止,还是希望该用户暂时被限制某些权限,例如聊天 我建议使用后者,并使用新的和改进的API 通过角色分配和x秒后不限制成员: @bot.command() 异步定义限制(ctx,成员:discord.member,持续时间:

我正在用discord.py制作一个管理discord机器人,所以我意识到我需要添加一个命令来临时禁止某人一段时间,这个禁止可以通过角色或将成员踢出频道然后禁止他,但我不知道如何做。有人能帮我吗

这取决于你所说的“临时禁令”是什么意思

您希望该用户在一定时间内被逐出服务器并被禁止,还是希望该用户暂时被限制某些权限,例如聊天

我建议使用后者,并使用新的和改进的API

通过角色分配和x秒后不限制成员:

@bot.command()
异步定义限制(ctx,成员:discord.member,持续时间:int):
role=discord.utils.get(ctx.guild.roles,name=“Restricted”)
等待成员。添加_角色(角色)
等待异步睡眠(持续时间)
等待成员。删除_角色(角色)
禁止用户并在x秒后取消禁止:

@bot.command()
异步定义禁止(ctx,用户:discord.user,持续时间:int):
等待ctx.guild.ban(用户)
等待异步睡眠(持续时间)
等待ctx.guild.unban(用户)

记住,如果你的BOT崩溃或离线,无论是什么原因,当它在睡眠过程中解禁用户时,BOT将不会取消用户在它备份后,所以要考虑使用的东西可能是一个数据库,并存储禁令的结束时间。然后,您可以在bot启动期间查询所有保存的日期,以计算睡眠时间。此外,你还必须获得他们的用户对象而不是成员对象,因为他们不再是公会的一部分。

经过多次尝试和错误,我终于获得了它!给定的bellow是一个discord.py bot,带有临时禁止用户的命令,可用于多个用户

ban_list = []
day_list = []
server_list = []

#This is a background process
async def countdown():
    await client.wait_until_ready()
    while not client.is_closed:
        await asyncio.sleep(1)
        day_list[:] = [x - 1 for x in day_list]
        for day in day_list:
            if day <= 0:
                try:
                    await client.unban(server_list[day_list.index(day)], ban_list[day_list.index(day)])
                except:
                    print('Error! User already unbanned!')
                del ban_list[day_list.index(day)]
                del server_list[day_list.index(day)]
                del day_list[day_list.index(day)]
               
#Command starts here
@client.command(pass_context = True)
async def ban(ctx,member:discord.Member, days = 1):
    if str(ctx.message.author.id) == '<You ID goes here>':
        try:
            await client.ban(member, delete_message_days=0)
            await client.say('User banned for **' + str(days) + ' day(s)**')
            ban_list.append(member)
            day_list.append(days * 24 * 60 * 60)
            server_list.append(ctx.message.server)
        except:
            await client.say('Error! User not active')
    else:
        await client.say('You do not have permission to ban users!')

client.loop.create_task(countdown())
ban_list=[]
日期列表=[]
服务器列表=[]
#这是一个后台过程
异步def倒计时():
等待客户端。等待,直到准备就绪()
而不是client.u关闭时:
等待asyncio.sleep(1)
日列表[:]=[x-1表示日列表中的x]
对于每日列表:

如果有一天有一个后台任务的示例代码。也许对你有帮助@Ellisein好的,谢谢问题是,当这个命令运行时,bot将无法执行任何其他操作,如果持续时间超过60秒,bot将崩溃,错误为“任务已销毁,但它处于挂起状态”@Sujit我认为API的重写分支没有这个问题,它使用的是asyncio.sleep()而不是时间。sleep()这样它就不会阻塞任何东西。我只是将持续时间设置为5+分钟,并在运行时使用各种命令,没有任何问题。