> Я так понимаю, что должно работать как-то так:
> @vcl.on('привет', "здравствуй")
> def hello(text):
Неправильно понимаешь. Это могло бы сработать, если бы ты передал
@vcl.on(['привет', "здравствуй"]) #обрати внимание на список!
Тогда, совместно с твоим предложением по изменению on(), сработало бы. Это один способ.
Однако ты не обратил внимание вот на какой вариант:
@vcl.on('привет')
@vcl.on("здравствуй")
def hello(text):
Это тоже должно сработать! Список имеет смысл, если ты загружаешь этот список откуда-то, а не записываешь его как константу в коде скрипта.
А вообще я бы посоветовал использовать регулярные выражения. Примерно так:
import re
#.............................................
def on(self, condition):
if isinstance(condition, re.Pattern):
predicate = lambda text: condition.match(text)
elif isinstance(condition, str):
condition = condition.lower()
predicate = lambda text: condition in text
elif callable(condition):
predicate = condition
else:
raise TypeError('Condition must be either string or function!')
def decorator(command_func):
self.actions.append((predicate, command_func))
return command_func
return decorator
Для пущего удобства можно исправить метод run_command(), чтобы обработчику команды был доступен результат сопоставления.
def run_command(self, text):
text = text.lower()
for predicate, command in self.actions:
res = predicate(text) #сохраняем результат
if res:
try:
response = command(text, res) #теперь обработчик принимает два аргумента!
if response is None:
response = "Команда выполнена"
else:
response = str(response)
except Exception as err:
response = "Ошибка при выполнении команды"
print(err)
if response:
m.say_message(response)
break
else:
m.say_message("Неизвестная команда")
И пример использования будет примерно таким:
#нужно знать синтаксис регулярных выражений
#совпадёт с любой строкой, начинающейся строго со слов "скажи" или "произнеси"
#всё что после этих слов попадёт в отдельную группу 1.
@vcl.on(re.compile('^(?:скажи|произнеси) (.+)$', re.I))
def hello(text, match): #все обработчики будут принимать два аргумента!
#match будет содержать результат сопоставления входной строки с регуляркой
#group(1) будет содержать то, что оказалось на месте (.+)
return match.group(1) #пусть бот повторит то, что мы попросили его сказать