我正在用python编写一个discord bot,我在下一个功能方面遇到了困难。当读取消息:('user'joind(时,机器人程序应每隔x秒开始循环该函数,直到读取消息:。
我一直在暂存文件中测试不同的代码。它成功地在"user"加入时开始循环。但当("用户"左(信息通过时,它不会接受新的参数,并永远继续循环。
这两个版本看起来最有前景:
import re
import time
def message(servermessage):
a = re.sub("[^S]", " ", servermessage).split()
if a[1] == 'joined':
online = False
elif a[1] == 'left':
online = True
while True:
mcusername = a[0]
print(mcusername, 0)
if online:
break
time.sleep(2)
message('user joined')
time.sleep(10)
message('user left')
和
import re
import sched, time
s = sched.scheduler(time.time, time.sleep)
def message(servermessage):
a = re.sub("[^S]", " ", servermessage).split()
def rewardplayer():
s.enter(1, 1, rewardplayer)
mcusername = a[0]
print(mcusername, 0)
if a[1] == 'joined':
s.enter(1, 1, rewardplayer)
s.run()
elif a[1] == 'left':
s.cancel()
message('user joined')
time.sleep(10)
print('done')
message('user left')
我的另一个要求是,当在前一个用户的("previoususer"离开(消息之前给出("newuser"加入(消息时,它应该能够为不同的用户运行相同的循环。
我为含糊的解释道歉。但我希望你能帮忙。提前感谢!
关于您的第一个代码:您有而,当联机为True时,应该打破它。但它在这个循环中永远不会改变。所以它类似于死锁。
关于您的第二个代码:您正在使用";调度器";。通常这意味着您希望定期运行一些事件。但你们的目的是在事件发生时做出反应。在任何时候。未安排。
所以在这里我可以推荐你使用异步python的方式。(请阅读有关asyncio的内容(
import re
import asyncio
async def process_msgs(queue):
while True:
msg = await queue.get()
online, usr_name = parse_msg(msg)
print(usr_name, 0)
queue.task_done()
def parse_msg(msg):
result = re.sub("[^S]", " ", msg).split()
action = result[1]
usr_name = result[0]
if action == 'joined':
online = False
elif action == 'left':
online = True
return online, usr_name
async def main():
queue = asyncio.Queue()
queue.put_nowait('usr joined')
task = asyncio.create_task(process_msgs(queue))
queue.put_nowait('usr left')
await queue.join()
task.cancel()
asyncio.run(main())
你可以这样使用它。我们在那里排队,把我们的活动放在那里。你也可以通过无限的方式做到这一点(监听套接字或smthg——在这里你会得到关于不同用户的消息(。
我们有任务(工作者(,当我们的";主";函数是活动的。