Ejemplo n.º 1
0
def unblock(_, ctx_msg, argv=None):
    def _send_error_msg():
        core.echo('参数不正确。\n\n正确使用方法:\nsudo.unblock <account-to-unblock>',
                  ctx_msg)

    if len(argv) != 1:
        _send_error_msg()
        return

    account = argv[0]
    # Get a target using a fake context message
    target = get_target({
        'via': 'default',
        'msg_type': 'private',
        'sender_id': account
    })

    if not target:
        _send_error_msg()
        return

    conn = _open_db_conn()
    conn.execute('DELETE FROM blocked_target_list WHERE target = ?',
                 (target, ))
    conn.commit()
    conn.close()
    core.echo('成功取消屏蔽用户 ' + account, ctx_msg)
Ejemplo n.º 2
0
 def wrapper(args_text, ctx_msg, internal=False, *args, **kwargs):
     target = get_target(ctx_msg)
     if not target:
         _send_fail_to_get_target_msg(ctx_msg, internal)
         return None
     else:
         return func(args_text, ctx_msg, internal, *args, **kwargs)
Ejemplo n.º 3
0
def _filter(ctx_msg):
    target = get_target(ctx_msg)
    if not target:
        return True

    if target in sudo.block_list('', ctx_msg, internal=True):
        return False
    return True
Ejemplo n.º 4
0
def execute_job(args_text, ctx_msg, internal=False):
    job = get_job(args_text, ctx_msg, internal=True)
    if not job:
        core.echo('没有找到该计划任务,请指定正确的计划任务 ID', ctx_msg, internal)
        return
    job_id_suffix = _job_id_suffix_start + get_target(ctx_msg)
    job_id = job.id[:-len(job_id_suffix)]
    _call_commands(job_id, job.kwargs['command_list'], job.kwargs['ctx_msg'],
                   internal)
Ejemplo n.º 5
0
def clear(_, ctx_msg):
    conn = _open_db_conn()
    target = get_target(ctx_msg)
    cursor = conn.cursor()
    cursor.execute('DELETE FROM cmd_note WHERE target = ?', (target, ))
    if cursor.rowcount > 0:
        core.echo('成功删除了所有的笔记,共 %s 条~' % cursor.rowcount, ctx_msg)
    else:
        core.echo('本来就没有笔记哦~', ctx_msg)
    conn.commit()
    conn.close()
Ejemplo n.º 6
0
def remove_job(args_text, ctx_msg, internal=False):
    job_id_without_suffix = args_text.strip()
    if not job_id_without_suffix:
        _send_text('请指定计划任务的 ID', ctx_msg, internal)
        return False
    job_id = job_id_without_suffix + _job_id_suffix_start + get_target(ctx_msg)
    try:
        _scheduler.remove_job(job_id, 'default')
        _send_text('成功删除计划任务 ' + job_id_without_suffix, ctx_msg, internal)
        return True
    except JobLookupError:
        _send_text('没有找到计划任务 ' + job_id_without_suffix, ctx_msg, internal)
        return False
Ejemplo n.º 7
0
def take(args_text, ctx_msg, allow_interactive=True):
    source = get_source(ctx_msg)
    if allow_interactive and (not args_text or has_session(source, _cmd_take)):
        # Be interactive
        return _take_interactively(args_text, ctx_msg, source)

    conn = _open_db_conn()
    dt_unix = int(datetime.now(tz=pytz.utc).timestamp())
    target = get_target(ctx_msg)
    conn.execute('INSERT INTO cmd_note (content, dt, target) VALUES (?, ?, ?)',
                 (args_text, dt_unix, target))
    conn.commit()
    conn.close()
    core.echo('好的,记下了~', ctx_msg)
Ejemplo n.º 8
0
def list_all(_, ctx_msg):
    conn = _open_db_conn()
    target = get_target(ctx_msg)
    cursor = conn.execute(
        'SELECT id, dt, content FROM cmd_note WHERE target = ?', (target, ))
    rows = list(cursor)
    conn.close()
    if len(rows) == 0:
        core.echo('还没有笔记哦~', ctx_msg)
        return
    for row in rows:
        tz_china = pytz.timezone('Asia/Shanghai')
        dt_raw = datetime.fromtimestamp(row[1], tz=pytz.utc)
        core.echo(
            'ID:' + str(row[0]) + '\n时间:' +
            dt_raw.astimezone(tz_china).strftime('%Y.%m.%d %H:%M') + '\n内容:' +
            str(row[2]), ctx_msg)
    core.echo('以上~', ctx_msg)
Ejemplo n.º 9
0
def get_job(args_text, ctx_msg, internal=False):
    job_id_without_suffix = args_text.strip()
    if not job_id_without_suffix:
        _send_text('请指定计划任务的 ID', ctx_msg, internal)
        return None
    job_id = job_id_without_suffix + _job_id_suffix_start + get_target(ctx_msg)
    job = _scheduler.get_job(job_id, 'default')
    if internal:
        if job:
            job.id = job_id_without_suffix
        return job
    if not job:
        core.echo('没有找到该计划任务,请指定正确的计划任务 ID', ctx_msg, internal)
        return
    reply = '找到计划任务如下:\n'
    reply += 'ID:' + job_id_without_suffix + '\n'
    reply += '下次触发时间:\n%s\n' % job.next_run_time.strftime('%Y-%m-%d %H:%M')
    reply += '命令:\n'
    command_list = job.kwargs['command_list']
    reply += convert_command_list_to_str(command_list)
    _send_text(reply, ctx_msg, internal)
