async def sched_list(session: CommandSession): job_id_prefix = scheduler.make_job_id(PLUGIN_NAME, context_id(session.ctx)) jobs = await scheduler.get_jobs( scheduler.make_job_id(PLUGIN_NAME, context_id(session.ctx))) if not jobs: await session.send(f'你还没有添加过计划任务') return for job in jobs: await session.send(format_job(job.id[len(job_id_prefix):], job)) await asyncio.sleep(0.8) await session.send(f'以上是所有的 {len(jobs)} 个计划任务')
async def subscribe(session: CommandSession): message = session.get('message', prompt='你想订阅什么内容呢?') hour = session.get_optional('hour') minute = session.get_optional('minute') if hour is None or minute is None: time = session.get('time', prompt='你希望我在每天的什么时候给你推送呢?\n' '(请使用24小时制,并使用阿拉伯数字表示小时和分钟)') m = re.match(r'(?P<hour>\d{1,2})[.::](?P<minute>\d{1,2})', time) if not m: m = re.match( r'(?P<hour>\d{1,2})\s*[点时]\s*' r'(?:(?P<minute>\d{1,2}|半|一刻)\s*[分]?)?', time) if m: hour = int(m.group('hour')) session.args['hour'] = hour try: minute = int(m.group('minute') or 0) except ValueError: if m.group('minute') == '半': minute = 30 elif m.group('minute') == '一刻': minute = 15 session.args['minute'] = minute else: session.pause('时间格式不对啦,请重新发送') repeat_str = session.get('repeat', prompt='是否希望我在推送消息的时候重复你上面发的消息内容呢?(请回答是或否)') repeat = nlp.check_confirmation(repeat_str) if repeat is None: session.pause('我听不懂呀,请用是或否再回答一次呢') escaped_message = message.replace('\\', '\\\\').replace('"', '\\"') if repeat: switch_arg = f'--repeat "{escaped_message}"' else: switch_arg = f'"{escaped_message}"' try: job = await scheduler.add_scheduled_commands( ScheduledCommand('switch', switch_arg), job_id=scheduler.make_job_id( PLUGIN_NAME, context_id(session.ctx), (random_string(1, string.ascii_lowercase) + random_string(7, string.ascii_lowercase + string.digits))), ctx=session.ctx, trigger='cron', hour=hour, minute=minute, replace_existing=False) session.finish(f'订阅成功啦,下次推送时间 ' f'{job.next_run_time.strftime("%Y-%m-%d %H:%M")}') except scheduler.JobIdConflictError: session.finish('订阅失败,有可能只是运气不好哦,请稍后重试~')
async def sched_remove(session: CommandSession): parser = ArgumentParser(session=session, usage=usage.REMOVE) parser.add_argument('name') args = parser.parse_args(session.argv) ok = await scheduler.remove_job( scheduler.make_job_id(PLUGIN_NAME, context_id(session.ctx), args.name)) if ok: await session.send(f'成功删除计划任务 {args.name}') else: await session.send(f'没有找到计划任务 {args.name},请检查你的输入是否正确')
async def sched_get(session: CommandSession): parser = ArgumentParser(session=session, usage=usage.GET) parser.add_argument('name') args = parser.parse_args(session.argv) job = await scheduler.get_job( scheduler.make_job_id(PLUGIN_NAME, context_id(session.ctx), args.name)) if not job: await session.send(f'没有找到计划任务 {args.name},请检查你的输入是否正确') return await session.send('找到计划任务如下') await session.send(format_job(args.name, job))
async def get_subscriptions(ctx) -> List[scheduler.Job]: return await scheduler.get_jobs( scheduler.make_job_id(PLUGIN_NAME, context_id(ctx)))
async def subscribe(session: CommandSession): message = session.get( 'message', prompt='你想订阅什么内容呢?', arg_filters=[ controllers.handle_cancellation(session), str.lstrip, validators.not_empty('请输入有效内容哦~'), ] ) hour = session.state.get('hour') minute = session.state.get('minute') if hour is None or minute is None: time = session.get( 'time', prompt='你希望我在每天的什么时候给你推送呢?\n' '(请使用24小时制,并使用阿拉伯数字表示小时和分钟)' ) m = re.match(r'(?P<hour>\d{1,2})[.::](?P<minute>\d{1,2})', time) if not m: m = re.match(r'(?P<hour>\d{1,2})\s*[点时]\s*' r'(?:(?P<minute>\d{1,2}|半|一刻)\s*[分]?)?', time) if m: hour = int(m.group('hour')) session.state['hour'] = hour try: minute = int(m.group('minute') or 0) except ValueError: if m.group('minute') == '半': minute = 30 elif m.group('minute') == '一刻': minute = 15 session.state['minute'] = minute else: del session.state['time'] session.pause('时间格式不对啦,请重新发送') repeat = session.get( 'repeat', prompt='是否希望我在推送消息的时候重复你上面发的消息内容呢?(请回答是或否)', arg_filters=[ extractors.extract_text, converters.simple_chinese_to_bool, validators.ensure_true(lambda x: x is not None, '我听不懂呀,请用是或否再回答一次呢') ] ) escaped_message = message.replace('\\', '\\\\').replace('"', '\\"') if repeat: switch_arg = f'--repeat "{escaped_message}"' else: switch_arg = f'"{escaped_message}"' try: job = await scheduler.add_scheduled_commands( ScheduledCommand('switch', switch_arg), job_id=scheduler.make_job_id( PLUGIN_NAME, context_id(session.ctx), (random_string(1, string.ascii_lowercase) + random_string(7, string.ascii_lowercase + string.digits)) ), ctx=session.ctx, trigger='cron', hour=hour, minute=minute, replace_existing=False ) session.finish(f'订阅成功啦,下次推送时间 ' f'{job.next_run_time.strftime("%Y-%m-%d %H:%M")}') except scheduler.JobIdConflictError: session.finish('订阅失败,有可能只是运气不好哦,请稍后重试~')
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))