if语句中的冷却时间

时间:2019-01-28 18:43:05

标签: python if-statement bots chatbot twitch

我正在用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

3 个答案:

答案 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