我试图为IRC客户端创建一个CLI,我只使用标准的python包编写。我一直在python中使用原生cmd库,它可以很好地满足我的需求(目前),但有一个问题我无法修复。
有一个公共实例变量,用于在cmd库中包含命令前缀,但我不能让我的生活让它正常工作;它只是给了我一个"未知语法"错误。这里的目标是' / help'或者带有/前缀的其他命令会调用该方法,只需输入'帮助'会发送"帮助"到服务器。
以下是我的代码中正在进行的CLI类:
class lircCLI(Cmd):
intro = 'Welcome to LIRC \nType help or ? for command list'
prompt = 'lirc> '
identchars = '/' << the problem
#---------commands-----------
def do_sync(self):
'Force synchronize with the IRC server'
connectionHandler.syncMessages()
def do_whoami(self, arg):
'Good question'
print(user.getName())
def do_changename(self, arg):
'Change your name'
user.setName(arg)
print("Username has been changed to '"+user.name+"'")
def default(self, line):
'Sends a message'
#compiles message request
message = str(user.getName().replace(" ", "_") + " SHOUTS " + line + " END")
connectionHandler.sendMessage(message)
logHandler.updateChatLog({time.strftime("%d/%m/%Y") : {'time': time.strftime("%I:%M:%S"), 'user': user.getName(),'text': line}})
答案 0 :(得分:1)
identchars
属性实际上定义了可以从中绘制命令的字符集。它的默认值几乎是“ascii chars”。
您要做的是使用.precmd
方法来反转正常处理。寻找一个领先的斜线,如果找到剥离它。如果未找到,则前缀一些无效前缀或某些“默认”命令名称。这些都可以起作用:
def precmd(self, line):
if line[0] == '/':
line = line[1:]
else:
line = '>' + line
return line
def default(self, line):
line = line[1:]
print("You said, '"+line+"'")
或者:
def precmd(self, line):
if line[0] == '/':
line = line[1:]
else:
line = 'say ' + line
return line
def do_say(self, arg):
print("You said, '"+arg+"'")
def default(self, line):
raise ValueError("Inconceivable!")