Exemplo n.º 1
0
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)} 个计划任务')
Exemplo n.º 2
0
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('订阅失败,有可能只是运气不好哦,请稍后重试~')
Exemplo n.º 3
0
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},请检查你的输入是否正确')
Exemplo n.º 4
0
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))
Exemplo n.º 5
0
async def get_subscriptions(ctx) -> List[scheduler.Job]:
    return await scheduler.get_jobs(
        scheduler.make_job_id(PLUGIN_NAME, context_id(ctx)))
Exemplo n.º 6
0
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('订阅失败,有可能只是运气不好哦,请稍后重试~')
Exemplo n.º 7
0
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))