diff --git a/nonebot/command/__init__.py b/nonebot/command/__init__.py index 1a9f622b..5a9fb7bf 100644 --- a/nonebot/command/__init__.py +++ b/nonebot/command/__init__.py @@ -73,6 +73,7 @@ class Command: session.current_key is not None: # argument-level filters are given, use them arg = session.current_arg + config = session.bot.config for f in session.current_arg_filters: try: res = f(arg) @@ -81,9 +82,21 @@ class Command: arg = res except ValidateError as e: # validation failed + if config.MAX_VALIDATION_FAILURES > 0: + # should check number of validation failures + session.state['__validation_failure_num'] = \ + session.state.get( + '__validation_failure_num', 0) + 1 + + if session.state['__validation_failure_num'] >= \ + config.MAX_VALIDATION_FAILURES: + # noinspection PyProtectedMember + session.finish(render_expression( + config.TOO_MANY_VALIDATION_FAILURES_EXPRESSION + ), **session._current_send_kwargs) + failure_message = e.message if failure_message is None: - config = session.bot.config failure_message = render_expression( config.DEFAULT_VALIDATION_FAILURE_EXPRESSION ) diff --git a/nonebot/default_config.py b/nonebot/default_config.py index 86e1b9e2..9ca0523e 100644 --- a/nonebot/default_config.py +++ b/nonebot/default_config.py @@ -28,14 +28,22 @@ DEBUG: bool = True SUPERUSERS: Container[int] = set() NICKNAME: Union[str, Iterable[str]] = '' + COMMAND_START: Iterable[Union[str, Pattern]] = {'/', '!', '/', '!'} COMMAND_SEP: Iterable[Union[str, Pattern]] = {'/', '.'} + SESSION_EXPIRE_TIMEOUT: Optional[timedelta] = timedelta(minutes=5) SESSION_RUN_TIMEOUT: Optional[timedelta] = None SESSION_RUNNING_EXPRESSION: Expression_T = '您有命令正在执行,请稍后再试' -SESSION_CANCEL_EXPRESSION = '好的' + SHORT_MESSAGE_MAX_LENGTH: int = 50 + +SESSION_CANCEL_EXPRESSION = '好的' + DEFAULT_VALIDATION_FAILURE_EXPRESSION: Expression_T = '您的输入不符合要求,请重新输入' +MAX_VALIDATION_FAILURES = 3 +TOO_MANY_VALIDATION_FAILURES_EXPRESSION: Expression_T = \ + '您输入错误太多次啦,如需重试,请重新触发本功能' APSCHEDULER_CONFIG: Dict[str, Any] = { 'apscheduler.timezone': 'Asia/Shanghai'