Python 使用twisted的循环函数调用
我有一个基本的IRC机器人,看起来像这样(见下文),我想做的是使用类似于Python 使用twisted的循环函数调用,python,twisted,Python,Twisted,我有一个基本的IRC机器人,看起来像这样(见下文),我想做的是使用类似于\u 5_mins的函数,每5分钟通过循环调用调用一次 import sys import re from twisted.internet import reactor, task, defer, protocol from twisted.python import log from twisted.words.protocols import irc from twisted.application import in
\u 5_mins
的函数,每5分钟通过循环调用调用一次
import sys
import re
from twisted.internet import reactor, task, defer, protocol
from twisted.python import log
from twisted.words.protocols import irc
from twisted.application import internet, service
import time
HOST, PORT = 'irc.freenode.net', 6667
class IrcProtocol(irc.IRCClient):
nickname = 'BOTSNAME'
password = 'NICKPASSWORD'
timeout = 600.0
def signedOn(self):
pMess = "IDENTIFY %s" % self.password
self.msg("NickServ",pMess)
time.sleep(10)
for channel in self.factory.channels:
self.join(channel)
def _5_mins(self):
self.msg(self.factory.channels[0],"5 minutes have elapsed")
class IrcFactory(protocol.ReconnectingClientFactory):
channels = ['#BOTCHANNEL']
protocol = IrcProtocol
if __name__ == '__main__':
reactor.connectTCP(HOST, PORT, IrcFactory())
log.startLogging(sys.stdout)
reactor.run()
elif __name__ == '__builtin__':
application = service.Application('IrcBot')
ircService = internet.TCPClient(HOST, PORT, IrcFactory())
ircService.setServiceParent(application)
如何更改signedOn
函数与task.LoopingCall
函数一起工作,还是有更好的方法
编辑:我真的很接近一个解决方案,以下是我所做的
def signedOn(self):
pMess = "IDENTIFY %s" % self.password
self.msg("NickServ",pMess)
time.sleep(10)
for channel in self.factory.channels:
self.join(channel)
lc = task.LoopingCall(self._5_mins)
lc.start(self.timeout)
def签名(自):
pMess=“标识%s”%self.password
self.msg(“NickServ”,pMess)
时间。睡眠(10)
对于self.factory.channels中的通道:
加入(频道)
lc=任务循环调用(自我5分钟)
lc.启动(自超时)
听起来你已经完成了99.9%的任务。是什么阻止你将循环调用
与\u 5分钟
一起使用?@Jean-Paul Calderone是的,我刚刚找到了答案,我将编辑我的帖子。:)一旦SO超时过期,您应该将其作为问题的答案发布。此外,您真的不应该在Twisted中使用代码调用time.sleep
。如果您需要延迟,有reactor.callLater
。但是我认为你不需要在这段代码中延迟,time.sleep
就在那里,这样nickserver就有时间在你尝试加入频道之前进行身份验证,以防它们是为注册用户提供的。在NickServ设置正确的模式之前,我尝试加入频道时遇到了一些问题。但正如您所说,我应该能够稍微将代码重新编写成callLater
来删除它,并且仍然可以避免这个问题。谢谢