async def alarm(session: CommandSession): time: datetime = session.get("time") target: str = session.get("target") # 过滤时间 now = datetime.now() # 过去的时间 if time <= now: session.finish(render_expression(EXPR_COULD_NOT)) time_str = time.strftime("%Y-%m-%d %H:%M:%S") await add_job( remind, trigger="date", run_date=time, id=make_job_id( PLUGIN_NAME, session.event, (random_string(1, string.ascii_lowercase) + random_string(7, string.ascii_lowercase + string.digits)), ), args=[target, session.event], kwargs={"remark": target}, ) cmd, current_arg = CommandManager().parse_command(session.bot, target) if cmd: tmp_session = CommandSession(session.bot, session.event, cmd, current_arg=current_arg) if await cmd.run(tmp_session, dry=True): await add_scheduled_commands( ScheduledCommand(cmd.name, current_arg), job_id=make_job_id( PLUGIN_NAME, session.event, (random_string(1, string.ascii_lowercase) + random_string(7, string.ascii_lowercase + string.digits)), ), event=session.event, trigger="date", run_date=time, replace_existing=True, ) session.finish( render_expression( EXPR_OK, time=time_str, action=target, escape_args=False) + f"\n提醒创建成功:\n" f"> 提醒时间:{time_str}\n" f"> 内容:{target}")
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))