Add max validation failures check of command arguments

This commit is contained in:
Richard Chien 2019-02-21 22:23:43 +08:00
parent 635fc70756
commit 5986afb200
2 changed files with 23 additions and 2 deletions

View File

@ -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
)

View File

@ -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'