我正在用Python编写一个非常简单的Twitch聊天机器人,并且我的所有“命令”都在if语句中运行(基本上,如果聊天机器人在聊天中看到某些东西被激活了)。
但是,我想添加大约3秒的冷却时间或每个命令(或if语句)的时间,以便我可以根据需要对其进行自定义。为此,我尝试了这个(伪代码)
if command is seen in chat
newtimestamp = create timestamp at now
if (newtimestamp - previoustimestamp) > 30
execute the command
make (previoustimestamp)
else
return
但这没用,因为显然它由于尚未声明而在第一次运行时未检测到(previoustimestamp),但是当您声明它时,它将在每次运行命令时声明它。
有没有办法在if语句的开头仅一次声明一次,然后每隔一次忽略一次?还是其他想法?我仍然是一个相当新手的程序员,所以我深表歉意。
这是我想要冷却的示例代码,这很简单
if "!redb match" in message:
x = str(randint(1, 100))
realmessage = message.replace('!redb ship ', '')
array = realmessage.split(' ')
person1 = array[0]
person2 = array[1]
if ((9 - 2) > 5):
sendMessage(s, person1 + " and " + person2 + "have a " + x + "% love compatibility <3")
else:
break
答案 0 :(得分:0)
例如,如果某个条件触发,则可以使用for
等待3秒。这将使执行暂停3秒钟。
编辑:由于您希望这些if语句具有自己的冷却时间,因此您可以尝试将其置于控制循环中,该循环会稍微复杂一些
time.sleep(3)
答案 1 :(得分:0)
我会使用字典作为时间戳,像previous_timestamp = command_timestamps.get('!redb match', 0)
一样访问它。这将为您提供存储的时间戳(如果在字典中),以及0(如果您使用time.time()
作为时间戳,则为1970年1月1日,这在过去已经足够远了,不会对任何时间造成影响)的冷却时间。
答案 2 :(得分:0)
您可以为存储上次调用的函数编写一个装饰器,如果距离现在太近,则返回None
from functools import wraps
from datetime import datetime, timedelta
def cooldown(*delta_args, **delta_kwargs):
delta = timedelta(*delta_args, **delta_kwargs)
def decorator(func):
last_called = None
@wraps(func)
def wrapper(*args, **kwargs):
nonlocal last_called
now = datetime.now()
if last_called and (now - last_called < delta):
return
last_called = now
return func(*args, **kwargs)
return wrapper
return decorator
@cooldown(seconds=5)
def foo():
print("Run")
foo() # Run
time.sleep(1)
foo()
time.sleep(4)
foo() # Run
cooldown
的参数已发送到timedelta
,因此您应该在这些对象上进一步阅读the documentation