From 286772a6db65f2fc18bf0cda7c34375e9784cb45 Mon Sep 17 00:00:00 2001 From: felinae98 <731499577@qq.com> Date: Wed, 16 Jun 2021 12:53:35 +0800 Subject: [PATCH] add outer manager #6 --- .../nonebot_hk_reporter/config_manager.py | 286 +++++++++--------- 1 file changed, 147 insertions(+), 139 deletions(-) diff --git a/src/plugins/nonebot_hk_reporter/config_manager.py b/src/plugins/nonebot_hk_reporter/config_manager.py index 581ccfa..97ed65b 100644 --- a/src/plugins/nonebot_hk_reporter/config_manager.py +++ b/src/plugins/nonebot_hk_reporter/config_manager.py @@ -1,3 +1,4 @@ +from typing import Type from nonebot import logger, on_command from nonebot.adapters.cqhttp import Bot, Event, GroupMessageEvent from nonebot.adapters.cqhttp.message import Message @@ -5,6 +6,7 @@ from nonebot.adapters.cqhttp.permission import GROUP_ADMIN, GROUP_MEMBER, GROUP_ from nonebot.permission import Permission, SUPERUSER from nonebot.rule import to_me from nonebot.typing import T_State +from nonebot.matcher import Matcher from .config import Config, NoSuchSubscribeException from .platform import platform_manager, check_sub_target @@ -23,152 +25,158 @@ async def send_help(bot: Bot, event: Event, state: T_State): message = '使用方法:\n@bot 添加订阅(仅管理员)\n@bot 查询订阅\n@bot 删除订阅(仅管理员)' await help_match.finish(Message(await parse_text(message))) -add_sub = on_command("添加订阅", rule=to_me(), permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER, priority=5) -@add_sub.handle() -async def add_sub_handle_platform(bot: Bot, event: Event, state: T_State): - if 'platform' in state: - return - await bot.send(event=event, message='请输入想要订阅的平台,目前支持:\n' + - ''.join(['{}:{}\n'.format(platform_name, platform_manager[platform_name].name) \ - for platform_name in common_platform]) + - '要查看全部平台请输入:“全部”' - ) - await add_sub.pause() -@add_sub.handle() -async def add_sub_parse_platform(bot: Bot, event: Event, state: T_State): - if 'platform' in state: - return - platform = str(event.get_message()).strip() - if platform == '全部': - message = '全部平台\n' + \ - '\n'.join(['{}:{}'.format(platform_name, platform.name) \ - for platform_name, platform in platform_manager.items()]) - await add_sub.reject(message) - elif platform in platform_manager: - state['platform'] = platform - else: - await add_sub.reject('平台输入错误') -# @add_sub.got('platform', '请输入想要订阅的平台,目前支持:{}'.format(', '.join(platform_manager.keys()))) -# @add_sub.got('id', '请输入订阅用户的id,详情查阅https://github.com/felinae98/nonebot-hk-reporter') -@add_sub.handle() -async def add_sub_handle_id(bot: Bot, event: Event, state: T_State): - if not platform_manager[state['platform']].has_target or 'id' in state: - return - await bot.send(event=event, message='请输入订阅用户的id,详情查阅https://github.com/felinae98/nonebot-hk-reporter') - await add_sub.pause() +def do_add_sub(add_sub: Type[Matcher]): + @add_sub.handle() + async def init_promote(bot: Bot, event: Event, state: T_State): + state['_prompt'] = '请输入想要订阅的平台,目前支持:\n' + \ + ''.join(['{}:{}\n'.format(platform_name, platform_manager[platform_name].name) \ + for platform_name in common_platform]) + \ + '要查看全部平台请输入:“全部”' -@add_sub.handle() -async def add_sub_parse_id(bot: Bot, event: Event, state: T_State): - if not platform_manager[state['platform']].has_target or 'id' in state: - return - target = str(event.get_message()).strip() - name = await check_sub_target(state['platform'], target) - if not name: - await add_sub.reject('id输入错误') - state['id'] = target - state['name'] = name + async def parse_platform(bot: Bot, event: Event, state: T_State) -> None: + platform = str(event.get_message()).strip() + if platform == '全部': + message = '全部平台\n' + \ + '\n'.join(['{}:{}'.format(platform_name, platform.name) \ + for platform_name, platform in platform_manager.items()]) + await add_sub.reject(message) + elif platform in platform_manager: + state['platform'] = platform + else: + await add_sub.reject('平台输入错误') -@add_sub.handle() -async def add_sub_handle_cat(bot: Bot, event: Event, state: T_State): - if not platform_manager[state['platform']].categories: - return - if 'cats' in state: - return - await bot.send(event=event, message='请输入要订阅的类别,以空格分隔,支持的类别有:{}'.format( - ','.join(list(platform_manager[state['platform']].categories.values())) - )) - await add_sub.pause() + @add_sub.got('platform', '{_prompt}', parse_platform) + @add_sub.handle() + async def init_id(bot: Bot, event: Event, state: T_State): + state['_prompt'] = '请输入订阅用户的id,详情查阅https://github.com/felinae98/nonebot-hk-reporter' -@add_sub.handle() -async def add_sub_parse_cat(bot: Bot, event: Event, state: T_State): - if not platform_manager[state['platform']].categories: - return - if 'cats' in state: - return - res = [] - for cat in str(event.get_message()).strip().split(): - if cat not in platform_manager[state['platform']].reverse_category: - await add_sub.reject('不支持 {}'.format(cat)) - res.append(platform_manager[state['platform']].reverse_category[cat]) - state['cats'] = res + async def parse_id(bot: Bot, event: Event, state: T_State): + target = str(event.get_message()).strip() + name = await check_sub_target(state['platform'], target) + if not name: + await add_sub.reject('id输入错误') + state['id'] = target + state['name'] = name -@add_sub.handle() -async def add_sub_handle_tag(bot: Bot, event: Event, state: T_State): - if not platform_manager[state['platform']].enable_tag: - return - if 'tags' in state: - return - await bot.send(event=event, message='请输入要订阅的tag,订阅所有tag输入"全部标签"') - await add_sub.pause() + @add_sub.got('id', '{_prompt}', parse_id) + @add_sub.handle() + async def init_cat(bot: Bot, event: Event, state: T_State): + if not platform_manager[state['platform']].categories: + state['cats'] = [] + return + state['_prompt'] = '请输入要订阅的类别,以空格分隔,支持的类别有:{}'.format( + ','.join(list(platform_manager[state['platform']].categories.values()))) -@add_sub.handle() -async def add_sub_parse_tag(bot: Bot, event: Event, state: T_State): - if not platform_manager[state['platform']].enable_tag: - return - if 'tags' in state: - return - if str(event.get_message()).strip() == '全部标签': - state['tags'] = [] - else: - state['tags'] = str(event.get_message()).strip().split() + async def parser_cats(bot: Bot, event: Event, state: T_State): + res = [] + for cat in str(event.get_message()).strip().split(): + if cat not in platform_manager[state['platform']].reverse_category: + await add_sub.reject('不支持 {}'.format(cat)) + res.append(platform_manager[state['platform']].reverse_category[cat]) + state['cats'] = res -@add_sub.handle() -async def add_sub_process(bot: Bot, event: GroupMessageEvent, state: T_State): - if not platform_manager[state['platform']].has_target: - state['name'] = await platform_manager[state['platform']].get_account_name(Target('')) - state['id'] = 'default' - config = Config() - config.add_subscribe(event.group_id, user_type='group', - target=state['id'], - target_name=state['name'], target_type=state['platform'], - cats=state.get('cats', []), tags=state.get('tags', [])) - await add_sub.finish('添加 {} 成功'.format(state['name'])) + @add_sub.got('cats', '{_prompt}', parser_cats) + @add_sub.handle() + async def init_tag(bot: Bot, event: Event, state: T_State): + if not platform_manager[state['platform']].enable_tag: + state['tags'] = [] + return + state['_prompt'] = '请输入要订阅的tag,订阅所有tag输入"全部标签"' -query_sub = on_command("查询订阅", rule=to_me(), priority=5) -@query_sub.handle() -async def _(bot: Bot, event: GroupMessageEvent, state: T_State): - config: Config = Config() - sub_list = config.list_subscribe(event.group_id, "group") - res = '订阅的帐号为:\n' - for sub in sub_list: - res += '{} {} {}'.format(sub['target_type'], sub['target_name'], sub['target']) - platform = platform_manager[sub['target_type']] - if platform.categories: - res += ' [{}]'.format(', '.join(map(lambda x: platform.categories[x], sub['cats']))) - if platform.enable_tag: - res += ' {}'.format(', '.join(sub['tags'])) - res += '\n' - # send_msgs(bot, event.group_id, 'group', [await parse_text(res)]) - await query_sub.finish(Message(await parse_text(res))) + async def parser_tags(bot: Bot, event: Event, state: T_State): + if str(event.get_message()).strip() == '全部标签': + state['tags'] = [] + else: + state['tags'] = str(event.get_message()).strip().split() -del_sub = on_command("删除订阅", rule=to_me(), permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER, priority=5) -@del_sub.handle() -async def send_list(bot: Bot, event: GroupMessageEvent, state: T_State): - config: Config = Config() - sub_list = config.list_subscribe(event.group_id, "group") - res = '订阅的帐号为:\n' - state['sub_table'] = {} - for index, sub in enumerate(sub_list, 1): - state['sub_table'][index] = {'target_type': sub['target_type'], 'target': sub['target']} - res += '{} {} {} {}\n'.format(index, sub['target_type'], sub['target_name'], sub['target']) - platform = platform_manager[sub['target_type']] - if platform.categories: - res += ' [{}]'.format(', '.join(map(lambda x: platform.categories[x], sub['cats']))) - if platform.enable_tag: - res += ' {}'.format(', '.join(sub['tags'])) - res += '\n' - res += '请输入要删除的订阅的序号' - await bot.send(event=event, message=Message(await parse_text(res))) - -@del_sub.receive() -async def do_del(bot, event: GroupMessageEvent, state: T_State): - try: - index = int(str(event.get_message()).strip()) + @add_sub.got('tags', '{_prompt}', parser_tags) + @add_sub.handle() + async def add_sub_process(bot: Bot, event: Event, state: T_State): + if not platform_manager[state['platform']].has_target: + state['name'] = await platform_manager[state['platform']].get_account_name(Target('')) + state['id'] = 'default' config = Config() - config.del_subscribe(event.group_id, 'group', **state['sub_table'][index]) - except Exception as e: - await del_sub.reject('删除错误') - logger.warning(e) - else: - await del_sub.finish('删除成功') + config.add_subscribe(state.get('_user_id') or event.group_id, user_type='group', + target=state['id'], + target_name=state['name'], target_type=state['platform'], + cats=state.get('cats', []), tags=state.get('tags', [])) + await add_sub.finish('添加 {} 成功'.format(state['name'])) + +def do_query_sub(query_sub: Type[Matcher]): + @query_sub.handle() + async def _(bot: Bot, event: Event, state: T_State): + config: Config = Config() + sub_list = config.list_subscribe(state.get('_user_id') or event.group_id, "group") + res = '订阅的帐号为:\n' + for sub in sub_list: + res += '{} {} {}'.format(sub['target_type'], sub['target_name'], sub['target']) + platform = platform_manager[sub['target_type']] + if platform.categories: + res += ' [{}]'.format(', '.join(map(lambda x: platform.categories[x], sub['cats']))) + if platform.enable_tag: + res += ' {}'.format(', '.join(sub['tags'])) + res += '\n' + # send_msgs(bot, event.group_id, 'group', [await parse_text(res)]) + await query_sub.finish(Message(await parse_text(res))) + +def do_del_sub(del_sub: Type[Matcher]): + @del_sub.handle() + async def send_list(bot: Bot, event: Event, state: T_State): + config: Config = Config() + sub_list = config.list_subscribe(state.get('_user_id') or event.group_id, "group") + res = '订阅的帐号为:\n' + state['sub_table'] = {} + for index, sub in enumerate(sub_list, 1): + state['sub_table'][index] = {'target_type': sub['target_type'], 'target': sub['target']} + res += '{} {} {} {}\n'.format(index, sub['target_type'], sub['target_name'], sub['target']) + platform = platform_manager[sub['target_type']] + if platform.categories: + res += ' [{}]'.format(', '.join(map(lambda x: platform.categories[x], sub['cats']))) + if platform.enable_tag: + res += ' {}'.format(', '.join(sub['tags'])) + res += '\n' + res += '请输入要删除的订阅的序号' + await bot.send(event=event, message=Message(await parse_text(res))) + + @del_sub.receive() + async def do_del(bot, event: Event, state: T_State): + try: + index = int(str(event.get_message()).strip()) + config = Config() + config.del_subscribe(state.get('_user_id') or event.group_id, 'group', **state['sub_table'][index]) + except Exception as e: + await del_sub.reject('删除错误') + logger.warning(e) + else: + await del_sub.finish('删除成功') + +async def parse_group_number(bot: Bot, event: Event, state: T_State): + state[state["_current_key"]] = int(str(event.get_message())) + + +add_sub_matcher = on_command("添加订阅", rule=to_me(), permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER, priority=5) +do_add_sub(add_sub_matcher) +manage_add_sub_mather = on_command('管理-添加订阅', permission=SUPERUSER, priority=5) +@manage_add_sub_mather.got('_user_id', "群号", parse_group_number) +async def handle(bot: Bot, event: Event, state: T_State): + pass +do_add_sub(manage_add_sub_mather) + + +query_sub_macher = on_command("查询订阅", rule=to_me(), priority=5) +do_query_sub(query_sub_macher) +manage_query_sub_mather = on_command('管理-查询订阅', permission=SUPERUSER, priority=5) +@manage_query_sub_mather.got('_user_id', "群号", parse_group_number) +async def handle(bot: Bot, event: Event, state: T_State): + pass +do_query_sub(manage_query_sub_mather) + + +del_sub_macher = on_command("删除订阅", rule=to_me(), permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER, priority=5) +do_del_sub(del_sub_macher) +manage_del_sub_mather = on_command('管理-删除订阅', permission=SUPERUSER, priority=5) +@manage_del_sub_mather.got('_user_id', "群号", parse_group_number) +async def handle(bot: Bot, event: Event, state: T_State): + pass +do_del_sub(manage_del_sub_mather)