Ejemplo n.º 10
0
def list_jobs(_, ctx_msg, internal=False):
    target = get_target(ctx_msg)
    job_id_suffix = _job_id_suffix_start + target
    jobs = list(
        filter(lambda j: j.id.endswith(job_id_suffix),
               _scheduler.get_jobs('default')))
    if internal:
        for job in jobs:
            job.id = job.id[:-len(job_id_suffix)]
        return jobs

    for job in jobs:
        job_id = job.id[:-len(job_id_suffix)]
        command_list = job.kwargs['command_list']
        reply = 'ID:' + job_id + '\n'
        reply += '下次触发时间:\n%s\n' % job.next_run_time.strftime('%Y-%m-%d %H:%M')
        reply += '命令:\n'
        reply += convert_command_list_to_str(command_list)
        _send_text(reply, ctx_msg, internal)
    if len(jobs):
        _send_text('以上', ctx_msg, internal)
    else:
        _send_text('还没有添加计划任务', ctx_msg, internal)
Ejemplo n.º 11
0
def remove(args_text, ctx_msg, allow_interactive=True):
    source = get_source(ctx_msg)
    if allow_interactive and (not args_text
                              or has_session(source, _cmd_remove)):
        # Be interactive
        return _remove_interactively(args_text, ctx_msg, source)

    try:
        note_id = int(args_text)
    except ValueError:
        # Failed to cast
        core.echo('你输入的 ID 格式不正确哦~应该是个数字才对~', ctx_msg)
        return
    conn = _open_db_conn()
    target = get_target(ctx_msg)
    cursor = conn.cursor()
    cursor.execute('DELETE FROM cmd_note WHERE target = ? AND id = ?',
                   (target, note_id))
    if cursor.rowcount > 0:
        core.echo('删除成功了~', ctx_msg)
    else:
        core.echo('没找到这个 ID 的笔记哦~', ctx_msg)
    conn.commit()
    conn.close()
Ejemplo n.º 12
0
def add_job(args_text, ctx_msg, internal=False):
    if args_text.strip() in ('', 'help', '-h', '--help') and not internal:
        _send_add_job_help_msg(ctx_msg, internal)
        return

    args_text = args_text.lstrip()
    try:
        # Parse trigger args
        trigger_args = {}
        if args_text.startswith('-'):
            # options mode
            key_dict = {
                '-M': 'minute',
                '-H': 'hour',
                '-d': 'day',
                '-m': 'month',
                '-w': 'day_of_week'
            }
            while args_text.startswith('-') and not args_text.startswith('--'):
                try:
                    option, value, args_text = re.split(
                        _args_split_sep, args_text, 2)
                    trigger_args[key_dict[option]] = value
                    args_text = args_text.lstrip()
                except (ValueError, KeyError):
                    # Split failed or get key failed, which means format is not correct
                    raise _InvalidTriggerArgsError
        else:
            # cron mode
            try:
                trigger_args['minute'], \
                trigger_args['hour'], \
                trigger_args['day'], \
                trigger_args['month'], \
                trigger_args['day_of_week'], \
                args_text = re.split(_args_split_sep, args_text, 5)
                args_text = args_text.lstrip()
            except ValueError:
                # Split failed, which means format is not correct
                raise _InvalidTriggerArgsError

        # Parse '--multi' option
        multi = False
        if args_text.startswith('--multi '):
            multi = True
            tmp = re.split(_args_split_sep, args_text, 1)
            if len(tmp) < 2:
                raise _IncompleteArgsError
            args_text = tmp[1].lstrip()

        tmp = re.split(_args_split_sep, args_text, 1)
        if len(tmp) < 2:
            raise _IncompleteArgsError
        job_id_without_suffix, command_raw = tmp
        job_id = job_id_without_suffix + _job_id_suffix_start + get_target(
            ctx_msg)
        command_list = []
        if multi:
            command_raw_list = re.split('\r?\n', command_raw)
            for cmd_raw in command_raw_list:
                cmd_raw = cmd_raw.lstrip()
                if not cmd_raw:
                    continue
                tmp = re.split('|'.join(_command_args_start_flags), cmd_raw, 1)
                if len(tmp) < 2:
                    tmp.append('')
                command_list.append(tuple(tmp))
        else:
            command_raw = command_raw.lstrip()
            tmp = re.split('|'.join(_command_args_start_flags), command_raw, 1)
            if len(tmp) < 2:
                tmp.append('')
            command_list.append(tuple(tmp))

        job_args = {
            'job_id': job_id_without_suffix,
            'command_list': command_list,
            'ctx_msg': ctx_msg
        }
        job = _scheduler.add_job(_call_commands,
                                 kwargs=job_args,
                                 trigger='cron',
                                 **trigger_args,
                                 id=job_id,
                                 replace_existing=True,
                                 misfire_grace_time=30)
        _send_text('成功添加计划任务 ' + job_id_without_suffix, ctx_msg, internal)
        if job:
            job.id = job_id_without_suffix
        return job
    except _InvalidTriggerArgsError:
        _send_add_job_trigger_args_invalid_msg(ctx_msg, internal)
    except _IncompleteArgsError:
        _send_add_job_incomplete_args_msg(ctx_msg, internal)