def _check_hbtitle_is_cmd(ctx, title): ctx = ctx.copy() # 复制一份,避免影响原有的ctx ctx['message'] = Message(title) _check_calling_me_nickname(bot, ctx) cmd, _ = parse_command(bot, str(ctx['message']).lstrip()) return bool(cmd)
async def sched_add(session: CommandSession): parser = ArgumentParser(session=session, usage=usage.ADD) parser.add_argument('-S', '--second') parser.add_argument('-M', '--minute') parser.add_argument('-H', '--hour') parser.add_argument('-d', '--day') parser.add_argument('-m', '--month') parser.add_argument('-w', '--day-of-week') parser.add_argument('-f', '--force', action='store_true', default=False) parser.add_argument('-v', '--verbose', action='store_true', default=False) parser.add_argument('--name', required=True) parser.add_argument('commands', nargs='+') args = parser.parse_args(session.argv) if not re.match(r'[_a-zA-Z][_a-zA-Z0-9]*', args.name): await session.send( '计划任务名必须仅包含字母、数字、下划线,且以字母或下划线开头') return parsed_commands: List[ScheduledCommand] = [] invalid_commands: List[str] = [] if args.verbose: parsed_commands.append( ScheduledCommand(('echo',), f'开始执行计划任务 {args.name}……')) for cmd_str in args.commands: cmd, current_arg = parse_command(session.bot, cmd_str) if cmd: tmp_session = CommandSession(session.bot, session.ctx, cmd, current_arg=current_arg) if await cmd.run(tmp_session, dry=True): parsed_commands.append(ScheduledCommand(cmd.name, current_arg)) continue invalid_commands.append(cmd_str) if invalid_commands: invalid_commands_joined = '\n'.join( [f'- {c}' for c in invalid_commands]) await session.send(f'计划任务添加失败,' f'因为下面的 {len(invalid_commands)} 个命令无法被运行' f'(命令不存在或权限不够):\n' f'{invalid_commands_joined}') return trigger_args = {k: v for k, v in args.__dict__.items() if k in {'second', 'minute', 'hour', 'day', 'month', 'day_of_week'}} try: job = await scheduler.add_scheduled_commands( parsed_commands, job_id=scheduler.make_job_id( PLUGIN_NAME, context_id(session.ctx), args.name), ctx=session.ctx, trigger='cron', **trigger_args, replace_existing=args.force ) except scheduler.JobIdConflictError: # a job with same name exists await session.send(f'计划任务 {args.name} 已存在,' f'若要覆盖请使用 --force 参数') return await session.send(f'计划任务 {args.name} 添加成功') await session.send(format_job(args.name, job))