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)
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)
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
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)
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()
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
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)
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)
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)
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)
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()
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)