作为学习项目的一部分,我正在编写一个简单的IRC机器人,并且我已经实现了简单的文本功能,如!auth
,!join
,!say
等。为了方便添加功能,我已经在python中实现了bot_auth()
,bot_join()
,bot_say()
等每个功能,并对bot_NOCOMMAND()
进行了规避。记录错误。
我遇到的问题是虽然getattr()
按预期找到了大多数功能,但join
和part
功能却没有,我无法理解为什么。
代码:
def process_bot_command(self, prefix, params, trailing):
# eg: !command some arguments
try:
bot_command,bot_args = trailing[1:].split(' ',1)
bot_command = bot_command.lower().strip()
bot_args = bot_args.strip()
except ValueError:
bot_command = trailing[1:].split(' ')[0].lower().strip()
bot_args = ''
try:
function = getattr(self, 'bot_'+bot_command)
function(prefix, params[0], bot_command, bot_args)
except AttributeError:
self.bot_NOCOMMAND(prefix, params[0], bot_command, bot_args)
def bot_NOCOMMAND(self, c_from, c_to, command, args):
self.log('Undefined command: %s' % ','.join([c_from, c_to, command, args]), 1)
def bot_auth(self, c_from, c_to, command, args):
user = self.parsePrefix(c_from)['name']
if self.authenticate(user, args):
self.irc_PRIVMSG(user, 'Authentication successful.')
self.admins.append(c_from)
self.log('Added %s to active admin list.' % c_from)
else:
self.irc_PRIVMSG(user, 'Authentication failed.')
# TODO: doesn't work for some reason
def bot_join(self, c_from, c_to, command, args):
if not self.isAdmin(c_from):
self.respond(c_from, c_to, self.str['unauth'])
return
channel = args.split(' ')[0].strip()
self.irc_JOIN(channel)
self.respond(c_from, c_to, 'Joining %s' % channel)
# TODO: doesn't work for some reason
def bot_part(self, c_from, c_to, command, args):
if not self.isAdmin(c_from):
self.respond(c_from, c_to, self.str['unauth'])
return
channel = args.split(' ')[0].strip()
if channel in self.subscribed_channels:
self.irc_PART(channel, 'Leaving channel')
self.respond(c_from, c_to, 'Left %s' % channel)
def bot_say(self, c_from, c_to, command, args):
if not self.isAdmin(c_from):
self.respond(c_from, c_to, self.str['unauth'])
return
if args[0] == '#':
channel,text = args.split(' ', 1)
self.irc_PRIVMSG(channel, text)
else:
self.respond(c_from, c_to, args)
基本流程:
!
数据的第一个字符中找到trailing
,则将数据发送到process_bot_command()
process_bot_command()
弹出trailing
字符串的第一部分,删除!
,预先bot_
,然后调用getattr()
以查找具有该功能的函数名称bot_NOCOMMAND()
,它将输入作为错误转储到日志中。示例输出:
> Sammitch!~Sammitch@hostname.tld PRIVMSG JerkfaceMcAssbot :!auth password
* Authentication request for user: Sammitch succeeded.
< PRIVMSG Sammitch :Authentication successful.
* Added Sammitch!~Sammitch@hostname.tld to active admin list.
> Sammitch!~Sammitch@hostname.tld PRIVMSG JerkfaceMcAssbot :!identify
< PRIVMSG nickserv :IDENTIFY password
< PRIVMSG Sammitch :Sent identify command.
> NickServ!NickServ@services. NOTICE JerkfaceMcAssbot :You are now identified for JerkfaceMcAssbot.
> Sammitch!~Sammitch@hostname.tld PRIVMSG JerkfaceMcAssbot :!join ##systemadmins
! Undefined command: Sammitch!~Sammitch@hostname.tld,JerkfaceMcAssbot,join,##systemadmins
> Sammitch!~Sammitch@hostname.tld PRIVMSG JerkfaceMcAssbot :!part KitchenCommandCenter
! Undefined command: Sammitch!~Sammitch@hostname.tld,JerkfaceMcAssbot,part,KitchenCommandCenter
例如:
! Undefined command: Sammitch!~Sammitch@hostname.tld,JerkfaceMcAssbot,join,##systemadmins
表示get_attr()
无法找到名为bot_join()
的函数。
我无法弄清楚为什么只有bot_join()
和bot_part()
函数不想工作而其他所有函数都运行得很好。任何人都可以告诉我这里可能出现的问题吗?
我从process_bot_command()
注释掉了try / catch以使其死亡,并在评论中为你们提供了例外,并且join / part函数开始工作。然后我把它添加回去,看看我是否能弄清楚它为什么会破坏,但代码仍在继续工作。
我不知道为什么,但我猜问题已经解决了?