【问题标题】:Python Discord.py `time.sleep()` coroutinePython Discord.py `time.sleep()` 协程
【发布时间】:2020-07-23 15:41:21
【问题描述】:
import discord

import os
import random
import time
import math


client = discord.Client()

with open('admins.conf', 'r') as f:
    for line in f.readlines():
        exec(line)
with open('bans.conf', 'r') as f:
    for line in f.readlines():
        exec(line)
with open('coins.conf', 'r') as f:
    for line in f.readlines():
        exec(line)

random.seed(os.urandom(32))
searchusers = []

@client.event
async def on_ready():
    '''Notification on ready.'''
    print('Logged in! Bot running.')
    await client.change_presence(activity=discord.Game(name='/help'))

def getcoins(uid):
    '''Get the amount of coins, if nonexistent set to 0.'''
    try:
        return coins[uid][0]
    except Exception:
        coins[uid] = [0, time.time()+20]
        return 0

def mention_to_uid(mention):
    '''Extract UID from a mention'''
    uid = mention[2:-1]
    if uid[0] == '!':
        uid = uid[1:]
    return uid

def setcoins(uid, value):
    '''Set the amount of coins someone has.'''
    try:
        coins[uid][0] = value
    except Exception:
        coins[uid] = [value, time.time()+20]
    with open('coins.conf','w') as f:
        f.write('coins = '+repr(coins))

@client.event
async def on_message(message):
    '''Main bot code running on message.'''
    if message.author == client.user:
        return
    if message.author.id in bans:
        return
    if message.content.startswith('/') or message.content.startswith('&'):
        user = message.author.id
        text = message.content[1:].strip()
        command = text.split(' ')[0]
        subcommand = text.split(' ')[1:]
        if message.author.id in searchusers:
            await message.channel.send('<@'+str(message.author.id)+'>, you cannot use bot commands while you are searching.')
            return

-------------------- snip --------------------

        if command == 'search':
            await message.channel.send('<@'+str(user)+'>, you have begun searching! It will take 2 minutes.')
            searchusers.append(user)
            time.sleep(59.99)
            await message.channel.send('<@'+str(user)+'>, there is 1 minute left.')
            time.sleep(39.99)
            await message.channel.send('<@'+str(user)+'>, there are 20 seconds left!')
            time.sleep(14.99)
            await message.channel.send('<@'+str(user)+'>, there are 5 seconds left!')
            time.sleep(4.99)
            found = random.randint(50, 120)
            await message.channel.send('<@'+str(user)+'>, you are done searching! You found '+str(found)+' coins!')
            setcoins(user, getcoins(user)+found)
            searchusers.remove(user)

在 time.sleep() 事件期间,其他机器人命令在 sleep 函数通过之前不会注册。例如,在执行 /search 后立即执行 /help 之类的命令,机器人将在 1 分钟后才会响应,此时它会响应 /help 并且消息还剩 1 分钟。我尝试在每个睡眠功能之前坚持“等待”,但它只是向我吐出运行时警告并停止执行(它只是说你开始搜索然后什么也没发生)。

【问题讨论】:

  • 顺便说一句,你真的需要找到一种不同于exec() 每行的逻辑处理方式

标签: python discord.py coroutine


【解决方案1】:

time.sleep() 停止程序的整个执行。如果您只想延迟一个异步响应线程,请使用asyncio.sleep

例子:

import asyncio

async def wait():
    await asyncio.sleep(5)
    print('I waited 5 seconds')

【讨论】:

    猜你喜欢
    • 2019-12-25
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2014-11-14
    • 2015-05-18
    • 2017-10-27
    相关资源
    最近更新 更多