From 922c74f20d78dd658db61198e5fc4e4aa508025c Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Wed, 21 Apr 2021 19:32:46 +0800 Subject: [PATCH 01/33] =?UTF-8?q?Fix:=20B=E7=AB=99=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E5=9C=A8=E6=B2=A1=E6=9C=89=E8=AE=A2=E9=98=85=E6=97=B6=E4=BB=8D?= =?UTF-8?q?=E4=BC=9A=E8=AF=B7=E6=B1=82api=E8=BF=9B=E8=A1=8C=E6=A3=80?= =?UTF-8?q?=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复B站插件在没有订阅时仍会请求api导致请求体为空的问题 --- omega_miya/plugins/bilibili_dynamic_monitor/monitor.py | 4 ++++ omega_miya/plugins/bilibili_live_monitor/monitor.py | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/omega_miya/plugins/bilibili_dynamic_monitor/monitor.py b/omega_miya/plugins/bilibili_dynamic_monitor/monitor.py index 1f366ce4..208bf6d4 100644 --- a/omega_miya/plugins/bilibili_dynamic_monitor/monitor.py +++ b/omega_miya/plugins/bilibili_dynamic_monitor/monitor.py @@ -69,6 +69,10 @@ async def bilibili_dynamic_monitor(): sub_res = await t.list_col_with_condition('sub_id', 'sub_type', 2) check_sub = [int(x) for x in sub_res.result] + if not check_sub: + logger.debug(f'bilibili_dynamic_monitor: no dynamic subscription, ignore.') + return + # 注册一个异步函数用于检查动态 async def check_dynamic(dy_uid): # 获取动态并返回动态类型及内容 diff --git a/omega_miya/plugins/bilibili_live_monitor/monitor.py b/omega_miya/plugins/bilibili_live_monitor/monitor.py index 3fb155e4..d3628184 100644 --- a/omega_miya/plugins/bilibili_live_monitor/monitor.py +++ b/omega_miya/plugins/bilibili_live_monitor/monitor.py @@ -326,6 +326,10 @@ async def bilibili_live_monitor(): sub_res = await t.list_col_with_condition('sub_id', 'sub_type', 1) check_sub = [int(x) for x in sub_res.result] + if not check_sub: + logger.debug(f'bilibili_live_monitor: no live subscription, ignore.') + return + # 检查单个直播间状态 async def check_live(room_id: int): # 获取直播间信息 From bd7ebbc13a4cc556bdab664f558deb922755bb12 Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Wed, 21 Apr 2021 22:50:24 +0800 Subject: [PATCH 02/33] =?UTF-8?q?Upgrade:=20=E4=BC=98=E5=8C=96Result?= =?UTF-8?q?=E7=B1=BB,=20=E7=BB=86=E5=88=86result=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 优化Result类, 细分result数据类型 --- omega_miya/plugins/Omega_email/utils.py | 24 +- omega_miya/plugins/Omega_manage/__init__.py | 42 +-- omega_miya/plugins/Omega_skill/__init__.py | 34 +-- .../bilibili_dynamic_monitor/__init__.py | 16 +- .../plugins/bilibili_dynamic_monitor/utils.py | 39 +-- .../plugins/bilibili_live_monitor/__init__.py | 16 +- .../plugins/bilibili_live_monitor/utils.py | 48 ++-- .../plugins/pixivsion_monitor/__init__.py | 10 +- omega_miya/plugins/pixivsion_monitor/utils.py | 10 +- omega_miya/plugins/search_anime/utils.py | 16 +- omega_miya/plugins/search_image/utils.py | 8 +- omega_miya/plugins/setu/utils.py | 4 +- omega_miya/plugins/zhoushen_hime/utils.py | 22 +- omega_miya/utils/Omega_Base/__init__.py | 3 +- omega_miya/utils/Omega_Base/class_result.py | 147 ++++++++++ omega_miya/utils/Omega_Base/database.py | 35 +-- omega_miya/utils/Omega_Base/model/auth.py | 109 +++---- .../utils/Omega_Base/model/bilidynamic.py | 23 +- omega_miya/utils/Omega_Base/model/cooldown.py | 84 +++--- omega_miya/utils/Omega_Base/model/group.py | 271 +++++++++--------- omega_miya/utils/Omega_Base/model/history.py | 9 +- omega_miya/utils/Omega_Base/model/mail.py | 67 ++--- .../utils/Omega_Base/model/pixivillust.py | 44 +-- .../utils/Omega_Base/model/pixivision.py | 23 +- omega_miya/utils/Omega_Base/model/pixivtag.py | 29 +- omega_miya/utils/Omega_Base/model/skill.py | 51 ++-- omega_miya/utils/Omega_Base/model/status.py | 23 +- .../utils/Omega_Base/model/subscription.py | 51 ++-- omega_miya/utils/Omega_Base/model/user.py | 139 ++++----- .../utils/Omega_plugin_utils/cooldown.py | 8 +- omega_miya/utils/nhentai_utils/__init__.py | 8 +- omega_miya/utils/pixiv_utils/pixiv.py | 53 ++-- omega_miya/utils/pixiv_utils/pixivision.py | 16 +- 33 files changed, 819 insertions(+), 663 deletions(-) create mode 100644 omega_miya/utils/Omega_Base/class_result.py diff --git a/omega_miya/plugins/Omega_email/utils.py b/omega_miya/plugins/Omega_email/utils.py index 71384b27..74176dfa 100644 --- a/omega_miya/plugins/Omega_email/utils.py +++ b/omega_miya/plugins/Omega_email/utils.py @@ -10,14 +10,14 @@ AES_KEY = global_config.aes_key -async def check_mailbox(address: str, server_host: str, password: str) -> Result: - def __check_mailbox() -> Result: +async def check_mailbox(address: str, server_host: str, password: str) -> Result.IntResult: + def __check_mailbox() -> Result.IntResult: try: with EmailImap(host=server_host, address=address, password=password) as m: m.select() - __result = Result(error=False, info='Success', result=0) + __result = Result.IntResult(error=False, info='Success', result=0) except Exception as e: - __result = Result(error=True, info=f'Login Failed: {repr(e)}', result=-1) + __result = Result.IntResult(error=True, info=f'Login Failed: {repr(e)}', result=-1) return __result @@ -27,15 +27,15 @@ def __check_mailbox() -> Result: return result -async def get_unseen_mail_info(address: str, server_host: str, password: str) -> Result: - def __get_unseen_mail_info() -> Result: +async def get_unseen_mail_info(address: str, server_host: str, password: str) -> Result.ListResult: + def __get_unseen_mail_info() -> Result.ListResult: try: mail = EmailImap(host=server_host, address=address, password=password) unseen_mails = mail.get_mail_info(None, 'UNSEEN') res = [x for x in unseen_mails] - __result = Result(error=False, info='Success', result=res) + __result = Result.ListResult(error=False, info='Success', result=res) except Exception as e: - __result = Result(error=True, info=repr(e), result=[]) + __result = Result.ListResult(error=True, info=repr(e), result=[]) return __result loop = asyncio.get_running_loop() @@ -52,14 +52,14 @@ def encrypt_password(plaintext: str) -> str: return json.dumps(list(encryptor.encrypt(plaintext))) -def decrypt_password(ciphertext: str) -> Result: +def decrypt_password(ciphertext: str) -> Result.TextResult: encryptor = AESEncryptStr(key=AES_KEY) try: data = json.loads(ciphertext) stat, plaintext = encryptor.decrypt(data[0], data[1], data[2]) if stat: - return Result(error=False, info='Success', result=plaintext) + return Result.TextResult(error=False, info='Success', result=plaintext) else: - return Result(error=True, info='Key incorrect or message corrupted', result=plaintext) + return Result.TextResult(error=True, info='Key incorrect or message corrupted', result=plaintext) except Exception as e: - return Result(error=True, info=f'Ciphertext parse error: {repr(e)}', result='') + return Result.TextResult(error=True, info=f'Ciphertext parse error: {repr(e)}', result='') diff --git a/omega_miya/plugins/Omega_manage/__init__.py b/omega_miya/plugins/Omega_manage/__init__.py index 28057855..b8cf05e7 100644 --- a/omega_miya/plugins/Omega_manage/__init__.py +++ b/omega_miya/plugins/Omega_manage/__init__.py @@ -97,7 +97,7 @@ async def handle_sub_command(bot: Bot, event: GroupMessageEvent, state: T_State) await omega.finish('Failed QAQ') -async def group_init(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: +async def group_init(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.IntResult: group_id = event.group_id # 调用api获取群信息 group_info = await bot.call_api(api='get_group_info', group_id=group_id) @@ -107,18 +107,18 @@ async def group_init(bot: Bot, event: GroupMessageEvent, state: T_State) -> Resu # 添加并初始化群信息 _result = await group.add(name=group_name) if not _result.success(): - return Result(True, _result.info, -1) + return Result.IntResult(True, _result.info, -1) _result = await group.permission_set(notice=1, command=1, level=10) if not _result.success(): - return Result(True, _result.info, -1) + return Result.IntResult(True, _result.info, -1) # 初始化群组authnode await init_group_auth_node(group_id=group_id) _result = await group.member_clear() if not _result.success(): - return Result(True, _result.info, -1) + return Result.IntResult(True, _result.info, -1) # 添加用户 group_member_list = await bot.call_api(api='get_group_member_list', group_id=group_id) @@ -145,10 +145,10 @@ async def group_init(bot: Bot, event: GroupMessageEvent, state: T_State) -> Resu await group.init_member_status() - return Result(False, f'Success with ignore user: {failed_user}', 0) + return Result.IntResult(False, f'Success with ignore user: {failed_user}', 0) -async def group_upgrade(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: +async def group_upgrade(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.IntResult: group_id = event.group_id # 调用api获取群信息 group_info = await bot.call_api(api='get_group_info', group_id=group_id) @@ -158,7 +158,7 @@ async def group_upgrade(bot: Bot, event: GroupMessageEvent, state: T_State) -> R # 更新群信息 _result = await group.add(name=group_name) if not _result.success(): - return Result(True, _result.info, -1) + return Result.IntResult(True, _result.info, -1) # 更新用户 group_member_list = await bot.call_api(api='get_group_member_list', group_id=group_id) @@ -202,15 +202,15 @@ async def group_upgrade(bot: Bot, event: GroupMessageEvent, state: T_State) -> R await group.init_member_status() - return Result(False, f'Success with ignore user: {failed_user}', 0) + return Result.IntResult(False, f'Success with ignore user: {failed_user}', 0) -async def set_group_notice(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: +async def set_group_notice(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.IntResult: group_id = event.group_id group = DBGroup(group_id=group_id) permission_res = await group.permission_info() if permission_res.error: - return Result(True, permission_res.info, -1) + return Result.IntResult(True, permission_res.info, -1) _notice, group_command, group_level = permission_res.result @@ -219,17 +219,17 @@ async def set_group_notice(bot: Bot, event: GroupMessageEvent, state: T_State) - elif state['sub_arg'] == 'off': result = await group.permission_set(notice=0, command=group_command, level=group_level) else: - result = Result(True, 'Missing parameters or Illegal parameter', -1) + result = Result.IntResult(True, 'Missing parameters or Illegal parameter', -1) return result -async def set_group_command(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: +async def set_group_command(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.IntResult: group_id = event.group_id group = DBGroup(group_id=group_id) permission_res = await group.permission_info() if permission_res.error: - return Result(True, permission_res.info, -1) + return Result.IntResult(True, permission_res.info, -1) group_notice, _command, group_level = permission_res.result @@ -238,17 +238,17 @@ async def set_group_command(bot: Bot, event: GroupMessageEvent, state: T_State) elif state['sub_arg'] == 'off': result = await group.permission_set(notice=group_notice, command=0, level=group_level) else: - result = Result(True, 'Missing parameters or Illegal parameter', -1) + result = Result.IntResult(True, 'Missing parameters or Illegal parameter', -1) return result -async def set_group_level(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: +async def set_group_level(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.IntResult: group_id = event.group_id group = DBGroup(group_id=group_id) permission_res = await group.permission_info() if permission_res.error: - return Result(True, permission_res.info, -1) + return Result.IntResult(True, permission_res.info, -1) group_notice, group_command, _level = permission_res.result @@ -256,26 +256,26 @@ async def set_group_level(bot: Bot, event: GroupMessageEvent, state: T_State) -> group_level = int(state['sub_arg']) result = await group.permission_set(notice=group_notice, command=group_command, level=group_level) except Exception as e: - result = Result(True, f'Missing parameters or Illegal parameter, {e}', -1) + result = Result.IntResult(True, f'Missing parameters or Illegal parameter, {e}', -1) return result -async def show_group_permission(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: +async def show_group_permission(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.TextResult: group_id = event.group_id group = DBGroup(group_id=group_id) permission_res = await group.permission_info() if permission_res.error: - return Result(True, permission_res.info, '') + return Result.TextResult(True, permission_res.info, '') group_notice, group_command, group_level = permission_res.result msg = f'当前群组权限: \n\nNotice: {group_notice}\nCommand: {group_command}\nPermissionLevel: {group_level}' - result = Result(False, 'Success', msg) + result = Result.TextResult(False, 'Success', msg) return result -async def reset_group_permission(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: +async def reset_group_permission(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.IntResult: group_id = event.group_id group = DBGroup(group_id=group_id) diff --git a/omega_miya/plugins/Omega_skill/__init__.py b/omega_miya/plugins/Omega_skill/__init__.py index 3613b5c8..8dabbfe0 100644 --- a/omega_miya/plugins/Omega_skill/__init__.py +++ b/omega_miya/plugins/Omega_skill/__init__.py @@ -100,7 +100,7 @@ async def handle_sub_command(bot: Bot, event: Event, state: T_State): await skill_admin.finish('Failed QAQ') -async def skill_add(bot: Bot, event: Event, state: T_State) -> Result: +async def skill_add(bot: Bot, event: Event, state: T_State) -> Result.IntResult: skill_name = state["skill_name"] skill_description = state["skill_description"] skill = DBSkill(name=skill_name) @@ -108,7 +108,7 @@ async def skill_add(bot: Bot, event: Event, state: T_State) -> Result: return result -async def skill_del(bot: Bot, event: Event, state: T_State) -> Result: +async def skill_del(bot: Bot, event: Event, state: T_State) -> Result.IntResult: skill_name = state["skill_name"] skill = DBSkill(name=skill_name) result = await skill.delete() @@ -215,20 +215,20 @@ async def handle_sub_command(bot: Bot, event: GroupMessageEvent, state: T_State) await skill_group_user.finish('Failed QAQ') -async def skill_list(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: +async def skill_list(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.TextResult: skill_table = DBTable(table_name='Skill') _res = await skill_table.list_col(col_name='name') if _res.success(): msg = '目前已有的技能列表如下:' for skill_name in _res.result: msg += f'\n{skill_name}' - result = Result(False, _res.info, msg) + result = Result.TextResult(False, _res.info, msg) else: - result = Result(True, _res.info, '') + result = Result.TextResult(True, _res.info, '') return result -async def user_skill_list(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: +async def user_skill_list(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.TextResult: user_id = event.user_id user = DBUser(user_id=user_id) _res = await user.skill_list() @@ -245,13 +245,13 @@ async def user_skill_list(bot: Bot, event: GroupMessageEvent, state: T_State) -> elif skill_level == 3: skill_level = '专业' msg += f'\n【{skill_name}/{skill_level}】' - result = Result(False, _res.info, msg) + result = Result.TextResult(False, _res.info, msg) else: - result = Result(True, _res.info, '') + result = Result.TextResult(True, _res.info, '') return result -async def user_skill_set(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: +async def user_skill_set(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.TextResult: user_id = event.user_id user = DBUser(user_id=user_id) skill_name = state['skill_name'] @@ -265,30 +265,30 @@ async def user_skill_set(bot: Bot, event: GroupMessageEvent, state: T_State) -> skill_level = 3 _res = await user.skill_add(skill=DBSkill(name=skill_name), skill_level=skill_level) if _res.success(): - result = Result(False, _res.info, msg) + result = Result.TextResult(False, _res.info, msg) else: - result = Result(True, _res.info, '') + result = Result.TextResult(True, _res.info, '') return result -async def user_skill_del(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: +async def user_skill_del(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.IntResult: user_id = event.user_id user = DBUser(user_id=user_id) skill_name = state['skill_name'] _res = await user.skill_del(skill=DBSkill(name=skill_name)) if _res.success(): - result = Result(False, _res.info, 0) + result = Result.IntResult(False, _res.info, 0) else: - result = Result(True, _res.info, -1) + result = Result.IntResult(True, _res.info, -1) return result -async def user_skill_clear(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: +async def user_skill_clear(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.IntResult: user_id = event.user_id user = DBUser(user_id=user_id) _res = await user.skill_clear() if _res.success(): - result = Result(False, _res.info, 0) + result = Result.IntResult(False, _res.info, 0) else: - result = Result(True, _res.info, -1) + result = Result.IntResult(True, _res.info, -1) return result diff --git a/omega_miya/plugins/bilibili_dynamic_monitor/__init__.py b/omega_miya/plugins/bilibili_dynamic_monitor/__init__.py index 9607991d..fb4b5a03 100644 --- a/omega_miya/plugins/bilibili_dynamic_monitor/__init__.py +++ b/omega_miya/plugins/bilibili_dynamic_monitor/__init__.py @@ -120,7 +120,7 @@ async def handle_check(bot: Bot, event: GroupMessageEvent, state: T_State): elif sub_command == '清空订阅': _res = await sub_clear(bot=bot, event=event, state=state) else: - _res = Result(error=True, info='Unknown error, except sub_command', result=-1) + _res = Result.IntResult(error=True, info='Unknown error, except sub_command', result=-1) if _res.success(): logger.info(f"{sub_command}动态成功, group_id: {event.group_id}, uid: {uid}") await bilibili_dynamic.finish(f'{sub_command}成功!') @@ -130,14 +130,14 @@ async def handle_check(bot: Bot, event: GroupMessageEvent, state: T_State): await bilibili_dynamic.finish(f'{sub_command}失败了QAQ, 可能并未订阅该用户, 或请稍后再试~') -async def sub_list(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: +async def sub_list(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.ListResult: group_id = event.group_id group = DBGroup(group_id=group_id) result = await group.subscription_list_by_type(sub_type=2) return result -async def sub_add(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: +async def sub_add(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.IntResult: group_id = event.group_id group = DBGroup(group_id=group_id) uid = state['uid'] @@ -148,26 +148,26 @@ async def sub_add(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: _res = await group.subscription_add(sub=sub) if not _res.success(): return _res - result = Result(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) return result -async def sub_del(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: +async def sub_del(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.IntResult: group_id = event.group_id group = DBGroup(group_id=group_id) uid = state['uid'] _res = await group.subscription_del(sub=DBSubscription(sub_type=2, sub_id=uid)) if not _res.success(): return _res - result = Result(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) return result -async def sub_clear(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: +async def sub_clear(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.IntResult: group_id = event.group_id group = DBGroup(group_id=group_id) _res = await group.subscription_clear_by_type(sub_type=2) if not _res.success(): return _res - result = Result(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) return result diff --git a/omega_miya/plugins/bilibili_dynamic_monitor/utils.py b/omega_miya/plugins/bilibili_dynamic_monitor/utils.py index 04e4c002..a0263b56 100644 --- a/omega_miya/plugins/bilibili_dynamic_monitor/utils.py +++ b/omega_miya/plugins/bilibili_dynamic_monitor/utils.py @@ -17,14 +17,14 @@ ENABLE_DYNAMIC_CHECK_POOL_MODE = plugin_config.enable_dynamic_check_pool_mode -def check_bili_cookies() -> Result: +def check_bili_cookies() -> Result.DictResult: cookies = {} if BILI_SESSDATA and BILI_CSRF: cookies.update({'SESSDATA': BILI_SESSDATA}) cookies.update({'bili_jct': BILI_CSRF}) - return Result(error=False, info='Success', result=cookies) + return Result.DictResult(error=False, info='Success', result=cookies) else: - return Result(error=True, info='None', result=cookies) + return Result.DictResult(error=True, info='None', result=cookies) async def fetch_json(url: str, paras: dict = None) -> HttpFetcher.FetcherJsonResult: @@ -57,7 +57,7 @@ async def fetch_json(url: str, paras: dict = None) -> HttpFetcher.FetcherJsonRes # 图片转base64 -async def pic_2_base64(url: str) -> Result: +async def pic_2_base64(url: str) -> Result.TextResult: headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/89.0.4389.114 Safari/537.36', 'origin': 'https://t.bilibili.com', @@ -67,18 +67,18 @@ async def pic_2_base64(url: str) -> Result: timeout=30, attempt_limit=2, flag='bilibili_dynamic_monitor_get_image', headers=headers) bytes_result = await fetcher.get_bytes(url=url) if bytes_result.error: - return Result(error=True, info='Image download failed', result='') + return Result.TextResult(error=True, info='Image download failed', result='') encode_result = PicEncoder.bytes_to_b64(image=bytes_result.result) if encode_result.success(): - return Result(error=False, info='Success', result=encode_result.result) + return Result.TextResult(error=False, info='Success', result=encode_result.result) else: - return Result(error=True, info=encode_result.info, result='') + return Result.TextResult(error=True, info=encode_result.info, result='') # 根据用户uid获取用户信息 -async def get_user_info(user_uid) -> Result: +async def get_user_info(user_uid) -> Result.DictResult: url = USER_INFO_API_URL payload = {'mid': user_uid} result = await fetch_json(url=url, paras=payload) @@ -91,25 +91,25 @@ async def get_user_info(user_uid) -> Result: 'status': user_info['code'], 'name': user_info['data']['name'] } - result = Result(error=False, info='Success', result=_res) + result = Result.DictResult(error=False, info='Success', result=_res) except Exception as e: - result = Result(error=True, info=f'User info parse failed: {repr(e)}', result={}) + result = Result.DictResult(error=True, info=f'User info parse failed: {repr(e)}', result={}) return result # 返回某个up的所有动态id的列表 -async def get_user_dynamic(user_id: int) -> Result: +async def get_user_dynamic(user_id: int) -> Result.ListResult: t = DBTable(table_name='Bilidynamic') _res = await t.list_col_with_condition('dynamic_id', 'uid', user_id) - if not _res.success(): + if _res.error: return _res dynamic_list = [int(x) for x in _res.result] - result = Result(error=False, info='Success', result=dynamic_list) + result = Result.ListResult(error=False, info='Success', result=dynamic_list) return result # 查询动态并返回动态类型及内容 -async def get_user_dynamic_history(dy_uid) -> Result: +async def get_user_dynamic_history(dy_uid) -> Result.DictResult: _DYNAMIC_INFO = {} # 这个字典用来放最后的输出结果 url = DYNAMIC_API_URL if BILI_UID and BILI_CSRF: @@ -124,7 +124,8 @@ async def get_user_dynamic_history(dy_uid) -> Result: else: dynamic_info = result.result if not dynamic_info.get('data'): - result = Result(error=True, info=f"Get dynamic info failed: {dynamic_info.get('message')}", result={}) + result = Result.DictResult( + error=True, info=f"Get dynamic info failed: {dynamic_info.get('message')}", result={}) return result for card_num in range(len(dynamic_info['data']['cards'])): cards = dynamic_info['data']['cards'][card_num] @@ -296,10 +297,10 @@ async def get_user_dynamic_history(dy_uid) -> Result: card_dic = dict({'id': dy_id, 'type': cards['desc']['type'], 'url': url, 'name': name, 'content': '', 'origin': ''}) _DYNAMIC_INFO[card_num] = card_dic - return Result(error=False, info='Success', result=_DYNAMIC_INFO) + return Result.DictResult(error=False, info='Success', result=_DYNAMIC_INFO) -async def get_dynamic_info(dynamic_id) -> Result: +async def get_dynamic_info(dynamic_id) -> Result.DictResult: __payload = {'dynamic_id': dynamic_id} _res = await fetch_json(url=GET_DYNAMIC_DETAIL_API_URL, paras=__payload) if not _res.success(): @@ -343,12 +344,12 @@ async def get_dynamic_info(dynamic_id) -> Result: origin = dict({'id': dynamic_id, 'type': origin_card['desc']['type'], 'url': '', 'name': origin_name, 'content': origin_description, 'origin': '', 'origin_pics': origin_pics_list}) - result = Result(error=False, info='Success', result=origin) + result = Result.DictResult(error=False, info='Success', result=origin) except Exception as e: # 原动态被删除 origin = dict({'id': dynamic_id, 'type': -1, 'url': '', 'name': 'Unknown', 'content': '原动态被删除', 'origin': repr(e)}) - result = Result(error=True, info='Dynamic not found', result=origin) + result = Result.DictResult(error=True, info='Dynamic not found', result=origin) return result diff --git a/omega_miya/plugins/bilibili_live_monitor/__init__.py b/omega_miya/plugins/bilibili_live_monitor/__init__.py index ba33e17c..662e584d 100644 --- a/omega_miya/plugins/bilibili_live_monitor/__init__.py +++ b/omega_miya/plugins/bilibili_live_monitor/__init__.py @@ -126,7 +126,7 @@ async def handle_check(bot: Bot, event: GroupMessageEvent, state: T_State): elif sub_command == '清空订阅': _res = await sub_clear(bot=bot, event=event, state=state) else: - _res = Result(error=True, info='Unknown error, except sub_command', result=-1) + _res = Result.IntResult(error=True, info='Unknown error, except sub_command', result=-1) if _res.success(): logger.info(f"{sub_command}直播间成功, group_id: {event.group_id}, room_id: {room_id}") await bilibili_live.finish(f'{sub_command}成功!') @@ -136,14 +136,14 @@ async def handle_check(bot: Bot, event: GroupMessageEvent, state: T_State): await bilibili_live.finish(f'{sub_command}失败了QAQ, 可能并未订阅该用户, 或请稍后再试~') -async def sub_list(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: +async def sub_list(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.ListResult: group_id = event.group_id group = DBGroup(group_id=group_id) result = await group.subscription_list_by_type(sub_type=1) return result -async def sub_add(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: +async def sub_add(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.IntResult: group_id = event.group_id group = DBGroup(group_id=group_id) room_id = state['room_id'] @@ -157,26 +157,26 @@ async def sub_add(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: # 添加直播间时需要刷新全局监控列表 # 执行一次初始化 await init_add_live_info(room_id=room_id) - result = Result(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) return result -async def sub_del(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: +async def sub_del(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.IntResult: group_id = event.group_id group = DBGroup(group_id=group_id) room_id = state['room_id'] _res = await group.subscription_del(sub=DBSubscription(sub_type=1, sub_id=room_id)) if not _res.success(): return _res - result = Result(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) return result -async def sub_clear(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: +async def sub_clear(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.IntResult: group_id = event.group_id group = DBGroup(group_id=group_id) _res = await group.subscription_clear_by_type(sub_type=1) if not _res.success(): return _res - result = Result(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) return result diff --git a/omega_miya/plugins/bilibili_live_monitor/utils.py b/omega_miya/plugins/bilibili_live_monitor/utils.py index edab47f0..1d9fe04a 100644 --- a/omega_miya/plugins/bilibili_live_monitor/utils.py +++ b/omega_miya/plugins/bilibili_live_monitor/utils.py @@ -36,14 +36,14 @@ } -def check_bili_cookies() -> Result: +def check_bili_cookies() -> Result.DictResult: cookies = {} if BILI_SESSDATA and BILI_CSRF: cookies.update({'SESSDATA': BILI_SESSDATA}) cookies.update({'bili_jct': BILI_CSRF}) - return Result(error=False, info='Success', result=cookies) + return Result.DictResult(error=False, info='Success', result=cookies) else: - return Result(error=True, info='None', result=cookies) + return Result.DictResult(error=True, info='None', result=cookies) async def fetch_json(url: str, paras: dict = None) -> HttpFetcher.FetcherJsonResult: @@ -60,7 +60,7 @@ async def fetch_json(url: str, paras: dict = None) -> HttpFetcher.FetcherJsonRes # 图片转base64 -async def pic_2_base64(url: str) -> Result: +async def pic_2_base64(url: str) -> Result.TextResult: headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/89.0.4389.114 Safari/537.36', 'origin': 'https://www.bilibili.com', @@ -70,25 +70,25 @@ async def pic_2_base64(url: str) -> Result: timeout=30, attempt_limit=2, flag='bilibili_live_monitor_get_image', headers=headers) bytes_result = await fetcher.get_bytes(url=url) if bytes_result.error: - return Result(error=True, info='Image download failed', result='') + return Result.TextResult(error=True, info='Image download failed', result='') encode_result = PicEncoder.bytes_to_b64(image=bytes_result.result) if encode_result.success(): - return Result(error=False, info='Success', result=encode_result.result) + return Result.TextResult(error=False, info='Success', result=encode_result.result) else: - return Result(error=True, info=encode_result.info, result='') + return Result.TextResult(error=True, info=encode_result.info, result='') # 获取直播间信息 -async def get_live_info(room_id) -> Result: +async def get_live_info(room_id) -> Result.DictResult: url = LIVE_API_URL payload = {'id': room_id} result = await fetch_json(url=url, paras=payload) if not result.success(): return result elif result.result.get('code') != 0: - result = Result(error=True, info=f"Get Live info failed: {result.result.get('message')}", result={}) + result = Result.DictResult(error=True, info=f"Get Live info failed: {result.result.get('message')}", result={}) else: live_info = result.result try: @@ -102,14 +102,14 @@ async def get_live_info(room_id) -> Result: 'room_id': live_info['data']['room_id'], 'short_id': live_info['data']['short_id'] } - result = Result(error=False, info='Success', result=_res) + result = Result.DictResult(error=False, info='Success', result=_res) except Exception as e: - result = Result(error=True, info=f'Live info parse failed: {repr(e)}', result={}) + result = Result.DictResult(error=True, info=f'Live info parse failed: {repr(e)}', result={}) return result # 获取直播间信息 -async def get_live_info_by_uid_list(uid_list: List[Union[int, str]]) -> Result: +async def get_live_info_by_uid_list(uid_list: List[Union[int, str]]) -> Result.DictResult: """ :param uid_list: uid 列表 :return: result: {直播间房间号: 直播间信息} @@ -120,12 +120,12 @@ async def get_live_info_by_uid_list(uid_list: List[Union[int, str]]) -> Result: api_result = await fetcher.post_json(url=LIVE_BY_UIDS_API_URL, json=payload) if api_result.error: - return Result(error=True, info=api_result.info, result={}) + return Result.DictResult(error=True, info=api_result.info, result={}) api_code = api_result.result.get('code') api_msg = api_result.result.get('message') if api_code != 0: - return Result(error=True, info=f'Api error: {api_msg}', result={}) + return Result.DictResult(error=True, info=f'Api error: {api_msg}', result={}) result = {} live_data = dict(api_result.result.get('data')) @@ -146,18 +146,18 @@ async def get_live_info_by_uid_list(uid_list: List[Union[int, str]]) -> Result: except Exception as e: logger.warning(f'bilibili_live_monitor_utils: parse room live info failed, error info: {repr(e)}') continue - return Result(error=False, info='Success', result=result) + return Result.DictResult(error=False, info='Success', result=result) # 根据用户uid获取用户信息 -async def get_user_info(user_uid) -> Result: +async def get_user_info(user_uid) -> Result.DictResult: url = USER_INFO_API_URL payload = {'mid': user_uid} result = await fetch_json(url=url, paras=payload) if not result.success(): return result elif result.result.get('code') != 0: - result = Result(error=True, info=f"Get User info failed: {result.result.get('message')}", result={}) + result = Result.DictResult(error=True, info=f"Get User info failed: {result.result.get('message')}", result={}) else: user_info = result.result try: @@ -165,13 +165,13 @@ async def get_user_info(user_uid) -> Result: 'status': user_info['code'], 'name': user_info['data']['name'] } - result = Result(error=False, info='Success', result=_res) + result = Result.DictResult(error=False, info='Success', result=_res) except Exception as e: - result = Result(error=True, info=f'User info parse failed: {repr(e)}', result={}) + result = Result.DictResult(error=True, info=f'User info parse failed: {repr(e)}', result={}) return result -async def verify_cookies() -> Result: +async def verify_cookies() -> Result.TextResult: cookies_verify_url = 'https://api.bilibili.com/x/web-interface/nav' _res = await fetch_json(url=cookies_verify_url, paras=None) if _res.success(): @@ -181,14 +181,14 @@ async def verify_cookies() -> Result: uname = data.get('uname') mid = data.get('mid') if mid == BILI_UID: - result = Result(error=False, info='Success login', result=uname) + result = Result.TextResult(error=False, info='Success login', result=uname) else: - result = Result(error=True, info='Logged user UID does not match', result=uname) + result = Result.TextResult(error=True, info='Logged user UID does not match', result=uname) else: - result = Result(error=True, info='Not login', result='') + result = Result.TextResult(error=True, info='Not login', result='') return result else: - return _res + return Result.TextResult(error=True, info=_res.info, result='') __all__ = [ diff --git a/omega_miya/plugins/pixivsion_monitor/__init__.py b/omega_miya/plugins/pixivsion_monitor/__init__.py index 6a972d49..362d3a0f 100644 --- a/omega_miya/plugins/pixivsion_monitor/__init__.py +++ b/omega_miya/plugins/pixivsion_monitor/__init__.py @@ -72,7 +72,7 @@ async def handle_sub_command_args(bot: Bot, event: GroupMessageEvent, state: T_S elif sub_command == '取消订阅': _res = await sub_del(bot=bot, event=event, state=state) else: - _res = Result(error=True, info='Unknown error, except sub_command', result=-1) + _res = Result.IntResult(error=True, info='Unknown error, except sub_command', result=-1) if _res.success(): logger.info(f"{sub_command}Pixivision成功, group_id: {event.group_id}, {_res.info}") await pixivision.finish(f'{sub_command}成功!') @@ -81,7 +81,7 @@ async def handle_sub_command_args(bot: Bot, event: GroupMessageEvent, state: T_S await pixivision.finish(f'{sub_command}失败了QAQ, 可能并未订阅Pixivision, 或请稍后再试~') -async def sub_add(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: +async def sub_add(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.IntResult: group_id = event.group_id group = DBGroup(group_id=group_id) sub_id = -1 @@ -92,16 +92,16 @@ async def sub_add(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: _res = await group.subscription_add(sub=sub) if not _res.success(): return _res - result = Result(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) return result -async def sub_del(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result: +async def sub_del(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.IntResult: group_id = event.group_id group = DBGroup(group_id=group_id) sub_id = -1 _res = await group.subscription_del(sub=DBSubscription(sub_type=8, sub_id=sub_id)) if not _res.success(): return _res - result = Result(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) return result diff --git a/omega_miya/plugins/pixivsion_monitor/utils.py b/omega_miya/plugins/pixivsion_monitor/utils.py index 33138239..d599dc38 100644 --- a/omega_miya/plugins/pixivsion_monitor/utils.py +++ b/omega_miya/plugins/pixivsion_monitor/utils.py @@ -2,10 +2,10 @@ from omega_miya.utils.pixiv_utils import PixivisionArticle -async def pixivsion_article_parse(aid: int, tags: list) -> Result: +async def pixivsion_article_parse(aid: int, tags: list) -> Result.DictResult: article_result = await PixivisionArticle(aid=aid).get_article_info() if article_result.error: - return Result(error=True, info=article_result.info, result={}) + return Result.DictResult(error=True, info=article_result.info, result={}) try: article_info = dict(article_result.result) @@ -29,9 +29,9 @@ async def pixivsion_article_parse(aid: int, tags: list) -> Result: 'image:': article_info['article_eyecatch_image'], 'illusts_list': illusts_list } - result = Result(error=False, info='Success', result=__res) + result = Result.DictResult(error=False, info='Success', result=__res) else: - result = Result(error=True, info=db_res.info, result={}) + result = Result.DictResult(error=True, info=db_res.info, result={}) except Exception as e: - result = Result(error=True, info=repr(e), result={}) + result = Result.DictResult(error=True, info=repr(e), result={}) return result diff --git a/omega_miya/plugins/search_anime/utils.py b/omega_miya/plugins/search_anime/utils.py index 2e7462e0..b0d6d23b 100644 --- a/omega_miya/plugins/search_anime/utils.py +++ b/omega_miya/plugins/search_anime/utils.py @@ -11,32 +11,32 @@ # 图片转base64 -async def pic_2_base64(url: str) -> Result: +async def pic_2_base64(url: str) -> Result.TextResult: fetcher = HttpFetcher(timeout=10, flag='search_anime_get_image', headers=HEADERS) bytes_result = await fetcher.get_bytes(url=url) if bytes_result.error: - return Result(error=True, info='Image download failed', result='') + return Result.TextResult(error=True, info='Image download failed', result='') encode_result = PicEncoder.bytes_to_b64(image=bytes_result.result) if encode_result.success(): - return Result(error=False, info='Success', result=encode_result.result) + return Result.TextResult(error=False, info='Success', result=encode_result.result) else: - return Result(error=True, info=encode_result.info, result='') + return Result.TextResult(error=True, info=encode_result.info, result='') # 获取识别结果 -async def get_identify_result(img_url: str) -> Result: +async def get_identify_result(img_url: str) -> Result.ListResult: fetcher = HttpFetcher(timeout=10, flag='search_anime', headers=HEADERS) payload = {'url': img_url} result_json = await fetcher.get_json(url=API_URL, params=payload) if not result_json.success(): - return result_json + return Result.ListResult(error=True, info=result_json.info, result=[]) _res = result_json.result if not _res.get('docs'): - return Result(error=True, info='no result found', result=[]) + return Result.ListResult(error=True, info='no result found', result=[]) _result = [] for item in _res.get('docs'): @@ -60,4 +60,4 @@ async def get_identify_result(img_url: str) -> Result: logger.warning(f'result parse failed: {repr(e)}, raw_json: {item}') continue - return Result(error=False, info='Success', result=_result) + return Result.ListResult(error=False, info='Success', result=_result) diff --git a/omega_miya/plugins/search_image/utils.py b/omega_miya/plugins/search_image/utils.py index 9a4ec3e7..6a1b95c7 100644 --- a/omega_miya/plugins/search_image/utils.py +++ b/omega_miya/plugins/search_image/utils.py @@ -17,18 +17,18 @@ # 图片转base64 -async def pic_2_base64(url: str) -> Result: +async def pic_2_base64(url: str) -> Result.TextResult: fetcher = HttpFetcher(timeout=10, flag='search_image_get_image', headers=HEADERS) bytes_result = await fetcher.get_bytes(url=url) if bytes_result.error: - return Result(error=True, info='Image download failed', result='') + return Result.TextResult(error=True, info='Image download failed', result='') encode_result = PicEncoder.bytes_to_b64(image=bytes_result.result) if encode_result.success(): - return Result(error=False, info='Success', result=encode_result.result) + return Result.TextResult(error=False, info='Success', result=encode_result.result) else: - return Result(error=True, info=encode_result.info, result='') + return Result.TextResult(error=True, info=encode_result.info, result='') # 获取识别结果 Saucenao模块 diff --git a/omega_miya/plugins/setu/utils.py b/omega_miya/plugins/setu/utils.py index 5b20fd60..e2960424 100644 --- a/omega_miya/plugins/setu/utils.py +++ b/omega_miya/plugins/setu/utils.py @@ -2,7 +2,7 @@ from omega_miya.utils.pixiv_utils import PixivIllust -async def add_illust(pid: int, nsfw_tag: int) -> Result: +async def add_illust(pid: int, nsfw_tag: int) -> Result.IntResult: illust_result = await PixivIllust(pid=pid).get_illust_data() if illust_result.success(): @@ -21,4 +21,4 @@ async def add_illust(pid: int, nsfw_tag: int) -> Result: _res = await illust.add(uid=uid, title=title, uname=uname, nsfw_tag=nsfw_tag, tags=tags, url=url) return _res else: - return illust_result + return Result.IntResult(error=True, info=illust_result.info, result=-1) diff --git a/omega_miya/plugins/zhoushen_hime/utils.py b/omega_miya/plugins/zhoushen_hime/utils.py index 495d6f61..cd0c2fec 100644 --- a/omega_miya/plugins/zhoushen_hime/utils.py +++ b/omega_miya/plugins/zhoushen_hime/utils.py @@ -429,15 +429,15 @@ def __init__(self, file_path: str, single_threshold_time: int = 500, multi_thres self.__header_lines: List[AssScriptLine] = list() self.__styles = set() - def init_file(self, auto_style: bool = False) -> Result: + def init_file(self, auto_style: bool = False) -> Result.IntResult: """ :param auto_style: 是否启用智能样式, 启用后会检查字幕文件使用样式数, 若只使用一种则自动停用style_mode """ if not os.path.exists(self.__file_path): - return Result(error=True, info='File not exist', result=-1) + return Result.IntResult(error=True, info='File not exist', result=-1) if os.path.splitext(self.__file_path)[-1] not in ['.ass', '.ASS']: - return Result(error=True, info='File type error, not ass', result=-1) + return Result.IntResult(error=True, info='File type error, not ass', result=-1) with open(self.__file_path, 'r', encoding='utf8') as f_ass: line_count = 0 @@ -468,12 +468,12 @@ def init_file(self, auto_style: bool = False) -> Result: self.__style_mode = True self.__is_init = True - return Result(error=False, info='Success', result=0) + return Result.IntResult(error=False, info='Success', result=0) - def handle(self): + def handle(self) -> Result.DictResult: if not self.__is_init: logger.error('Handle processing error: 时轴文件未未初始化') - return Result(error=True, info='Handle without init file', result={}) + return Result.DictResult(error=True, info='Handle without init file', result={}) logger.info('Handle processing started') flash_mode = self.__flash_mode @@ -643,21 +643,21 @@ def handle(self): result_dict = {'output_txt_path': output_txt_path, 'output_ass_path': output_ass_path, 'character_count': character_count, 'overlap_count': overlap_count, 'flash_count': flash_count} - return Result(error=False, info='Success', result=result_dict) + return Result.DictResult(error=False, info='Success', result=result_dict) -async def download_file(url: str, file_path: str) -> Result: +async def download_file(url: str, file_path: str) -> Result.IntResult: headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/89.0.4389.114 Safari/537.36'} # 尝试从服务器下载资源 fetcher = HttpFetcher(timeout=10, flag=f'zhoushen_hime', headers=headers) download_result = await fetcher.get_bytes(url=url) if download_result.error: - return Result(error=True, info=f'Download failed, error info: {download_result.info}', result=-1) + return Result.IntResult(error=True, info=f'Download failed, error info: {download_result.info}', result=-1) try: with open(file_path, 'wb+') as f: f.write(download_result.result) - return Result(error=False, info='Success', result=1) + return Result.IntResult(error=False, info='Success', result=1) except Exception as e: - return Result(error=True, info=f'Write file failed, error info: {repr(e)}', result=-1) + return Result.IntResult(error=True, info=f'Write file failed, error info: {repr(e)}', result=-1) diff --git a/omega_miya/utils/Omega_Base/__init__.py b/omega_miya/utils/Omega_Base/__init__.py index 692d37f5..359e71b7 100644 --- a/omega_miya/utils/Omega_Base/__init__.py +++ b/omega_miya/utils/Omega_Base/__init__.py @@ -3,7 +3,8 @@ 其他插件不得单独写入数据库操作逻辑 """ -from .database import DBTable, DBResult as Result +from .database import DBTable +from .class_result import Result from .model import \ DBUser, DBGroup, DBSkill, DBSubscription, DBDynamic, \ DBPixivillust, DBPixivtag, DBPixivision, \ diff --git a/omega_miya/utils/Omega_Base/class_result.py b/omega_miya/utils/Omega_Base/class_result.py new file mode 100644 index 00000000..cf0d417b --- /dev/null +++ b/omega_miya/utils/Omega_Base/class_result.py @@ -0,0 +1,147 @@ +from dataclasses import dataclass +from typing import Dict, List, Set, Tuple, Any + + +@dataclass +class BaseResult: + error: bool + info: str + + def success(self) -> bool: + if not self.error: + return True + else: + return False + + +class Result(object): + @dataclass + class DictResult(BaseResult): + result: dict + + def __repr__(self): + return f'' + + @dataclass + class IntDictResult(BaseResult): + result: Dict[int, int] + + def __repr__(self): + return f'' + + @dataclass + class TextDictResult(BaseResult): + result: Dict[str, str] + + def __repr__(self): + return f'' + + @dataclass + class JsonDictResult(BaseResult): + result: Dict[Any, dict] + + def __repr__(self): + return f'' + + @dataclass + class ListResult(BaseResult): + result: list + + def __repr__(self): + return f'' + + @dataclass + class IntListResult(BaseResult): + result: List[int] + + def __repr__(self): + return f'' + + @dataclass + class TextListResult(BaseResult): + result: List[str] + + def __repr__(self): + return f'' + + @dataclass + class DictListResult(BaseResult): + result: List[dict] + + def __repr__(self): + return f'' + + @dataclass + class SetResult(BaseResult): + result: set + + def __repr__(self): + return f'' + + @dataclass + class IntSetResult(BaseResult): + result: Set[int] + + def __repr__(self): + return f'' + + @dataclass + class TextSetResult(BaseResult): + result: Set[str] + + def __repr__(self): + return f'' + + @dataclass + class TupleResult(BaseResult): + result: tuple + + def __repr__(self): + return f'' + + @dataclass + class IntTupleResult(BaseResult): + result: Tuple[int, ...] + + def __repr__(self): + return f'' + + @dataclass + class TextTupleResult(BaseResult): + result: Tuple[str, ...] + + def __repr__(self): + return f'' + + @dataclass + class IntResult(BaseResult): + result: int + + def __repr__(self): + return f'' + + @dataclass + class TextResult(BaseResult): + result: str + + def __repr__(self): + return f'' + + @dataclass + class BoolResult(BaseResult): + result: bool + + def __repr__(self): + return f'' + + @dataclass + class AnyResult(BaseResult): + result: Any + + def __repr__(self): + return f'' + + +__all__ = [ + 'Result' +] diff --git a/omega_miya/utils/Omega_Base/database.py b/omega_miya/utils/Omega_Base/database.py index e703064b..66499c14 100644 --- a/omega_miya/utils/Omega_Base/database.py +++ b/omega_miya/utils/Omega_Base/database.py @@ -1,10 +1,10 @@ import nonebot -from typing import Union from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import create_async_engine from sqlalchemy.future import select from sqlalchemy.orm import sessionmaker from .tables import Base +from .class_result import Result global_config = nonebot.get_driver().config __DATABASE = 'mysql' @@ -60,22 +60,6 @@ def get_async_session(self): return self.__async_session -class DBResult(object): - def __init__(self, error: bool, info: str, result: Union[int, str, list, set, tuple, dict]): - self.error = error - self.info = info - self.result = result - - def success(self) -> bool: - if not self.error: - return True - else: - return False - - def __repr__(self): - return f'' - - class DBTable(object): def __init__(self, table_name): self.__tables = Base @@ -89,10 +73,10 @@ def __get_table(self): else: return None - async def list_col(self, col_name) -> DBResult: + async def list_col(self, col_name) -> Result.ListResult: res = [] if not self.__table: - result = DBResult(error=True, info='Table not exist', result=res) + result = Result.ListResult(error=True, info='Table not exist', result=res) else: async_session = NBdb().get_async_session() async with async_session() as session: @@ -102,15 +86,15 @@ async def list_col(self, col_name) -> DBResult: session_result = await session.execute(select(col)) for item in session_result.scalars().all(): res.append(item) - result = DBResult(error=False, info='Success', result=res) + result = Result.ListResult(error=False, info='Success', result=res) except Exception as e: - result = DBResult(error=True, info=repr(e), result=res) + result = Result.ListResult(error=True, info=repr(e), result=res) return result - async def list_col_with_condition(self, col_name, condition_col_name, condition) -> DBResult: + async def list_col_with_condition(self, col_name, condition_col_name, condition) -> Result.ListResult: res = [] if not self.__table: - result = DBResult(error=True, info='Table not exist', result=res) + result = Result.ListResult(error=True, info='Table not exist', result=res) else: async_session = NBdb().get_async_session() async with async_session() as session: @@ -121,14 +105,13 @@ async def list_col_with_condition(self, col_name, condition_col_name, condition) session_result = await session.execute(select(col).where(condition_col == condition)) for item in session_result.scalars().all(): res.append(item) - result = DBResult(error=False, info='Success', result=res) + result = Result.ListResult(error=False, info='Success', result=res) except Exception as e: - result = DBResult(error=True, info=repr(e), result=res) + result = Result.ListResult(error=True, info=repr(e), result=res) return result __all__ = [ 'NBdb', - 'DBResult', 'DBTable' ] diff --git a/omega_miya/utils/Omega_Base/model/auth.py b/omega_miya/utils/Omega_Base/model/auth.py index 8904fe2a..4d4b0b66 100644 --- a/omega_miya/utils/Omega_Base/model/auth.py +++ b/omega_miya/utils/Omega_Base/model/auth.py @@ -1,4 +1,5 @@ -from omega_miya.utils.Omega_Base.database import NBdb, DBResult +from omega_miya.utils.Omega_Base.database import NBdb +from omega_miya.utils.Omega_Base.class_result import Result from omega_miya.utils.Omega_Base.tables import AuthUser, AuthGroup, User, Group from .user import DBUser from .group import DBGroup @@ -20,7 +21,7 @@ def __init__(self, auth_id: int, auth_type: str, auth_node: str): self.auth_type = auth_type self.auth_node = auth_node - async def id(self) -> DBResult: + async def id(self) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -33,7 +34,7 @@ async def id(self) -> DBResult: where(AuthUser.auth_node == self.auth_node) ) auth_table_id = session_result.scalar_one() - result = DBResult(error=False, info='Success', result=auth_table_id) + result = Result.IntResult(error=False, info='Success', result=auth_table_id) elif self.auth_type == 'group': session_result = await session.execute( select(AuthGroup.id).join(Group). @@ -42,22 +43,22 @@ async def id(self) -> DBResult: where(AuthGroup.auth_node == self.auth_node) ) auth_table_id = session_result.scalar_one() - result = DBResult(error=False, info='Success', result=auth_table_id) + result = Result.IntResult(error=False, info='Success', result=auth_table_id) else: - result = DBResult(error=True, info='Auth type error', result=-1) + result = Result.IntResult(error=True, info='Auth type error', result=-1) except NoResultFound: - result = DBResult(error=True, info='NoResultFound', result=-1) + result = Result.IntResult(error=True, info='NoResultFound', result=-1) except MultipleResultsFound: - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result async def exist(self) -> bool: result = await self.id() return result.success() - async def set(self, allow_tag: int, deny_tag: int, auth_info: str = None) -> DBResult: + async def set(self, allow_tag: int, deny_tag: int, auth_info: str = None) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: try: @@ -75,7 +76,7 @@ async def set(self, allow_tag: int, deny_tag: int, auth_info: str = None) -> DBR auth.deny_tag = deny_tag auth.auth_info = auth_info auth.updated_at = datetime.now() - result = DBResult(error=False, info='Success upgraded', result=0) + result = Result.IntResult(error=False, info='Success upgraded', result=0) elif self.auth_type == 'group': session_result = await session.execute( select(AuthGroup).join(Group). @@ -88,44 +89,44 @@ async def set(self, allow_tag: int, deny_tag: int, auth_info: str = None) -> DBR auth.deny_tag = deny_tag auth.auth_info = auth_info auth.updated_at = datetime.now() - result = DBResult(error=False, info='Success upgraded', result=0) + result = Result.IntResult(error=False, info='Success upgraded', result=0) else: - result = DBResult(error=True, info='Auth type error', result=-1) + result = Result.IntResult(error=True, info='Auth type error', result=-1) except NoResultFound: if self.auth_type == 'user': user = DBUser(user_id=self.auth_id) user_id_result = await user.id() if user_id_result.error: - result = DBResult(error=True, info='User not exist', result=-1) + result = Result.IntResult(error=True, info='User not exist', result=-1) else: auth = AuthUser(user_id=user_id_result.result, auth_node=self.auth_node, allow_tag=allow_tag, deny_tag=deny_tag, auth_info=auth_info, created_at=datetime.now()) session.add(auth) - result = DBResult(error=False, info='Success set', result=0) + result = Result.IntResult(error=False, info='Success set', result=0) elif self.auth_type == 'group': group = DBGroup(group_id=self.auth_id) group_id_result = await group.id() if group_id_result.error: - result = DBResult(error=True, info='Group not exist', result=-1) + result = Result.IntResult(error=True, info='Group not exist', result=-1) else: auth = AuthGroup(group_id=group_id_result.result, auth_node=self.auth_node, allow_tag=allow_tag, deny_tag=deny_tag, auth_info=auth_info, created_at=datetime.now()) session.add(auth) - result = DBResult(error=False, info='Success set', result=0) + result = Result.IntResult(error=False, info='Success set', result=0) else: - result = DBResult(error=True, info='Auth type error', result=-1) + result = Result.IntResult(error=True, info='Auth type error', result=-1) await session.commit() except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def allow_tag(self) -> DBResult: + async def allow_tag(self) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -138,7 +139,7 @@ async def allow_tag(self) -> DBResult: where(AuthUser.auth_node == self.auth_node) ) allow_tag = session_result.scalar_one() - result = DBResult(error=False, info='Success', result=allow_tag) + result = Result.IntResult(error=False, info='Success', result=allow_tag) elif self.auth_type == 'group': session_result = await session.execute( select(AuthGroup.allow_tag).join(Group). @@ -147,18 +148,18 @@ async def allow_tag(self) -> DBResult: where(AuthGroup.auth_node == self.auth_node) ) allow_tag = session_result.scalar_one() - result = DBResult(error=False, info='Success', result=allow_tag) + result = Result.IntResult(error=False, info='Success', result=allow_tag) else: - result = DBResult(error=True, info='Auth type error', result=-1) + result = Result.IntResult(error=True, info='Auth type error', result=-1) except NoResultFound: - result = DBResult(error=True, info='NoResultFound', result=-2) + result = Result.IntResult(error=True, info='NoResultFound', result=-2) except MultipleResultsFound: - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def deny_tag(self) -> DBResult: + async def deny_tag(self) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -171,7 +172,7 @@ async def deny_tag(self) -> DBResult: where(AuthUser.auth_node == self.auth_node) ) deny_tag = session_result.scalar_one() - result = DBResult(error=False, info='Success', result=deny_tag) + result = Result.IntResult(error=False, info='Success', result=deny_tag) elif self.auth_type == 'group': session_result = await session.execute( select(AuthGroup.deny_tag).join(Group). @@ -180,18 +181,18 @@ async def deny_tag(self) -> DBResult: where(AuthGroup.auth_node == self.auth_node) ) deny_tag = session_result.scalar_one() - result = DBResult(error=False, info='Success', result=deny_tag) + result = Result.IntResult(error=False, info='Success', result=deny_tag) else: - result = DBResult(error=True, info='Auth type error', result=-1) + result = Result.IntResult(error=True, info='Auth type error', result=-1) except NoResultFound: - result = DBResult(error=True, info='NoResultFound', result=-2) + result = Result.IntResult(error=True, info='NoResultFound', result=-2) except MultipleResultsFound: - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def tags_info(self) -> DBResult: + async def tags_info(self) -> Result.IntTupleResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -204,7 +205,7 @@ async def tags_info(self) -> DBResult: where(AuthUser.auth_node == self.auth_node) ) res = session_result.one() - result = DBResult(error=False, info='Success', result=(res[0], res[1])) + result = Result.IntTupleResult(error=False, info='Success', result=(res[0], res[1])) elif self.auth_type == 'group': session_result = await session.execute( select(AuthGroup.allow_tag, AuthGroup.deny_tag).join(Group). @@ -213,18 +214,18 @@ async def tags_info(self) -> DBResult: where(AuthGroup.auth_node == self.auth_node) ) res = session_result.one() - result = DBResult(error=False, info='Success', result=(res[0], res[1])) + result = Result.IntTupleResult(error=False, info='Success', result=(res[0], res[1])) else: - result = DBResult(error=True, info='Auth type error', result=(-1, -1)) + result = Result.IntTupleResult(error=True, info='Auth type error', result=(-1, -1)) except NoResultFound: - result = DBResult(error=True, info='NoResultFound', result=(-2, -2)) + result = Result.IntTupleResult(error=True, info='NoResultFound', result=(-2, -2)) except MultipleResultsFound: - result = DBResult(error=True, info='MultipleResultsFound', result=(-1, -1)) + result = Result.IntTupleResult(error=True, info='MultipleResultsFound', result=(-1, -1)) except Exception as e: - result = DBResult(error=True, info=repr(e), result=(-1, -1)) + result = Result.IntTupleResult(error=True, info=repr(e), result=(-1, -1)) return result - async def delete(self) -> DBResult: + async def delete(self) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: try: @@ -238,7 +239,7 @@ async def delete(self) -> DBResult: ) auth = session_result.scalar_one() await session.delete(auth) - result = DBResult(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) elif self.auth_type == 'group': session_result = await session.execute( select(AuthGroup).join(Group). @@ -248,23 +249,23 @@ async def delete(self) -> DBResult: ) auth = session_result.scalar_one() await session.delete(auth) - result = DBResult(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) else: - result = DBResult(error=True, info='Auth type error', result=-1) + result = Result.IntResult(error=True, info='Auth type error', result=-1) await session.commit() except NoResultFound: await session.rollback() - result = DBResult(error=True, info='NoResultFound', result=-1) + result = Result.IntResult(error=True, info='NoResultFound', result=-1) except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result @classmethod - async def list(cls, auth_type: str, auth_id: int) -> DBResult: + async def list(cls, auth_type: str, auth_id: int) -> Result.ListResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -276,7 +277,7 @@ async def list(cls, auth_type: str, auth_id: int) -> DBResult: where(User.qq == auth_id) ) auth_node_list = [(x[0], x[1], x[2]) for x in session_result.all()] - result = DBResult(error=False, info='Success', result=auth_node_list) + result = Result.ListResult(error=False, info='Success', result=auth_node_list) elif auth_type == 'group': session_result = await session.execute( select(AuthGroup.auth_node, AuthGroup.allow_tag, AuthGroup.deny_tag).join(Group). @@ -284,13 +285,13 @@ async def list(cls, auth_type: str, auth_id: int) -> DBResult: where(Group.group_id == auth_id) ) auth_node_list = [(x[0], x[1], x[2]) for x in session_result.all()] - result = DBResult(error=False, info='Success', result=auth_node_list) + result = Result.ListResult(error=False, info='Success', result=auth_node_list) else: - result = DBResult(error=True, info='Auth type error', result=[]) + result = Result.ListResult(error=True, info='Auth type error', result=[]) except NoResultFound: - result = DBResult(error=True, info='NoResultFound', result=[]) + result = Result.ListResult(error=True, info='NoResultFound', result=[]) except MultipleResultsFound: - result = DBResult(error=True, info='MultipleResultsFound', result=[]) + result = Result.ListResult(error=True, info='MultipleResultsFound', result=[]) except Exception as e: - result = DBResult(error=True, info=repr(e), result=[]) + result = Result.ListResult(error=True, info=repr(e), result=[]) return result diff --git a/omega_miya/utils/Omega_Base/model/bilidynamic.py b/omega_miya/utils/Omega_Base/model/bilidynamic.py index 418fad72..6813d75b 100644 --- a/omega_miya/utils/Omega_Base/model/bilidynamic.py +++ b/omega_miya/utils/Omega_Base/model/bilidynamic.py @@ -1,4 +1,5 @@ -from omega_miya.utils.Omega_Base.database import NBdb, DBResult +from omega_miya.utils.Omega_Base.database import NBdb +from omega_miya.utils.Omega_Base.class_result import Result from omega_miya.utils.Omega_Base.tables import Bilidynamic from datetime import datetime from sqlalchemy.future import select @@ -10,7 +11,7 @@ def __init__(self, uid: int, dynamic_id: int): self.uid = uid self.dynamic_id = dynamic_id - async def id(self) -> DBResult: + async def id(self) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -21,20 +22,20 @@ async def id(self) -> DBResult: where(Bilidynamic.dynamic_id == self.dynamic_id) ) bilidynamic_table_id = session_result.scalar_one() - result = DBResult(error=False, info='Success', result=bilidynamic_table_id) + result = Result.IntResult(error=False, info='Success', result=bilidynamic_table_id) except NoResultFound: - result = DBResult(error=True, info='NoResultFound', result=-1) + result = Result.IntResult(error=True, info='NoResultFound', result=-1) except MultipleResultsFound: - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result async def exist(self) -> bool: result = await self.id() return result.success() - async def add(self, dynamic_type: int, content: str) -> DBResult: + async def add(self, dynamic_type: int, content: str) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: try: @@ -48,18 +49,18 @@ async def add(self, dynamic_type: int, content: str) -> DBResult: exist_dynamic = session_result.scalar_one() exist_dynamic.content += f'\nupdate: {datetime.now()}\n{content}' exist_dynamic.updated_at = datetime.now() - result = DBResult(error=False, info='Success upgrade', result=0) + result = Result.IntResult(error=False, info='Success upgrade', result=0) except NoResultFound: # 动态表中添加新动态 new_dynamic = Bilidynamic(uid=self.uid, dynamic_id=self.dynamic_id, dynamic_type=dynamic_type, content=content, created_at=datetime.now()) session.add(new_dynamic) - result = DBResult(error=False, info='Success added', result=0) + result = Result.IntResult(error=False, info='Success added', result=0) await session.commit() except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result diff --git a/omega_miya/utils/Omega_Base/model/cooldown.py b/omega_miya/utils/Omega_Base/model/cooldown.py index b852e2a2..3157b2dd 100644 --- a/omega_miya/utils/Omega_Base/model/cooldown.py +++ b/omega_miya/utils/Omega_Base/model/cooldown.py @@ -1,4 +1,5 @@ -from omega_miya.utils.Omega_Base.database import NBdb, DBResult +from omega_miya.utils.Omega_Base.database import NBdb +from omega_miya.utils.Omega_Base.class_result import Result from omega_miya.utils.Omega_Base.tables import CoolDownEvent from datetime import datetime from sqlalchemy.future import select @@ -7,7 +8,7 @@ class DBCoolDownEvent(object): @classmethod - async def add_global_cool_down_event(cls, stop_at: datetime, description: str = None) -> DBResult: + async def add_global_cool_down_event(cls, stop_at: datetime, description: str = None) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: try: @@ -21,23 +22,23 @@ async def add_global_cool_down_event(cls, stop_at: datetime, description: str = exist_event.stop_at = stop_at exist_event.description = description exist_event.updated_at = datetime.now() - result = DBResult(error=False, info='Success upgraded', result=0) + result = Result.IntResult(error=False, info='Success upgraded', result=0) except NoResultFound: new_event = CoolDownEvent( event_type='global', stop_at=stop_at, description=description, created_at=datetime.now()) session.add(new_event) - result = DBResult(error=False, info='Success added', result=0) + result = Result.IntResult(error=False, info='Success added', result=0) await session.commit() except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result @classmethod - async def check_global_cool_down_event(cls) -> DBResult: + async def check_global_cool_down_event(cls) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -48,17 +49,18 @@ async def check_global_cool_down_event(cls) -> DBResult: ) event = session_result.scalar_one() stop_at = event.stop_at - result = DBResult(error=False, info=f'CoolDown until: {stop_at}', result=1) + result = Result.IntResult(error=False, info=f'CoolDown until: {stop_at}', result=1) except NoResultFound: - result = DBResult(error=False, info='NoResultFound', result=0) + result = Result.IntResult(error=False, info='NoResultFound', result=0) except MultipleResultsFound: - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result @classmethod - async def add_plugin_cool_down_event(cls, plugin: str, stop_at: datetime, description: str = None) -> DBResult: + async def add_plugin_cool_down_event( + cls, plugin: str, stop_at: datetime, description: str = None) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: try: @@ -73,24 +75,24 @@ async def add_plugin_cool_down_event(cls, plugin: str, stop_at: datetime, descri exist_event.stop_at = stop_at exist_event.description = description exist_event.updated_at = datetime.now() - result = DBResult(error=False, info='Success upgraded', result=0) + result = Result.IntResult(error=False, info='Success upgraded', result=0) except NoResultFound: new_event = CoolDownEvent( event_type='plugin', plugin=plugin, stop_at=stop_at, description=description, created_at=datetime.now()) session.add(new_event) - result = DBResult(error=False, info='Success added', result=0) + result = Result.IntResult(error=False, info='Success added', result=0) await session.commit() except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result @classmethod - async def check_plugin_cool_down_event(cls, plugin: str) -> DBResult: + async def check_plugin_cool_down_event(cls, plugin: str) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -102,18 +104,18 @@ async def check_plugin_cool_down_event(cls, plugin: str) -> DBResult: ) event = session_result.scalar_one() stop_at = event.stop_at - result = DBResult(error=False, info=f'CoolDown until: {stop_at}', result=1) + result = Result.IntResult(error=False, info=f'CoolDown until: {stop_at}', result=1) except NoResultFound: - result = DBResult(error=False, info='NoResultFound', result=0) + result = Result.IntResult(error=False, info='NoResultFound', result=0) except MultipleResultsFound: - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result @classmethod async def add_group_cool_down_event( - cls, plugin: str, group_id: int, stop_at: datetime, description: str = None) -> DBResult: + cls, plugin: str, group_id: int, stop_at: datetime, description: str = None) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: try: @@ -129,24 +131,24 @@ async def add_group_cool_down_event( exist_event.stop_at = stop_at exist_event.description = description exist_event.updated_at = datetime.now() - result = DBResult(error=False, info='Success upgraded', result=0) + result = Result.IntResult(error=False, info='Success upgraded', result=0) except NoResultFound: new_event = CoolDownEvent( event_type='group', plugin=plugin, group_id=group_id, stop_at=stop_at, description=description, created_at=datetime.now()) session.add(new_event) - result = DBResult(error=False, info='Success added', result=0) + result = Result.IntResult(error=False, info='Success added', result=0) await session.commit() except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result @classmethod - async def check_group_cool_down_event(cls, plugin: str, group_id: int) -> DBResult: + async def check_group_cool_down_event(cls, plugin: str, group_id: int) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -159,18 +161,18 @@ async def check_group_cool_down_event(cls, plugin: str, group_id: int) -> DBResu ) event = session_result.scalar_one() stop_at = event.stop_at - result = DBResult(error=False, info=f'CoolDown until: {stop_at}', result=1) + result = Result.IntResult(error=False, info=f'CoolDown until: {stop_at}', result=1) except NoResultFound: - result = DBResult(error=False, info='NoResultFound', result=0) + result = Result.IntResult(error=False, info='NoResultFound', result=0) except MultipleResultsFound: - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result @classmethod async def add_user_cool_down_event( - cls, plugin: str, user_id: int, stop_at: datetime, description: str = None) -> DBResult: + cls, plugin: str, user_id: int, stop_at: datetime, description: str = None) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: try: @@ -186,24 +188,24 @@ async def add_user_cool_down_event( exist_event.stop_at = stop_at exist_event.description = description exist_event.updated_at = datetime.now() - result = DBResult(error=False, info='Success upgraded', result=0) + result = Result.IntResult(error=False, info='Success upgraded', result=0) except NoResultFound: new_event = CoolDownEvent( event_type='user', plugin=plugin, user_id=user_id, stop_at=stop_at, description=description, created_at=datetime.now()) session.add(new_event) - result = DBResult(error=False, info='Success added', result=0) + result = Result.IntResult(error=False, info='Success added', result=0) await session.commit() except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result @classmethod - async def check_user_cool_down_event(cls, plugin: str, user_id: int) -> DBResult: + async def check_user_cool_down_event(cls, plugin: str, user_id: int) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -216,13 +218,13 @@ async def check_user_cool_down_event(cls, plugin: str, user_id: int) -> DBResult ) event = session_result.scalar_one() stop_at = event.stop_at - result = DBResult(error=False, info=f'CoolDown until: {stop_at}', result=1) + result = Result.IntResult(error=False, info=f'CoolDown until: {stop_at}', result=1) except NoResultFound: - result = DBResult(error=False, info='NoResultFound', result=0) + result = Result.IntResult(error=False, info='NoResultFound', result=0) except MultipleResultsFound: - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result @classmethod diff --git a/omega_miya/utils/Omega_Base/model/group.py b/omega_miya/utils/Omega_Base/model/group.py index 57febbab..615c3ac5 100644 --- a/omega_miya/utils/Omega_Base/model/group.py +++ b/omega_miya/utils/Omega_Base/model/group.py @@ -1,4 +1,5 @@ -from omega_miya.utils.Omega_Base.database import NBdb, DBResult +from omega_miya.utils.Omega_Base.database import NBdb +from omega_miya.utils.Omega_Base.class_result import Result from omega_miya.utils.Omega_Base.tables import \ User, Group, UserGroup, Vocation, Skill, UserSkill, Subscription, GroupSub, AuthGroup, EmailBox, GroupEmailBox from .user import DBUser, DBSkill @@ -13,7 +14,7 @@ class DBGroup(object): def __init__(self, group_id: int): self.group_id = group_id - async def id(self) -> DBResult: + async def id(self) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -22,20 +23,20 @@ async def id(self) -> DBResult: select(Group.id).where(Group.group_id == self.group_id) ) group_table_id = session_result.scalar_one() - result = DBResult(error=False, info='Success', result=group_table_id) + result = Result.IntResult(error=False, info='Success', result=group_table_id) except NoResultFound: - result = DBResult(error=True, info='NoResultFound', result=-1) + result = Result.IntResult(error=True, info='NoResultFound', result=-1) except MultipleResultsFound: - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result async def exist(self) -> bool: result = await self.id() return result.success() - async def name(self) -> DBResult: + async def name(self) -> Result.TextResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -44,16 +45,16 @@ async def name(self) -> DBResult: select(Group.name).where(Group.group_id == self.group_id) ) group_name = session_result.scalar_one() - result = DBResult(error=False, info='Success', result=group_name) + result = Result.TextResult(error=False, info='Success', result=group_name) except NoResultFound: - result = DBResult(error=True, info='NoResultFound', result='') + result = Result.TextResult(error=True, info='NoResultFound', result='') except MultipleResultsFound: - result = DBResult(error=True, info='MultipleResultsFound', result='') + result = Result.TextResult(error=True, info='MultipleResultsFound', result='') except Exception as e: - result = DBResult(error=True, info=repr(e), result='') + result = Result.TextResult(error=True, info=repr(e), result='') return result - async def add(self, name: str) -> DBResult: + async def add(self, name: str) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: try: @@ -65,25 +66,25 @@ async def add(self, name: str) -> DBResult: exist_group = session_result.scalar_one() exist_group.name = name exist_group.updated_at = datetime.now() - result = DBResult(error=False, info='Success upgraded', result=0) + result = Result.IntResult(error=False, info='Success upgraded', result=0) except NoResultFound: new_group = Group(group_id=self.group_id, name=name, notice_permissions=0, command_permissions=0, permission_level=0, created_at=datetime.now()) session.add(new_group) - result = DBResult(error=False, info='Success added', result=0) + result = Result.IntResult(error=False, info='Success added', result=0) await session.commit() except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def delete(self) -> DBResult: + async def delete(self) -> Result.IntResult: id_result = await self.id() if id_result.error: - return DBResult(error=True, info='Group not exist', result=-1) + return Result.IntResult(error=True, info='Group not exist', result=-1) async_session = NBdb().get_async_session() async with async_session() as session: @@ -124,22 +125,22 @@ async def delete(self) -> DBResult: exist_group = session_result.scalar_one() await session.delete(exist_group) await session.commit() - result = DBResult(error=False, info='Success Delete', result=0) + result = Result.IntResult(error=False, info='Success Delete', result=0) except NoResultFound: await session.rollback() - result = DBResult(error=True, info='NoResultFound', result=-1) + result = Result.IntResult(error=True, info='NoResultFound', result=-1) except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def member_list(self) -> DBResult: + async def member_list(self) -> Result.ListResult: id_result = await self.id() if id_result.error: - return DBResult(error=True, info='Group not exist', result=[]) + return Result.ListResult(error=True, info='Group not exist', result=[]) async_session = NBdb().get_async_session() async with async_session() as session: @@ -151,19 +152,19 @@ async def member_list(self) -> DBResult: where(UserGroup.group_id == id_result.result) ) res = [(x[0], x[1]) for x in session_result.all()] - result = DBResult(error=False, info='Success', result=res) + result = Result.ListResult(error=False, info='Success', result=res) except Exception as e: - result = DBResult(error=True, info=repr(e), result=[]) + result = Result.ListResult(error=True, info=repr(e), result=[]) return result - async def member_add(self, user: DBUser, user_group_nickname: str) -> DBResult: + async def member_add(self, user: DBUser, user_group_nickname: str) -> Result.IntResult: group_id_result = await self.id() if group_id_result.error: - return DBResult(error=True, info='Group not exist', result=-1) + return Result.IntResult(error=True, info='Group not exist', result=-1) user_id_result = await user.id() if user_id_result.error: - return DBResult(error=True, info='User not exist', result=-1) + return Result.IntResult(error=True, info='User not exist', result=-1) async_session = NBdb().get_async_session() async with async_session() as session: @@ -180,30 +181,30 @@ async def member_add(self, user: DBUser, user_group_nickname: str) -> DBResult: exist_user = session_result.scalar_one() exist_user.user_group_nickname = user_group_nickname exist_user.updated_at = datetime.now() - result = DBResult(error=False, info='Success upgraded', result=0) + result = Result.IntResult(error=False, info='Success upgraded', result=0) except NoResultFound: # 不存在关系则添加新成员 new_user = UserGroup(user_id=user_id_result.result, group_id=group_id_result.result, user_group_nickname=user_group_nickname, created_at=datetime.now()) session.add(new_user) - result = DBResult(error=False, info='Success added', result=0) + result = Result.IntResult(error=False, info='Success added', result=0) await session.commit() except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def member_del(self, user: DBUser) -> DBResult: + async def member_del(self, user: DBUser) -> Result.IntResult: group_id_result = await self.id() if group_id_result.error: - return DBResult(error=True, info='Group not exist', result=-1) + return Result.IntResult(error=True, info='Group not exist', result=-1) user_id_result = await user.id() if user_id_result.error: - return DBResult(error=True, info='User not exist', result=-1) + return Result.IntResult(error=True, info='User not exist', result=-1) async_session = NBdb().get_async_session() async with async_session() as session: @@ -217,22 +218,22 @@ async def member_del(self, user: DBUser) -> DBResult: exist_user = session_result.scalar_one() await session.delete(exist_user) await session.commit() - result = DBResult(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) except NoResultFound: await session.rollback() - result = DBResult(error=True, info='NoResultFound', result=-1) + result = Result.IntResult(error=True, info='NoResultFound', result=-1) except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def member_clear(self) -> DBResult: + async def member_clear(self) -> Result.IntResult: group_id_result = await self.id() if group_id_result.error: - return DBResult(error=True, info='Group not exist', result=-1) + return Result.IntResult(error=True, info='Group not exist', result=-1) async_session = NBdb().get_async_session() async with async_session() as session: @@ -244,13 +245,13 @@ async def member_clear(self) -> DBResult: for exist_user in session_result.scalars().all(): await session.delete(exist_user) await session.commit() - result = DBResult(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def permission_reset(self) -> DBResult: + async def permission_reset(self) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: try: @@ -263,20 +264,20 @@ async def permission_reset(self) -> DBResult: exist_group.command_permissions = 0 exist_group.permission_level = 0 exist_group.updated_at = datetime.now() - result = DBResult(error=False, info='Success upgraded', result=0) + result = Result.IntResult(error=False, info='Success upgraded', result=0) await session.commit() except NoResultFound: await session.rollback() - result = DBResult(error=True, info='NoResultFound', result=-1) + result = Result.IntResult(error=True, info='NoResultFound', result=-1) except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def permission_set(self, notice: int = 0, command: int = 0, level: int = 0) -> DBResult: + async def permission_set(self, notice: int = 0, command: int = 0, level: int = 0) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: try: @@ -289,20 +290,20 @@ async def permission_set(self, notice: int = 0, command: int = 0, level: int = 0 exist_group.command_permissions = command exist_group.permission_level = level exist_group.updated_at = datetime.now() - result = DBResult(error=False, info='Success upgraded', result=0) + result = Result.IntResult(error=False, info='Success upgraded', result=0) await session.commit() except NoResultFound: await session.rollback() - result = DBResult(error=True, info='NoResultFound', result=-1) + result = Result.IntResult(error=True, info='NoResultFound', result=-1) except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def permission_info(self) -> DBResult: + async def permission_info(self) -> Result.IntTupleResult: """ :return: Result: Tuple[Notice_permission, Command_permission, Permission_level] """ @@ -315,16 +316,16 @@ async def permission_info(self) -> DBResult: where(Group.group_id == self.group_id) ) notice, command, level = session_result.one() - result = DBResult(error=False, info='Success', result=(notice, command, level)) + result = Result.IntTupleResult(error=False, info='Success', result=(notice, command, level)) except NoResultFound: - result = DBResult(error=True, info='NoResultFound', result=(-1, -1, -1)) + result = Result.IntTupleResult(error=True, info='NoResultFound', result=(-1, -1, -1)) except MultipleResultsFound: - result = DBResult(error=True, info='MultipleResultsFound', result=(-1, -1, -1)) + result = Result.IntTupleResult(error=True, info='MultipleResultsFound', result=(-1, -1, -1)) except Exception as e: - result = DBResult(error=True, info=repr(e), result=(-1, -1, -1)) + result = Result.IntTupleResult(error=True, info=repr(e), result=(-1, -1, -1)) return result - async def permission_notice(self) -> DBResult: + async def permission_notice(self) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -333,12 +334,12 @@ async def permission_notice(self) -> DBResult: select(Group.notice_permissions).where(Group.group_id == self.group_id) ) res = session_result.scalar_one() - result = DBResult(error=False, info='Success', result=res) + result = Result.IntResult(error=False, info='Success', result=res) except Exception as e: - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def permission_command(self) -> DBResult: + async def permission_command(self) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -347,12 +348,12 @@ async def permission_command(self) -> DBResult: select(Group.command_permissions).where(Group.group_id == self.group_id) ) res = session_result.scalar_one() - result = DBResult(error=False, info='Success', result=res) + result = Result.IntResult(error=False, info='Success', result=res) except Exception as e: - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def permission_level(self) -> DBResult: + async def permission_level(self) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -361,15 +362,15 @@ async def permission_level(self) -> DBResult: select(Group.permission_level).where(Group.group_id == self.group_id) ) res = session_result.scalar_one() - result = DBResult(error=False, info='Success', result=res) + result = Result.IntResult(error=False, info='Success', result=res) except Exception as e: - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def idle_member_list(self) -> DBResult: + async def idle_member_list(self) -> Result.ListResult: group_id_result = await self.id() if group_id_result.error: - return DBResult(error=True, info='Group not exist', result=[]) + return Result.ListResult(error=True, info='Group not exist', result=[]) res = [] async_session = NBdb().get_async_session() @@ -400,19 +401,19 @@ async def idle_member_list(self) -> DBResult: else: user_skill_text = '暂无技能' res.append((nickname, user_skill_text)) - result = DBResult(error=False, info='Success', result=res) + result = Result.ListResult(error=False, info='Success', result=res) except Exception as e: - result = DBResult(error=True, info=repr(e), result=[]) + result = Result.ListResult(error=True, info=repr(e), result=[]) return result - async def idle_skill_list(self, skill: DBSkill) -> DBResult: + async def idle_skill_list(self, skill: DBSkill) -> Result.ListResult: group_id_result = await self.id() if group_id_result.error: - return DBResult(error=True, info='Group not exist', result=[]) + return Result.ListResult(error=True, info='Group not exist', result=[]) skill_id_result = await skill.id() if skill_id_result.error: - return DBResult(error=True, info='Skill not exist', result=[]) + return Result.ListResult(error=True, info='Skill not exist', result=[]) res = [] async_session = NBdb().get_async_session() @@ -437,15 +438,15 @@ async def idle_skill_list(self, skill: DBSkill) -> DBResult: # 如果空闲则把这个人昵称放进结果列表里面 if session_result.scalar_one() == 0: res.append(nickname) - result = DBResult(error=False, info='Success', result=res) + result = Result.ListResult(error=False, info='Success', result=res) except Exception as e: - result = DBResult(error=True, info=repr(e), result=[]) + result = Result.ListResult(error=True, info=repr(e), result=[]) return result - async def vocation_member_list(self) -> DBResult: + async def vocation_member_list(self) -> Result.ListResult: group_id_result = await self.id() if group_id_result.error: - return DBResult(error=True, info='Group not exist', result=[]) + return Result.ListResult(error=True, info='Group not exist', result=[]) async_session = NBdb().get_async_session() async with async_session() as session: @@ -461,27 +462,27 @@ async def vocation_member_list(self) -> DBResult: where(UserGroup.group_id == group_id_result.result) ) res = [(x[0], x[1]) for x in session_result.all()] - result = DBResult(error=False, info='Success', result=res) + result = Result.ListResult(error=False, info='Success', result=res) except Exception as e: - result = DBResult(error=True, info=repr(e), result=[]) + result = Result.ListResult(error=True, info=repr(e), result=[]) return result - async def init_member_status(self) -> DBResult: + async def init_member_status(self) -> Result.IntResult: member_list_res = await self.member_list() for user_qq, nickname in member_list_res.result: user = DBUser(user_id=user_qq) user_status_res = await user.status() if user_status_res.error: await user.status_set(status=0) - return DBResult(error=False, info='ignore', result=0) + return Result.IntResult(error=False, info='ignore', result=0) - async def subscription_list(self) -> DBResult: + async def subscription_list(self) -> Result.ListResult: """ :return: Result: List[Tuple[sub_type, sub_id, up_name]] """ group_id_result = await self.id() if group_id_result.error: - return DBResult(error=True, info='Group not exist', result=[]) + return Result.ListResult(error=True, info='Group not exist', result=[]) async_session = NBdb().get_async_session() async with async_session() as session: @@ -494,19 +495,19 @@ async def subscription_list(self) -> DBResult: where(GroupSub.group_id == group_id_result.result) ) res = [(x[0], x[1], x[2]) for x in session_result.all()] - result = DBResult(error=False, info='Success', result=res) + result = Result.ListResult(error=False, info='Success', result=res) except Exception as e: - result = DBResult(error=True, info=repr(e), result=[]) + result = Result.ListResult(error=True, info=repr(e), result=[]) return result - async def subscription_list_by_type(self, sub_type: int) -> DBResult: + async def subscription_list_by_type(self, sub_type: int) -> Result.ListResult: """ :param sub_type: 订阅类型 :return: Result: List[Tuple[sub_id, up_name]] """ group_id_result = await self.id() if group_id_result.error: - return DBResult(error=True, info='Group not exist', result=[]) + return Result.ListResult(error=True, info='Group not exist', result=[]) async_session = NBdb().get_async_session() async with async_session() as session: @@ -520,19 +521,19 @@ async def subscription_list_by_type(self, sub_type: int) -> DBResult: where(GroupSub.group_id == group_id_result.result) ) res = [(x[0], x[1]) for x in session_result.all()] - result = DBResult(error=False, info='Success', result=res) + result = Result.ListResult(error=False, info='Success', result=res) except Exception as e: - result = DBResult(error=True, info=repr(e), result=[]) + result = Result.ListResult(error=True, info=repr(e), result=[]) return result - async def subscription_add(self, sub: DBSubscription, group_sub_info: str = None) -> DBResult: + async def subscription_add(self, sub: DBSubscription, group_sub_info: str = None) -> Result.IntResult: group_id_result = await self.id() if group_id_result.error: - return DBResult(error=True, info='Group not exist', result=-1) + return Result.IntResult(error=True, info='Group not exist', result=-1) sub_id_result = await sub.id() if sub_id_result.error: - return DBResult(error=True, info='Subscription not exist', result=-1) + return Result.IntResult(error=True, info='Subscription not exist', result=-1) async_session = NBdb().get_async_session() async with async_session() as session: @@ -548,29 +549,29 @@ async def subscription_add(self, sub: DBSubscription, group_sub_info: str = None exist_subscription = session_result.scalar_one() exist_subscription.group_sub_info = group_sub_info exist_subscription.updated_at = datetime.now() - result = DBResult(error=False, info='Success upgraded', result=0) + result = Result.IntResult(error=False, info='Success upgraded', result=0) except NoResultFound: subscription = GroupSub(sub_id=sub_id_result.result, group_id=group_id_result.result, group_sub_info=group_sub_info, created_at=datetime.now()) session.add(subscription) - result = DBResult(error=False, info='Success added', result=0) + result = Result.IntResult(error=False, info='Success added', result=0) await session.commit() except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def subscription_del(self, sub: DBSubscription) -> DBResult: + async def subscription_del(self, sub: DBSubscription) -> Result.IntResult: group_id_result = await self.id() if group_id_result.error: - return DBResult(error=True, info='Group not exist', result=-1) + return Result.IntResult(error=True, info='Group not exist', result=-1) sub_id_result = await sub.id() if sub_id_result.error: - return DBResult(error=True, info='Subscription not exist', result=-1) + return Result.IntResult(error=True, info='Subscription not exist', result=-1) async_session = NBdb().get_async_session() async with async_session() as session: @@ -584,22 +585,22 @@ async def subscription_del(self, sub: DBSubscription) -> DBResult: exist_subscription = session_result.scalar_one() await session.delete(exist_subscription) await session.commit() - result = DBResult(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) except NoResultFound: await session.rollback() - result = DBResult(error=True, info='NoResultFound', result=-1) + result = Result.IntResult(error=True, info='NoResultFound', result=-1) except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def subscription_clear(self) -> DBResult: + async def subscription_clear(self) -> Result.IntResult: group_id_result = await self.id() if group_id_result.error: - return DBResult(error=True, info='Group not exist', result=-1) + return Result.IntResult(error=True, info='Group not exist', result=-1) async_session = NBdb().get_async_session() async with async_session() as session: @@ -611,16 +612,16 @@ async def subscription_clear(self) -> DBResult: for exist_group_sub in session_result.scalars().all(): await session.delete(exist_group_sub) await session.commit() - result = DBResult(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def subscription_clear_by_type(self, sub_type: int) -> DBResult: + async def subscription_clear_by_type(self, sub_type: int) -> Result.IntResult: group_id_result = await self.id() if group_id_result.error: - return DBResult(error=True, info='Group not exist', result=-1) + return Result.IntResult(error=True, info='Group not exist', result=-1) async_session = NBdb().get_async_session() async with async_session() as session: @@ -635,16 +636,16 @@ async def subscription_clear_by_type(self, sub_type: int) -> DBResult: for exist_group_sub in session_result.scalars().all(): await session.delete(exist_group_sub) await session.commit() - result = DBResult(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def mailbox_list(self) -> DBResult: + async def mailbox_list(self) -> Result.ListResult: group_id_result = await self.id() if group_id_result.error: - return DBResult(error=True, info='Group not exist', result=[]) + return Result.ListResult(error=True, info='Group not exist', result=[]) async_session = NBdb().get_async_session() async with async_session() as session: @@ -657,19 +658,19 @@ async def mailbox_list(self) -> DBResult: where(GroupEmailBox.group_id == group_id_result.result) ) res = [x for x in session_result.scalars().all()] - result = DBResult(error=False, info='Success', result=res) + result = Result.ListResult(error=False, info='Success', result=res) except Exception as e: - result = DBResult(error=True, info=repr(e), result=[]) + result = Result.ListResult(error=True, info=repr(e), result=[]) return result - async def mailbox_add(self, mailbox: DBEmailBox, mailbox_info: str = None) -> DBResult: + async def mailbox_add(self, mailbox: DBEmailBox, mailbox_info: str = None) -> Result.IntResult: group_id_result = await self.id() if group_id_result.error: - return DBResult(error=True, info='Group not exist', result=-1) + return Result.IntResult(error=True, info='Group not exist', result=-1) mailbox_id_result = await mailbox.id() if mailbox_id_result.error: - return DBResult(error=True, info='Mailbox not exist', result=-1) + return Result.IntResult(error=True, info='Mailbox not exist', result=-1) async_session = NBdb().get_async_session() async with async_session() as session: @@ -685,30 +686,30 @@ async def mailbox_add(self, mailbox: DBEmailBox, mailbox_info: str = None) -> DB exist_mailbox = session_result.scalar_one() exist_mailbox.box_info = mailbox_info exist_mailbox.updated_at = datetime.now() - result = DBResult(error=False, info='Success upgraded', result=0) + result = Result.IntResult(error=False, info='Success upgraded', result=0) except NoResultFound: new_mailbox = GroupEmailBox(email_box_id=mailbox_id_result.result, group_id=group_id_result.result, box_info=mailbox_info, created_at=datetime.now()) session.add(new_mailbox) - result = DBResult(error=False, info='Success added', result=0) + result = Result.IntResult(error=False, info='Success added', result=0) await session.commit() except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def mailbox_del(self, mailbox: DBEmailBox) -> DBResult: + async def mailbox_del(self, mailbox: DBEmailBox) -> Result.IntResult: group_id_result = await self.id() if group_id_result.error: - return DBResult(error=True, info='Group not exist', result=-1) + return Result.IntResult(error=True, info='Group not exist', result=-1) mailbox_id_result = await mailbox.id() if mailbox_id_result.error: - return DBResult(error=True, info='Mailbox not exist', result=-1) + return Result.IntResult(error=True, info='Mailbox not exist', result=-1) async_session = NBdb().get_async_session() async with async_session() as session: @@ -722,22 +723,22 @@ async def mailbox_del(self, mailbox: DBEmailBox) -> DBResult: exist_mailbox = session_result.scalar_one() await session.delete(exist_mailbox) await session.commit() - result = DBResult(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) except NoResultFound: await session.rollback() - result = DBResult(error=True, info='NoResultFound', result=-1) + result = Result.IntResult(error=True, info='NoResultFound', result=-1) except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def mailbox_clear(self) -> DBResult: + async def mailbox_clear(self) -> Result.IntResult: group_id_result = await self.id() if group_id_result.error: - return DBResult(error=True, info='Group not exist', result=-1) + return Result.IntResult(error=True, info='Group not exist', result=-1) async_session = NBdb().get_async_session() async with async_session() as session: @@ -749,8 +750,8 @@ async def mailbox_clear(self) -> DBResult: for exist_mailbox in session_result.scalars().all(): await session.delete(exist_mailbox) await session.commit() - result = DBResult(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result diff --git a/omega_miya/utils/Omega_Base/model/history.py b/omega_miya/utils/Omega_Base/model/history.py index 8ce403ab..23accb2c 100644 --- a/omega_miya/utils/Omega_Base/model/history.py +++ b/omega_miya/utils/Omega_Base/model/history.py @@ -1,4 +1,5 @@ -from omega_miya.utils.Omega_Base.database import NBdb, DBResult +from omega_miya.utils.Omega_Base.database import NBdb +from omega_miya.utils.Omega_Base.class_result import Result from omega_miya.utils.Omega_Base.tables import History from datetime import datetime @@ -12,7 +13,7 @@ def __init__(self, time: int, self_id: int, post_type: str, detail_type: str): async def add(self, sub_type: str = None, event_id: int = None, group_id: int = None, user_id: int = None, user_name: str = None, - raw_data: str = None, msg_data: str = None) -> DBResult: + raw_data: str = None, msg_data: str = None) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: try: @@ -22,9 +23,9 @@ async def add(self, sub_type: str = None, event_id: int = None, group_id: int = event_id=event_id, group_id=group_id, user_id=user_id, user_name=user_name, raw_data=raw_data, msg_data=msg_data, created_at=datetime.now()) session.add(new_event) - result = DBResult(error=False, info='Success added', result=0) + result = Result.IntResult(error=False, info='Success added', result=0) await session.commit() except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result diff --git a/omega_miya/utils/Omega_Base/model/mail.py b/omega_miya/utils/Omega_Base/model/mail.py index ac29151c..0d150085 100644 --- a/omega_miya/utils/Omega_Base/model/mail.py +++ b/omega_miya/utils/Omega_Base/model/mail.py @@ -1,4 +1,5 @@ -from omega_miya.utils.Omega_Base.database import NBdb, DBResult +from omega_miya.utils.Omega_Base.database import NBdb +from omega_miya.utils.Omega_Base.class_result import Result from omega_miya.utils.Omega_Base.tables import Email, EmailBox, GroupEmailBox from datetime import datetime from sqlalchemy.future import select @@ -9,7 +10,7 @@ class DBEmailBox(object): def __init__(self, address: str): self.address = address - async def id(self) -> DBResult: + async def id(self) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -19,13 +20,13 @@ async def id(self) -> DBResult: where(EmailBox.address == self.address) ) email_box_table_id = session_result.scalar_one() - result = DBResult(error=False, info='Success', result=email_box_table_id) + result = Result.IntResult(error=False, info='Success', result=email_box_table_id) except NoResultFound: - result = DBResult(error=True, info='NoResultFound', result=-1) + result = Result.IntResult(error=True, info='NoResultFound', result=-1) except MultipleResultsFound: - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result async def exist(self) -> bool: @@ -33,7 +34,7 @@ async def exist(self) -> bool: return result.success() @classmethod - async def list(cls) -> DBResult: + async def list(cls) -> Result.ListResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -42,12 +43,12 @@ async def list(cls) -> DBResult: select(EmailBox.address).order_by(EmailBox.id) ) res = [x for x in session_result.scalars().all()] - result = DBResult(error=False, info='Success', result=res) + result = Result.ListResult(error=False, info='Success', result=res) except Exception as e: - result = DBResult(error=True, info=repr(e), result=[]) + result = Result.ListResult(error=True, info=repr(e), result=[]) return result - async def get_info(self) -> DBResult: + async def get_info(self) -> Result.DictResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -61,16 +62,16 @@ async def get_info(self) -> DBResult: port = exist_box.port password = exist_box.password res_dict = {'server_host': server_host, 'port': port, 'password': password} - result = DBResult(error=False, info='Success', result=res_dict) + result = Result.DictResult(error=False, info='Success', result=res_dict) except NoResultFound: - result = DBResult(error=True, info='NoResultFound', result={}) + result = Result.DictResult(error=True, info='NoResultFound', result={}) except MultipleResultsFound: - result = DBResult(error=True, info='MultipleResultsFound', result={}) + result = Result.DictResult(error=True, info='MultipleResultsFound', result={}) except Exception as e: - result = DBResult(error=True, info=repr(e), result={}) + result = Result.DictResult(error=True, info=repr(e), result={}) return result - async def add(self, server_host: str, password: str, port: int = 993) -> DBResult: + async def add(self, server_host: str, password: str, port: int = 993) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: try: @@ -86,25 +87,25 @@ async def add(self, server_host: str, password: str, port: int = 993) -> DBResul exist_box.port = port exist_box.password = password exist_box.updated_at = datetime.now() - result = DBResult(error=False, info='Success upgraded', result=0) + result = Result.IntResult(error=False, info='Success upgraded', result=0) except NoResultFound: new_box = EmailBox(address=self.address, server_host=server_host, password=password, port=port, created_at=datetime.now()) session.add(new_box) - result = DBResult(error=False, info='Success added', result=0) + result = Result.IntResult(error=False, info='Success added', result=0) await session.commit() except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def delete(self) -> DBResult: + async def delete(self) -> Result.IntResult: id_result = await self.id() if id_result.error: - return DBResult(error=True, info='EmailBox not exist', result=-1) + return Result.IntResult(error=True, info='EmailBox not exist', result=-1) # 清空持已绑定这个邮箱的群组 await self.mailbox_group_clear() @@ -120,22 +121,22 @@ async def delete(self) -> DBResult: exist_box = session_result.scalar_one() await session.delete(exist_box) await session.commit() - result = DBResult(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) except NoResultFound: await session.rollback() - result = DBResult(error=True, info='NoResultFound', result=-1) + result = Result.IntResult(error=True, info='NoResultFound', result=-1) except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def mailbox_group_clear(self) -> DBResult: + async def mailbox_group_clear(self) -> Result.IntResult: id_result = await self.id() if id_result.error: - return DBResult(error=True, info='EmailBox not exist', result=-1) + return Result.IntResult(error=True, info='EmailBox not exist', result=-1) async_session = NBdb().get_async_session() async with async_session() as session: @@ -147,10 +148,10 @@ async def mailbox_group_clear(self) -> DBResult: for exist_group_mailbox in session_result.scalars().all(): await session.delete(exist_group_mailbox) await session.commit() - result = DBResult(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result @@ -158,7 +159,9 @@ class DBEmail(object): def __init__(self, mail_hash: str): self.mail_hash = mail_hash - async def add(self, date: str, header: str, sender: str, to: str, body: str = None, html: str = None) -> DBResult: + async def add( + self, date: str, header: str, sender: str, to: str, body: str = None, html: str = None + ) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: try: @@ -167,8 +170,8 @@ async def add(self, date: str, header: str, sender: str, to: str, body: str = No body=body, html=html, created_at=datetime.now()) session.add(new_email) await session.commit() - result = DBResult(error=False, info='Success added', result=0) + result = Result.IntResult(error=False, info='Success added', result=0) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result diff --git a/omega_miya/utils/Omega_Base/model/pixivillust.py b/omega_miya/utils/Omega_Base/model/pixivillust.py index 36b02b8d..4afd3546 100644 --- a/omega_miya/utils/Omega_Base/model/pixivillust.py +++ b/omega_miya/utils/Omega_Base/model/pixivillust.py @@ -1,5 +1,6 @@ from typing import List -from omega_miya.utils.Omega_Base.database import NBdb, DBResult +from omega_miya.utils.Omega_Base.database import NBdb +from omega_miya.utils.Omega_Base.class_result import Result from omega_miya.utils.Omega_Base.tables import Pixiv, PixivT2I from .pixivtag import DBPixivtag from datetime import datetime @@ -13,7 +14,7 @@ class DBPixivillust(object): def __init__(self, pid: int): self.pid = pid - async def id(self) -> DBResult: + async def id(self) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -22,20 +23,20 @@ async def id(self) -> DBResult: select(Pixiv.id).where(Pixiv.pid == self.pid) ) pixiv_table_id = session_result.scalar_one() - result = DBResult(error=False, info='Success', result=pixiv_table_id) + result = Result.IntResult(error=False, info='Success', result=pixiv_table_id) except NoResultFound: - result = DBResult(error=True, info='NoResultFound', result=-1) + result = Result.IntResult(error=True, info='NoResultFound', result=-1) except MultipleResultsFound: - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result async def exist(self) -> bool: result = await self.id() return result.success() - async def add(self, uid: int, title: str, uname: str, nsfw_tag: int, tags: List[str], url: str) -> DBResult: + async def add(self, uid: int, title: str, uname: str, nsfw_tag: int, tags: List[str], url: str) -> Result.IntResult: # 将tag写入pixiv_tag表 for tag in tags: _tag = DBPixivtag(tagname=tag) @@ -59,13 +60,13 @@ async def add(self, uid: int, title: str, uname: str, nsfw_tag: int, tags: List[ exist_illust.nsfw_tag = nsfw_tag exist_illust.tags = tag_text exist_illust.updated_at = datetime.now() - result = DBResult(error=False, info='Exist illust updated', result=0) + result = Result.IntResult(error=False, info='Exist illust updated', result=0) except NoResultFound: new_illust = Pixiv(pid=self.pid, uid=uid, title=title, uname=uname, url=url, nsfw_tag=nsfw_tag, tags=tag_text, created_at=datetime.now()) session.add(new_illust) need_upgrade_pixivt2i = True - result = DBResult(error=False, info='Success added', result=0) + result = Result.IntResult(error=False, info='Success added', result=0) await session.commit() # 写入tag_pixiv关联表 @@ -88,17 +89,17 @@ async def add(self, uid: int, title: str, uname: str, nsfw_tag: int, tags: List[ except Exception as e: continue await session.commit() - result = DBResult(error=False, info='Success added with tags', result=0) + result = Result.IntResult(error=False, info='Success added with tags', result=0) except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result @classmethod - async def rand_illust(cls, num: int, nsfw_tag: int) -> DBResult: + async def rand_illust(cls, num: int, nsfw_tag: int) -> Result.ListResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -109,13 +110,13 @@ async def rand_illust(cls, num: int, nsfw_tag: int) -> DBResult: order_by(func.random()).limit(num) ) res = [x for x in session_result.scalars().all()] - result = DBResult(error=False, info='Success', result=res) + result = Result.ListResult(error=False, info='Success', result=res) except Exception as e: - result = DBResult(error=True, info=repr(e), result=[]) + result = Result.ListResult(error=True, info=repr(e), result=[]) return result @classmethod - async def status(cls) -> DBResult: + async def status(cls) -> Result.DictResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -130,13 +131,14 @@ async def status(cls) -> DBResult: r18_count = session_result.scalar() res = {'total': int(all_count), 'moe': int(moe_count), 'setu': int(setu_count), 'r18': int(r18_count)} - result = DBResult(error=False, info='Success', result=res) + result = Result.DictResult(error=False, info='Success', result=res) except Exception as e: - result = DBResult(error=True, info=repr(e), result={}) + result = Result.DictResult(error=True, info=repr(e), result={}) return result @classmethod - async def list_illust(cls, keywords: List[str], num: int, nsfw_tag: int, acc_mode: bool = False) -> DBResult: + async def list_illust( + cls, keywords: List[str], num: int, nsfw_tag: int, acc_mode: bool = False) -> Result.ListResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -167,7 +169,7 @@ async def list_illust(cls, keywords: List[str], num: int, nsfw_tag: int, acc_mod session_result = await session.execute(query) res = [x for x in session_result.scalars().all()] - result = DBResult(error=False, info='Success', result=res) + result = Result.ListResult(error=False, info='Success', result=res) except Exception as e: - result = DBResult(error=True, info=repr(e), result=[]) + result = Result.ListResult(error=True, info=repr(e), result=[]) return result diff --git a/omega_miya/utils/Omega_Base/model/pixivision.py b/omega_miya/utils/Omega_Base/model/pixivision.py index f4584637..72e7dcad 100644 --- a/omega_miya/utils/Omega_Base/model/pixivision.py +++ b/omega_miya/utils/Omega_Base/model/pixivision.py @@ -1,4 +1,5 @@ -from omega_miya.utils.Omega_Base.database import NBdb, DBResult +from omega_miya.utils.Omega_Base.database import NBdb +from omega_miya.utils.Omega_Base.class_result import Result from omega_miya.utils.Omega_Base.tables import Pixivision from datetime import datetime from sqlalchemy.future import select @@ -9,7 +10,7 @@ class DBPixivision(object): def __init__(self, aid: int): self.aid = aid - async def id(self) -> DBResult: + async def id(self) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -18,20 +19,20 @@ async def id(self) -> DBResult: select(Pixivision.id).where(Pixivision.aid == self.aid) ) pixivision_table_id = session_result.scalar_one() - result = DBResult(error=False, info='Success', result=pixivision_table_id) + result = Result.IntResult(error=False, info='Success', result=pixivision_table_id) except NoResultFound: - result = DBResult(error=True, info='NoResultFound', result=-1) + result = Result.IntResult(error=True, info='NoResultFound', result=-1) except MultipleResultsFound: - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result async def exist(self) -> bool: result = await self.id() return result.success() - async def add(self, title: str, description: str, tags: str, illust_id: str, url: str) -> DBResult: + async def add(self, title: str, description: str, tags: str, illust_id: str, url: str) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: try: @@ -48,17 +49,17 @@ async def add(self, title: str, description: str, tags: str, illust_id: str, url exist_pixivision.illust_id = illust_id exist_pixivision.url = url exist_pixivision.updated_at = datetime.now() - result = DBResult(error=False, info='Success upgrade', result=0) + result = Result.IntResult(error=False, info='Success upgrade', result=0) except NoResultFound: new_pixivision = Pixivision(aid=self.aid, title=title, description=description, tags=tags, illust_id=illust_id, url=url, created_at=datetime.now()) session.add(new_pixivision) - result = DBResult(error=False, info='Success added', result=0) + result = Result.IntResult(error=False, info='Success added', result=0) await session.commit() except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result diff --git a/omega_miya/utils/Omega_Base/model/pixivtag.py b/omega_miya/utils/Omega_Base/model/pixivtag.py index b7a34f30..ed045840 100644 --- a/omega_miya/utils/Omega_Base/model/pixivtag.py +++ b/omega_miya/utils/Omega_Base/model/pixivtag.py @@ -1,4 +1,5 @@ -from omega_miya.utils.Omega_Base.database import NBdb, DBResult +from omega_miya.utils.Omega_Base.database import NBdb +from omega_miya.utils.Omega_Base.class_result import Result from omega_miya.utils.Omega_Base.tables import PixivTag, Pixiv, PixivT2I from datetime import datetime from sqlalchemy.future import select @@ -9,7 +10,7 @@ class DBPixivtag(object): def __init__(self, tagname: str): self.tagname = tagname - async def id(self) -> DBResult: + async def id(self) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -18,20 +19,20 @@ async def id(self) -> DBResult: select(PixivTag.id).where(PixivTag.tagname == self.tagname) ) pixivtag_table_id = session_result.scalar_one() - result = DBResult(error=False, info='Success', result=pixivtag_table_id) + result = Result.IntResult(error=False, info='Success', result=pixivtag_table_id) except NoResultFound: - result = DBResult(error=True, info='NoResultFound', result=-1) + result = Result.IntResult(error=True, info='NoResultFound', result=-1) except MultipleResultsFound: - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result async def exist(self) -> bool: result = await self.id() return result.success() - async def add(self) -> DBResult: + async def add(self) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: try: @@ -41,21 +42,21 @@ async def add(self) -> DBResult: select(PixivTag).where(PixivTag.tagname == self.tagname) ) exist_pixivtag = session_result.scalar_one() - result = DBResult(error=False, info='pixivtag exist', result=0) + result = Result.IntResult(error=False, info='pixivtag exist', result=0) except NoResultFound: new_tag = PixivTag(tagname=self.tagname, created_at=datetime.now()) session.add(new_tag) - result = DBResult(error=False, info='Success added', result=0) + result = Result.IntResult(error=False, info='Success added', result=0) await session.commit() except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def list_illust(self, nsfw_tag: int) -> DBResult: + async def list_illust(self, nsfw_tag: int) -> Result.ListResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -68,7 +69,7 @@ async def list_illust(self, nsfw_tag: int) -> DBResult: where(PixivTag.tagname.ilike(f'%{self.tagname}%')) ) tag_pid_list = [x for x in session_result.scalars().all()] - result = DBResult(error=False, info='Success', result=tag_pid_list) + result = Result.ListResult(error=False, info='Success', result=tag_pid_list) except Exception as e: - result = DBResult(error=True, info=repr(e), result=[]) + result = Result.ListResult(error=True, info=repr(e), result=[]) return result diff --git a/omega_miya/utils/Omega_Base/model/skill.py b/omega_miya/utils/Omega_Base/model/skill.py index f23366ac..80dd45ad 100644 --- a/omega_miya/utils/Omega_Base/model/skill.py +++ b/omega_miya/utils/Omega_Base/model/skill.py @@ -1,4 +1,5 @@ -from omega_miya.utils.Omega_Base.database import NBdb, DBResult +from omega_miya.utils.Omega_Base.database import NBdb +from omega_miya.utils.Omega_Base.class_result import Result from omega_miya.utils.Omega_Base.tables import Skill, User, UserSkill from datetime import datetime from sqlalchemy.future import select @@ -9,7 +10,7 @@ class DBSkill(object): def __init__(self, name: str): self.name = name - async def id(self) -> DBResult: + async def id(self) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -18,20 +19,20 @@ async def id(self) -> DBResult: select(Skill.id).where(Skill.name == self.name) ) skill_table_id = session_result.scalar_one() - result = DBResult(error=False, info='Success', result=skill_table_id) + result = Result.IntResult(error=False, info='Success', result=skill_table_id) except NoResultFound: - result = DBResult(error=True, info='NoResultFound', result=-1) + result = Result.IntResult(error=True, info='NoResultFound', result=-1) except MultipleResultsFound: - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result async def exist(self) -> bool: result = await self.id() return result.success() - async def add(self, description: str) -> DBResult: + async def add(self, description: str) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: try: @@ -43,24 +44,24 @@ async def add(self, description: str) -> DBResult: exist_skill = session_result.scalar_one() exist_skill.description = description exist_skill.updated_at = datetime.now() - result = DBResult(error=False, info='Success upgraded', result=0) + result = Result.IntResult(error=False, info='Success upgraded', result=0) except NoResultFound: new_skill = Skill(name=self.name, description=description, created_at=datetime.now()) session.add(new_skill) - result = DBResult(error=False, info='Success added', result=0) + result = Result.IntResult(error=False, info='Success added', result=0) await session.commit() except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def delete(self) -> DBResult: + async def delete(self) -> Result.IntResult: id_result = await self.id() if id_result.error: - return DBResult(error=True, info='Skill not exist', result=-1) + return Result.IntResult(error=True, info='Skill not exist', result=-1) # 清空持有这个技能人的技能 await self.able_member_clear() @@ -75,22 +76,22 @@ async def delete(self) -> DBResult: exist_skill = session_result.scalar_one() await session.delete(exist_skill) await session.commit() - result = DBResult(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) except NoResultFound: await session.rollback() - result = DBResult(error=True, info='NoResultFound', result=-1) + result = Result.IntResult(error=True, info='NoResultFound', result=-1) except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def able_member_list(self) -> DBResult: + async def able_member_list(self) -> Result.ListResult: id_result = await self.id() if id_result.error: - return DBResult(error=True, info='Skill not exist', result=[]) + return Result.ListResult(error=True, info='Skill not exist', result=[]) async_session = NBdb().get_async_session() async with async_session() as session: @@ -102,15 +103,15 @@ async def able_member_list(self) -> DBResult: where(UserSkill.skill_id == id_result.result) ) res = [x for x in session_result.scalars().all()] - result = DBResult(error=False, info='Success', result=res) + result = Result.ListResult(error=False, info='Success', result=res) except Exception as e: - result = DBResult(error=True, info=repr(e), result=[]) + result = Result.ListResult(error=True, info=repr(e), result=[]) return result - async def able_member_clear(self) -> DBResult: + async def able_member_clear(self) -> Result.IntResult: id_result = await self.id() if id_result.error: - return DBResult(error=True, info='Skill not exist', result=-1) + return Result.IntResult(error=True, info='Skill not exist', result=-1) async_session = NBdb().get_async_session() async with async_session() as session: @@ -123,8 +124,8 @@ async def able_member_clear(self) -> DBResult: for exist_user_skill in session_result.scalars().all(): await session.delete(exist_user_skill) await session.commit() - result = DBResult(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result diff --git a/omega_miya/utils/Omega_Base/model/status.py b/omega_miya/utils/Omega_Base/model/status.py index 72bb69e1..26567948 100644 --- a/omega_miya/utils/Omega_Base/model/status.py +++ b/omega_miya/utils/Omega_Base/model/status.py @@ -1,4 +1,5 @@ -from omega_miya.utils.Omega_Base.database import NBdb, DBResult +from omega_miya.utils.Omega_Base.database import NBdb +from omega_miya.utils.Omega_Base.class_result import Result from omega_miya.utils.Omega_Base.tables import OmegaStatus from datetime import datetime from sqlalchemy.future import select @@ -9,7 +10,7 @@ class DBStatus(object): def __init__(self, name: str): self.name = name - async def get_status(self): + async def get_status(self) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -18,16 +19,16 @@ async def get_status(self): select(OmegaStatus.status).where(OmegaStatus.name == self.name) ) status = session_result.scalar_one() - result = DBResult(error=False, info='Success', result=status) + result = Result.IntResult(error=False, info='Success', result=status) except NoResultFound: - result = DBResult(error=True, info='NoResultFound', result=-1) + result = Result.IntResult(error=True, info='NoResultFound', result=-1) except MultipleResultsFound: - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def set_status(self, status: int, info: str = None) -> DBResult: + async def set_status(self, status: int, info: str = None) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: try: @@ -41,17 +42,17 @@ async def set_status(self, status: int, info: str = None) -> DBResult: exist_status.status = status exist_status.info = info exist_status.updated_at = datetime.now() - result = DBResult(error=False, info='Success upgraded', result=0) + result = Result.IntResult(error=False, info='Success upgraded', result=0) except NoResultFound: # 不存在则添加信息 new_status = OmegaStatus(name=self.name, status=status, info=info, created_at=datetime.now()) session.add(new_status) - result = DBResult(error=False, info='Success set', result=0) + result = Result.IntResult(error=False, info='Success set', result=0) await session.commit() except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result diff --git a/omega_miya/utils/Omega_Base/model/subscription.py b/omega_miya/utils/Omega_Base/model/subscription.py index 919c4dbb..35ba3bdf 100644 --- a/omega_miya/utils/Omega_Base/model/subscription.py +++ b/omega_miya/utils/Omega_Base/model/subscription.py @@ -1,4 +1,5 @@ -from omega_miya.utils.Omega_Base.database import NBdb, DBResult +from omega_miya.utils.Omega_Base.database import NBdb +from omega_miya.utils.Omega_Base.class_result import Result from omega_miya.utils.Omega_Base.tables import Subscription, Group, GroupSub from datetime import datetime from sqlalchemy.future import select @@ -10,7 +11,7 @@ def __init__(self, sub_type: int, sub_id: int): self.sub_type = sub_type self.sub_id = sub_id - async def id(self) -> DBResult: + async def id(self) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -21,20 +22,20 @@ async def id(self) -> DBResult: where(Subscription.sub_id == self.sub_id) ) subscription_table_id = session_result.scalar_one() - result = DBResult(error=False, info='Success', result=subscription_table_id) + result = Result.IntResult(error=False, info='Success', result=subscription_table_id) except NoResultFound: - result = DBResult(error=True, info='NoResultFound', result=-1) + result = Result.IntResult(error=True, info='NoResultFound', result=-1) except MultipleResultsFound: - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result async def exist(self) -> bool: result = await self.id() return result.success() - async def add(self, up_name: str, live_info: str = None) -> DBResult: + async def add(self, up_name: str, live_info: str = None) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: try: @@ -49,25 +50,25 @@ async def add(self, up_name: str, live_info: str = None) -> DBResult: exist_subscription.up_name = up_name exist_subscription.live_info = live_info exist_subscription.updated_at = datetime.now() - result = DBResult(error=False, info='Success upgraded', result=0) + result = Result.IntResult(error=False, info='Success upgraded', result=0) except NoResultFound: new_subscription = Subscription(sub_type=self.sub_type, sub_id=self.sub_id, up_name=up_name, live_info=live_info, created_at=datetime.now()) session.add(new_subscription) - result = DBResult(error=False, info='Success added', result=0) + result = Result.IntResult(error=False, info='Success added', result=0) await session.commit() except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def delete(self) -> DBResult: + async def delete(self) -> Result.IntResult: id_result = await self.id() if id_result.error: - return DBResult(error=True, info='Subscription not exist', result=-1) + return Result.IntResult(error=True, info='Subscription not exist', result=-1) # 清空持已订阅这个sub的群组 await self.sub_group_clear() @@ -84,22 +85,22 @@ async def delete(self) -> DBResult: exist_subscription = session_result.scalar_one() await session.delete(exist_subscription) await session.commit() - result = DBResult(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) except NoResultFound: await session.rollback() - result = DBResult(error=True, info='NoResultFound', result=-1) + result = Result.IntResult(error=True, info='NoResultFound', result=-1) except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def sub_group_list(self) -> DBResult: + async def sub_group_list(self) -> Result.ListResult: id_result = await self.id() if id_result.error: - return DBResult(error=True, info='Subscription not exist', result=[]) + return Result.ListResult(error=True, info='Subscription not exist', result=[]) async_session = NBdb().get_async_session() async with async_session() as session: @@ -111,15 +112,15 @@ async def sub_group_list(self) -> DBResult: where(GroupSub.sub_id == id_result.result) ) res = [x for x in session_result.scalars().all()] - result = DBResult(error=False, info='Success', result=res) + result = Result.ListResult(error=False, info='Success', result=res) except Exception as e: - result = DBResult(error=True, info=repr(e), result=[]) + result = Result.ListResult(error=True, info=repr(e), result=[]) return result - async def sub_group_clear(self) -> DBResult: + async def sub_group_clear(self) -> Result.IntResult: id_result = await self.id() if id_result.error: - return DBResult(error=True, info='Subscription not exist', result=-1) + return Result.IntResult(error=True, info='Subscription not exist', result=-1) async_session = NBdb().get_async_session() async with async_session() as session: @@ -131,8 +132,8 @@ async def sub_group_clear(self) -> DBResult: for exist_group_sub in session_result.scalars().all(): await session.delete(exist_group_sub) await session.commit() - result = DBResult(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result diff --git a/omega_miya/utils/Omega_Base/model/user.py b/omega_miya/utils/Omega_Base/model/user.py index 99eaa725..d27f60e5 100644 --- a/omega_miya/utils/Omega_Base/model/user.py +++ b/omega_miya/utils/Omega_Base/model/user.py @@ -1,4 +1,5 @@ -from omega_miya.utils.Omega_Base.database import NBdb, DBResult +from omega_miya.utils.Omega_Base.database import NBdb +from omega_miya.utils.Omega_Base.class_result import Result from omega_miya.utils.Omega_Base.tables import User, UserGroup, Skill, UserSkill, Vocation, AuthUser from .skill import DBSkill from datetime import datetime @@ -10,7 +11,7 @@ class DBUser(object): def __init__(self, user_id: int): self.qq = user_id - async def id(self) -> DBResult: + async def id(self) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -19,20 +20,20 @@ async def id(self) -> DBResult: select(User.id).where(User.qq == self.qq) ) user_table_id = session_result.scalar_one() - result = DBResult(error=False, info='Success', result=user_table_id) + result = Result.IntResult(error=False, info='Success', result=user_table_id) except NoResultFound: - result = DBResult(error=True, info='NoResultFound', result=-1) + result = Result.IntResult(error=True, info='NoResultFound', result=-1) except MultipleResultsFound: - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result async def exist(self) -> bool: result = await self.id() return result.success() - async def nickname(self) -> DBResult: + async def nickname(self) -> Result.TextResult: async_session = NBdb().get_async_session() async with async_session() as session: async with session.begin(): @@ -41,16 +42,16 @@ async def nickname(self) -> DBResult: select(User.nickname).where(User.qq == self.qq) ) user_nickname = session_result.scalar_one() - result = DBResult(error=False, info='Success', result=user_nickname) + result = Result.TextResult(error=False, info='Success', result=user_nickname) except NoResultFound: - result = DBResult(error=True, info='NoResultFound', result='') + result = Result.TextResult(error=True, info='NoResultFound', result='') except MultipleResultsFound: - result = DBResult(error=True, info='MultipleResultsFound', result='') + result = Result.TextResult(error=True, info='MultipleResultsFound', result='') except Exception as e: - result = DBResult(error=True, info=repr(e), result='') + result = Result.TextResult(error=True, info=repr(e), result='') return result - async def add(self, nickname: str, is_friend: int = 0, aliasname: str = None) -> DBResult: + async def add(self, nickname: str, is_friend: int = 0, aliasname: str = None) -> Result.IntResult: async_session = NBdb().get_async_session() async with async_session() as session: try: @@ -62,32 +63,32 @@ async def add(self, nickname: str, is_friend: int = 0, aliasname: str = None) -> ) exist_user = session_result.scalar_one() if exist_user.nickname == nickname: - result = DBResult(error=False, info='Nickname not change', result=0) + result = Result.IntResult(error=False, info='Nickname not change', result=0) else: exist_user.nickname = nickname exist_user.is_friend = is_friend exist_user.aliasname = aliasname exist_user.updated_at = datetime.now() - result = DBResult(error=False, info='Success upgraded', result=0) + result = Result.IntResult(error=False, info='Success upgraded', result=0) except NoResultFound: # 不存在则成员表中添加新成员 new_user = User(qq=self.qq, nickname=nickname, is_friend=is_friend, aliasname=aliasname, created_at=datetime.now()) session.add(new_user) - result = DBResult(error=False, info='Success added', result=0) + result = Result.IntResult(error=False, info='Success added', result=0) await session.commit() except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def delete(self) -> DBResult: + async def delete(self) -> Result.IntResult: id_result = await self.id() if id_result.error: - return DBResult(error=True, info='User not exist', result=-1) + return Result.IntResult(error=True, info='User not exist', result=-1) async_session = NBdb().get_async_session() async with async_session() as session: @@ -128,22 +129,22 @@ async def delete(self) -> DBResult: exist_user = session_result.scalar_one() await session.delete(exist_user) await session.commit() - result = DBResult(error=False, info='Success Delete', result=0) + result = Result.IntResult(error=False, info='Success Delete', result=0) except NoResultFound: await session.rollback() - result = DBResult(error=True, info='NoResultFound', result=-1) + result = Result.IntResult(error=True, info='NoResultFound', result=-1) except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def skill_list(self) -> DBResult: + async def skill_list(self) -> Result.ListResult: id_result = await self.id() if id_result.error: - return DBResult(error=True, info='User not exist', result=[]) + return Result.ListResult(error=True, info='User not exist', result=[]) async_session = NBdb().get_async_session() async with async_session() as session: @@ -156,19 +157,19 @@ async def skill_list(self) -> DBResult: where(UserSkill.user_id == id_result.result) ) res = [(x[0], x[1]) for x in session_result.all()] - result = DBResult(error=False, info='Success', result=res) + result = Result.ListResult(error=False, info='Success', result=res) except Exception as e: - result = DBResult(error=True, info=repr(e), result=[]) + result = Result.ListResult(error=True, info=repr(e), result=[]) return result - async def skill_add(self, skill: DBSkill, skill_level: int) -> DBResult: + async def skill_add(self, skill: DBSkill, skill_level: int) -> Result.IntResult: user_id_result = await self.id() if user_id_result.error: - return DBResult(error=True, info='User not exist', result=-1) + return Result.IntResult(error=True, info='User not exist', result=-1) skill_id_result = await skill.id() if skill_id_result.error: - return DBResult(error=True, info='Skill not exist', result=-1) + return Result.IntResult(error=True, info='Skill not exist', result=-1) async_session = NBdb().get_async_session() async with async_session() as session: @@ -185,29 +186,29 @@ async def skill_add(self, skill: DBSkill, skill_level: int) -> DBResult: exist_skill = session_result.scalar_one() exist_skill.skill_level = skill_level exist_skill.updated_at = datetime.now() - result = DBResult(error=False, info='Success upgraded', result=0) + result = Result.IntResult(error=False, info='Success upgraded', result=0) except NoResultFound: new_skill = UserSkill(user_id=user_id_result.result, skill_id=skill_id_result.result, skill_level=skill_level, created_at=datetime.now()) session.add(new_skill) - result = DBResult(error=False, info='Success added', result=0) + result = Result.IntResult(error=False, info='Success added', result=0) await session.commit() except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def skill_del(self, skill: DBSkill) -> DBResult: + async def skill_del(self, skill: DBSkill) -> Result.IntResult: user_id_result = await self.id() if user_id_result.error: - return DBResult(error=True, info='User not exist', result=-1) + return Result.IntResult(error=True, info='User not exist', result=-1) skill_id_result = await skill.id() if skill_id_result.error: - return DBResult(error=True, info='Skill not exist', result=-1) + return Result.IntResult(error=True, info='Skill not exist', result=-1) async_session = NBdb().get_async_session() async with async_session() as session: @@ -221,22 +222,22 @@ async def skill_del(self, skill: DBSkill) -> DBResult: exist_skill = session_result.scalar_one() await session.delete(exist_skill) await session.commit() - result = DBResult(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) except NoResultFound: await session.rollback() - result = DBResult(error=True, info='NoResultFound', result=-1) + result = Result.IntResult(error=True, info='NoResultFound', result=-1) except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def skill_clear(self) -> DBResult: + async def skill_clear(self) -> Result.IntResult: user_id_result = await self.id() if user_id_result.error: - return DBResult(error=True, info='User not exist', result=-1) + return Result.IntResult(error=True, info='User not exist', result=-1) async_session = NBdb().get_async_session() async with async_session() as session: @@ -248,16 +249,16 @@ async def skill_clear(self) -> DBResult: for exist_skill in session_result.scalars().all(): await session.delete(exist_skill) await session.commit() - result = DBResult(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def status(self) -> DBResult: + async def status(self) -> Result.IntResult: user_id_result = await self.id() if user_id_result.error: - return DBResult(error=True, info='User not exist', result=-1) + return Result.IntResult(error=True, info='User not exist', result=-1) async_session = NBdb().get_async_session() async with async_session() as session: @@ -267,15 +268,15 @@ async def status(self) -> DBResult: select(Vocation.status).where(Vocation.user_id == user_id_result.result) ) res = session_result.scalar_one() - result = DBResult(error=False, info='Success', result=res) + result = Result.IntResult(error=False, info='Success', result=res) except Exception as e: - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def vocation_status(self) -> DBResult: + async def vocation_status(self) -> Result.ListResult: user_id_result = await self.id() if user_id_result.error: - return DBResult(error=True, info='User not exist', result=[-1, None]) + return Result.ListResult(error=True, info='User not exist', result=[-1, None]) async_session = NBdb().get_async_session() async with async_session() as session: @@ -286,15 +287,15 @@ async def vocation_status(self) -> DBResult: where(Vocation.user_id == user_id_result.result) ) res = session_result.one() - result = DBResult(error=False, info='Success', result=[res[0], res[1]]) + result = Result.ListResult(error=False, info='Success', result=[res[0], res[1]]) except Exception as e: - result = DBResult(error=True, info=repr(e), result=[-1, None]) + result = Result.ListResult(error=True, info=repr(e), result=[-1, None]) return result - async def status_set(self, status: int) -> DBResult: + async def status_set(self, status: int) -> Result.IntResult: user_id_result = await self.id() if user_id_result.error: - return DBResult(error=True, info='User not exist', result=-1) + return Result.IntResult(error=True, info='User not exist', result=-1) async_session = NBdb().get_async_session() async with async_session() as session: @@ -309,24 +310,24 @@ async def status_set(self, status: int) -> DBResult: exist_status.stop_at = None exist_status.reason = None exist_status.updated_at = datetime.now() - result = DBResult(error=False, info='Success upgraded', result=0) + result = Result.IntResult(error=False, info='Success upgraded', result=0) except NoResultFound: new_status = Vocation(user_id=user_id_result.result, status=status, created_at=datetime.now()) session.add(new_status) - result = DBResult(error=False, info='Success set', result=0) + result = Result.IntResult(error=False, info='Success set', result=0) await session.commit() except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def vocation_set(self, stop_time: datetime, reason: str = None) -> DBResult: + async def vocation_set(self, stop_time: datetime, reason: str = None) -> Result.IntResult: user_id_result = await self.id() if user_id_result.error: - return DBResult(error=True, info='User not exist', result=-1) + return Result.IntResult(error=True, info='User not exist', result=-1) async_session = NBdb().get_async_session() async with async_session() as session: @@ -341,25 +342,25 @@ async def vocation_set(self, stop_time: datetime, reason: str = None) -> DBResul exist_status.stop_at = stop_time exist_status.reason = reason exist_status.updated_at = datetime.now() - result = DBResult(error=False, info='Success upgraded', result=0) + result = Result.IntResult(error=False, info='Success upgraded', result=0) except NoResultFound: new_status = Vocation(user_id=user_id_result.result, status=1, stop_at=stop_time, reason=reason, created_at=datetime.now()) session.add(new_status) - result = DBResult(error=False, info='Success set', result=0) + result = Result.IntResult(error=False, info='Success set', result=0) await session.commit() except MultipleResultsFound: await session.rollback() - result = DBResult(error=True, info='MultipleResultsFound', result=-1) + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result - async def status_del(self) -> DBResult: + async def status_del(self) -> Result.IntResult: user_id_result = await self.id() if user_id_result.error: - return DBResult(error=True, info='User not exist', result=-1) + return Result.IntResult(error=True, info='User not exist', result=-1) async_session = NBdb().get_async_session() async with async_session() as session: @@ -371,8 +372,8 @@ async def status_del(self) -> DBResult: exist_status = session_result.scalar_one() await session.delete(exist_status) await session.commit() - result = DBResult(error=False, info='Success', result=0) + result = Result.IntResult(error=False, info='Success', result=0) except Exception as e: await session.rollback() - result = DBResult(error=True, info=repr(e), result=-1) + result = Result.IntResult(error=True, info=repr(e), result=-1) return result diff --git a/omega_miya/utils/Omega_plugin_utils/cooldown.py b/omega_miya/utils/Omega_plugin_utils/cooldown.py index 82e3d728..aa63c0c9 100644 --- a/omega_miya/utils/Omega_plugin_utils/cooldown.py +++ b/omega_miya/utils/Omega_plugin_utils/cooldown.py @@ -14,7 +14,7 @@ class PluginCoolDown: skip_auth_node: str = field(default='skip_cd', init=False) -async def check_and_set_global_cool_down(minutes: int) -> Result: +async def check_and_set_global_cool_down(minutes: int) -> Result.IntResult: check = await DBCoolDownEvent.check_global_cool_down_event() if check.result == 1: return check @@ -28,7 +28,7 @@ async def check_and_set_global_cool_down(minutes: int) -> Result: return check -async def check_and_set_plugin_cool_down(minutes: int, plugin: str) -> Result: +async def check_and_set_plugin_cool_down(minutes: int, plugin: str) -> Result.IntResult: check = await DBCoolDownEvent.check_plugin_cool_down_event(plugin=plugin) if check.result == 1: return check @@ -42,7 +42,7 @@ async def check_and_set_plugin_cool_down(minutes: int, plugin: str) -> Result: return check -async def check_and_set_group_cool_down(minutes: int, plugin: str, group_id: int) -> Result: +async def check_and_set_group_cool_down(minutes: int, plugin: str, group_id: int) -> Result.IntResult: check = await DBCoolDownEvent.check_group_cool_down_event(plugin=plugin, group_id=group_id) if check.result == 1: return check @@ -56,7 +56,7 @@ async def check_and_set_group_cool_down(minutes: int, plugin: str, group_id: int return check -async def check_and_set_user_cool_down(minutes: int, plugin: str, user_id: int) -> Result: +async def check_and_set_user_cool_down(minutes: int, plugin: str, user_id: int) -> Result.IntResult: check = await DBCoolDownEvent.check_user_cool_down_event(plugin=plugin, user_id=user_id) if check.result == 1: return check diff --git a/omega_miya/utils/nhentai_utils/__init__.py b/omega_miya/utils/nhentai_utils/__init__.py index 3bb0b792..08255ed3 100644 --- a/omega_miya/utils/nhentai_utils/__init__.py +++ b/omega_miya/utils/nhentai_utils/__init__.py @@ -32,7 +32,7 @@ def __init__(self, *args): # 通过关键词搜索本子id和标题 -async def search_gallery_by_tag(keyword: str) -> Result: +async def search_gallery_by_tag(keyword: str) -> Result.ListResult: # 搜索关键词 payload_keyword = {'q': keyword} search_url = f'https://nhentai.net/search/' @@ -42,7 +42,7 @@ async def search_gallery_by_tag(keyword: str) -> Result: fetcher = HttpFetcher(timeout=10, flag='nhentai_search', headers=headers) html_result = await fetcher.get_text(url=search_url, params=payload_keyword) if html_result.error: - return Result(error=True, info=f'Search keyword failed, {html_result.info}', result=[]) + return Result.ListResult(error=True, info=f'Search keyword failed, {html_result.info}', result=[]) search_res = html_result.result result = [] @@ -58,10 +58,10 @@ async def search_gallery_by_tag(keyword: str) -> Result: gallery_title = item.find('div', class_='caption').get_text(strip=True) gallery_id = re.sub(r'\D', '', item.find('a', class_='cover').get('href')) result.append({'id': gallery_id, 'title': gallery_title}) - return Result(error=False, info='Success', result=result) + return Result.ListResult(error=False, info='Success', result=result) except Exception as e: logger.error(f'Nhentai | Parse search result failed, error: {repr(e)}') - return Result(error=True, info=f'Parse search result failed', result=[]) + return Result.ListResult(error=True, info=f'Parse search result failed', result=[]) # 下载一张图片 diff --git a/omega_miya/utils/pixiv_utils/pixiv.py b/omega_miya/utils/pixiv_utils/pixiv.py index 39b3cfc2..2df4b9bf 100644 --- a/omega_miya/utils/pixiv_utils/pixiv.py +++ b/omega_miya/utils/pixiv_utils/pixiv.py @@ -24,17 +24,19 @@ class Pixiv(object): 'Chrome/89.0.4389.114 Safari/537.36'} @classmethod - async def daily_ranking(cls) -> Result: + async def daily_ranking(cls) -> Result.DictResult: payload_daily = {'format': 'json', 'mode': 'daily', 'content': 'illust', 'p': 1} fetcher = HttpFetcher(timeout=10, flag='pixiv_utils_daily_ranking', headers=cls.HEADERS) daily_ranking_result = await fetcher.get_json(url=cls.RANKING_URL, params=payload_daily) if daily_ranking_result.error: - return Result(error=True, info=f'Fetch daily ranking failed, {daily_ranking_result.info}', result={}) + return Result.DictResult( + error=True, info=f'Fetch daily ranking failed, {daily_ranking_result.info}', result={}) daily_ranking_data = daily_ranking_result.result.get('contents') if type(daily_ranking_data) != list: - return Result(error=True, info=f'Daily ranking data error, {daily_ranking_result.result}', result={}) + return Result.DictResult( + error=True, info=f'Daily ranking data error, {daily_ranking_result.result}', result={}) result = {} for num in range(len(daily_ranking_data)): @@ -50,20 +52,22 @@ async def daily_ranking(cls) -> Result: except Exception as e: logger.debug(f'Pixiv | Daily ranking data error at {num}, ignored. {str(e)},') continue - return Result(error=False, info='Success', result=result) + return Result.DictResult(error=False, info='Success', result=result) @classmethod - async def weekly_ranking(cls) -> Result: + async def weekly_ranking(cls) -> Result.DictResult: payload_weekly = {'format': 'json', 'mode': 'weekly', 'content': 'illust', 'p': 1} fetcher = HttpFetcher(timeout=10, flag='pixiv_utils_weekly_ranking', headers=cls.HEADERS) weekly_ranking_result = await fetcher.get_json(url=cls.RANKING_URL, params=payload_weekly) if weekly_ranking_result.error: - return Result(error=True, info=f'Fetch weekly ranking failed, {weekly_ranking_result.info}', result={}) + return Result.DictResult( + error=True, info=f'Fetch weekly ranking failed, {weekly_ranking_result.info}', result={}) weekly_ranking_data = weekly_ranking_result.result.get('contents') if type(weekly_ranking_data) != list: - return Result(error=True, info=f'Weekly ranking data error, {weekly_ranking_result.result}', result={}) + return Result.DictResult( + error=True, info=f'Weekly ranking data error, {weekly_ranking_result.result}', result={}) result = {} for num in range(len(weekly_ranking_data)): @@ -79,20 +83,22 @@ async def weekly_ranking(cls) -> Result: except Exception as e: logger.debug(f'Pixiv | Weekly ranking data error at {num}, ignored. {str(e)},') continue - return Result(error=False, info='Success', result=result) + return Result.DictResult(error=False, info='Success', result=result) @classmethod - async def monthly_ranking(cls) -> Result: + async def monthly_ranking(cls) -> Result.DictResult: payload_monthly = {'format': 'json', 'mode': 'monthly', 'content': 'illust', 'p': 1} fetcher = HttpFetcher(timeout=10, flag='pixiv_utils_monthly_ranking', headers=cls.HEADERS) monthly_ranking_result = await fetcher.get_json(url=cls.RANKING_URL, params=payload_monthly) if monthly_ranking_result.error: - return Result(error=True, info=f'Fetch monthly ranking failed, {monthly_ranking_result.info}', result={}) + return Result.DictResult( + error=True, info=f'Fetch monthly ranking failed, {monthly_ranking_result.info}', result={}) monthly_ranking_data = monthly_ranking_result.result.get('contents') if type(monthly_ranking_data) != list: - return Result(error=True, info=f'Monthly ranking data error, {monthly_ranking_result.result}', result={}) + return Result.DictResult( + error=True, info=f'Monthly ranking data error, {monthly_ranking_result.result}', result={}) result = {} for num in range(len(monthly_ranking_data)): @@ -108,7 +114,7 @@ async def monthly_ranking(cls) -> Result: except Exception as e: logger.debug(f'Pixiv | Monthly ranking data error at {num}, ignored. {repr(e)},') continue - return Result(error=False, info='Success', result=result) + return Result.DictResult(error=False, info='Success', result=result) class PixivIllust(Pixiv): @@ -117,7 +123,7 @@ def __init__(self, pid: int): # 获取作品完整信息(pixiv api 获取 json) # 返回格式化后的作品信息 - async def get_illust_data(self) -> Result: + async def get_illust_data(self) -> Result.DictResult: illust_url = f'{self.ILLUST_DATA_URL}{self.__pid}' illust_artworks_url = f'{self.ILLUST_ARTWORK_URL}{self.__pid}' @@ -129,17 +135,18 @@ async def get_illust_data(self) -> Result: # 获取作品信息 illust_data_result = await fetcher.get_json(url=illust_url) if illust_data_result.error: - return Result(error=True, info=f'Fetch illust data failed, {illust_data_result.info}', result={}) + return Result.DictResult(error=True, info=f'Fetch illust data failed, {illust_data_result.info}', result={}) # 检查返回状态 if illust_data_result.result.get('error') or not illust_data_result.result: - return Result(error=True, info=f'PixivApiError: {illust_data_result.result}', result={}) + return Result.DictResult(error=True, info=f'PixivApiError: {illust_data_result.result}', result={}) # 获取多张图作品图片列表 illust_page_url = illust_url + '/pages' illust_pages_result = await fetcher.get_json(url=illust_page_url) if illust_pages_result.error: - return Result(error=True, info=f'Fetch illust pages failed, {illust_pages_result.info}', result={}) + return Result.DictResult( + error=True, info=f'Fetch illust pages failed, {illust_pages_result.info}', result={}) illust_data = illust_data_result.result illust_pages = illust_pages_result.result @@ -193,16 +200,16 @@ async def get_illust_data(self) -> Result: result = {'pid': illustid, 'title': illusttitle, 'uid': userid, 'uname': username, 'url': url, 'orig_url': illust_orig_url, 'regular_url': illust_regular_url, 'all_url': all_url, 'description': illust_description, 'tags': illusttag, 'is_r18': is_r18} - return Result(error=False, info='Success', result=result) + return Result.DictResult(error=False, info='Success', result=result) except Exception as e: logger.error(f'PixivIllust | Parse illust data failed, error: {repr(e)}') - return Result(error=True, info=f'Parse illust data failed', result={}) + return Result.DictResult(error=True, info=f'Parse illust data failed', result={}) # 图片转base64 - async def pic_2_base64(self, original: bool = False) -> Result: + async def pic_2_base64(self, original: bool = False) -> Result.TextResult: illust_data_result = await self.get_illust_data() if illust_data_result.error: - return Result(error=True, info='Fetch illust data failed', result='') + return Result.TextResult(error=True, info='Fetch illust data failed', result='') illust_data = dict(illust_data_result.result) title = illust_data.get('title') @@ -233,14 +240,14 @@ async def pic_2_base64(self, original: bool = False) -> Result: fetcher = HttpFetcher(timeout=30, attempt_limit=2, flag='pixiv_utils_get_image', headers=headers) bytes_result = await fetcher.get_bytes(url=url) if bytes_result.error: - return Result(error=True, info='Image download failed', result='') + return Result.TextResult(error=True, info='Image download failed', result='') encode_result = PicEncoder.bytes_to_b64(image=bytes_result.result) if encode_result.success(): - return Result(error=False, info=info, result=encode_result.result) + return Result.TextResult(error=False, info=info, result=encode_result.result) else: - return Result(error=True, info=encode_result.info, result='') + return Result.TextResult(error=True, info=encode_result.info, result='') __all__ = [ diff --git a/omega_miya/utils/pixiv_utils/pixivision.py b/omega_miya/utils/pixiv_utils/pixivision.py index af64199c..86c11bb6 100644 --- a/omega_miya/utils/pixiv_utils/pixivision.py +++ b/omega_miya/utils/pixiv_utils/pixivision.py @@ -27,11 +27,11 @@ class Pixivision(object): 'Chrome/89.0.4389.114 Safari/537.36'} @classmethod - async def get_illustration_list(cls) -> Result: + async def get_illustration_list(cls) -> Result.ListResult: fetcher = HttpFetcher(timeout=10, flag='pixivision_utils_illustration_list', headers=cls.HEADERS) html_result = await fetcher.get_text(url=cls.ILLUSTRATION_URL, params={'lang': 'zh'}) if html_result.error: - return Result(error=True, info=f'Fetch illustration list failed, {html_result.info}', result=[]) + return Result.ListResult(error=True, info=f'Fetch illustration list failed, {html_result.info}', result=[]) result = [] try: @@ -50,22 +50,22 @@ async def get_illustration_list(cls) -> Result: tag_url = cls.ROOT_URL + tag_r_url tag_list.append({'tag_id': tag_id, 'tag_name': tag_name, 'tag_url': tag_url}) result.append({'id': aid, 'title': title, 'url': url, 'tags': tag_list}) - return Result(error=False, info='Success', result=result) + return Result.ListResult(error=False, info='Success', result=result) except Exception as e: logger.error(f'Pixivision | Parse illustration list failed, error: {repr(e)}') - return Result(error=True, info=f'Parse illustration list failed', result=[]) + return Result.ListResult(error=True, info=f'Parse illustration list failed', result=[]) class PixivisionArticle(Pixivision): def __init__(self, aid: int): self.__aid = aid - async def get_article_info(self) -> Result: + async def get_article_info(self) -> Result.DictResult: url = f'{self.ARTICLES_URL}/{self.__aid}' fetcher = HttpFetcher(timeout=10, flag='pixivision_utils_article_info', headers=self.HEADERS) html_result = await fetcher.get_text(url=url, params={'lang': 'zh'}) if html_result.error: - return Result(error=True, info=f'Fetch article info failed, {html_result.info}', result={}) + return Result.DictResult(error=True, info=f'Fetch article info failed, {html_result.info}', result={}) try: __bs = BeautifulSoup(html_result.result, 'lxml') @@ -140,10 +140,10 @@ async def get_article_info(self) -> Result: 'article_eyecatch_image': article_eyecatch_image, 'illusts_list': illusts_list } - return Result(error=False, info='Success', result=result) + return Result.DictResult(error=False, info='Success', result=result) except Exception as e: logger.error(f'PixivisionArticle | Parse article failed, error: {repr(e)}') - return Result(error=True, info=f'Parse article failed', result={}) + return Result.DictResult(error=True, info=f'Parse article failed', result={}) __all__ = [ From ea9d478ec6b8d99fc219553171001de40a7b6503 Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Fri, 23 Apr 2021 01:46:59 +0800 Subject: [PATCH 03/33] =?UTF-8?q?Upgrade:=20=E4=BC=98=E5=8C=96=E4=BA=86?= =?UTF-8?q?=E8=AF=86=E5=9B=BE=E6=8F=92=E4=BB=B6=E5=AF=B9=E8=AF=86=E5=9B=BE?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E7=9A=84=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 优化了识图插件对识图结果的处理 --- omega_miya/plugins/search_image/__init__.py | 26 +++++++++++++------ omega_miya/plugins/search_image/utils.py | 28 ++++++++++++--------- 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/omega_miya/plugins/search_image/__init__.py b/omega_miya/plugins/search_image/__init__.py index c950eb6d..8be43c36 100644 --- a/omega_miya/plugins/search_image/__init__.py +++ b/omega_miya/plugins/search_image/__init__.py @@ -83,13 +83,23 @@ async def handle_draw(bot: Bot, event: GroupMessageEvent, state: T_State): image_url = re.sub(r'(])$', '', image_url) try: + has_error = False await search_image.send('获取识别结果中, 请稍后~') - identify_result = await get_saucenao_identify_result(url=image_url) + identify_result = [] + identify_saucenao_result = await get_saucenao_identify_result(url=image_url) + if identify_saucenao_result.success(): + identify_result.extend(identify_saucenao_result.result) + else: + has_error = True + # saucenao 没有结果时再使用 ascii2d 进行搜索 if not identify_result: identify_ascii2d_result = await get_ascii2d_identify_result(url=image_url) # 合并搜索结果 - identify_result.extend(identify_ascii2d_result) + if identify_ascii2d_result.success(): + identify_result.extend(identify_ascii2d_result.result) + else: + has_error = True if identify_result: for item in identify_result: try: @@ -115,13 +125,15 @@ async def handle_draw(bot: Bot, event: GroupMessageEvent, state: T_State): logger.info(f"Group: {event.group_id}, user: {event.user_id} " f"使用searchimage成功搜索了一张图片") return + elif not identify_result and has_error: + await search_image.send('识图过程中获取信息失败QAQ, 请重试一下吧') + logger.info(f"Group: {event.group_id}, user: {event.user_id} 使用了searchimage, 但在识图过程中获取信息失败") + return else: await search_image.send('没有找到相似度足够高的图片QAQ') - logger.info(f"Group: {event.group_id}, user: {event.user_id} " - f"使用了searchimage, 但没有找到相似的图片") + logger.info(f"Group: {event.group_id}, user: {event.user_id} 使用了searchimage, 但没有找到相似的图片") return except Exception as e: - await search_image.send('识图失败, 发生了意外的错误QAQ') - logger.error(f"Group: {event.group_id}, user: {event.user_id} " - f"使用命令searchimage时发生了错误: {repr(e)}") + await search_image.send('识图失败, 发生了意外的错误QAQ, 请稍后重试') + logger.error(f"Group: {event.group_id}, user: {event.user_id} 使用命令searchimage时发生了错误: {repr(e)}") return diff --git a/omega_miya/plugins/search_image/utils.py b/omega_miya/plugins/search_image/utils.py index 6a1b95c7..4a7a5240 100644 --- a/omega_miya/plugins/search_image/utils.py +++ b/omega_miya/plugins/search_image/utils.py @@ -32,12 +32,12 @@ async def pic_2_base64(url: str) -> Result.TextResult: # 获取识别结果 Saucenao模块 -async def get_saucenao_identify_result(url: str) -> list: +async def get_saucenao_identify_result(url: str) -> Result.ListResult: fetcher = HttpFetcher(timeout=10, flag='search_image_saucenao', headers=HEADERS) if not API_KEY: logger.opt(colors=True).warning(f'Saucenao API KEY未配置, 无法使用Saucenao API进行识图!') - return [] + return Result.ListResult(error=True, info='Saucenao API KEY未配置', result=[]) __payload = {'output_type': 2, 'api_key': API_KEY, @@ -47,15 +47,16 @@ async def get_saucenao_identify_result(url: str) -> list: 'url': url} saucenao_result = await fetcher.get_json(url=API_URL, params=__payload) if saucenao_result.error: - logger.error(f"get_saucenao_identify_result failed, Network error: {saucenao_result.info}") - return [] + logger.warning(f'get_saucenao_identify_result failed, Network error: {saucenao_result.info}') + return Result.ListResult(error=True, info=f'Network error: {saucenao_result.info}', result=[]) __result_json = saucenao_result.result if __result_json['header']['status'] != 0: logger.error(f"get_saucenao_identify_result failed, DataSource error, " f"status code: {__result_json['header']['status']}") - return [] + return Result.ListResult( + error=True, info=f"DataSource error, status code: {__result_json['header']['status']}", result=[]) __result = [] for __item in __result_json['results']: @@ -68,22 +69,25 @@ async def get_saucenao_identify_result(url: str) -> list: 'index_name': __item['header']['index_name'], 'ext_urls': __item['data']['ext_urls']}) except Exception as res_err: - logger.error(f"get_saucenao_identify_result failed: {repr(res_err)}, can not resolve results") + logger.warning(f"get_saucenao_identify_result failed: {repr(res_err)}, can not resolve results") continue - return __result + return Result.ListResult(error=False, info='Success', result=__result) # 获取识别结果 ascii2d模块 -async def get_ascii2d_identify_result(url: str) -> list: +async def get_ascii2d_identify_result(url: str) -> Result.ListResult: fetcher = HttpFetcher(timeout=10, flag='search_image_ascii2d', headers=HEADERS) search_url = f'{API_URL_ASCII2D}{url}' saucenao_redirects_result = await fetcher.get_text(url=search_url, allow_redirects=False) if saucenao_redirects_result.error: - logger.warning(f'get_ascii2d_identify_result failed: 获取识别结果url发生错误, 错误信息详见日志.') - return [] + logger.error(f'get_ascii2d_identify_result failed: 获取识别结果url发生错误, 错误信息详见日志.') + return Result.ListResult(error=True, info=f'Get identify result url failed', result=[]) ascii2d_color_url = saucenao_redirects_result.headers.get('Location') + if not ascii2d_color_url: + logger.error(f'get_ascii2d_identify_result failed: 获取识别结果url发生错误, 可能被流量限制.') + return Result.ListResult(error=True, info=f'Get identify result url failed, may be limited', result=[]) ascii2d_bovw_url = re.sub( r'https://ascii2d\.net/search/color/', r'https://ascii2d.net/search/bovw/', ascii2d_color_url) @@ -97,7 +101,7 @@ async def get_ascii2d_identify_result(url: str) -> list: pre_bs_list.append(bovw_res.result) if not pre_bs_list: logger.error(f'get_ascii2d_identify_result ERROR: 获取识别结果异常, 错误信息详见日志.') - return [] + return Result.ListResult(error=True, info=f'Get identify result data failed', result=[]) __result = [] @@ -148,4 +152,4 @@ async def get_ascii2d_identify_result(url: str) -> list: except Exception as row_err: logger.warning(f'get_ascii2d_identify_result ERROR: {repr(row_err)}, 解搜索结果条目时发生错误.') continue - return __result + return Result.ListResult(error=False, info=f'Success', result=__result) From 73a63efbca1bd306ae5fe518d34332cb51f8b19b Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Thu, 29 Apr 2021 21:49:14 +0800 Subject: [PATCH 04/33] =?UTF-8?q?Upgrade:=20=E4=BC=98=E5=8C=96setu?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 优化setu插件日志 --- omega_miya/plugins/setu/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/omega_miya/plugins/setu/__init__.py b/omega_miya/plugins/setu/__init__.py index 15a36d79..f3991365 100644 --- a/omega_miya/plugins/setu/__init__.py +++ b/omega_miya/plugins/setu/__init__.py @@ -121,10 +121,10 @@ async def handle_setu(bot: Bot, event: GroupMessageEvent, state: T_State): continue if fault_count == len(pid_list): - logger.info(f"Group: {event.group_id}, User: {event.user_id} 没能看到他/她想要的涩图") + logger.info(f"Group: {event.group_id}, User: {event.user_id} 没能看到他/她想要的涩图, {pid_list}") await setu.finish('似乎出现了网络问题, 所有的图片都下载失败了QAQ') else: - logger.info(f"Group: {event.group_id}, User: {event.user_id} 找到了他/她想要的涩图") + logger.info(f"Group: {event.group_id}, User: {event.user_id} 找到了他/她想要的涩图, {pid_list}") # 注册事件响应器 @@ -187,10 +187,10 @@ async def handle_moepic(bot: Bot, event: GroupMessageEvent, state: T_State): continue if fault_count == len(pid_list): - logger.info(f"Group: {event.group_id}, User: {event.user_id} 没能看到他/她想要的萌图") + logger.info(f"Group: {event.group_id}, User: {event.user_id} 没能看到他/她想要的萌图, {pid_list}") await moepic.finish('似乎出现了网络问题, 所有的图片都下载失败了QAQ') else: - logger.info(f"Group: {event.group_id}, User: {event.user_id} 找到了他/她想要的萌图") + logger.info(f"Group: {event.group_id}, User: {event.user_id} 找到了他/她想要的萌图, {pid_list}") # 注册事件响应器 From e7c3c6722052297555c62a0f065fdaa542882283 Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Thu, 29 Apr 2021 21:49:34 +0800 Subject: [PATCH 05/33] =?UTF-8?q?Upgrade:=20HttpFetcher=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - HttpFetcher新增文件下载 --- .../utils/Omega_plugin_utils/http_fetcher.py | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/omega_miya/utils/Omega_plugin_utils/http_fetcher.py b/omega_miya/utils/Omega_plugin_utils/http_fetcher.py index ecf085a2..cdc33d31 100644 --- a/omega_miya/utils/Omega_plugin_utils/http_fetcher.py +++ b/omega_miya/utils/Omega_plugin_utils/http_fetcher.py @@ -1,4 +1,6 @@ +import os import aiohttp +import aiofiles import nonebot from asyncio.exceptions import TimeoutError as TimeoutError_ from dataclasses import dataclass @@ -87,6 +89,66 @@ def __init__( self.__cookies = cookies self.__flag = flag + async def download_file( + self, + url: str, + path: str, + file_name: str, + params: Dict[str, str] = None, + force_proxy: bool = False, + **kwargs: Any) -> FetcherTextResult: + """ + 下载文件 + :param url: 链接 + :param path: 下载文件夹路径 + :param file_name: 文件名 + :param params: 请求参数 + :param force_proxy: 强制代理 + :param kwargs: ... + :return: + """ + # 检查保存文件路径 + folder_path = os.path.abspath(path) + if not os.path.exists(folder_path): + os.makedirs(folder_path) + file_path = os.path.abspath(os.path.join(folder_path, file_name)) + + proxy = await self.__get_proxy(always_return_proxy=force_proxy) + num_of_attempts = 0 + while num_of_attempts < self.__attempt_limit: + try: + async with aiohttp.ClientSession(timeout=self.__timeout) as session: + async with session.get( + url=url, params=params, + headers=self.__headers, cookies=self.__cookies, proxy=proxy, timeout=self.__timeout, + **kwargs + ) as rp: + file_bytes = await rp.read() + status = rp.status + headers = dict(rp.headers) + async with aiofiles.open(file_path, 'wb') as f: + await f.write(file_bytes) + result = self.FetcherTextResult( + error=False, info='Success', status=status, headers=headers, result=file_path) + return result + except TimeoutError_: + logger.opt(colors=True).warning( + fr'HttpFetcher \<{self.__flag}> TimeoutError occurred ' + f'in download_file attempt {num_of_attempts + 1}.') + except Exception as e: + logger.opt(colors=True).warning( + fr'HttpFetcher \<{self.__flag}> {str(e.__class__.__name__)} occurred ' + f'in download_file attempt {num_of_attempts + 1}.\nError info: {str(e)}') + finally: + num_of_attempts += 1 + else: + logger.opt(colors=True).error( + fr'HttpFetcher \<{self.__flag}> ExceededAttemptNumberError ' + f'Failed too many times in download_file.\n' + f'url: {url}\nparams: {params}') + return self.FetcherTextResult( + error=True, info='Failed too many times in download_file', status=-1, headers={}, result='') + async def get_json( self, url: str, From e7a89f6efdc595fec4be38e421bffcd681492903 Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Thu, 29 Apr 2021 21:49:51 +0800 Subject: [PATCH 06/33] =?UTF-8?q?Upgrade:=20pixiv=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E5=8F=8A=E6=8F=92=E4=BB=B6=E6=96=B0=E5=A2=9E=E4=BD=9C=E5=93=81?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - pixiv模块及插件新增作品下载 --- omega_miya/plugins/pixiv/__init__.py | 68 ++++++++++++++++++++++++++- omega_miya/utils/pixiv_utils/pixiv.py | 37 +++++++++++++-- 2 files changed, 100 insertions(+), 5 deletions(-) diff --git a/omega_miya/plugins/pixiv/__init__.py b/omega_miya/plugins/pixiv/__init__.py index 372cbe74..3c37f764 100644 --- a/omega_miya/plugins/pixiv/__init__.py +++ b/omega_miya/plugins/pixiv/__init__.py @@ -19,6 +19,7 @@ **AuthNode** basic +download **CoolDown** 群组共享冷却时间 @@ -30,12 +31,15 @@ /pixiv [PID] /pixiv 日榜 /pixiv 周榜 -/pixiv 月榜''' +/pixiv 月榜 +**Need AuthNode** +/pixivdl [PID]''' # 声明本插件可配置的权限节点 __plugin_auth_node__ = [ PluginCoolDown.skip_auth_node, - 'basic' + 'basic', + 'download' ] # 声明本插件的冷却时间配置 @@ -170,3 +174,63 @@ async def handle_pixiv(bot: Bot, event: GroupMessageEvent, state: T_State): await pixiv.send('加载失败, 网络超时或没有这张图QAQ') else: await pixiv.reject('你输入的命令好像不对呢……请输入"月榜"、"周榜"、"日榜"或者PixivID, 取消命令请发送【取消】:') + + +# 注册事件响应器 +pixiv_dl = on_command( + 'pixivdl', + aliases={'Pixivdl'}, + # 使用run_preprocessor拦截权限管理, 在default_state初始化所需权限 + state=init_permission_state( + name='pixivdl', + command=True, + auth_node='download'), + permission=GROUP, + priority=20, + block=True) + + +# 修改默认参数处理 +@pixiv_dl.args_parser +async def parse(bot: Bot, event: GroupMessageEvent, state: T_State): + args = str(event.get_plaintext()).strip().lower().split() + if not args: + await pixiv_dl.reject('你似乎没有发送有效的参数呢QAQ, 请重新发送:') + state[state["_current_key"]] = args[0] + if state[state["_current_key"]] == '取消': + await pixiv_dl.finish('操作已取消') + + +@pixiv_dl.handle() +async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_State): + args = str(event.get_plaintext()).strip().lower().split() + if not args: + pass + elif args and len(args) == 1: + state['pid'] = args[0] + else: + await pixiv_dl.finish('参数错误QAQ') + + +@pixiv_dl.got('pid', prompt='请输入PixivID:') +async def handle_pixiv_dl(bot: Bot, event: GroupMessageEvent, state: T_State): + pid = state['pid'] + if re.match(r'^\d+$', pid): + pid = int(pid) + logger.debug(f'获取Pixiv资源: {pid}.') + await pixiv_dl.send('稍等, 正在下载图片~') + download_result = await PixivIllust(pid=pid).download_illust() + if download_result.error: + logger.warning(f"User: {event.user_id} 下载Pixiv资源失败, 网络超时或 {pid} 不存在, {download_result.info}") + await pixiv_dl.finish('下载失败, 网络超时或没有这张图QAQ') + else: + file_path = download_result.result + file_name = download_result.info + try: + await bot.call_api(api='upload_group_file', group_id=event.group_id, file=file_path, name=file_name) + except Exception as e: + logger.warning(f'User: {event.user_id} 下载Pixiv资源失败, 上传群文件失败: {repr(e)}') + await pixiv_dl.finish('上传图片到群文件失败QAQ, 请稍后再试') + + else: + await pixiv_dl.finish('参数错误, pid应为纯数字') diff --git a/omega_miya/utils/pixiv_utils/pixiv.py b/omega_miya/utils/pixiv_utils/pixiv.py index 2df4b9bf..19a8c9ef 100644 --- a/omega_miya/utils/pixiv_utils/pixiv.py +++ b/omega_miya/utils/pixiv_utils/pixiv.py @@ -1,5 +1,6 @@ import re -from nonebot import logger +import os +from nonebot import logger, get_driver from omega_miya.utils.Omega_plugin_utils import HttpFetcher, PicEncoder from omega_miya.utils.Omega_Base import Result @@ -226,9 +227,9 @@ async def pic_2_base64(self, original: bool = False) -> Result.TextResult: info = f'「{title}」/「{author}」\n{tags}\n{url}\n----------------\n{description[:28]}......' if original: - url = illust_data_result.result.get('orig_url') + url = illust_data.get('orig_url') else: - url = illust_data_result.result.get('regular_url') + url = illust_data.get('regular_url') headers = self.HEADERS.copy() headers.update({ @@ -249,6 +250,36 @@ async def pic_2_base64(self, original: bool = False) -> Result.TextResult: else: return Result.TextResult(error=True, info=encode_result.info, result='') + async def download_illust(self, original: bool = True) -> Result.TextResult: + illust_data_result = await self.get_illust_data() + if illust_data_result.error: + return Result.TextResult(error=True, info='Fetch illust data failed', result='') + + if original: + url = illust_data_result.result.get('orig_url') + else: + url = illust_data_result.result.get('regular_url') + + headers = self.HEADERS.copy() + headers.update({ + 'sec-fetch-dest': 'image', + 'sec-fetch-mode': 'no-cors', + 'sec-fetch-site': 'cross-site' + }) + + global_config = get_driver().config + file_path = os.path.abspath(os.path.join(global_config.tmp_path_, 'pixiv_illust')) + file_name = os.path.basename(url) + if not file_name: + file_name = f'{self.__pid}.tmp' + + fetcher = HttpFetcher(timeout=45, attempt_limit=2, flag='pixiv_utils_download_illust', headers=headers) + download_result = await fetcher.download_file(url=url, path=file_path, file_name=file_name) + if download_result.success(): + return Result.TextResult(error=False, info=file_name, result=download_result.result) + else: + return Result.TextResult(error=True, info=download_result.info, result='') + __all__ = [ 'Pixiv', From ff1698f71e61c14326f9deaf3c7219e3445834b5 Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Thu, 29 Apr 2021 21:50:13 +0800 Subject: [PATCH 07/33] =?UTF-8?q?Upgrade:=20=E6=9B=B4=E6=96=B0=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BE=9D=E8=B5=96=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 更新相关依赖版本 --- requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index 397f651e..4cc71fbc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ nonebot2==2.0.0a13.post1 -nonebot-adapter-cqhttp==2.0.0a12 -SQLAlchemy~=1.4.8 +nonebot-adapter-cqhttp==2.0.0a13 +SQLAlchemy~=1.4.11 mysqlclient~=2.0.3 aiomysql~=0.0.21 aiocqhttp~=1.3.0 @@ -17,4 +17,4 @@ msgpack~=1.0.2 pydantic~=1.8.1 APScheduler~=3.7.0 pycryptodome~=3.10.1 -py7zr==0.15.1 \ No newline at end of file +py7zr==0.15.2 \ No newline at end of file From 2e24a6a5835ab3dd8eccd6328339f2416066c0d8 Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Fri, 30 Apr 2021 01:22:13 +0800 Subject: [PATCH 08/33] =?UTF-8?q?Upgrade:=20pixiv=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E5=A4=9A=E5=9B=BE=E5=8F=8A=E5=8A=A8=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - pixiv模块增加了对多图及动图下载的功能 --- .env.dev | 4 + omega_miya/plugins/pixiv/__init__.py | 19 ++- .../utils/Omega_plugin_utils/__init__.py | 4 +- .../utils/Omega_plugin_utils/zip_utils.py | 42 +++++++ omega_miya/utils/pixiv_utils/pixiv.py | 115 +++++++++++++++--- 5 files changed, 160 insertions(+), 24 deletions(-) create mode 100644 omega_miya/utils/Omega_plugin_utils/zip_utils.py diff --git a/.env.dev b/.env.dev index c1e75e90..d2a09609 100644 --- a/.env.dev +++ b/.env.dev @@ -43,3 +43,7 @@ SECRET_KEY= # 识图插件 Saucenao API KEY SAUCENAO_API_KEY= + +# Pixiv cookies +# P站cookies配置, 不填也行, 就是r18多图作品获取不到全部图片链接, 另外请确认P站用户设置-浏览限制中启用r18显示 +PIXIV_PHPSESSID= diff --git a/omega_miya/plugins/pixiv/__init__.py b/omega_miya/plugins/pixiv/__init__.py index 3c37f764..9db8c538 100644 --- a/omega_miya/plugins/pixiv/__init__.py +++ b/omega_miya/plugins/pixiv/__init__.py @@ -28,12 +28,12 @@ 10 Minutes **Usage** -/pixiv [PID] +/pixiv /pixiv 日榜 /pixiv 周榜 /pixiv 月榜 **Need AuthNode** -/pixivdl [PID]''' +/pixivdl [页码]''' # 声明本插件可配置的权限节点 __plugin_auth_node__ = [ @@ -205,21 +205,32 @@ async def parse(bot: Bot, event: GroupMessageEvent, state: T_State): async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_State): args = str(event.get_plaintext()).strip().lower().split() if not args: - pass + state['page'] = None elif args and len(args) == 1: state['pid'] = args[0] + state['page'] = None + elif args and len(args) == 2: + state['pid'] = args[0] + state['page'] = args[1] else: await pixiv_dl.finish('参数错误QAQ') + if state['page']: + try: + state['page'] = int(state['page']) + except ValueError: + await pixiv_dl.finish('参数错误QAQ, 页码应为数字') + @pixiv_dl.got('pid', prompt='请输入PixivID:') async def handle_pixiv_dl(bot: Bot, event: GroupMessageEvent, state: T_State): pid = state['pid'] + page = state['page'] if re.match(r'^\d+$', pid): pid = int(pid) logger.debug(f'获取Pixiv资源: {pid}.') await pixiv_dl.send('稍等, 正在下载图片~') - download_result = await PixivIllust(pid=pid).download_illust() + download_result = await PixivIllust(pid=pid).download_illust(page=page) if download_result.error: logger.warning(f"User: {event.user_id} 下载Pixiv资源失败, 网络超时或 {pid} 不存在, {download_result.info}") await pixiv_dl.finish('下载失败, 网络超时或没有这张图QAQ') diff --git a/omega_miya/utils/Omega_plugin_utils/__init__.py b/omega_miya/utils/Omega_plugin_utils/__init__.py index b91eba8d..808fb078 100644 --- a/omega_miya/utils/Omega_plugin_utils/__init__.py +++ b/omega_miya/utils/Omega_plugin_utils/__init__.py @@ -7,6 +7,7 @@ from .permission import * from .http_fetcher import HttpFetcher from .picture_encoder import PicEncoder +from .zip_utils import create_zip_file def init_export( @@ -59,5 +60,6 @@ def init_permission_state( 'check_permission_level', 'check_auth_node', 'HttpFetcher', - 'PicEncoder' + 'PicEncoder', + 'create_zip_file' ] diff --git a/omega_miya/utils/Omega_plugin_utils/zip_utils.py b/omega_miya/utils/Omega_plugin_utils/zip_utils.py new file mode 100644 index 00000000..d82fa133 --- /dev/null +++ b/omega_miya/utils/Omega_plugin_utils/zip_utils.py @@ -0,0 +1,42 @@ +import os +import zipfile +import asyncio +from typing import List +from nonebot.log import logger +from omega_miya.utils.Omega_Base import Result + + +def __create_zip_file(files: List[str], file_path: str, file_name: str) -> Result.TextResult: + # 检查文件路径 + folder_path = os.path.abspath(file_path) + if not os.path.exists(folder_path): + os.makedirs(folder_path) + zip_file_path = os.path.abspath(os.path.join(folder_path, f'{file_name}.zip')) + with zipfile.ZipFile(zip_file_path, mode='w', compression=zipfile.ZIP_STORED) as zipf: + for file in files: + file_path = os.path.abspath(file) + arcname = os.path.basename(file_path) + if os.path.exists(file_path): + zipf.write(file_path, arcname=arcname) + else: + logger.warning(f'create_zip_file: file not exists: {file}, ignore') + + return Result.TextResult(error=False, info=f'{file_name}.zip', result=zip_file_path) + + +async def create_zip_file(files: List[str], file_path: str, file_name: str) -> Result.TextResult: + def __handle(): + return __create_zip_file(files, file_path, file_name) + + loop = asyncio.get_running_loop() + try: + result = await loop.run_in_executor(None, __handle) + except Exception as e: + result = Result.TextResult(error=True, info=repr(e), result='') + + return result + + +__all__ = [ + 'create_zip_file' +] diff --git a/omega_miya/utils/pixiv_utils/pixiv.py b/omega_miya/utils/pixiv_utils/pixiv.py index 19a8c9ef..ddfc4840 100644 --- a/omega_miya/utils/pixiv_utils/pixiv.py +++ b/omega_miya/utils/pixiv_utils/pixiv.py @@ -1,9 +1,19 @@ import re import os +import asyncio from nonebot import logger, get_driver -from omega_miya.utils.Omega_plugin_utils import HttpFetcher, PicEncoder +from omega_miya.utils.Omega_plugin_utils import HttpFetcher, PicEncoder, create_zip_file from omega_miya.utils.Omega_Base import Result +global_config = get_driver().config +TMP_PATH = global_config.tmp_path_ +PIXIV_PHPSESSID = global_config.pixiv_phpsessid + +if PIXIV_PHPSESSID: + COOKIES = {'PHPSESSID': PIXIV_PHPSESSID} +else: + COOKIES = None + class Pixiv(object): ILLUST_DATA_URL = 'https://www.pixiv.net/ajax/illust/' @@ -131,7 +141,7 @@ async def get_illust_data(self) -> Result.DictResult: headers = self.HEADERS.copy() headers.update({'referer': illust_artworks_url}) - fetcher = HttpFetcher(timeout=10, flag='pixiv_utils_illust', headers=headers) + fetcher = HttpFetcher(timeout=10, flag='pixiv_utils_illust', headers=headers, cookies=COOKIES) # 获取作品信息 illust_data_result = await fetcher.get_json(url=illust_url) @@ -154,11 +164,13 @@ async def get_illust_data(self) -> Result.DictResult: try: # 处理作品基本信息 + illust_type = int(illust_data['body']['illustType']) illustid = int(illust_data['body']['illustId']) illusttitle = str(illust_data['body']['illustTitle']) userid = int(illust_data['body']['userId']) username = str(illust_data['body']['userName']) url = f'{self.ILLUST_ARTWORK_URL}{self.__pid}' + page_count = int(illust_data['body']['pageCount']) illust_orig_url = str(illust_data['body']['urls']['original']) illust_regular_url = str(illust_data['body']['urls']['regular']) illust_description = str(illust_data['body']['description']) @@ -198,9 +210,40 @@ async def get_illust_data(self) -> Result.DictResult: all_url.get('regular').append(item['urls']['regular']) all_url.get('original').append(item['urls']['original']) - result = {'pid': illustid, 'title': illusttitle, 'uid': userid, 'uname': username, - 'url': url, 'orig_url': illust_orig_url, 'regular_url': illust_regular_url, 'all_url': all_url, - 'description': illust_description, 'tags': illusttag, 'is_r18': is_r18} + ugoira_meta = { + 'mime_type': None, + 'originalsrc': None, + 'src': None + } + # 如果是动图额外处理动图资源 + if illust_type == 2: + illust_ugoira_meta_url = illust_url + '/ugoira_meta' + illust_ugoira_meta_result = await fetcher.get_json(url=illust_ugoira_meta_url) + if illust_ugoira_meta_result.error: + return Result.DictResult( + error=True, info=f'Fetch illust pages failed, {illust_ugoira_meta_result.info}', result={}) + illust_ugoira_meta = illust_ugoira_meta_result.result + if illust_ugoira_meta_result.success() and not illust_ugoira_meta.get('error') and illust_ugoira_meta: + ugoira_meta['mime_type'] = illust_ugoira_meta['body']['mime_type'] + ugoira_meta['originalsrc'] = illust_ugoira_meta['body']['originalSrc'] + ugoira_meta['src'] = illust_ugoira_meta['body']['src'] + + result = { + 'illust_type': illust_type, + 'pid': illustid, + 'title': illusttitle, + 'uid': userid, + 'uname': username, + 'url': url, + 'page_count': page_count, + 'orig_url': illust_orig_url, + 'regular_url': illust_regular_url, + 'all_url': all_url, + 'ugoira_meta': ugoira_meta, + 'description': illust_description, + 'tags': illusttag, + 'is_r18': is_r18 + } return Result.DictResult(error=False, info='Success', result=result) except Exception as e: logger.error(f'PixivIllust | Parse illust data failed, error: {repr(e)}') @@ -250,15 +293,32 @@ async def pic_2_base64(self, original: bool = False) -> Result.TextResult: else: return Result.TextResult(error=True, info=encode_result.info, result='') - async def download_illust(self, original: bool = True) -> Result.TextResult: + async def download_illust(self, page: int = None) -> Result.TextResult: + """ + :param page: 仅下载特定页码 + """ + if page < 1: + page = None + illust_data_result = await self.get_illust_data() if illust_data_result.error: return Result.TextResult(error=True, info='Fetch illust data failed', result='') - if original: - url = illust_data_result.result.get('orig_url') + download_url_list = [] + page_count = illust_data_result.result.get('page_count') + illust_type = illust_data_result.result.get('illust_type') + if illust_type == 2: + # 作品类型为动图 + download_url_list.append(illust_data_result.result.get('ugoira_meta').get('originalsrc')) + if page_count == 1: + download_url_list.append(illust_data_result.result.get('orig_url')) else: - url = illust_data_result.result.get('regular_url') + download_url_list.extend(illust_data_result.result.get('all_url').get('original')) + + if page and page <= page_count: + download_url_list = [download_url_list[page - 1]] + elif page and page > page_count: + return Result.TextResult(error=True, info='请求页数大于插画总页数', result='') headers = self.HEADERS.copy() headers.update({ @@ -267,18 +327,35 @@ async def download_illust(self, original: bool = True) -> Result.TextResult: 'sec-fetch-site': 'cross-site' }) - global_config = get_driver().config - file_path = os.path.abspath(os.path.join(global_config.tmp_path_, 'pixiv_illust')) - file_name = os.path.basename(url) - if not file_name: - file_name = f'{self.__pid}.tmp' - fetcher = HttpFetcher(timeout=45, attempt_limit=2, flag='pixiv_utils_download_illust', headers=headers) - download_result = await fetcher.download_file(url=url, path=file_path, file_name=file_name) - if download_result.success(): - return Result.TextResult(error=False, info=file_name, result=download_result.result) + file_path = os.path.abspath(os.path.join(TMP_PATH, 'pixiv_illust')) + + if len(download_url_list) == 1: + file_name = os.path.basename(download_url_list[0]) + if not file_name: + file_name = f'{self.__pid}.tmp' + + download_result = await fetcher.download_file(url=download_url_list[0], path=file_path, file_name=file_name) + if download_result.success(): + return Result.TextResult(error=False, info=file_name, result=download_result.result) + else: + return Result.TextResult(error=True, info=download_result.info, result='') + elif len(download_url_list) > 1: + tasks = [] + for url in download_url_list: + file_name = os.path.basename(url) + if not file_name: + file_name = f'{self.__pid}.tmp' + tasks.append(fetcher.download_file(url=url, path=file_path, file_name=file_name)) + download_result = await asyncio.gather(*tasks) + downloaded_list = [x.result for x in download_result if x.success()] + failed_num = len([x for x in download_result if x.error]) + if len(downloaded_list) != len(download_url_list): + return Result.TextResult(error=True, info=f'{failed_num} illust download failed', result='') + zip_result = await create_zip_file(files=downloaded_list, file_path=file_path, file_name=str(self.__pid)) + return zip_result else: - return Result.TextResult(error=True, info=download_result.info, result='') + return Result.TextResult(error=True, info='Get illust url failed', result='') __all__ = [ From 36c677a3e0c07e043855ce1dcf95be9968050c98 Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Fri, 30 Apr 2021 02:18:41 +0800 Subject: [PATCH 09/33] =?UTF-8?q?Upgrade:=20pixiv=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E5=8A=A8=E5=9B=BE=E9=A2=9D=E5=A4=96=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E5=8E=9F=E5=A7=8Bugoira=5Fmeta=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复一个页码导致的bug - pixiv模块下载动图额外保存原始ugoira_meta信息 --- omega_miya/utils/pixiv_utils/pixiv.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/omega_miya/utils/pixiv_utils/pixiv.py b/omega_miya/utils/pixiv_utils/pixiv.py index ddfc4840..a6373eea 100644 --- a/omega_miya/utils/pixiv_utils/pixiv.py +++ b/omega_miya/utils/pixiv_utils/pixiv.py @@ -1,6 +1,8 @@ import re import os +import json import asyncio +import aiofiles from nonebot import logger, get_driver from omega_miya.utils.Omega_plugin_utils import HttpFetcher, PicEncoder, create_zip_file from omega_miya.utils.Omega_Base import Result @@ -211,6 +213,7 @@ async def get_illust_data(self) -> Result.DictResult: all_url.get('original').append(item['urls']['original']) ugoira_meta = { + 'frames': None, 'mime_type': None, 'originalsrc': None, 'src': None @@ -224,6 +227,7 @@ async def get_illust_data(self) -> Result.DictResult: error=True, info=f'Fetch illust pages failed, {illust_ugoira_meta_result.info}', result={}) illust_ugoira_meta = illust_ugoira_meta_result.result if illust_ugoira_meta_result.success() and not illust_ugoira_meta.get('error') and illust_ugoira_meta: + ugoira_meta['frames'] = illust_ugoira_meta['body']['frames'] ugoira_meta['mime_type'] = illust_ugoira_meta['body']['mime_type'] ugoira_meta['originalsrc'] = illust_ugoira_meta['body']['originalSrc'] ugoira_meta['src'] = illust_ugoira_meta['body']['src'] @@ -297,7 +301,7 @@ async def download_illust(self, page: int = None) -> Result.TextResult: """ :param page: 仅下载特定页码 """ - if page < 1: + if page and page < 1: page = None illust_data_result = await self.get_illust_data() @@ -352,6 +356,17 @@ async def download_illust(self, page: int = None) -> Result.TextResult: failed_num = len([x for x in download_result if x.error]) if len(downloaded_list) != len(download_url_list): return Result.TextResult(error=True, info=f'{failed_num} illust download failed', result='') + + # 动图额外保存原始ugoira_meta信息 + if illust_type == 2: + pid = illust_data_result.result.get('pid') + ugoira_meta = illust_data_result.result.get('ugoira_meta') + ugoira_meta_file = os.path.abspath(os.path.join(file_path, f'{pid}_ugoira_meta')) + async with aiofiles.open(ugoira_meta_file, 'w') as f: + await f.write(json.dumps(ugoira_meta)) + downloaded_list.append(ugoira_meta_file) + + # 打包 zip_result = await create_zip_file(files=downloaded_list, file_path=file_path, file_name=str(self.__pid)) return zip_result else: From f794ddd09204a0966cf3606a60fd3751bf0b6893 Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Sun, 2 May 2021 12:03:00 +0800 Subject: [PATCH 10/33] =?UTF-8?q?Upgrade:=20=E4=BC=98=E5=8C=96=E4=BA=86?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E8=BF=9E=E6=8E=A5=E5=BB=BA=E7=AB=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 优化了数据库连接建立 --- omega_miya/utils/Omega_Base/database.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/omega_miya/utils/Omega_Base/database.py b/omega_miya/utils/Omega_Base/database.py index 66499c14..8247e8eb 100644 --- a/omega_miya/utils/Omega_Base/database.py +++ b/omega_miya/utils/Omega_Base/database.py @@ -20,9 +20,16 @@ # 创建数据库连接 -engine = create_async_engine(__DB_ENGINE, encoding='utf8', - connect_args={"use_unicode": True, "charset": "utf8mb4"}, - pool_recycle=3600, pool_pre_ping=True, echo=False) +try: + engine = create_async_engine( + __DB_ENGINE, encoding='utf8', + connect_args={"use_unicode": True, "charset": "utf8mb4"}, + pool_recycle=3600, pool_pre_ping=True, echo=False + ) +except Exception as exp: + import sys + nonebot.logger.opt(colors=True).critical(f'创建数据库连接失败, error: {repr(exp)}') + sys.exit('创建数据库连接失败') async def database_init(): From 9e4a5b856a295a3f497e73f1eff476163806d1be Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Sun, 2 May 2021 12:03:21 +0800 Subject: [PATCH 11/33] =?UTF-8?q?Upgrade:=20=E6=97=A5=E5=BF=97=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - zip_utils 日志调整 --- omega_miya/utils/Omega_plugin_utils/zip_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/omega_miya/utils/Omega_plugin_utils/zip_utils.py b/omega_miya/utils/Omega_plugin_utils/zip_utils.py index d82fa133..eaad3bc8 100644 --- a/omega_miya/utils/Omega_plugin_utils/zip_utils.py +++ b/omega_miya/utils/Omega_plugin_utils/zip_utils.py @@ -32,7 +32,7 @@ def __handle(): try: result = await loop.run_in_executor(None, __handle) except Exception as e: - result = Result.TextResult(error=True, info=repr(e), result='') + result = Result.TextResult(error=True, info=f'create_zip_file failed: {repr(e)}', result='') return result From 603a3571fe3ad8bf204abe6ba4fa2cfc40a81185 Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Sun, 2 May 2021 12:03:42 +0800 Subject: [PATCH 12/33] =?UTF-8?q?Upgrade:=20=E9=87=8D=E6=9E=84=E4=BA=86nh?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重构了nh模块 --- omega_miya/plugins/nhentai/__init__.py | 38 +- omega_miya/utils/nhentai_utils/__init__.py | 501 ++++++++++----------- 2 files changed, 263 insertions(+), 276 deletions(-) diff --git a/omega_miya/plugins/nhentai/__init__.py b/omega_miya/plugins/nhentai/__init__.py index 1179d389..8034fddb 100644 --- a/omega_miya/plugins/nhentai/__init__.py +++ b/omega_miya/plugins/nhentai/__init__.py @@ -10,7 +10,7 @@ from nonebot.adapters.cqhttp.event import GroupMessageEvent from nonebot.adapters.cqhttp.permission import GROUP from omega_miya.utils.Omega_plugin_utils import init_export, init_permission_state -from omega_miya.utils.nhentai_utils import search_gallery_by_tag, download_gallery +from omega_miya.utils.nhentai_utils import NhentaiGallery # Custom plugin usage text @@ -78,15 +78,24 @@ async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_Stat @nhentai.got('sub_command', prompt='执行操作?\n【search / download】') +async def handle_sub_command(bot: Bot, event: GroupMessageEvent, state: T_State): + sub_command = state["sub_command"] + if sub_command not in ['search', 'download']: + await nhentai.finish('没有这个命令哦QAQ') + + @nhentai.got('sub_arg', prompt='tag 或 id?') +async def handle_sub_arg(bot: Bot, event: GroupMessageEvent, state: T_State): + pass + + +@nhentai.handle() async def handle_nhentai(bot: Bot, event: GroupMessageEvent, state: T_State): sub_command = state["sub_command"] sub_arg = state["sub_arg"] - if sub_command not in ['search', 'download']: - await nhentai.finish('没有这个命令哦QAQ') if sub_command == 'search': - search_result = await search_gallery_by_tag(keyword=sub_arg) + search_result = await NhentaiGallery.search_gallery_by_keyword(keyword=sub_arg) if search_result.success(): nh_list = list(search_result.result) msg = '' @@ -105,15 +114,18 @@ async def handle_nhentai(bot: Bot, event: GroupMessageEvent, state: T_State): await nhentai.finish('错误QAQ, id应为纯数字') else: await nhentai.send('正在下载资源, 请稍后~') - status, password, path = await download_gallery(gallery_id=sub_arg) - if not status: - logger.warning(f"Group: {event.group_id}, User: {event.user_id} 下载失败") + download_result = await NhentaiGallery(gallery_id=sub_arg).fetch_gallery() + if download_result.error: + logger.error(f"Group: {event.group_id}, User: {event.user_id} 下载失败") await nhentai.finish('下载失败QAQ, 请稍后再试') else: - file_abs = os.path.abspath(path) - await bot.call_api(api='upload_group_file', - group_id=event.group_id, file=file_abs, name=f'{sub_arg}.7z') - logger.info(f"Group: {event.group_id}, User: {event.user_id} 下载成功") - await nhentai.finish(f'成功, 解压密码: {password}') + file_abs = os.path.abspath(download_result.result) + try: + await bot.call_api(api='upload_group_file', + group_id=event.group_id, file=file_abs, name=download_result.info) + logger.info(f"Group: {event.group_id}, User: {event.user_id} 下载成功") + except Exception as e: + logger.error(f'Group: {event.group_id}, User: {event.user_id} 上传文件失败, {repr(e)}') + await nhentai.finish(f'上传文件失败QAQ') else: - pass + await nhentai.finish('没有这个命令哦QAQ') diff --git a/omega_miya/utils/nhentai_utils/__init__.py b/omega_miya/utils/nhentai_utils/__init__.py index 08255ed3..d15b5f3e 100644 --- a/omega_miya/utils/nhentai_utils/__init__.py +++ b/omega_miya/utils/nhentai_utils/__init__.py @@ -2,28 +2,17 @@ import asyncio import os import json -import hashlib -import py7zr -from typing import Tuple +import random +import string +import aiofiles +from dataclasses import dataclass from bs4 import BeautifulSoup -from nonebot import logger -from omega_miya.utils.Omega_plugin_utils import HttpFetcher +from nonebot import logger, get_driver +from omega_miya.utils.Omega_plugin_utils import HttpFetcher, create_zip_file from omega_miya.utils.Omega_Base import Result -HEADERS = {'accept': '*/*', - 'accept-encoding': 'gzip, deflate', - 'accept-language': 'zh-CN,zh;q=0.9', - 'dnt': '1', - 'referer': 'https://nhentai.net/', - 'sec-ch-ua': '"Google Chrome";v="89", "Chromium";v="89", ";Not A Brand";v="99"', - 'sec-ch-ua-mobile': '?0', - 'sec-fetch-dest': 'document', - 'sec-fetch-mode': 'navigate', - 'sec-fetch-site': 'same-origin', - 'sec-fetch-user': '?1', - 'sec-gpc': '1', - 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' - 'Chrome/89.0.4389.114 Safari/537.36'} +global_config = get_driver().config +TMP_PATH = global_config.tmp_path_ class NHException(Exception): @@ -31,259 +20,245 @@ def __init__(self, *args): super(NHException, self).__init__(*args) -# 通过关键词搜索本子id和标题 -async def search_gallery_by_tag(keyword: str) -> Result.ListResult: - # 搜索关键词 - payload_keyword = {'q': keyword} - search_url = f'https://nhentai.net/search/' - headers = HEADERS.copy() - headers.update({'referer': search_url}) - - fetcher = HttpFetcher(timeout=10, flag='nhentai_search', headers=headers) - html_result = await fetcher.get_text(url=search_url, params=payload_keyword) - if html_result.error: - return Result.ListResult(error=True, info=f'Search keyword failed, {html_result.info}', result=[]) - - search_res = html_result.result - result = [] - try: - gallery_soup = BeautifulSoup(search_res, 'lxml').find_all('div', class_='gallery') - if len(gallery_soup) >= 10: - for item in gallery_soup[0:10]: - gallery_title = item.find('div', class_='caption').get_text(strip=True) - gallery_id = re.sub(r'\D', '', item.find('a', class_='cover').get('href')) - result.append({'id': gallery_id, 'title': gallery_title}) - else: - for item in gallery_soup: - gallery_title = item.find('div', class_='caption').get_text(strip=True) - gallery_id = re.sub(r'\D', '', item.find('a', class_='cover').get('href')) - result.append({'id': gallery_id, 'title': gallery_title}) - return Result.ListResult(error=False, info='Success', result=result) - except Exception as e: - logger.error(f'Nhentai | Parse search result failed, error: {repr(e)}') - return Result.ListResult(error=True, info=f'Parse search result failed', result=[]) - - -# 下载一张图片 -async def download_image(index: int, url: str, local: str) -> Tuple[int, bool]: - # 已经下载过了就不再下载 - if os.path.exists(local): - return index, True - - headers = HEADERS.copy() - headers.update({ - 'sec-fetch-dest': 'image', - 'sec-fetch-mode': 'no-cors', - 'sec-fetch-site': 'cross-site' - }) - - fetcher = HttpFetcher(timeout=30, flag='nhentai_download_image', headers=headers) - bytes_result = await fetcher.get_bytes(url=url) - if bytes_result.error: - return index, False - - try: - with open(f'{local}', 'wb+') as f: - f.write(bytes_result.result) - return index, True - except Exception as e: - logger.error(f'Nhentai | Image downloaded failed, error: {repr(e)}') - return index, False - - -# 并发执行所有下载请求 -async def concurrently_fetch(request_list, pool=10) -> Tuple[bool, list]: - failed_list = [] - all_count = len(request_list) - success_count = 0 - - # 每个切片任务数量为10, 每个切片打包一个任务 - poll_tasks = [] - for i in range(0, all_count, pool): - poll_tasks.append(request_list[i:i + pool]) - - # 提交任务 - # 每个切片打包一个任务 - for poll_task in poll_tasks: - tasks = [] - for req in poll_task: - i, url, local, file_type = req - tasks.append(download_image(index=i, url=url, local=local)) - # 进行异步处理 - _res = await asyncio.gather(*tasks) - # 对结果进行计数 - for index, success in _res: - if success: - success_count += 1 +class Nhentai(object): + HEADERS = {'accept': '*/*', + 'accept-encoding': 'gzip, deflate', + 'accept-language': 'zh-CN,zh;q=0.9', + 'dnt': '1', + 'referer': 'https://nhentai.net/', + 'sec-ch-ua': '"Google Chrome";v="89", "Chromium";v="89", ";Not A Brand";v="99"', + 'sec-ch-ua-mobile': '?0', + 'sec-fetch-dest': 'document', + 'sec-fetch-mode': 'navigate', + 'sec-fetch-site': 'same-origin', + 'sec-fetch-user': '?1', + 'sec-gpc': '1', + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' + 'Chrome/89.0.4389.114 Safari/537.36'} + + @dataclass + class GalleryPage: + index: int + type_: str + width: int + height: int + + # 通过关键词搜索本子id和标题 + @classmethod + async def search_gallery_by_keyword(cls, keyword: str) -> Result.ListResult: + # 搜索关键词 + payload_keyword = {'q': keyword} + search_url = f'https://nhentai.net/search/' + headers = cls.HEADERS.copy() + headers.update({'referer': search_url}) + + fetcher = HttpFetcher(timeout=10, flag='nhentai_search', headers=headers) + html_result = await fetcher.get_text(url=search_url, params=payload_keyword) + if html_result.error: + return Result.ListResult(error=True, info=f'Search keyword failed, {html_result.info}', result=[]) + + search_res = html_result.result + result = [] + try: + gallery_soup = BeautifulSoup(search_res, 'lxml').find_all('div', class_='gallery') + # 只取前10个结果 + if len(gallery_soup) >= 10: + for item in gallery_soup[0:10]: + gallery_title = item.find('div', class_='caption').get_text(strip=True) + gallery_id = re.sub(r'\D', '', item.find('a', class_='cover').get('href')) + result.append({'id': gallery_id, 'title': gallery_title}) else: - failed_list.append(index) - - if success_count == all_count: - all_success = True - else: - all_success = False - - # 返回下载结果 - return all_success, failed_list - - -# 从html文本中找到包含本子数据的那一行 即粗定位数据 -def get_gallery_line_from_html(html_text: str) -> str: - start = html_text.find('window._gallery') - middle_text = html_text[start:] - end = middle_text.find('\n') - return middle_text[:end] - + for item in gallery_soup: + gallery_title = item.find('div', class_='caption').get_text(strip=True) + gallery_id = re.sub(r'\D', '', item.find('a', class_='cover').get('href')) + result.append({'id': gallery_id, 'title': gallery_title}) + return Result.ListResult(error=False, info='Success', result=result) + except Exception as e: + logger.error(f'Nhentai | Parse search result failed, error: {repr(e)}') + return Result.ListResult(error=True, info=f'Parse search result failed', result=[]) -# 从单行JS脚本中取出JSON字符串的部分 细定位 -def get_json_text_from_js_text(js_text: str) -> str: - start_tips = 'JSON.parse' - start = js_text.find(start_tips) - stop = js_text.rindex('"') - start += len(start_tips) + 2 - return js_text[start:stop] +class NhentaiGallery(Nhentai): + def __init__(self, gallery_id: int): + self.gallery_id = gallery_id -# 从JSON字符串解析数据 转为python结构 -def get_dict_from_json_text(json_text: str) -> dict: - # 把字符串中的\u都反解析掉 - decodeable_json_text = json_text.encode('utf-8').decode('unicode_escape') - return json.loads(decodeable_json_text) - - -# 获取gallery信息 -async def get_gallery_data_by_id(gallery_id: int) -> dict: - try: - url = f'https://nhentai.net/g/{gallery_id}/1/' - fetcher = HttpFetcher(timeout=10, flag='nhentai_get_gallery_data', headers=HEADERS) + # 获取gallery信息 + async def get_data(self) -> Result.DictResult: + url = f'https://nhentai.net/g/{self.gallery_id}/1/' + fetcher = HttpFetcher(timeout=10, flag='nhentai_get_gallery_data', headers=self.HEADERS) html_result = await fetcher.get_text(url=url) if html_result.error: - raise Exception(html_result.info) + return Result.DictResult(error=True, info=f'访问本子页面时异常,似乎网络不行. {html_result.info}', result={}) html_text = html_result.result - except Exception as e: - raise NHException(f'访问本子页面时异常,似乎网络不行. Exception: {repr(e)}') - try: - js_text = get_gallery_line_from_html(html_text) - except Exception as e: - raise NHException(f'解析本子信息时异常,读取信息行失败. Exception: {repr(e)}') - try: - json_text = get_json_text_from_js_text(js_text) - except Exception as e: - raise NHException(f'解析本子信息时异常,分割JSON字符串失败. Exception: {repr(e)}') - try: - gallery = get_dict_from_json_text(json_text) - except Exception as e: - raise NHException(f'解析本子信息时异常,解析JSON失败. Exception: {repr(e)}') - return gallery - - -# 给定本子ID 下载所有图片到指定目录 -async def fetch_gallery(gallery_id: int) -> str: - # 获取gallery信息 - gallery = await get_gallery_data_by_id(gallery_id) - # 获取总页数 - total_page_count = len(gallery['images']['pages']) - # 生成每一页对应的图片格式 - every_page_image_type = [] - for num in range(total_page_count): - every_page_image_type.append(gallery['images']['pages'][num]['t']) - # 本子图片的media编号 - media_id = gallery['media_id'] - # 子目录 - nhentai_plugin_path = os.path.dirname(__file__) - sub_dir = os.path.join(nhentai_plugin_path, 'nhentai_gallery', str(gallery_id)) - # 创建子目录 - if not os.path.exists(sub_dir): - os.makedirs(sub_dir) - - # 产生请求序列 - request_list = [] - for i in range(total_page_count): - type_index = i - index = i + 1 - if every_page_image_type[type_index] == 'j': - file_type = 'jpg' - elif every_page_image_type[type_index] == 'p': - file_type = 'png' - else: - file_type = 'undefined' - url = f'https://i.nhentai.net/galleries/{media_id}/{index}.{file_type}' - local = os.path.join(sub_dir, f'{index}.{file_type}') - req = index, url, local, file_type - request_list.append(req) - - # 下载所有图片 - success, failed_list = await concurrently_fetch(request_list) - if not success: - failed_list_str = ','.join([str(x) for x in failed_list]) - raise NHException(f'图片{failed_list_str}下载失败') - - # 打包成7z - file = os.path.join(sub_dir, f'{gallery_id}.7z') - password_file = os.path.join(sub_dir, 'password') - # 密码 - password_hash_str = repr(gallery) - md5 = hashlib.md5() - md5.update(password_hash_str.encode('utf-8')) - password = md5.hexdigest() - - # 异步压缩文件 - async def compress7z(file_: str, password_: str) -> bool: - def __compress7z() -> bool: - try: - # 执行压缩 - with py7zr.SevenZipFile(file_, mode='w', password=password_) as z: - z.set_encrypted_header(True) - manifest_path = os.path.join(sub_dir, 'manifest.json') - with open(manifest_path, 'w') as f: - f.write(json.dumps(gallery)) - z.write(manifest_path, 'manifest.json') - for index_, url_, local_, file_type_ in request_list: - z.write(local_, f'{index_}.{file_type_}') - # 保存密码 - with open(password_file, 'w+', encoding='utf-8') as f: - f.write(password) - return True - except Exception as e: - logger.error(f'Nhentai | Compress file failed, error: {repr(e)}') - return False - - loop = asyncio.get_running_loop() - res = await loop.run_in_executor(None, __compress7z) - return res - - result = await compress7z(file_=file, password_=password) - if not result: - raise NHException(f'创建压缩文件失败') - - return password - - -async def download_gallery(gallery_id: int) -> Tuple[bool, str, str]: - """ - :param gallery_id: ID - :return: Tuple[bool, str, str]: Success status, File Password, File Path - """ - # 子目录 - nhentai_plugin_path = os.path.dirname(__file__) - sub_dir = os.path.join(nhentai_plugin_path, 'nhentai_gallery', str(gallery_id)) - file = os.path.join(sub_dir, f'{gallery_id}.7z') - password_file = os.path.join(sub_dir, 'password') - if os.path.exists(file) and os.path.exists(password_file): - with open(password_file, 'r', encoding='utf-8') as f: - password = f.read() - return True, password, os.path.abspath(file) - - try: - password = await fetch_gallery(gallery_id) - return True, password, os.path.abspath(file) - except Exception as e: - logger.error(f'Nhentai | Gallery downloaded failed, error: {repr(e)}') - return False, '', '' + # 从html文本中找到包含本子数据的那一行 即粗定位数据 + try: + start = html_text.find('window._gallery') + middle_text = html_text[start:] + end = middle_text.find('\n') + js_text = middle_text[:end] + except Exception as e: + return Result.DictResult(error=True, info=f'解析本子信息时异常,读取信息行失败. Exception: {repr(e)}', result={}) + + # 从单行JS脚本中取出JSON字符串的部分 细定位 + try: + start_tips = 'JSON.parse' + start = js_text.find(start_tips) + stop = js_text.rindex('"') + start += len(start_tips) + 2 + json_text = js_text[start:stop] + except Exception as e: + return Result.DictResult(error=True, info=f'解析本子信息时异常,分割JSON字符串失败. Exception: {repr(e)}', result={}) + + # 从JSON字符串解析数据 转为python结构 + try: + # 把字符串中的\u都反解析掉 + decodeable_json_text = json_text.encode('utf-8').decode('unicode_escape') + gallery = json.loads(decodeable_json_text) + except Exception as e: + return Result.DictResult(error=True, info=f'解析本子信息时异常,解析JSON失败. Exception: {repr(e)}', result={}) + + """ + 解析json内容: + { + "id": int, # gallery id + "media_id": str, # media id + "title": { + "english": str, + "japanese": str, + "pretty": str + }, + # 每页图片信息 + "images": { + "pages": [ + { + "t": str, # 图片格式, j 为 jpg , p 为 png + "w": int, # 宽 + "h": int # 高 + }, + ... + ], + # 封面 + "cover": { + "t": str, # 图片格式, j 为 jpg , p 为 png + "w": int, # 宽 + "h": int + }, + # 缩略图 + "thumbnail": { + "t": str, # 图片格式, j 为 jpg , p 为 png + "w": int, # 宽 + "h": int + } + }, + "scanlator": str, + "upload_date": int, + "tags": [ + { + "id": int, + "type": str, + "name": str, + "url": str, + "count": int + }, + ... + ], + "num_pages": int, + "num_favorites": int + } + """ + return Result.DictResult(error=False, info='Success', result=gallery) + + # 给定本子ID 下载所有图片到指定目录 + async def fetch_gallery(self) -> Result.TextResult: + # 获取gallery信息 + gallery_result = await self.get_data() + if gallery_result.error: + return Result.TextResult(error=True, info=f'获取本子信息失败, {gallery_result.info}', result='') + gallery = gallery_result.result + + # 获取总页数 + total_page_count = len(gallery['images']['pages']) + # 处理每一页图片信息 + gallery_pages = [] + for num in range(total_page_count): + page_index = num + 1 + page_width = gallery['images']['pages'][num]['w'] + page_height = gallery['images']['pages'][num]['h'] + page_type = gallery['images']['pages'][num]['t'] + if page_type == 'j': + gallery_pages.append( + self.GalleryPage(index=page_index, width=page_width, height=page_height, type_='jpg')) + elif page_type == 'p': + gallery_pages.append( + self.GalleryPage(index=page_index, width=page_width, height=page_height, type_='png')) + else: + gallery_pages.append( + self.GalleryPage(index=page_index, width=page_width, height=page_height, type_=page_type)) + + # 本子图片的media编号 + media_id = gallery['media_id'] + + # 下载到公用临时目录 + file_path = os.path.abspath(os.path.join(TMP_PATH, 'nhentai_gallery', str(self.gallery_id))) + headers = self.HEADERS.copy() + headers.update({ + 'sec-fetch-dest': 'image', + 'sec-fetch-mode': 'no-cors', + 'sec-fetch-site': 'cross-site' + }) + fetcher = HttpFetcher(timeout=30, flag='nhentai_download_image', headers=headers) + + # 每个切片任务数量为10, 每个切片打包一个任务 + pool = 10 + downloaded_list = [] + failed_num = 0 + for i in range(0, total_page_count, pool): + # 产生请求序列 + tasks = [] + for page in gallery_pages[i:i + pool]: + logger.debug(f'Downloading: {self.gallery_id}/{page} ...') + url = f'https://i.nhentai.net/galleries/{media_id}/{page.index}.{page.type_}' + file_name = os.path.basename(url) + if not file_name: + file_name = f'{page.index}.tmp' + + # 检测文件是否已经存在避免重复下载 + if os.path.exists(os.path.abspath(os.path.join(file_path, file_name))): + downloaded_list.append(os.path.abspath(os.path.join(file_path, file_name))) + logger.debug(f'file: {self.gallery_id}/{file_name} exists, pass.') + continue + + tasks.append(fetcher.download_file(url=url, path=file_path, file_name=file_name)) + + # 开始下载 + download_result = await asyncio.gather(*tasks) + downloaded_list.extend([x.result for x in download_result if x.success()]) + failed_num += len([x for x in download_result if x.error]) + + logger.debug(f'Gallery download completed, success list: {downloaded_list}, failed number: {failed_num}') + if failed_num > 0: + return Result.TextResult(error=True, info=f'{failed_num} page(s) download failed', result='') + + # 生成包含本子原始信息的文件 + manifest_path = os.path.abspath(os.path.join(file_path, f'manifest.json')) + async with aiofiles.open(manifest_path, 'w') as f: + await f.write(json.dumps(gallery)) + downloaded_list.append(manifest_path) + + # 生成一段随机字符串改变打包后zip文件的hash + rand_str = ''.join(random.choices(string.ascii_letters + string.digits, k=1024)) + rand_file = os.path.abspath(os.path.join(file_path, f'mask')) + async with aiofiles.open(rand_file, 'w') as f: + await f.write(rand_str) + downloaded_list.append(rand_file) + + # 打包 + zip_result = await create_zip_file(files=downloaded_list, file_path=file_path, file_name=str(self.gallery_id)) + + return zip_result __all__ = [ - 'search_gallery_by_tag', - 'download_gallery' + 'NhentaiGallery' ] From 2622383678ab34cd4361ed8010b57e5fb0e9f345 Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Sun, 2 May 2021 12:03:53 +0800 Subject: [PATCH 13/33] =?UTF-8?q?Upgrade:=20=E4=BE=9D=E8=B5=96=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 依赖更新 --- requirements.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index 4cc71fbc..e7df2993 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ nonebot2==2.0.0a13.post1 nonebot-adapter-cqhttp==2.0.0a13 -SQLAlchemy~=1.4.11 +SQLAlchemy~=1.4.12 mysqlclient~=2.0.3 aiomysql~=0.0.21 aiocqhttp~=1.3.0 @@ -16,5 +16,4 @@ ujson~=4.0.2 msgpack~=1.0.2 pydantic~=1.8.1 APScheduler~=3.7.0 -pycryptodome~=3.10.1 -py7zr==0.15.2 \ No newline at end of file +pycryptodome~=3.10.1 \ No newline at end of file From 82c20f714dd643e14ae250548add7d03799e3429 Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Sun, 2 May 2021 13:48:37 +0800 Subject: [PATCH 14/33] =?UTF-8?q?Upgrade:=20zip=5Futils=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=B7=BB=E5=8A=A07z=E5=8E=8B=E7=BC=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - zip_utils模块添加7z压缩 --- .../utils/Omega_plugin_utils/__init__.py | 5 ++- .../utils/Omega_plugin_utils/zip_utils.py | 37 ++++++++++++++++++- requirements.txt | 3 +- 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/omega_miya/utils/Omega_plugin_utils/__init__.py b/omega_miya/utils/Omega_plugin_utils/__init__.py index 808fb078..0f55a274 100644 --- a/omega_miya/utils/Omega_plugin_utils/__init__.py +++ b/omega_miya/utils/Omega_plugin_utils/__init__.py @@ -7,7 +7,7 @@ from .permission import * from .http_fetcher import HttpFetcher from .picture_encoder import PicEncoder -from .zip_utils import create_zip_file +from .zip_utils import create_zip_file, create_7z_file def init_export( @@ -61,5 +61,6 @@ def init_permission_state( 'check_auth_node', 'HttpFetcher', 'PicEncoder', - 'create_zip_file' + 'create_zip_file', + 'create_7z_file' ] diff --git a/omega_miya/utils/Omega_plugin_utils/zip_utils.py b/omega_miya/utils/Omega_plugin_utils/zip_utils.py index eaad3bc8..bf51f02d 100644 --- a/omega_miya/utils/Omega_plugin_utils/zip_utils.py +++ b/omega_miya/utils/Omega_plugin_utils/zip_utils.py @@ -1,5 +1,6 @@ import os import zipfile +import py7zr import asyncio from typing import List from nonebot.log import logger @@ -37,6 +38,40 @@ def __handle(): return result +def __create_7z_file(files: List[str], file_path: str, file_name: str, password: str) -> Result.TextResult: + # 检查文件路径 + folder_path = os.path.abspath(file_path) + if not os.path.exists(folder_path): + os.makedirs(folder_path) + z7z_file_path = os.path.abspath(os.path.join(folder_path, f'{file_name}.7z')) + with py7zr.SevenZipFile(z7z_file_path, mode='w', password=password) as zf: + zf.set_encrypted_header(True) + for file in files: + file_path = os.path.abspath(file) + arcname = os.path.basename(file_path) + if os.path.exists(file_path): + zf.write(file_path, arcname=arcname) + else: + logger.warning(f'create_zip_file: file not exists: {file}, ignore') + + return Result.TextResult(error=False, info=f'{file_name}.7z', result=z7z_file_path) + + +async def create_7z_file(files: List[str], file_path: str, file_name: str, password: str) -> Result.TextResult: + def __handle(): + return __create_7z_file(files, file_path, file_name, password) + + loop = asyncio.get_running_loop() + + try: + result = await loop.run_in_executor(None, __handle) + except Exception as e: + result = Result.TextResult(error=True, info=f'create_7z_file failed: {repr(e)}', result='') + + return result + + __all__ = [ - 'create_zip_file' + 'create_zip_file', + 'create_7z_file' ] diff --git a/requirements.txt b/requirements.txt index e7df2993..ceab188b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,4 +16,5 @@ ujson~=4.0.2 msgpack~=1.0.2 pydantic~=1.8.1 APScheduler~=3.7.0 -pycryptodome~=3.10.1 \ No newline at end of file +pycryptodome~=3.10.1 +py7zr==0.15.2 \ No newline at end of file From 52672f877300e96624c9480518ca68fb0ad96a02 Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Sun, 2 May 2021 13:49:04 +0800 Subject: [PATCH 15/33] =?UTF-8?q?Upgrade:=20nh=E6=A8=A1=E5=9D=97=E6=94=B9?= =?UTF-8?q?=E5=9B=9E=E4=BD=BF=E7=94=A8=E5=B8=A6=E5=AF=86=E7=A0=81=E7=9A=84?= =?UTF-8?q?7z=E6=96=87=E4=BB=B6=E5=8E=8B=E7=BC=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - nh模块改回使用带密码的7z文件压缩 --- omega_miya/plugins/nhentai/__init__.py | 11 +++++--- omega_miya/utils/nhentai_utils/__init__.py | 32 ++++++++++++++++------ 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/omega_miya/plugins/nhentai/__init__.py b/omega_miya/plugins/nhentai/__init__.py index 8034fddb..18af7fea 100644 --- a/omega_miya/plugins/nhentai/__init__.py +++ b/omega_miya/plugins/nhentai/__init__.py @@ -116,16 +116,19 @@ async def handle_nhentai(bot: Bot, event: GroupMessageEvent, state: T_State): await nhentai.send('正在下载资源, 请稍后~') download_result = await NhentaiGallery(gallery_id=sub_arg).fetch_gallery() if download_result.error: - logger.error(f"Group: {event.group_id}, User: {event.user_id} 下载失败") + logger.error(f"Group: {event.group_id}, User: {event.user_id} 下载失败, {download_result.info}") await nhentai.finish('下载失败QAQ, 请稍后再试') else: - file_abs = os.path.abspath(download_result.result) + password = download_result.result.get('password') + file_name = download_result.result.get('file_name') + file_path = os.path.abspath(download_result.result.get('file_path')) + await nhentai.send(f'下载完成, 密码: {password}, 正在上传文件, 可能需要一段时间...') try: await bot.call_api(api='upload_group_file', - group_id=event.group_id, file=file_abs, name=download_result.info) + group_id=event.group_id, file=file_path, name=file_name) logger.info(f"Group: {event.group_id}, User: {event.user_id} 下载成功") except Exception as e: logger.error(f'Group: {event.group_id}, User: {event.user_id} 上传文件失败, {repr(e)}') - await nhentai.finish(f'上传文件失败QAQ') + await nhentai.finish(f'上传文件失败QAQ, 获取上传结果超时, 请等待1~2分钟后再重试') else: await nhentai.finish('没有这个命令哦QAQ') diff --git a/omega_miya/utils/nhentai_utils/__init__.py b/omega_miya/utils/nhentai_utils/__init__.py index d15b5f3e..dcc25f39 100644 --- a/omega_miya/utils/nhentai_utils/__init__.py +++ b/omega_miya/utils/nhentai_utils/__init__.py @@ -8,7 +8,7 @@ from dataclasses import dataclass from bs4 import BeautifulSoup from nonebot import logger, get_driver -from omega_miya.utils.Omega_plugin_utils import HttpFetcher, create_zip_file +from omega_miya.utils.Omega_plugin_utils import HttpFetcher, create_7z_file from omega_miya.utils.Omega_Base import Result global_config = get_driver().config @@ -169,12 +169,12 @@ async def get_data(self) -> Result.DictResult: """ return Result.DictResult(error=False, info='Success', result=gallery) - # 给定本子ID 下载所有图片到指定目录 - async def fetch_gallery(self) -> Result.TextResult: + # 下载所有图片到指定目录 + async def fetch_gallery(self) -> Result.DictResult: # 获取gallery信息 gallery_result = await self.get_data() if gallery_result.error: - return Result.TextResult(error=True, info=f'获取本子信息失败, {gallery_result.info}', result='') + return Result.DictResult(error=True, info=f'获取本子信息失败, {gallery_result.info}', result={}) gallery = gallery_result.result # 获取总页数 @@ -238,7 +238,7 @@ async def fetch_gallery(self) -> Result.TextResult: logger.debug(f'Gallery download completed, success list: {downloaded_list}, failed number: {failed_num}') if failed_num > 0: - return Result.TextResult(error=True, info=f'{failed_num} page(s) download failed', result='') + return Result.DictResult(error=True, info=f'{failed_num} page(s) download failed', result={}) # 生成包含本子原始信息的文件 manifest_path = os.path.abspath(os.path.join(file_path, f'manifest.json')) @@ -246,17 +246,31 @@ async def fetch_gallery(self) -> Result.TextResult: await f.write(json.dumps(gallery)) downloaded_list.append(manifest_path) - # 生成一段随机字符串改变打包后zip文件的hash + # 生成一段随机字符串改变打包后压缩文件的hash rand_str = ''.join(random.choices(string.ascii_letters + string.digits, k=1024)) rand_file = os.path.abspath(os.path.join(file_path, f'mask')) async with aiofiles.open(rand_file, 'w') as f: await f.write(rand_str) downloaded_list.append(rand_file) - # 打包 - zip_result = await create_zip_file(files=downloaded_list, file_path=file_path, file_name=str(self.gallery_id)) + # 生成压缩包随机密码 + password_str = ''.join(random.sample(string.ascii_letters + string.digits, k=8)) + password_file = os.path.abspath(os.path.join(file_path, f'password')) + async with aiofiles.open(password_file, 'w') as f: + await f.write(password_str) - return zip_result + # 打包 + c7z_result = await create_7z_file( + files=downloaded_list, file_path=file_path, file_name=str(self.gallery_id), password=password_str) + if c7z_result.error: + return Result.DictResult(error=True, info=f'创建压缩文件失败, error: {c7z_result.info}', result={}) + else: + result = { + 'password': password_str, + 'file_name': c7z_result.info, + 'file_path': c7z_result.result + } + return Result.DictResult(error=False, info='Success', result=result) __all__ = [ From 171c00fd5e130c023d565baa242856ae45581dcf Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Mon, 3 May 2021 22:30:28 +0800 Subject: [PATCH 16/33] =?UTF-8?q?Change:=20=E6=8F=92=E4=BB=B6=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 日志文本调整 - 交互文本调整 - pixiv模块下载图片超时时间调整 --- omega_miya/plugins/nhentai/__init__.py | 2 +- omega_miya/utils/nhentai_utils/__init__.py | 6 +++--- omega_miya/utils/pixiv_utils/pixiv.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/omega_miya/plugins/nhentai/__init__.py b/omega_miya/plugins/nhentai/__init__.py index 18af7fea..1c319565 100644 --- a/omega_miya/plugins/nhentai/__init__.py +++ b/omega_miya/plugins/nhentai/__init__.py @@ -129,6 +129,6 @@ async def handle_nhentai(bot: Bot, event: GroupMessageEvent, state: T_State): logger.info(f"Group: {event.group_id}, User: {event.user_id} 下载成功") except Exception as e: logger.error(f'Group: {event.group_id}, User: {event.user_id} 上传文件失败, {repr(e)}') - await nhentai.finish(f'上传文件失败QAQ, 获取上传结果超时, 请等待1~2分钟后再重试') + await nhentai.finish(f'获取上传结果超时或上传失败QAQ, 上传可能仍在进行中, 请等待2~5分钟后再重试') else: await nhentai.finish('没有这个命令哦QAQ') diff --git a/omega_miya/utils/nhentai_utils/__init__.py b/omega_miya/utils/nhentai_utils/__init__.py index dcc25f39..b146b8da 100644 --- a/omega_miya/utils/nhentai_utils/__init__.py +++ b/omega_miya/utils/nhentai_utils/__init__.py @@ -217,7 +217,7 @@ async def fetch_gallery(self) -> Result.DictResult: # 产生请求序列 tasks = [] for page in gallery_pages[i:i + pool]: - logger.debug(f'Downloading: {self.gallery_id}/{page} ...') + logger.debug(f'Nhentai | Downloading: {self.gallery_id}/{page} ...') url = f'https://i.nhentai.net/galleries/{media_id}/{page.index}.{page.type_}' file_name = os.path.basename(url) if not file_name: @@ -226,7 +226,7 @@ async def fetch_gallery(self) -> Result.DictResult: # 检测文件是否已经存在避免重复下载 if os.path.exists(os.path.abspath(os.path.join(file_path, file_name))): downloaded_list.append(os.path.abspath(os.path.join(file_path, file_name))) - logger.debug(f'file: {self.gallery_id}/{file_name} exists, pass.') + logger.debug(f'Nhentai | File: {self.gallery_id}/{file_name} exists, pass.') continue tasks.append(fetcher.download_file(url=url, path=file_path, file_name=file_name)) @@ -236,7 +236,7 @@ async def fetch_gallery(self) -> Result.DictResult: downloaded_list.extend([x.result for x in download_result if x.success()]) failed_num += len([x for x in download_result if x.error]) - logger.debug(f'Gallery download completed, success list: {downloaded_list}, failed number: {failed_num}') + logger.debug(f'Nhentai | Gallery download completed, succeed: {downloaded_list}, failed number: {failed_num}') if failed_num > 0: return Result.DictResult(error=True, info=f'{failed_num} page(s) download failed', result={}) diff --git a/omega_miya/utils/pixiv_utils/pixiv.py b/omega_miya/utils/pixiv_utils/pixiv.py index a6373eea..c211568c 100644 --- a/omega_miya/utils/pixiv_utils/pixiv.py +++ b/omega_miya/utils/pixiv_utils/pixiv.py @@ -331,7 +331,7 @@ async def download_illust(self, page: int = None) -> Result.TextResult: 'sec-fetch-site': 'cross-site' }) - fetcher = HttpFetcher(timeout=45, attempt_limit=2, flag='pixiv_utils_download_illust', headers=headers) + fetcher = HttpFetcher(timeout=60, attempt_limit=2, flag='pixiv_utils_download_illust', headers=headers) file_path = os.path.abspath(os.path.join(TMP_PATH, 'pixiv_illust')) if len(download_url_list) == 1: From 003a7733938511e27ea1fd7bc7be14edaabf2075 Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Mon, 3 May 2021 22:31:06 +0800 Subject: [PATCH 17/33] =?UTF-8?q?Add:=20=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0Friend=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 数据库添加Friend表 --- omega_miya/utils/Omega_Base/__init__.py | 3 +- omega_miya/utils/Omega_Base/model/__init__.py | 2 + omega_miya/utils/Omega_Base/model/friend.py | 106 ++++++++++++++++++ omega_miya/utils/Omega_Base/tables.py | 34 +++++- 4 files changed, 143 insertions(+), 2 deletions(-) create mode 100644 omega_miya/utils/Omega_Base/model/friend.py diff --git a/omega_miya/utils/Omega_Base/__init__.py b/omega_miya/utils/Omega_Base/__init__.py index 359e71b7..855c9333 100644 --- a/omega_miya/utils/Omega_Base/__init__.py +++ b/omega_miya/utils/Omega_Base/__init__.py @@ -6,7 +6,7 @@ from .database import DBTable from .class_result import Result from .model import \ - DBUser, DBGroup, DBSkill, DBSubscription, DBDynamic, \ + DBUser, DBFriend, DBGroup, DBSkill, DBSubscription, DBDynamic, \ DBPixivillust, DBPixivtag, DBPixivision, \ DBEmail, DBEmailBox, DBHistory, DBAuth, DBCoolDownEvent, DBStatus @@ -14,6 +14,7 @@ __all__ = [ 'DBTable', 'DBUser', + 'DBFriend', 'DBGroup', 'DBSkill', 'DBSubscription', diff --git a/omega_miya/utils/Omega_Base/model/__init__.py b/omega_miya/utils/Omega_Base/model/__init__.py index 39c15b15..11be0c66 100644 --- a/omega_miya/utils/Omega_Base/model/__init__.py +++ b/omega_miya/utils/Omega_Base/model/__init__.py @@ -1,6 +1,7 @@ from .auth import DBAuth from .bilidynamic import DBDynamic from .cooldown import DBCoolDownEvent +from .friend import DBFriend from .group import DBGroup from .history import DBHistory from .mail import DBEmail, DBEmailBox @@ -16,6 +17,7 @@ 'DBAuth', 'DBDynamic', 'DBCoolDownEvent', + 'DBFriend', 'DBGroup', 'DBHistory', 'DBEmail', diff --git a/omega_miya/utils/Omega_Base/model/friend.py b/omega_miya/utils/Omega_Base/model/friend.py new file mode 100644 index 00000000..7db6ec72 --- /dev/null +++ b/omega_miya/utils/Omega_Base/model/friend.py @@ -0,0 +1,106 @@ +from omega_miya.utils.Omega_Base.database import NBdb +from omega_miya.utils.Omega_Base.class_result import Result +from omega_miya.utils.Omega_Base.tables import Friends +from .user import DBUser +from typing import Optional +from datetime import datetime +from sqlalchemy.future import select +from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound + + +class DBFriend(DBUser): + async def set_friend( + self, nickname: str, remark: Optional[str] = None, private_permissions: Optional[int] = None + ) -> Result.IntResult: + + user_id_result = await self.id() + if user_id_result.error: + return Result.IntResult(error=True, info='User not exist', result=-1) + + async_session = NBdb().get_async_session() + async with async_session() as session: + try: + async with session.begin(): + try: + session_result = await session.execute( + select(Friends).where(Friends.user_id == user_id_result.result) + ) + exist_friend = session_result.scalar_one() + exist_friend.nickname = nickname + exist_friend.remark = remark + if private_permissions: + exist_friend.private_permissions = private_permissions + exist_friend.updated_at = datetime.now() + result = Result.IntResult(error=False, info='Success upgraded', result=0) + except NoResultFound: + if private_permissions: + new_friend = Friends(user_id=user_id_result.result, nickname=nickname, remark=remark, + private_permissions=private_permissions, created_at=datetime.now()) + else: + new_friend = Friends(user_id=user_id_result.result, nickname=nickname, remark=remark, + private_permissions=0, created_at=datetime.now()) + session.add(new_friend) + result = Result.IntResult(error=False, info='Success added', result=0) + await session.commit() + except MultipleResultsFound: + await session.rollback() + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) + except Exception as e: + await session.rollback() + result = Result.IntResult(error=True, info=repr(e), result=-1) + return result + + async def del_friend(self) -> Result.IntResult: + user_id_result = await self.id() + if user_id_result.error: + return Result.IntResult(error=True, info='User not exist', result=-1) + + async_session = NBdb().get_async_session() + async with async_session() as session: + try: + async with session.begin(): + session_result = await session.execute( + select(Friends).where(Friends.user_id == user_id_result.result) + ) + exist_friend = session_result.scalar_one() + await session.delete(exist_friend) + await session.commit() + result = Result.IntResult(error=False, info='Success', result=0) + except NoResultFound: + await session.rollback() + result = Result.IntResult(error=True, info='NoResultFound', result=-1) + except MultipleResultsFound: + await session.rollback() + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) + except Exception as e: + await session.rollback() + result = Result.IntResult(error=True, info=repr(e), result=-1) + return result + + async def set_private_permission(self, private_permissions: int) -> Result.IntResult: + user_id_result = await self.id() + if user_id_result.error: + return Result.IntResult(error=True, info='User not exist', result=-1) + + async_session = NBdb().get_async_session() + async with async_session() as session: + try: + async with session.begin(): + session_result = await session.execute( + select(Friends).where(Friends.user_id == user_id_result.result) + ) + exist_friend = session_result.scalar_one() + exist_friend.private_permissions = private_permissions + exist_friend.updated_at = datetime.now() + await session.commit() + result = Result.IntResult(error=False, info='Success upgraded', result=0) + except NoResultFound: + await session.rollback() + result = Result.IntResult(error=True, info='NoResultFound', result=-1) + except MultipleResultsFound: + await session.rollback() + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) + except Exception as e: + await session.rollback() + result = Result.IntResult(error=True, info=repr(e), result=-1) + return result diff --git a/omega_miya/utils/Omega_Base/tables.py b/omega_miya/utils/Omega_Base/tables.py index 80742b24..18417b9a 100644 --- a/omega_miya/utils/Omega_Base/tables.py +++ b/omega_miya/utils/Omega_Base/tables.py @@ -46,12 +46,14 @@ class User(Base): id = Column(Integer, Sequence('users_id_seq'), primary_key=True, nullable=False, index=True, unique=True) qq = Column(BigInteger, nullable=False, index=True, unique=True, comment='QQ号') nickname = Column(String(64), nullable=False, comment='昵称') - is_friend = Column(Integer, nullable=False, comment='是否为好友') + is_friend = Column(Integer, nullable=False, comment='是否为好友(已弃用)') aliasname = Column(String(64), nullable=True, comment='自定义名称') created_at = Column(DateTime, nullable=True) updated_at = Column(DateTime, nullable=True) # 声明外键联系 + has_friends = relationship('Friends', back_populates='user_friend', uselist=False, + cascade="all, delete", passive_deletes=True) has_skills = relationship('UserSkill', back_populates='user_skill', cascade="all, delete", passive_deletes=True) in_which_groups = relationship('UserGroup', back_populates='user_groups', @@ -74,6 +76,36 @@ def __repr__(self): f"is_friend='{self.is_friend}', created_at='{self.created_at}', updated_at='{self.updated_at}')>" +# 好友表 +class Friends(Base): + __tablename__ = f'{TABLE_PREFIX}friends' + __table_args__ = {'mysql_engine': 'InnoDB', 'mysql_charset': 'utf8mb4'} + + # 表结构 + id = Column(Integer, Sequence('friends_id_seq'), primary_key=True, nullable=False, index=True, unique=True) + user_id = Column(Integer, ForeignKey(f'{TABLE_PREFIX}users.id'), nullable=False) + nickname = Column(String(64), nullable=False, comment='昵称') + remark = Column(String(64), nullable=True, comment='备注') + private_permissions = Column(Integer, nullable=False, comment='是否启用私聊权限') + created_at = Column(DateTime, nullable=True) + updated_at = Column(DateTime, nullable=True) + + user_friend = relationship('User', back_populates='has_friends') + + def __init__(self, user_id, nickname, remark=None, private_permissions=0, created_at=None, updated_at=None): + self.user_id = user_id + self.nickname = nickname + self.remark = remark + self.private_permissions = private_permissions + self.created_at = created_at + self.updated_at = updated_at + + def __repr__(self): + return f"" + + # 技能表 class Skill(Base): __tablename__ = f'{TABLE_PREFIX}skills' From 0f72d5a6144a9ddaf21cebbdf261cc9d18800d27 Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Tue, 4 May 2021 11:25:41 +0800 Subject: [PATCH 18/33] =?UTF-8?q?Add:=20=E5=A2=9E=E5=8A=A0=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=A5=BD=E5=8F=8B=E4=BF=A1=E6=81=AF=E7=9A=84=E8=AE=A1?= =?UTF-8?q?=E5=88=92=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 增加更新好友信息的计划任务 --- .../Omega_manage/sys_background_scheduled.py | 67 ++++++++++++++++++- omega_miya/utils/Omega_Base/model/friend.py | 45 ++++++++++++- 2 files changed, 110 insertions(+), 2 deletions(-) diff --git a/omega_miya/plugins/Omega_manage/sys_background_scheduled.py b/omega_miya/plugins/Omega_manage/sys_background_scheduled.py index 6f87f1f7..abca5ebc 100644 --- a/omega_miya/plugins/Omega_manage/sys_background_scheduled.py +++ b/omega_miya/plugins/Omega_manage/sys_background_scheduled.py @@ -3,7 +3,7 @@ """ import nonebot from nonebot import logger, require -from omega_miya.utils.Omega_Base import DBGroup, DBUser, DBStatus, DBCoolDownEvent +from omega_miya.utils.Omega_Base import DBGroup, DBUser, DBFriend, DBStatus, DBCoolDownEvent from omega_miya.utils.Omega_plugin_utils import HttpFetcher @@ -37,6 +37,7 @@ misfire_grace_time=300 ) async def refresh_group_info(): + logger.debug('refresh_group_info: Start task') from nonebot import get_bots for bot_id, bot in get_bots().items(): @@ -88,6 +89,70 @@ async def refresh_group_info(): await group.init_member_status() logger.info(f'Refresh group info completed, Bot: {bot_id}, Group: {group_id}') + logger.debug('refresh_group_info: Task finish') + + +# 创建自动更新好友信息的定时任务 +@scheduler.scheduled_job( + 'cron', + # year=None, + # month=None, + # day='*/1', + # week=None, + # day_of_week=None, + hour='*/1', + # minute='*/1', + # second='*/10', + # start_date=None, + # end_date=None, + # timezone=None, + id='refresh_friends_info', + coalesce=True, + misfire_grace_time=120 +) +async def refresh_friends_info(): + logger.debug('refresh_friends_info: Start task') + from nonebot import get_bots + + for bot_id, bot in get_bots().items(): + friends_list = await bot.call_api('get_friend_list') + # 首先清除非好友 + exist_friend_result = await DBFriend.list_exist_friends() + if exist_friend_result.error: + logger.error(f'Refresh friends info failed, get exist friend list failed: {exist_friend_result.info}') + return + + exist_friend_list = exist_friend_result.result + actual_friend_list = [int(x.get('user_id')) for x in friends_list] + del_member_list = list(set(exist_friend_list).difference(set(actual_friend_list))) + + for user in del_member_list: + del_result = await DBFriend(user_id=user).del_friend() + if del_result.error: + logger.warning(f'Del expire friend user {user} failed, {del_result.info}') + + # 更新好友信息 + for friend in friends_list: + user_id = int(friend.get('user_id')) + nickname = friend.get('nickname') + remark = friend.get('remark') + + friend = DBFriend(user_id=user_id) + # 更新用户表 + add_user_result = await friend.add(nickname=nickname) + if add_user_result.error: + logger.warning(f'Add friend user {user_id} failed, {add_user_result.info}') + continue + + # 更新好友表 + add_friend_result = await friend.set_friend(nickname=nickname, remark=remark) + if add_friend_result.error: + logger.warning(f'Add friend user {user_id} failed, {add_user_result.info}') + + logger.debug(f'Refresh friends info, upgrade friend user {user_id} info') + + logger.info(f'Refresh friends info completed, Bot: {bot_id}') + logger.debug('refresh_friends_info: Task finish') # 创建用于刷新冷却事件的定时任务 diff --git a/omega_miya/utils/Omega_Base/model/friend.py b/omega_miya/utils/Omega_Base/model/friend.py index 7db6ec72..2aaf11c3 100644 --- a/omega_miya/utils/Omega_Base/model/friend.py +++ b/omega_miya/utils/Omega_Base/model/friend.py @@ -1,6 +1,6 @@ from omega_miya.utils.Omega_Base.database import NBdb from omega_miya.utils.Omega_Base.class_result import Result -from omega_miya.utils.Omega_Base.tables import Friends +from omega_miya.utils.Omega_Base.tables import Friends, User from .user import DBUser from typing import Optional from datetime import datetime @@ -9,6 +9,27 @@ class DBFriend(DBUser): + @classmethod + async def list_exist_friends(cls) -> Result.ListResult: + async_session = NBdb().get_async_session() + async with async_session() as session: + try: + async with session.begin(): + session_result = await session.execute( + select(User.qq). + join(Friends). + where(User.id == Friends.user_id) + ) + exist_friends = [x for x in session_result.scalars().all()] + result = Result.ListResult(error=False, info='Success', result=exist_friends) + except NoResultFound: + result = Result.ListResult(error=True, info='NoResultFound', result=[]) + except MultipleResultsFound: + result = Result.ListResult(error=True, info='MultipleResultsFound', result=[]) + except Exception as e: + result = Result.ListResult(error=True, info=repr(e), result=[]) + return result + async def set_friend( self, nickname: str, remark: Optional[str] = None, private_permissions: Optional[int] = None ) -> Result.IntResult: @@ -104,3 +125,25 @@ async def set_private_permission(self, private_permissions: int) -> Result.IntRe await session.rollback() result = Result.IntResult(error=True, info=repr(e), result=-1) return result + + async def get_private_permission(self) -> Result.IntResult: + user_id_result = await self.id() + if user_id_result.error: + return Result.IntResult(error=True, info='User not exist', result=-1) + + async_session = NBdb().get_async_session() + async with async_session() as session: + try: + async with session.begin(): + session_result = await session.execute( + select(Friends.private_permissions).where(Friends.user_id == user_id_result.result) + ) + private_permissions = session_result.scalar_one() + result = Result.IntResult(error=False, info='Success', result=private_permissions) + except NoResultFound: + result = Result.IntResult(error=True, info='NoResultFound', result=-2) + except MultipleResultsFound: + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) + except Exception as e: + result = Result.IntResult(error=True, info=repr(e), result=-1) + return result From 6869b43d452dfa9709667291d1c863008b64725b Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Tue, 4 May 2021 22:08:38 +0800 Subject: [PATCH 19/33] =?UTF-8?q?Change:=20=E6=8F=92=E4=BB=B6=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 调了下GalleryPage所属类 --- omega_miya/utils/nhentai_utils/__init__.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/omega_miya/utils/nhentai_utils/__init__.py b/omega_miya/utils/nhentai_utils/__init__.py index b146b8da..378c7a09 100644 --- a/omega_miya/utils/nhentai_utils/__init__.py +++ b/omega_miya/utils/nhentai_utils/__init__.py @@ -36,13 +36,6 @@ class Nhentai(object): 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/89.0.4389.114 Safari/537.36'} - @dataclass - class GalleryPage: - index: int - type_: str - width: int - height: int - # 通过关键词搜索本子id和标题 @classmethod async def search_gallery_by_keyword(cls, keyword: str) -> Result.ListResult: @@ -82,6 +75,13 @@ class NhentaiGallery(Nhentai): def __init__(self, gallery_id: int): self.gallery_id = gallery_id + @dataclass + class GalleryPage: + index: int + type_: str + width: int + height: int + # 获取gallery信息 async def get_data(self) -> Result.DictResult: url = f'https://nhentai.net/g/{self.gallery_id}/1/' From d6c5550f02dc6b0291a44dda9d6079b9ca2007ed Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Tue, 4 May 2021 22:08:54 +0800 Subject: [PATCH 20/33] =?UTF-8?q?Upgrade:=20Result=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Result类型调整 --- omega_miya/utils/Omega_Base/class_result.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/omega_miya/utils/Omega_Base/class_result.py b/omega_miya/utils/Omega_Base/class_result.py index cf0d417b..717f971f 100644 --- a/omega_miya/utils/Omega_Base/class_result.py +++ b/omega_miya/utils/Omega_Base/class_result.py @@ -1,5 +1,5 @@ from dataclasses import dataclass -from typing import Dict, List, Set, Tuple, Any +from typing import Dict, List, Set, Tuple, Union, Any @dataclass @@ -38,7 +38,7 @@ def __repr__(self): @dataclass class JsonDictResult(BaseResult): - result: Dict[Any, dict] + result: Dict[str, Union[str, int, bool, list, dict]] def __repr__(self): return f'' From cdf2e7c172d9c810f038b4a8326156a86b8867fe Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Tue, 4 May 2021 22:09:42 +0800 Subject: [PATCH 21/33] =?UTF-8?q?Upgrade:=20=E6=9D=83=E9=99=90=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E6=B7=BB=E5=8A=A0=E5=A5=BD=E5=8F=8B=E7=A7=81=E8=81=8A?= =?UTF-8?q?=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 权限模块添加好友私聊验证 --- omega_miya/utils/Omega_Permission/__init__.py | 55 +++++++++++++------ .../utils/Omega_plugin_utils/__init__.py | 2 + .../utils/Omega_plugin_utils/permission.py | 15 ++++- omega_miya/utils/Omega_plugin_utils/rules.py | 21 ++++++- 4 files changed, 73 insertions(+), 20 deletions(-) diff --git a/omega_miya/utils/Omega_Permission/__init__.py b/omega_miya/utils/Omega_Permission/__init__.py index a657bb53..7ecde8e8 100644 --- a/omega_miya/utils/Omega_Permission/__init__.py +++ b/omega_miya/utils/Omega_Permission/__init__.py @@ -4,12 +4,20 @@ from nonebot.typing import T_State from nonebot.matcher import Matcher from nonebot.adapters.cqhttp.bot import Bot -from nonebot.adapters.cqhttp.event import Event -from omega_miya.utils.Omega_plugin_utils import check_command_permission, check_permission_level, check_auth_node +from nonebot.adapters.cqhttp.event import MessageEvent, GroupMessageEvent, PrivateMessageEvent +from omega_miya.utils.Omega_plugin_utils import \ + check_command_permission, check_permission_level, check_auth_node, check_friend_private_permission @run_preprocessor -async def handle_plugin_permission(matcher: Matcher, bot: Bot, event: Event, state: T_State): +async def handle_plugin_permission(matcher: Matcher, bot: Bot, event: MessageEvent, state: T_State): + if isinstance(event, PrivateMessageEvent) and event.sub_type == "friend": + private_mode = True + elif isinstance(event, GroupMessageEvent): + private_mode = False + else: + private_mode = False + group_id = event.dict().get('group_id') user_id = event.dict().get('user_id') @@ -25,27 +33,42 @@ async def handle_plugin_permission(matcher: Matcher, bot: Bot, event: Event, sta matcher_permission_level = matcher_default_state.get('_permission_level') matcher_auth_node = matcher_default_state.get('_auth_node') - # 检查command权限 - if matcher_command_permission: - command_checker = await check_command_permission(group_id=group_id) - if command_checker: - pass - else: - await bot.send(event=event, message=f'没有群组命令权限QAQ') - raise IgnoredException('没有群组命令权限') + # 检查command/friend_private权限 + if private_mode: + if matcher_command_permission: + command_checker = await check_friend_private_permission(user_id=user_id) + if command_checker: + pass + else: + await bot.send(event=event, message=f'没有好友命令权限QAQ') + raise IgnoredException('没有好友命令权限') + else: + if matcher_command_permission: + command_checker = await check_command_permission(group_id=group_id) + if command_checker: + pass + else: + await bot.send(event=event, message=f'没有群组命令权限QAQ') + raise IgnoredException('没有群组命令权限') - # 检查权限等级 - if matcher_permission_level: - level_checker = await check_permission_level(group_id=group_id, level=matcher_permission_level) + # 检查权限等级 好友私聊跳过 + if private_mode: + level_checker = True else: - level_checker = False + if matcher_permission_level: + level_checker = await check_permission_level(group_id=group_id, level=matcher_permission_level) + else: + level_checker = False # 检查权限节点 if matcher_auth_node: auth_node = '.'.join([matcher.module, matcher_auth_node]) # 分别检查用户及群组权限节点 user_auth_checker = await check_auth_node(auth_id=user_id, auth_type='user', auth_node=auth_node) - group_auth_checker = await check_auth_node(auth_id=group_id, auth_type='group', auth_node=auth_node) + if private_mode: + group_auth_checker = 0 + else: + group_auth_checker = await check_auth_node(auth_id=group_id, auth_type='group', auth_node=auth_node) # 优先级: 用户权限节点>群组权限节点>权限等级 if user_auth_checker == -1 or group_auth_checker == -1: await bot.send(event=event, message=f'权限受限QAQ') diff --git a/omega_miya/utils/Omega_plugin_utils/__init__.py b/omega_miya/utils/Omega_plugin_utils/__init__.py index 0f55a274..674f88d8 100644 --- a/omega_miya/utils/Omega_plugin_utils/__init__.py +++ b/omega_miya/utils/Omega_plugin_utils/__init__.py @@ -49,6 +49,7 @@ def init_permission_state( 'has_auth_node', 'has_level_or_node', 'permission_level', + 'has_friend_private_permission', 'AESEncryptStr', 'PluginCoolDown', 'check_and_set_global_cool_down', @@ -59,6 +60,7 @@ def init_permission_state( 'check_command_permission', 'check_permission_level', 'check_auth_node', + 'check_friend_private_permission', 'HttpFetcher', 'PicEncoder', 'create_zip_file', diff --git a/omega_miya/utils/Omega_plugin_utils/permission.py b/omega_miya/utils/Omega_plugin_utils/permission.py index 285e0b3a..2effaab7 100644 --- a/omega_miya/utils/Omega_plugin_utils/permission.py +++ b/omega_miya/utils/Omega_plugin_utils/permission.py @@ -1,4 +1,4 @@ -from omega_miya.utils.Omega_Base import DBGroup, DBAuth +from omega_miya.utils.Omega_Base import DBFriend, DBGroup, DBAuth async def check_notice_permission(group_id: int) -> bool: @@ -39,9 +39,20 @@ async def check_auth_node(auth_id: int, auth_type: str, auth_node: str) -> int: return -1 +async def check_friend_private_permission(user_id: int) -> bool: + res = await DBFriend(user_id=user_id).get_private_permission() + if res.error: + return False + elif res.result == 1: + return True + else: + return False + + __all__ = [ 'check_notice_permission', 'check_command_permission', 'check_permission_level', - 'check_auth_node' + 'check_auth_node', + 'check_friend_private_permission' ] diff --git a/omega_miya/utils/Omega_plugin_utils/rules.py b/omega_miya/utils/Omega_plugin_utils/rules.py index 206bc986..a762c885 100644 --- a/omega_miya/utils/Omega_plugin_utils/rules.py +++ b/omega_miya/utils/Omega_plugin_utils/rules.py @@ -2,7 +2,7 @@ from nonebot.typing import T_State from nonebot.adapters.cqhttp.bot import Bot from nonebot.adapters.cqhttp.event import Event -from omega_miya.utils.Omega_Base import DBGroup, DBAuth +from omega_miya.utils.Omega_Base import DBFriend, DBGroup, DBAuth # Plugin permission rule @@ -133,10 +133,27 @@ async def _has_level_or_node(bot: Bot, event: Event, state: T_State) -> bool: return Rule(_has_level_or_node) +def has_friend_private_permission() -> Rule: + async def _has_friend_private_permission(bot: Bot, event: Event, state: T_State) -> bool: + detail_type = event.dict().get(f'{event.get_type()}_type') + user_id = event.dict().get('user_id') + # 检查当前消息类型 + if detail_type != 'private': + return False + else: + res = await DBFriend(user_id=user_id).get_private_permission() + if res.result == 1: + return True + else: + return False + return Rule(_has_friend_private_permission) + + __all__ = [ 'has_notice_permission', 'has_command_permission', 'has_auth_node', 'has_level_or_node', - 'permission_level' + 'permission_level', + 'has_friend_private_permission' ] From fd8ebdc026d08cc574509d9d11fee47420aea94d Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Tue, 4 May 2021 22:10:00 +0800 Subject: [PATCH 22/33] =?UTF-8?q?Add:=20=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A5=BD=E5=8F=8B=E7=94=A8=E6=88=B7=E8=AE=A2?= =?UTF-8?q?=E9=98=85=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 数据库添加好友用户订阅表 --- omega_miya/utils/Omega_Base/model/friend.py | 209 +++++++++++++++++++- omega_miya/utils/Omega_Base/model/user.py | 9 +- omega_miya/utils/Omega_Base/tables.py | 31 +++ 3 files changed, 247 insertions(+), 2 deletions(-) diff --git a/omega_miya/utils/Omega_Base/model/friend.py b/omega_miya/utils/Omega_Base/model/friend.py index 2aaf11c3..d4d2b6fe 100644 --- a/omega_miya/utils/Omega_Base/model/friend.py +++ b/omega_miya/utils/Omega_Base/model/friend.py @@ -1,7 +1,8 @@ from omega_miya.utils.Omega_Base.database import NBdb from omega_miya.utils.Omega_Base.class_result import Result -from omega_miya.utils.Omega_Base.tables import Friends, User +from omega_miya.utils.Omega_Base.tables import Friends, User, Subscription, UserSub from .user import DBUser +from .subscription import DBSubscription from typing import Optional from datetime import datetime from sqlalchemy.future import select @@ -30,6 +31,26 @@ async def list_exist_friends(cls) -> Result.ListResult: result = Result.ListResult(error=True, info=repr(e), result=[]) return result + async def exist(self) -> bool: + user_id_result = await self.id() + if user_id_result.error: + return False + + async_session = NBdb().get_async_session() + async with async_session() as session: + try: + async with session.begin(): + session_result = await session.execute( + select(Friends.id). + join(User). + where(Friends.user_id == User.id). + where(Friends.user_id == user_id_result.result) + ) + exist_friend = session_result.scalar_one() + return True + except Exception: + return False + async def set_friend( self, nickname: str, remark: Optional[str] = None, private_permissions: Optional[int] = None ) -> Result.IntResult: @@ -80,6 +101,14 @@ async def del_friend(self) -> Result.IntResult: async with async_session() as session: try: async with session.begin(): + # 清空订阅 + session_result = await session.execute( + select(UserSub).where(UserSub.user_id == user_id_result.result) + ) + for exist_user_sub in session_result.scalars().all(): + await session.delete(exist_user_sub) + + # 删除好友表中该群组 session_result = await session.execute( select(Friends).where(Friends.user_id == user_id_result.result) ) @@ -147,3 +176,181 @@ async def get_private_permission(self) -> Result.IntResult: except Exception as e: result = Result.IntResult(error=True, info=repr(e), result=-1) return result + + async def subscription_list(self) -> Result.ListResult: + """ + :return: Result: List[Tuple[sub_type, sub_id, up_name]] + """ + friend_check = await self.exist() + if not friend_check: + return Result.ListResult(error=True, info='Not friend', result=[]) + + user_id_result = await self.id() + if user_id_result.error: + return Result.ListResult(error=True, info='User not exist', result=[]) + + async_session = NBdb().get_async_session() + async with async_session() as session: + async with session.begin(): + try: + session_result = await session.execute( + select(Subscription.sub_type, Subscription.sub_id, Subscription.up_name). + join(UserSub). + where(Subscription.id == UserSub.sub_id). + where(UserSub.user_id == user_id_result.result) + ) + res = [(x[0], x[1], x[2]) for x in session_result.all()] + result = Result.ListResult(error=False, info='Success', result=res) + except Exception as e: + result = Result.ListResult(error=True, info=repr(e), result=[]) + return result + + async def subscription_list_by_type(self, sub_type: int) -> Result.ListResult: + """ + :param sub_type: 订阅类型 + :return: Result: List[Tuple[sub_id, up_name]] + """ + friend_check = await self.exist() + if not friend_check: + return Result.ListResult(error=True, info='Not friend', result=[]) + + user_id_result = await self.id() + if user_id_result.error: + return Result.ListResult(error=True, info='User not exist', result=[]) + + async_session = NBdb().get_async_session() + async with async_session() as session: + async with session.begin(): + try: + session_result = await session.execute( + select(Subscription.sub_id, Subscription.up_name). + join(UserSub). + where(Subscription.sub_type == sub_type). + where(Subscription.id == UserSub.sub_id). + where(UserSub.user_id == user_id_result.result) + ) + res = [(x[0], x[1]) for x in session_result.all()] + result = Result.ListResult(error=False, info='Success', result=res) + except Exception as e: + result = Result.ListResult(error=True, info=repr(e), result=[]) + return result + + async def subscription_add(self, sub: DBSubscription, user_sub_info: str = None) -> Result.IntResult: + friend_check = await self.exist() + if not friend_check: + return Result.IntResult(error=True, info='Not friend', result=-1) + + user_id_result = await self.id() + if user_id_result.error: + return Result.IntResult(error=True, info='User not exist', result=-1) + + sub_id_result = await sub.id() + if sub_id_result.error: + return Result.IntResult(error=True, info='Subscription not exist', result=-1) + + async_session = NBdb().get_async_session() + async with async_session() as session: + try: + async with session.begin(): + try: + session_result = await session.execute( + select(UserSub). + where(UserSub.user_id == user_id_result.result). + where(UserSub.sub_id == sub_id_result.result) + ) + # 订阅关系已存在, 更新信息 + exist_subscription = session_result.scalar_one() + exist_subscription.user_sub_info = user_sub_info + exist_subscription.updated_at = datetime.now() + result = Result.IntResult(error=False, info='Success upgraded', result=0) + except NoResultFound: + subscription = UserSub(sub_id=sub_id_result.result, user_id=user_id_result.result, + user_sub_info=user_sub_info, created_at=datetime.now()) + session.add(subscription) + result = Result.IntResult(error=False, info='Success added', result=0) + await session.commit() + except MultipleResultsFound: + await session.rollback() + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) + except Exception as e: + await session.rollback() + result = Result.IntResult(error=True, info=repr(e), result=-1) + return result + + async def subscription_del(self, sub: DBSubscription) -> Result.IntResult: + user_id_result = await self.id() + if user_id_result.error: + return Result.IntResult(error=True, info='User not exist', result=-1) + + sub_id_result = await sub.id() + if sub_id_result.error: + return Result.IntResult(error=True, info='Subscription not exist', result=-1) + + async_session = NBdb().get_async_session() + async with async_session() as session: + try: + async with session.begin(): + session_result = await session.execute( + select(UserSub). + where(UserSub.user_id == user_id_result.result). + where(UserSub.sub_id == sub_id_result.result) + ) + exist_subscription = session_result.scalar_one() + await session.delete(exist_subscription) + await session.commit() + result = Result.IntResult(error=False, info='Success', result=0) + except NoResultFound: + await session.rollback() + result = Result.IntResult(error=True, info='NoResultFound', result=-1) + except MultipleResultsFound: + await session.rollback() + result = Result.IntResult(error=True, info='MultipleResultsFound', result=-1) + except Exception as e: + await session.rollback() + result = Result.IntResult(error=True, info=repr(e), result=-1) + return result + + async def subscription_clear(self) -> Result.IntResult: + user_id_result = await self.id() + if user_id_result.error: + return Result.IntResult(error=True, info='User not exist', result=-1) + + async_session = NBdb().get_async_session() + async with async_session() as session: + try: + async with session.begin(): + session_result = await session.execute( + select(UserSub).where(UserSub.user_id == user_id_result.result) + ) + for exist_user_sub in session_result.scalars().all(): + await session.delete(exist_user_sub) + await session.commit() + result = Result.IntResult(error=False, info='Success', result=0) + except Exception as e: + await session.rollback() + result = Result.IntResult(error=True, info=repr(e), result=-1) + return result + + async def subscription_clear_by_type(self, sub_type: int) -> Result.IntResult: + user_id_result = await self.id() + if user_id_result.error: + return Result.IntResult(error=True, info='User not exist', result=-1) + + async_session = NBdb().get_async_session() + async with async_session() as session: + try: + async with session.begin(): + session_result = await session.execute( + select(UserSub).join(Subscription). + where(UserSub.sub_id == Subscription.id). + where(Subscription.sub_type == sub_type). + where(UserSub.user_id == user_id_result.result) + ) + for exist_user_sub in session_result.scalars().all(): + await session.delete(exist_user_sub) + await session.commit() + result = Result.IntResult(error=False, info='Success', result=0) + except Exception as e: + await session.rollback() + result = Result.IntResult(error=True, info=repr(e), result=-1) + return result diff --git a/omega_miya/utils/Omega_Base/model/user.py b/omega_miya/utils/Omega_Base/model/user.py index d27f60e5..54e27ce7 100644 --- a/omega_miya/utils/Omega_Base/model/user.py +++ b/omega_miya/utils/Omega_Base/model/user.py @@ -1,6 +1,6 @@ from omega_miya.utils.Omega_Base.database import NBdb from omega_miya.utils.Omega_Base.class_result import Result -from omega_miya.utils.Omega_Base.tables import User, UserGroup, Skill, UserSkill, Vocation, AuthUser +from omega_miya.utils.Omega_Base.tables import User, UserGroup, Skill, UserSkill, UserSub, Vocation, AuthUser from .skill import DBSkill from datetime import datetime from sqlalchemy.future import select @@ -115,6 +115,13 @@ async def delete(self) -> Result.IntResult: exist_status = session_result.scalar_one() await session.delete(exist_status) + # 清空订阅 + session_result = await session.execute( + select(UserSub).where(UserSub.user_id == id_result.result) + ) + for exist_user_sub in session_result.scalars().all(): + await session.delete(exist_user_sub) + # 清空群成员表中该用户 session_result = await session.execute( select(UserGroup).where(UserGroup.user_id == id_result.result) diff --git a/omega_miya/utils/Omega_Base/tables.py b/omega_miya/utils/Omega_Base/tables.py index 18417b9a..f80e0929 100644 --- a/omega_miya/utils/Omega_Base/tables.py +++ b/omega_miya/utils/Omega_Base/tables.py @@ -62,6 +62,8 @@ class User(Base): cascade="all, delete", passive_deletes=True) user_auth = relationship('AuthUser', back_populates='auth_for_user', uselist=False, cascade="all, delete", passive_deletes=True) + users_sub_what = relationship('UserSub', back_populates='users_sub', + cascade="all, delete", passive_deletes=True) def __init__(self, qq, nickname, is_friend=0, aliasname=None, created_at=None, updated_at=None): self.qq = qq @@ -445,6 +447,7 @@ class Subscription(Base): updated_at = Column(DateTime, nullable=True) be_sub = relationship('GroupSub', back_populates='sub_by', cascade="all, delete", passive_deletes=True) + be_sub_users = relationship('UserSub', back_populates='sub_by_users', cascade="all, delete", passive_deletes=True) def __init__(self, sub_type, sub_id, up_name, live_info=None, created_at=None, updated_at=None): self.sub_type = sub_type @@ -487,6 +490,34 @@ def __repr__(self): f"created_at='{self.created_at}', updated_at='{self.updated_at}')>" +# 好友用户订阅表 +class UserSub(Base): + __tablename__ = f'{TABLE_PREFIX}users_subs' + __table_args__ = {'mysql_engine': 'InnoDB', 'mysql_charset': 'utf8mb4'} + + id = Column(Integer, Sequence('users_subs_id_seq'), primary_key=True, nullable=False, index=True, unique=True) + sub_id = Column(Integer, ForeignKey(f'{TABLE_PREFIX}subscription.id'), nullable=False) + user_id = Column(Integer, ForeignKey(f'{TABLE_PREFIX}users.id'), nullable=False) + user_sub_info = Column(String(64), nullable=True, comment='用户订阅信息,暂空备用') + created_at = Column(DateTime, nullable=True) + updated_at = Column(DateTime, nullable=True) + + users_sub = relationship('User', back_populates='users_sub_what') + sub_by_users = relationship('Subscription', back_populates='be_sub_users') + + def __init__(self, sub_id, user_id, user_sub_info=None, created_at=None, updated_at=None): + self.sub_id = sub_id + self.user_id = user_id + self.user_sub_info = user_sub_info + self.created_at = created_at + self.updated_at = updated_at + + def __repr__(self): + return f"" + + # B站动态表 class Bilidynamic(Base): __tablename__ = f'{TABLE_PREFIX}bili_dynamics' From 126b19d5ec26bb64c2b3d037467f6a6b368c44ce Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Thu, 6 May 2021 03:06:12 +0800 Subject: [PATCH 23/33] =?UTF-8?q?Upgrade:=20=E5=AE=A1=E8=BD=B4=E5=A7=AC?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E4=B8=8B=E8=BD=BD=E6=96=87=E4=BB=B6=E5=A4=B9?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=BA=E5=85=AC=E5=85=B1=E4=B8=B4=E6=97=B6?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 审轴姬插件下载文件夹调整为公共临时文件夹 --- omega_miya/plugins/zhoushen_hime/__init__.py | 12 ++++------ omega_miya/plugins/zhoushen_hime/utils.py | 25 ++++++++++---------- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/omega_miya/plugins/zhoushen_hime/__init__.py b/omega_miya/plugins/zhoushen_hime/__init__.py index 7a5c7b69..6ed32d42 100644 --- a/omega_miya/plugins/zhoushen_hime/__init__.py +++ b/omega_miya/plugins/zhoushen_hime/__init__.py @@ -16,6 +16,7 @@ __plugin_name__ = '自动审轴姬' __plugin_usage__ = r'''【自动审轴姬】 检测群内上传文件并自动锤轴 +仅限群聊使用 **AuthNode** basic @@ -52,13 +53,7 @@ async def hime_handle(bot: Bot, event: GroupUploadNoticeEvent, state: T_State): if not any(key in file_name for key in ['未校', '待校', '需校']): await ZhouShenHime.finish() - plugin_path = os.path.dirname(__file__) - download_dir = os.path.join(plugin_path, 'file_downloaded') - if not os.path.exists(download_dir): - os.makedirs(download_dir) - - download_file_path = os.path.join(download_dir, file_name) - dl_res = await download_file(url=file_url, file_path=download_file_path) + dl_res = await download_file(url=file_url, file_name=file_name) if not dl_res.success(): logger.error(f'下载文件失败: {dl_res.info}') await ZhouShenHime.finish() @@ -67,7 +62,8 @@ async def hime_handle(bot: Bot, event: GroupUploadNoticeEvent, state: T_State): msg = f'{at_msg}你刚刚上传了一份轴呢, 让我来帮你看看吧!' await ZhouShenHime.send(Message(msg)) - checker = ZhouChecker(file_path=download_file_path, flash_mode=True) + file_path = os.path.abspath(dl_res.result) + checker = ZhouChecker(file_path=file_path, flash_mode=True) try: init_res = checker.init_file(auto_style=True) diff --git a/omega_miya/plugins/zhoushen_hime/utils.py b/omega_miya/plugins/zhoushen_hime/utils.py index cd0c2fec..d2420a0e 100644 --- a/omega_miya/plugins/zhoushen_hime/utils.py +++ b/omega_miya/plugins/zhoushen_hime/utils.py @@ -1,10 +1,13 @@ import os import datetime from typing import Tuple, List -from nonebot import logger +from nonebot import logger, get_driver from omega_miya.utils.Omega_plugin_utils import HttpFetcher from omega_miya.utils.Omega_Base import Result +global_config = get_driver().config +TMP_PATH = global_config.tmp_path_ + class AssScriptException(Exception): def __init__(self, *args): @@ -646,18 +649,16 @@ def handle(self) -> Result.DictResult: return Result.DictResult(error=False, info='Success', result=result_dict) -async def download_file(url: str, file_path: str) -> Result.IntResult: +async def download_file(url: str, file_name: str) -> Result.TextResult: headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/89.0.4389.114 Safari/537.36'} # 尝试从服务器下载资源 fetcher = HttpFetcher(timeout=10, flag=f'zhoushen_hime', headers=headers) - download_result = await fetcher.get_bytes(url=url) - if download_result.error: - return Result.IntResult(error=True, info=f'Download failed, error info: {download_result.info}', result=-1) - - try: - with open(file_path, 'wb+') as f: - f.write(download_result.result) - return Result.IntResult(error=False, info='Success', result=1) - except Exception as e: - return Result.IntResult(error=True, info=f'Write file failed, error info: {repr(e)}', result=-1) + file_path = os.path.abspath(os.path.join(TMP_PATH, 'zhoushen_hime')) + + download_result = await fetcher.download_file(url=url, path=file_path, file_name=file_name) + + if download_result.success(): + return Result.TextResult(error=False, info=file_name, result=download_result.result) + else: + return Result.TextResult(error=True, info=download_result.info, result='') From e319d94ce1181076792476e3144a8e824a02292c Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Thu, 6 May 2021 03:07:49 +0800 Subject: [PATCH 24/33] =?UTF-8?q?Upgrade:=20=E8=87=AA=E5=8A=A8=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E5=8A=A0=E5=A5=BD=E5=8F=8B=E6=97=B6=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改了自动通过加好友时的验证信息 --- omega_miya/utils/Omega_auto_manager/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/omega_miya/utils/Omega_auto_manager/__init__.py b/omega_miya/utils/Omega_auto_manager/__init__.py index 24425b0a..0a0812a5 100644 --- a/omega_miya/utils/Omega_auto_manager/__init__.py +++ b/omega_miya/utils/Omega_auto_manager/__init__.py @@ -15,7 +15,11 @@ async def handle_friend_request(bot: Bot, event: FriendRequestEvent, state: T_St user_id = event.user_id detail_type = event.request_type comment = event.comment - if detail_type == 'friend' and comment == 'Miya好萌好可爱': + + # 加好友验证消息 + auth_str = f'Miya好萌好可爱{int(user_id) % 9}' + + if detail_type == 'friend' and comment == auth_str: await bot.call_api('set_friend_add_request', flag=event.flag, approve=True) logger.info(f'已同意用户: {user_id} 的好友申请') elif detail_type == 'friend': From b15f644e9e5a7d11feb38330e2b475a591e368c7 Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Thu, 6 May 2021 03:10:37 +0800 Subject: [PATCH 25/33] =?UTF-8?q?Upgrade:=20=E9=83=A8=E5=88=86=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E8=B0=83=E6=95=B4=E4=B8=BA=E7=BE=A4=E8=81=8A/?= =?UTF-8?q?=E7=A7=81=E8=81=8A=E5=8F=AF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 表情包制作器插件调整为群聊/私聊可用 - 萌图插件调整为群聊/私聊可用 - 识图插件调整为群聊/私聊可用 - 识番插件调整为群聊/私聊可用 - 帮助插件调整为群聊/私聊可用 - 好好说话插件调整为群聊/私聊可用 --- omega_miya/plugins/Omega_help/__init__.py | 14 +++--- omega_miya/plugins/nbnhhsh/__init__.py | 14 +++--- omega_miya/plugins/search_anime/__init__.py | 31 ++++++------ omega_miya/plugins/search_image/__init__.py | 30 +++++++----- omega_miya/plugins/setu/__init__.py | 50 ++++++++++++-------- omega_miya/plugins/sticker_maker/__init__.py | 27 ++++++----- 6 files changed, 97 insertions(+), 69 deletions(-) diff --git a/omega_miya/plugins/Omega_help/__init__.py b/omega_miya/plugins/Omega_help/__init__.py index 1d47f799..28316ffe 100644 --- a/omega_miya/plugins/Omega_help/__init__.py +++ b/omega_miya/plugins/Omega_help/__init__.py @@ -2,8 +2,8 @@ from nonebot.plugin import get_loaded_plugins from nonebot.typing import T_State from nonebot.adapters.cqhttp.bot import Bot -from nonebot.adapters.cqhttp.event import GroupMessageEvent -from nonebot.adapters.cqhttp.permission import GROUP +from nonebot.adapters.cqhttp.event import MessageEvent, GroupMessageEvent, PrivateMessageEvent +from nonebot.adapters.cqhttp.permission import GROUP, PRIVATE_FRIEND from omega_miya.utils.Omega_plugin_utils import init_export, init_permission_state, PluginCoolDown @@ -38,13 +38,13 @@ command=True, level=10, auth_node='basic'), - permission=GROUP, + permission=GROUP | PRIVATE_FRIEND, priority=10, block=True) @bot_help.handle() -async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_first_receive(bot: Bot, event: MessageEvent, state: T_State): # 获取设置了名称的插件列表 plugins = list(filter(lambda p: set(p.export.keys()).issuperset({'custom_name', 'usage'}), get_loaded_plugins())) if not plugins: @@ -58,11 +58,13 @@ async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_Stat else: # 如果用户没有发送参数, 则发送功能列表并结束此命令 plugins_list = '\n'.join(p.export.custom_name for p in plugins) - await bot_help.finish(f'我现在支持的插件有: \n\n{plugins_list}\n\n注意: 群组权限等级未达到要求的命令不会被响应\n输入"/help [插件]"即可查看插件详情及帮助') + await bot_help.finish(f'我现在支持的插件有: \n\n{plugins_list}\n\n' + f'注意: 群组权限等级未达到要求的, 或非好友或未启用私聊功能的命令不会被响应\n\n' + f'输入"/help [插件]"即可查看插件详情及帮助') @bot_help.got('plugin_name', prompt='你想查询哪个插件的用法呢?') -async def handle_plugin_name(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_plugin_name(bot: Bot, event: MessageEvent, state: T_State): plugin_custom_name = state["plugin_name"] # 如果发了参数则发送相应命令的使用帮助 for p in state['plugin_list']: diff --git a/omega_miya/plugins/nbnhhsh/__init__.py b/omega_miya/plugins/nbnhhsh/__init__.py index 1f01c576..4ff35fb4 100644 --- a/omega_miya/plugins/nbnhhsh/__init__.py +++ b/omega_miya/plugins/nbnhhsh/__init__.py @@ -2,8 +2,8 @@ from nonebot import on_command, export, logger from nonebot.typing import T_State from nonebot.adapters.cqhttp.bot import Bot -from nonebot.adapters.cqhttp.event import GroupMessageEvent -from nonebot.adapters.cqhttp.permission import GROUP +from nonebot.adapters.cqhttp.event import MessageEvent, GroupMessageEvent, PrivateMessageEvent +from nonebot.adapters.cqhttp.permission import GROUP, PRIVATE_FRIEND from omega_miya.utils.Omega_plugin_utils import init_export, init_permission_state from .utils import get_guess @@ -12,8 +12,10 @@ __plugin_name__ = '好好说话' __plugin_usage__ = r'''【能不能好好说话?】 拼音首字母缩写释义 +群组/私聊可用 **Permission** +Friend Private Command & Lv.30 **Usage** @@ -33,14 +35,14 @@ command=True, level=30), aliases={'hhsh', 'nbnhhsh'}, - permission=GROUP, + permission=GROUP | PRIVATE_FRIEND, priority=20, block=True) # 修改默认参数处理 @nbnhhsh.args_parser -async def parse(bot: Bot, event: GroupMessageEvent, state: T_State): +async def parse(bot: Bot, event: MessageEvent, state: T_State): args = str(event.get_plaintext()).strip().lower().split() if not args: await nbnhhsh.reject('你似乎没有发送有效的参数呢QAQ, 请重新发送:') @@ -50,7 +52,7 @@ async def parse(bot: Bot, event: GroupMessageEvent, state: T_State): @nbnhhsh.handle() -async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_first_receive(bot: Bot, event: MessageEvent, state: T_State): args = str(event.get_plaintext()).strip().lower().split() if not args: pass @@ -61,7 +63,7 @@ async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_Stat @nbnhhsh.got('guess', prompt='有啥缩写搞不懂?') -async def handle_nbnhhsh(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_nbnhhsh(bot: Bot, event: MessageEvent, state: T_State): guess = state['guess'] if re.match(r'^[a-zA-Z0-9]+$', guess): res = await get_guess(guess=guess) diff --git a/omega_miya/plugins/search_anime/__init__.py b/omega_miya/plugins/search_anime/__init__.py index 62393191..59a9d318 100644 --- a/omega_miya/plugins/search_anime/__init__.py +++ b/omega_miya/plugins/search_anime/__init__.py @@ -2,8 +2,8 @@ from nonebot import on_command, export, logger from nonebot.typing import T_State from nonebot.adapters.cqhttp.bot import Bot -from nonebot.adapters.cqhttp.event import GroupMessageEvent -from nonebot.adapters.cqhttp.permission import GROUP +from nonebot.adapters.cqhttp.event import MessageEvent, GroupMessageEvent, PrivateMessageEvent +from nonebot.adapters.cqhttp.permission import GROUP, PRIVATE_FRIEND from nonebot.adapters.cqhttp import MessageSegment, Message from omega_miya.utils.Omega_plugin_utils import init_export, init_permission_state from .utils import get_identify_result, pic_2_base64 @@ -13,8 +13,10 @@ __plugin_name__ = '识番' __plugin_usage__ = r'''【识番助手】 使用 trace.moe API 识别番剧 +群组/私聊可用 **Permission** +Friend Private Command & Lv.50 or AuthNode @@ -43,14 +45,14 @@ command=True, level=50, auth_node='basic'), - permission=GROUP, + permission=GROUP | PRIVATE_FRIEND, priority=20, block=True) # 修改默认参数处理 @search_anime.args_parser -async def parse(bot: Bot, event: GroupMessageEvent, state: T_State): +async def parse(bot: Bot, event: MessageEvent, state: T_State): args = str(event.get_message()).strip().split() if not args: await search_anime.reject('你似乎没有发送有效的消息呢QAQ, 请重新发送:') @@ -60,7 +62,7 @@ async def parse(bot: Bot, event: GroupMessageEvent, state: T_State): @search_anime.handle() -async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_first_receive(bot: Bot, event: MessageEvent, state: T_State): # 响应引用回复图片 if event.reply: img_url = str(event.reply.message).strip() @@ -73,7 +75,12 @@ async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_Stat @search_anime.got('image_url', prompt='请发送你想要识别的番剧截图:') -async def handle_draw(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_draw(bot: Bot, event: MessageEvent, state: T_State): + if isinstance(event, GroupMessageEvent): + group_id = event.group_id + else: + group_id = 'Private event' + image_url = state['image_url'] if not re.match(r'^(\[CQ:image,file=[abcdef\d]{32}\.image,url=.+?])$', image_url): await search_anime.reject('你发送的似乎不是图片呢, 请重新发送, 取消命令请发送【取消】:') @@ -86,13 +93,11 @@ async def handle_draw(bot: Bot, event: GroupMessageEvent, state: T_State): res = await get_identify_result(img_url=image_url) if not res.success(): - logger.info(f"Group: {event.group_id}, user: {event.user_id} " - f"search_anime failed: {res.info}") + logger.info(f"{group_id} / {event.user_id} search_anime failed: {res.info}") await search_anime.finish('发生了意外的错误QAQ, 请稍后再试') if not res.result: - logger.info(f"Group: {event.group_id}, user: {event.user_id} " - f"使用了search_anime, 但没有找到相似的番剧") + logger.info(f"{group_id} / {event.user_id} 使用了search_anime, 但没有找到相似的番剧") await search_anime.finish('没有找到与截图相似度足够高的番剧QAQ') for item in res.result: @@ -125,8 +130,6 @@ async def handle_draw(bot: Bot, event: GroupMessageEvent, state: T_State): f"截图时间位置: {at}\n绅士: {is_adult}\n{img_seg}" await search_anime.send(Message(msg)) except Exception as e: - logger.error(f"Group: {event.group_id}, user: {event.user_id} " - f"使用命令search_anime时发生了错误: {repr(e)}") + logger.error(f"{group_id} / {event.user_id} 使用命令search_anime时发生了错误: {repr(e)}") continue - logger.info(f"Group: {event.group_id}, user: {event.user_id} " - f"使用search_anime进行了一次搜索") + logger.info(f"{group_id} / {event.user_id} 使用search_anime进行了一次搜索") diff --git a/omega_miya/plugins/search_image/__init__.py b/omega_miya/plugins/search_image/__init__.py index 8be43c36..0308ee1e 100644 --- a/omega_miya/plugins/search_image/__init__.py +++ b/omega_miya/plugins/search_image/__init__.py @@ -2,19 +2,20 @@ from nonebot import on_command, export, logger from nonebot.typing import T_State from nonebot.adapters.cqhttp.bot import Bot -from nonebot.adapters.cqhttp.event import GroupMessageEvent -from nonebot.adapters.cqhttp.permission import GROUP +from nonebot.adapters.cqhttp.event import MessageEvent, GroupMessageEvent, PrivateMessageEvent +from nonebot.adapters.cqhttp.permission import GROUP, PRIVATE_FRIEND from nonebot.adapters.cqhttp import MessageSegment, Message from omega_miya.utils.Omega_plugin_utils import init_export, init_permission_state from .utils import pic_2_base64, get_saucenao_identify_result, get_ascii2d_identify_result # Custom plugin usage text -__plugin_raw_name__ = __name__.split('.')[-1] __plugin_name__ = '识图' __plugin_usage__ = r'''【识图助手】 使用SauceNAO/ascii2d识别各类图片、插画 +群组/私聊可用 **Permission** +Friend Private Command & Lv.50 or AuthNode @@ -43,14 +44,14 @@ command=True, level=50, auth_node='basic'), - permission=GROUP, + permission=GROUP | PRIVATE_FRIEND, priority=20, block=True) # 修改默认参数处理 @search_image.args_parser -async def parse(bot: Bot, event: GroupMessageEvent, state: T_State): +async def parse(bot: Bot, event: MessageEvent, state: T_State): args = str(event.get_message()).strip().split() if not args: await search_image.reject('你似乎没有发送有效的消息呢QAQ, 请重新发送:') @@ -60,8 +61,7 @@ async def parse(bot: Bot, event: GroupMessageEvent, state: T_State): @search_image.handle() -async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_State): - # 响应引用回复图片 +async def handle_first_receive(bot: Bot, event: MessageEvent, state: T_State): if event.reply: img_url = str(event.reply.message).strip() if re.match(r'^(\[CQ:image,file=[abcdef\d]{32}\.image,url=.+?])$', img_url): @@ -73,7 +73,12 @@ async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_Stat @search_image.got('image_url', prompt='请发送你想要识别的图片:') -async def handle_draw(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_draw(bot: Bot, event: MessageEvent, state: T_State): + if isinstance(event, GroupMessageEvent): + group_id = event.group_id + else: + group_id = 'Private event' + image_url = state['image_url'] if not re.match(r'^(\[CQ:image,file=[abcdef\d]{32}\.image,url=.+?])$', image_url): await search_image.reject('你发送的似乎不是图片呢, 请重新发送, 取消命令请发送【取消】:') @@ -122,18 +127,17 @@ async def handle_draw(bot: Bot, event: GroupMessageEvent, state: T_State): except Exception as e: logger.warning(f'处理和发送识别结果时发生了错误: {repr(e)}') continue - logger.info(f"Group: {event.group_id}, user: {event.user_id} " - f"使用searchimage成功搜索了一张图片") + logger.info(f"{group_id} / {event.user_id} 使用searchimage成功搜索了一张图片") return elif not identify_result and has_error: await search_image.send('识图过程中获取信息失败QAQ, 请重试一下吧') - logger.info(f"Group: {event.group_id}, user: {event.user_id} 使用了searchimage, 但在识图过程中获取信息失败") + logger.info(f"{group_id} / {event.user_id} 使用了searchimage, 但在识图过程中获取信息失败") return else: await search_image.send('没有找到相似度足够高的图片QAQ') - logger.info(f"Group: {event.group_id}, user: {event.user_id} 使用了searchimage, 但没有找到相似的图片") + logger.info(f"{group_id} / {event.user_id} 使用了searchimage, 但没有找到相似的图片") return except Exception as e: await search_image.send('识图失败, 发生了意外的错误QAQ, 请稍后重试') - logger.error(f"Group: {event.group_id}, user: {event.user_id} 使用命令searchimage时发生了错误: {repr(e)}") + logger.error(f"{group_id} / {event.user_id} 使用命令searchimage时发生了错误: {repr(e)}") return diff --git a/omega_miya/plugins/setu/__init__.py b/omega_miya/plugins/setu/__init__.py index f3991365..38484a4d 100644 --- a/omega_miya/plugins/setu/__init__.py +++ b/omega_miya/plugins/setu/__init__.py @@ -4,8 +4,8 @@ from nonebot.permission import SUPERUSER from nonebot.typing import T_State from nonebot.adapters.cqhttp.bot import Bot -from nonebot.adapters.cqhttp.event import GroupMessageEvent, Event -from nonebot.adapters.cqhttp.permission import GROUP +from nonebot.adapters.cqhttp.event import MessageEvent, GroupMessageEvent, PrivateMessageEvent +from nonebot.adapters.cqhttp.permission import GROUP, PRIVATE_FRIEND from nonebot.adapters.cqhttp import MessageSegment from omega_miya.utils.Omega_plugin_utils import init_export, init_permission_state, PluginCoolDown from omega_miya.utils.Omega_Base import DBPixivillust @@ -17,8 +17,10 @@ __plugin_name__ = '来点萌图' __plugin_usage__ = r'''【来点萌图】 测试群友LSP成分 +群组/私聊可用 **Permission** +Friend Private Command & Lv.50 or AuthNode @@ -58,7 +60,7 @@ # 注册事件响应器 -Setu = CommandGroup('sepic', permission=GROUP, priority=20, block=True) +Setu = CommandGroup('sepic', permission=GROUP | PRIVATE_FRIEND, priority=20, block=True) setu = Setu.command( 'setu', @@ -72,7 +74,7 @@ @setu.handle() -async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_first_receive(bot: Bot, event: MessageEvent, state: T_State): args = set(str(event.get_plaintext()).strip().split()) # 处理r18 state['nsfw_tag'] = 1 @@ -84,7 +86,12 @@ async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_Stat @setu.got('tags', prompt='tag?') -async def handle_setu(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_setu(bot: Bot, event: MessageEvent, state: T_State): + if isinstance(event, GroupMessageEvent): + group_id = event.group_id + else: + group_id = 'Private event' + nsfw_tag = state['nsfw_tag'] tags = state['tags'] @@ -97,7 +104,7 @@ async def handle_setu(bot: Bot, event: GroupMessageEvent, state: T_State): pid_list = pid_res.result if not pid_list: - logger.info(f"Group: {event.group_id}, User: {event.user_id} 没有找到他/她想要的涩图") + logger.info(f"{group_id} / {event.user_id} 没有找到他/她想要的涩图") await setu.finish('找不到涩图QAQ') await setu.send('稍等, 正在下载图片~') # 处理article中图片内容 @@ -117,14 +124,14 @@ async def handle_setu(bot: Bot, event: GroupMessageEvent, state: T_State): # 发送图片 await setu.send(img_seg) except Exception as e: - logger.warning(f"图片发送失败, group: {event.group_id}. error: {repr(e)}") + logger.warning(f"图片发送失败, {group_id} / {event.user_id}. error: {repr(e)}") continue if fault_count == len(pid_list): - logger.info(f"Group: {event.group_id}, User: {event.user_id} 没能看到他/她想要的涩图, {pid_list}") + logger.info(f"{group_id} / {event.user_id} 没能看到他/她想要的涩图, 图片下载失败, {pid_list}") await setu.finish('似乎出现了网络问题, 所有的图片都下载失败了QAQ') else: - logger.info(f"Group: {event.group_id}, User: {event.user_id} 找到了他/她想要的涩图, {pid_list}") + logger.info(f"{group_id} / {event.user_id} 找到了他/她想要的涩图, {pid_list}") # 注册事件响应器 @@ -140,7 +147,7 @@ async def handle_setu(bot: Bot, event: GroupMessageEvent, state: T_State): @moepic.handle() -async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_first_receive(bot: Bot, event: MessageEvent, state: T_State): args = set(str(event.get_plaintext()).strip().split()) # 排除r18 for tag in args.copy(): @@ -150,7 +157,12 @@ async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_Stat @moepic.got('tags', prompt='tag?') -async def handle_moepic(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_moepic(bot: Bot, event: MessageEvent, state: T_State): + if isinstance(event, GroupMessageEvent): + group_id = event.group_id + else: + group_id = 'Private event' + tags = state['tags'] if tags: @@ -162,7 +174,7 @@ async def handle_moepic(bot: Bot, event: GroupMessageEvent, state: T_State): pid_list = pid_res.result if not pid_list: - logger.info(f"Group: {event.group_id}, User: {event.user_id} 没有找到他/她想要的萌图") + logger.info(f"{group_id} / {event.user_id} 没有找到他/她想要的萌图") await moepic.finish('找不到萌图QAQ') await moepic.send('稍等, 正在下载图片~') @@ -183,14 +195,14 @@ async def handle_moepic(bot: Bot, event: GroupMessageEvent, state: T_State): # 发送图片 await moepic.send(img_seg) except Exception as e: - logger.warning(f"图片发送失败, group: {event.group_id}. error: {repr(e)}") + logger.warning(f"图片发送失败, {group_id} / {event.user_id}. error: {repr(e)}") continue if fault_count == len(pid_list): - logger.info(f"Group: {event.group_id}, User: {event.user_id} 没能看到他/她想要的萌图, {pid_list}") + logger.info(f"{group_id} / {event.user_id} 没能看到他/她想要的萌图, 图片下载失败, {pid_list}") await moepic.finish('似乎出现了网络问题, 所有的图片都下载失败了QAQ') else: - logger.info(f"Group: {event.group_id}, User: {event.user_id} 找到了他/她想要的萌图, {pid_list}") + logger.info(f"{group_id} / {event.user_id} 找到了他/她想要的萌图, {pid_list}") # 注册事件响应器 @@ -198,7 +210,7 @@ async def handle_moepic(bot: Bot, event: GroupMessageEvent, state: T_State): @setu_stat.handle() -async def handle_first_receive(bot: Bot, event: Event, state: T_State): +async def handle_first_receive(bot: Bot, event: MessageEvent, state: T_State): status_res = await DBPixivillust.status() msg = f"本地数据库统计:\n\n" \ f"全部: {status_res.result.get('total')}\n" \ @@ -214,7 +226,7 @@ async def handle_first_receive(bot: Bot, event: Event, state: T_State): # 修改默认参数处理 @setu_import.args_parser -async def parse(bot: Bot, event: Event, state: T_State): +async def parse(bot: Bot, event: MessageEvent, state: T_State): args = str(event.get_plaintext()).strip().lower().split() if not args: await setu_import.reject('你似乎没有发送有效的参数呢QAQ, 请重新发送:') @@ -224,7 +236,7 @@ async def parse(bot: Bot, event: Event, state: T_State): @setu_import.handle() -async def handle_first_receive(bot: Bot, event: Event, state: T_State): +async def handle_first_receive(bot: Bot, event: MessageEvent, state: T_State): args = str(event.get_plaintext()).strip().lower().split() if not args: pass @@ -235,7 +247,7 @@ async def handle_first_receive(bot: Bot, event: Event, state: T_State): @setu_import.got('mode', prompt='模式: 【setu/moe】') -async def handle_setu_import(bot: Bot, event: Event, state: T_State): +async def handle_setu_import(bot: Bot, event: MessageEvent, state: T_State): mode = state['mode'] if mode not in ['setu', 'moe']: await setu_import.reject('参数错误, 重新输入: 【setu/moe】, 取消命令请发送【取消】:') diff --git a/omega_miya/plugins/sticker_maker/__init__.py b/omega_miya/plugins/sticker_maker/__init__.py index 395bbfdf..0a311e19 100644 --- a/omega_miya/plugins/sticker_maker/__init__.py +++ b/omega_miya/plugins/sticker_maker/__init__.py @@ -2,8 +2,8 @@ from nonebot import on_command, export, logger from nonebot.typing import T_State from nonebot.adapters.cqhttp.bot import Bot -from nonebot.adapters.cqhttp.event import GroupMessageEvent -from nonebot.adapters.cqhttp.permission import GROUP +from nonebot.adapters.cqhttp.event import MessageEvent, GroupMessageEvent, PrivateMessageEvent +from nonebot.adapters.cqhttp.permission import GROUP, PRIVATE_FRIEND from nonebot.adapters.cqhttp import MessageSegment from omega_miya.utils.Omega_plugin_utils import init_export, init_permission_state, PicEncoder from .utils import sticker_maker_main @@ -13,8 +13,10 @@ __plugin_name__ = '表情包' __plugin_usage__ = r'''【表情包助手】 使用模板快速制作表情包 +群组/私聊可用 **Permission** +Friend Private Command & Lv.10 **Usage** @@ -32,14 +34,14 @@ name='sticker', command=True, level=10), - permission=GROUP, + permission=GROUP | PRIVATE_FRIEND, priority=10, block=True) # 修改默认参数处理 @sticker.args_parser -async def parse(bot: Bot, event: GroupMessageEvent, state: T_State): +async def parse(bot: Bot, event: MessageEvent, state: T_State): args = str(event.get_message()).strip() if not args: await sticker.reject('你似乎没有发送有效的参数呢QAQ, 请重新发送:') @@ -49,7 +51,7 @@ async def parse(bot: Bot, event: GroupMessageEvent, state: T_State): @sticker.handle() -async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_first_receive(bot: Bot, event: MessageEvent, state: T_State): args = str(event.get_message()).strip().lower().split() if not args: state['temp'] = None @@ -60,7 +62,7 @@ async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_Stat @sticker.got('temp', prompt='请输入模板名称:') -async def handle_sticker(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_sticker(bot: Bot, event: MessageEvent, state: T_State): # 定义模板名称、类型, 处理模板正则 sticker_temp = { '默认': {'name': 'default', 'type': 'default', 'text_part': 1, 'help_msg': '该模板不支持gif'}, @@ -91,7 +93,7 @@ async def handle_sticker(bot: Bot, event: GroupMessageEvent, state: T_State): @sticker.got('image_url', prompt='请发送你想要制作的表情包的图片:') -async def handle_img(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_img(bot: Bot, event: MessageEvent, state: T_State): image_url = state['image_url'] if state['temp_type'] not in ['static', 'gif']: if not re.match(r'^(\[CQ:image,file=[abcdef\d]{32}\.image,url=.+])', image_url): @@ -106,7 +108,11 @@ async def handle_img(bot: Bot, event: GroupMessageEvent, state: T_State): @sticker.got('sticker_text', prompt='请输入你想要制作的表情包的文字:') -async def handle_sticker_text(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_sticker_text(bot: Bot, event: MessageEvent, state: T_State): + if isinstance(event, GroupMessageEvent): + group_id = event.group_id + else: + group_id = 'Private event' sticker_text = state['sticker_text'] sticker_temp_text_part = state['temp_text_part'] @@ -151,10 +157,9 @@ async def handle_sticker_text(bot: Bot, event: GroupMessageEvent, state: T_State # 发送图片 await sticker.send(sticker_seg) - logger.info(f"Group: {event.group_id}, 用户: {event.user_id} 成功制作了一个表情") + logger.info(f"{group_id} / {event.user_id} 成功制作了一个表情") except Exception as e: - logger.error(f"Group: {event.group_id}, 用户: {event.user_id} " - f"制作表情时发生了错误: {repr(e)}") + logger.error(f"{group_id} / {event.user_id} 制作表情时发生了错误: {repr(e)}") await sticker.finish(f"表情制作失败QAQ, 请稍后再试\n小提示:{sticker_temp_help_msg}") return From fdcf9f31d6f3436e5044aa0eb34b2c9dd5112894 Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Thu, 6 May 2021 03:11:09 +0800 Subject: [PATCH 26/33] =?UTF-8?q?Upgrade:=20=E4=BC=98=E5=8C=96=E5=85=AC?= =?UTF-8?q?=E5=91=8A=E6=8F=92=E4=BB=B6=E5=8F=91=E9=80=81=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E6=97=B6=E5=BC=82=E5=B8=B8=E6=8D=95=E8=8E=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 优化公告插件发送消息时异常捕获 --- omega_miya/plugins/announce/__init__.py | 31 ++++++++++++++++++------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/omega_miya/plugins/announce/__init__.py b/omega_miya/plugins/announce/__init__.py index 6bd86597..2431d4bc 100644 --- a/omega_miya/plugins/announce/__init__.py +++ b/omega_miya/plugins/announce/__init__.py @@ -4,7 +4,7 @@ from nonebot.permission import SUPERUSER from nonebot.typing import T_State from nonebot.adapters.cqhttp.bot import Bot -from nonebot.adapters.cqhttp.event import Event +from nonebot.adapters.cqhttp.event import PrivateMessageEvent from omega_miya.utils.Omega_Base import DBTable @@ -14,7 +14,7 @@ # 修改默认参数处理 @announce.args_parser -async def parse(bot: Bot, event: Event, state: T_State): +async def parse(bot: Bot, event: PrivateMessageEvent, state: T_State): args = str(event.get_plaintext()).strip().lower() if not args: await announce.reject('你似乎没有发送有效的参数呢QAQ, 请重新发送:') @@ -24,7 +24,7 @@ async def parse(bot: Bot, event: Event, state: T_State): @announce.handle() -async def handle_first_receive(bot: Bot, event: Event, state: T_State): +async def handle_first_receive(bot: Bot, event: PrivateMessageEvent, state: T_State): args = str(event.get_plaintext()).strip().lower().split() if not args: pass @@ -39,27 +39,42 @@ async def handle_first_receive(bot: Bot, event: Event, state: T_State): @announce.got('group', prompt='请输入通知群组:\n【all/notice/command/group_id】') @announce.got('announce_text', prompt='请输入公告内容:') -async def handle_announce(bot: Bot, event: Event, state: T_State): +async def handle_announce(bot: Bot, event: PrivateMessageEvent, state: T_State): group = state['group'] msg = state['announce_text'] if group == 'all': t = DBTable(table_name='Group') group_res = await t.list_col(col_name='group_id') for group_id in group_res.result: - await bot.call_api(api='send_group_msg', group_id=group_id, message=msg) + try: + await bot.call_api(api='send_group_msg', group_id=group_id, message=msg) + except Exception as e: + logger.warning(f'向群组发送公告失败, group: {group_id}, error: {repr(e)}') + continue elif group == 'notice': t = DBTable(table_name='Group') group_res = await t.list_col_with_condition('group_id', 'notice_permissions', 1) for group_id in group_res.result: - await bot.call_api(api='send_group_msg', group_id=group_id, message=msg) + try: + await bot.call_api(api='send_group_msg', group_id=group_id, message=msg) + except Exception as e: + logger.warning(f'向群组发送公告失败, group: {group_id}, error: {repr(e)}') + continue elif group == 'command': t = DBTable(table_name='Group') group_res = await t.list_col_with_condition('group_id', 'command_permissions', 1) for group_id in group_res.result: - await bot.call_api(api='send_group_msg', group_id=group_id, message=msg) + try: + await bot.call_api(api='send_group_msg', group_id=group_id, message=msg) + except Exception as e: + logger.warning(f'向群组发送公告失败, group: {group_id}, error: {repr(e)}') + continue elif re.match(r'^\d+$', group): group_id = int(group) - await bot.call_api(api='send_group_msg', group_id=group_id, message=msg) + try: + await bot.call_api(api='send_group_msg', group_id=group_id, message=msg) + except Exception as e: + logger.warning(f'向群组发送公告失败, group: {group_id}, error: {repr(e)}') else: logger.warning(f'公告未发送, 不合规的群组类型或群号: {group}') await announce.finish('不合规的群组类型或群号') From c0545db4cfe3986132da340d418fa0aceefa65e8 Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Thu, 6 May 2021 03:12:36 +0800 Subject: [PATCH 27/33] =?UTF-8?q?Upgrade:=20=E9=83=A8=E5=88=86=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=B8=AE=E5=8A=A9=E6=96=87=E6=9C=AC=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=9C=BA=E6=99=AF=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 部分插件帮助文本添加使用场景(群聊/私聊)说明 --- omega_miya/plugins/Omega_email/__init__.py | 1 + omega_miya/plugins/Omega_skill/__init__.py | 15 ++++++++------- omega_miya/plugins/Omega_vocation/__init__.py | 1 + omega_miya/plugins/draw/__init__.py | 1 + omega_miya/plugins/maybe/__init__.py | 1 + omega_miya/plugins/nhentai/__init__.py | 1 + omega_miya/plugins/pixiv/__init__.py | 1 + omega_miya/plugins/pixivsion_monitor/__init__.py | 1 + omega_miya/plugins/roll/__init__.py | 1 + 9 files changed, 16 insertions(+), 7 deletions(-) diff --git a/omega_miya/plugins/Omega_email/__init__.py b/omega_miya/plugins/Omega_email/__init__.py index d657e5cb..d6886aed 100644 --- a/omega_miya/plugins/Omega_email/__init__.py +++ b/omega_miya/plugins/Omega_email/__init__.py @@ -15,6 +15,7 @@ __plugin_name__ = 'OmegaEmail' __plugin_usage__ = r'''【OmegaEmail 邮箱插件】 主要是用来收验证码OvO +仅限群聊使用 **Permission** Command diff --git a/omega_miya/plugins/Omega_skill/__init__.py b/omega_miya/plugins/Omega_skill/__init__.py index 8dabbfe0..7294bed0 100644 --- a/omega_miya/plugins/Omega_skill/__init__.py +++ b/omega_miya/plugins/Omega_skill/__init__.py @@ -2,7 +2,7 @@ from nonebot.permission import SUPERUSER from nonebot.typing import T_State from nonebot.adapters.cqhttp.bot import Bot -from nonebot.adapters.cqhttp.event import Event, GroupMessageEvent +from nonebot.adapters.cqhttp.event import MessageEvent, GroupMessageEvent from nonebot.adapters.cqhttp.permission import GROUP from omega_miya.utils.Omega_Base import DBSkill, DBUser, DBTable, Result from omega_miya.utils.Omega_plugin_utils import init_export, init_permission_state @@ -11,6 +11,7 @@ __plugin_name__ = '技能' __plugin_usage__ = r'''【Omega 技能插件】 用来设置/查询自己的技能 +仅限群聊使用 **Permission** Command @@ -44,7 +45,7 @@ # 修改默认参数处理 @skill_admin.args_parser -async def parse(bot: Bot, event: Event, state: T_State): +async def parse(bot: Bot, event: MessageEvent, state: T_State): args = str(event.get_plaintext()).strip().lower().split() if not args: await skill_admin.reject('你似乎没有发送有效的参数呢QAQ, 请重新发送:') @@ -54,7 +55,7 @@ async def parse(bot: Bot, event: Event, state: T_State): @skill_admin.handle() -async def handle_first_receive(bot: Bot, event: Event, state: T_State): +async def handle_first_receive(bot: Bot, event: MessageEvent, state: T_State): args = str(event.get_plaintext()).strip().lower().split() if not args: pass @@ -72,7 +73,7 @@ async def handle_first_receive(bot: Bot, event: Event, state: T_State): @skill_admin.got('sub_command', prompt='执行操作?\n【add/del】') -async def handle_sub_command_args(bot: Bot, event: Event, state: T_State): +async def handle_sub_command_args(bot: Bot, event: MessageEvent, state: T_State): if state['sub_command'] not in ['add', 'del']: await skill_admin.finish('没有这个命令哦, 请在【add/del】中选择并重新发送') if state['sub_command'] == 'del': @@ -81,7 +82,7 @@ async def handle_sub_command_args(bot: Bot, event: Event, state: T_State): @skill_admin.got('skill_name', prompt='请输入技能名称:') @skill_admin.got('skill_description', prompt='请输入技能描述:') -async def handle_sub_command(bot: Bot, event: Event, state: T_State): +async def handle_sub_command(bot: Bot, event: MessageEvent, state: T_State): # 子命令列表 command = { 'add': skill_add, @@ -100,7 +101,7 @@ async def handle_sub_command(bot: Bot, event: Event, state: T_State): await skill_admin.finish('Failed QAQ') -async def skill_add(bot: Bot, event: Event, state: T_State) -> Result.IntResult: +async def skill_add(bot: Bot, event: MessageEvent, state: T_State) -> Result.IntResult: skill_name = state["skill_name"] skill_description = state["skill_description"] skill = DBSkill(name=skill_name) @@ -108,7 +109,7 @@ async def skill_add(bot: Bot, event: Event, state: T_State) -> Result.IntResult: return result -async def skill_del(bot: Bot, event: Event, state: T_State) -> Result.IntResult: +async def skill_del(bot: Bot, event: MessageEvent, state: T_State) -> Result.IntResult: skill_name = state["skill_name"] skill = DBSkill(name=skill_name) result = await skill.delete() diff --git a/omega_miya/plugins/Omega_vocation/__init__.py b/omega_miya/plugins/Omega_vocation/__init__.py index 0d267770..522aff84 100644 --- a/omega_miya/plugins/Omega_vocation/__init__.py +++ b/omega_miya/plugins/Omega_vocation/__init__.py @@ -12,6 +12,7 @@ __plugin_name__ = '请假' __plugin_usage__ = r'''【Omega 请假插件】 用来设置/查询自己以及群员的状态和假期 +仅限群聊使用 **Permission** Command diff --git a/omega_miya/plugins/draw/__init__.py b/omega_miya/plugins/draw/__init__.py index f998bb46..8e2b36ea 100644 --- a/omega_miya/plugins/draw/__init__.py +++ b/omega_miya/plugins/draw/__init__.py @@ -12,6 +12,7 @@ 模拟各种抽卡 没有保底的啦! 不要上头啊喂! +仅限群聊使用 **Permission** Command & Lv.10 diff --git a/omega_miya/plugins/maybe/__init__.py b/omega_miya/plugins/maybe/__init__.py index bf767714..28015fd4 100644 --- a/omega_miya/plugins/maybe/__init__.py +++ b/omega_miya/plugins/maybe/__init__.py @@ -15,6 +15,7 @@ 求签, 求运势, 包括且不限于抽卡、吃饭、睡懒觉、DD 每个人每天求同一个东西的结果是一样的啦! 不要不信邪重新抽啦! +仅限群聊使用 **Permission** Command & Lv.10 diff --git a/omega_miya/plugins/nhentai/__init__.py b/omega_miya/plugins/nhentai/__init__.py index 1c319565..65d0fc3b 100644 --- a/omega_miya/plugins/nhentai/__init__.py +++ b/omega_miya/plugins/nhentai/__init__.py @@ -17,6 +17,7 @@ __plugin_name__ = 'nh' __plugin_usage__ = r'''【nh】 神秘的插件 +仅限群聊使用 **Permission** Command diff --git a/omega_miya/plugins/pixiv/__init__.py b/omega_miya/plugins/pixiv/__init__.py index 9db8c538..0804899b 100644 --- a/omega_miya/plugins/pixiv/__init__.py +++ b/omega_miya/plugins/pixiv/__init__.py @@ -12,6 +12,7 @@ __plugin_name__ = 'Pixiv' __plugin_usage__ = r'''【Pixiv助手】 查看Pixiv插画, 以及日榜、周榜、月榜 +仅限群聊使用 **Permission** Command & Lv.50 diff --git a/omega_miya/plugins/pixivsion_monitor/__init__.py b/omega_miya/plugins/pixivsion_monitor/__init__.py index 362d3a0f..be1ae058 100644 --- a/omega_miya/plugins/pixivsion_monitor/__init__.py +++ b/omega_miya/plugins/pixivsion_monitor/__init__.py @@ -13,6 +13,7 @@ __plugin_name__ = 'Pixivision' __plugin_usage__ = r'''【Pixivision订阅】 推送最新的Pixivision特辑 +仅限群聊使用 **Permission** Command & Lv.30 diff --git a/omega_miya/plugins/roll/__init__.py b/omega_miya/plugins/roll/__init__.py index 48e6004c..012c602e 100644 --- a/omega_miya/plugins/roll/__init__.py +++ b/omega_miya/plugins/roll/__init__.py @@ -13,6 +13,7 @@ __plugin_usage__ = r'''【Roll & 抽奖】 一个整合了各种roll机制的插件 更多功能待加入 +仅限群聊使用 **Permission** Command & Lv.10 From 8ebf8280cb6e168994193c8664cfb90a1cb86019 Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Thu, 6 May 2021 03:14:17 +0800 Subject: [PATCH 28/33] =?UTF-8?q?Upgrade:=20omega=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E5=A2=9E=E5=8A=A0=E5=A5=BD=E5=8F=8B=E6=9D=83?= =?UTF-8?q?=E9=99=90=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - omega管理插件增加好友权限管理功能 - 权限模块交互文本优化 --- .../plugins/Omega_auth_manage/__init__.py | 19 +-- omega_miya/plugins/Omega_manage/__init__.py | 138 +++++++++++++++++- omega_miya/utils/Omega_Permission/__init__.py | 4 +- 3 files changed, 142 insertions(+), 19 deletions(-) diff --git a/omega_miya/plugins/Omega_auth_manage/__init__.py b/omega_miya/plugins/Omega_auth_manage/__init__.py index 674ad760..59a954ef 100644 --- a/omega_miya/plugins/Omega_auth_manage/__init__.py +++ b/omega_miya/plugins/Omega_auth_manage/__init__.py @@ -4,7 +4,7 @@ from nonebot.permission import SUPERUSER from nonebot.typing import T_State from nonebot.adapters.cqhttp.bot import Bot -from nonebot.adapters.cqhttp.event import Event +from nonebot.adapters.cqhttp.event import MessageEvent from omega_miya.utils.Omega_Base import DBUser, DBGroup, DBAuth from omega_miya.utils.Omega_plugin_utils import init_export @@ -13,6 +13,7 @@ __plugin_name__ = 'OmegaAuth' __plugin_usage__ = r'''【OmegaAuth 授权管理插件】 插件特殊权限授权管理 +仅限管理员使用 **Usage** **SuperUser Only** @@ -28,7 +29,7 @@ # 修改默认参数处理 @omegaauth.args_parser -async def parse(bot: Bot, event: Event, state: T_State): +async def parse(bot: Bot, event: MessageEvent, state: T_State): args = str(event.get_plaintext()).strip().split() if not args: await omegaauth.reject('你似乎没有发送有效的参数呢QAQ, 请重新发送:') @@ -38,7 +39,7 @@ async def parse(bot: Bot, event: Event, state: T_State): @omegaauth.handle() -async def handle_first_receive(bot: Bot, event: Event, state: T_State): +async def handle_first_receive(bot: Bot, event: MessageEvent, state: T_State): args = str(event.get_plaintext()).strip().split() if not args: pass @@ -49,7 +50,7 @@ async def handle_first_receive(bot: Bot, event: Event, state: T_State): @omegaauth.got('sub_command', prompt='执行操作?\n【allow/deny/clear/list】') -async def handle_sub_command(bot: Bot, event: Event, state: T_State): +async def handle_sub_command(bot: Bot, event: MessageEvent, state: T_State): sub_command = state["sub_command"] if sub_command not in ['allow', 'deny', 'clear', 'list']: await omegaauth.finish('参数错误QAQ') @@ -57,7 +58,7 @@ async def handle_sub_command(bot: Bot, event: Event, state: T_State): # 处理显示权限节点列表事件 @omegaauth.got('sub_command', prompt='list:') -async def handle_list_node(bot: Bot, event: Event, state: T_State): +async def handle_list_node(bot: Bot, event: MessageEvent, state: T_State): sub_command = state["sub_command"] if sub_command == 'list': detail_type = event.dict().get(f'{event.get_type()}_type') @@ -84,14 +85,14 @@ async def handle_list_node(bot: Bot, event: Event, state: T_State): @omegaauth.got('auth_type', prompt='授权类型?\n【user/group】') -async def handle_auth_type(bot: Bot, event: Event, state: T_State): +async def handle_auth_type(bot: Bot, event: MessageEvent, state: T_State): auth_type = state["auth_type"] if auth_type not in ['user', 'group']: await omegaauth.finish('参数错误QAQ') @omegaauth.got('auth_id', prompt='请输入授权用户qq或授权群组群号:') -async def handle_auth_id(bot: Bot, event: Event, state: T_State): +async def handle_auth_id(bot: Bot, event: MessageEvent, state: T_State): auth_type = state["auth_type"] auth_id = state["auth_id"] if not re.match(r'^\d+$', auth_id): @@ -129,7 +130,7 @@ async def handle_auth_id(bot: Bot, event: Event, state: T_State): @omegaauth.got('plugin', prompt='请输入想要配置权限节点的插件名称:') -async def handle_plugin(bot: Bot, event: Event, state: T_State): +async def handle_plugin(bot: Bot, event: MessageEvent, state: T_State): plugin = state["plugin"] auth_node_plugin = state["auth_node_plugin"] if plugin not in auth_node_plugin: @@ -142,7 +143,7 @@ async def handle_plugin(bot: Bot, event: Event, state: T_State): @omegaauth.got('auth_node', prompt='请输入想要配置的权限节点名称:') -async def handle_auth_node(bot: Bot, event: Event, state: T_State): +async def handle_auth_node(bot: Bot, event: MessageEvent, state: T_State): auth_node = state["auth_node"] plugin = state["plugin"] plugin_auth_nodes = state["plugin_auth_nodes"] diff --git a/omega_miya/plugins/Omega_manage/__init__.py b/omega_miya/plugins/Omega_manage/__init__.py index b8cf05e7..1e348a5b 100644 --- a/omega_miya/plugins/Omega_manage/__init__.py +++ b/omega_miya/plugins/Omega_manage/__init__.py @@ -1,7 +1,7 @@ """ Omega Miya 使用指南 -- /Omega Init - bot首次加入新群组后须使用本命令进行初始化 +- /Omega Init - bot首次加入新群组/首次添加bot好友后, 须使用本命令进行初始化 - /Omega Upgrade - 手动更新本群组信息 - /Omega Notice - 为本群组配置通知权限(订阅类插件是否通知) - /Omega Command - 为本群组配置命令权限(是否允许使用命令) @@ -12,9 +12,9 @@ from nonebot.permission import SUPERUSER from nonebot.typing import T_State from nonebot.adapters.cqhttp.bot import Bot -from nonebot.adapters.cqhttp.event import GroupMessageEvent -from nonebot.adapters.cqhttp.permission import GROUP_ADMIN, GROUP_OWNER -from omega_miya.utils.Omega_Base import DBGroup, DBUser, DBAuth, Result +from nonebot.adapters.cqhttp.event import MessageEvent, GroupMessageEvent, PrivateMessageEvent +from nonebot.adapters.cqhttp.permission import GROUP_ADMIN, GROUP_OWNER, PRIVATE_FRIEND +from omega_miya.utils.Omega_Base import DBGroup, DBUser, DBAuth, DBFriend, Result from omega_miya.utils.Omega_plugin_utils import init_export from .sys_background_scheduled import scheduler @@ -31,19 +31,24 @@ /Omega Command /Omega SetLevel /Omega ShowPermission -/Omega ResetPermission''' +/Omega ResetPermission + +**Friend Private Only** +/Omega Init +/Omega Enable +/Omega Disable''' # Init plugin export init_export(export(), __plugin_name__, __plugin_usage__) # 注册事件响应器 omega = on_command('Omega', rule=None, aliases={'omega'}, - permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER, priority=10, block=True) + permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER | PRIVATE_FRIEND, priority=10, block=True) # 修改默认参数处理 @omega.args_parser -async def parse(bot: Bot, event: GroupMessageEvent, state: T_State): +async def parse(bot: Bot, event: MessageEvent, state: T_State): args = str(event.get_plaintext()).strip().lower().split() if not args: await omega.reject('你似乎没有发送有效的参数呢QAQ, 请重新发送:') @@ -53,7 +58,7 @@ async def parse(bot: Bot, event: GroupMessageEvent, state: T_State): @omega.handle() -async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_first_receive(bot: Bot, event: MessageEvent, state: T_State): args = str(event.get_plaintext()).strip().lower().split() if args and len(args) == 1: state['sub_command'] = args[0] @@ -67,6 +72,8 @@ async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_Stat @omega.got('sub_command', prompt='执行操作?\n【Init/Upgrade/Notice/Command/SetLevel/ShowPermission/ResetPermission】') async def handle_sub_command(bot: Bot, event: GroupMessageEvent, state: T_State): + if not isinstance(event, GroupMessageEvent): + return # 子命令列表 command = { 'init': group_init, @@ -97,6 +104,98 @@ async def handle_sub_command(bot: Bot, event: GroupMessageEvent, state: T_State) await omega.finish('Failed QAQ') +@omega.got('sub_command', prompt='执行操作?\n【Init/Enable/Disable】') +async def handle_sub_command(bot: Bot, event: PrivateMessageEvent, state: T_State): + if not isinstance(event, PrivateMessageEvent): + return + # 子命令列表 + command = { + 'init': friend_init, + 'enable': friend_private_enable, + 'disable': friend_private_disable + } + # 需要回复信息的命令列表 + need_reply = [ + 'init', + 'enable', + 'disable' + ] + sub_command = state["sub_command"] + # 在这里对参数进行验证 + if sub_command not in command.keys(): + await omega.finish('没有这个命令哦QAQ') + result = await command[sub_command](bot=bot, event=event, state=state) + if result.success(): + logger.info(f"Private friend: {event.user_id}, {sub_command}, Success, {result.info}") + if sub_command in need_reply: + await omega.finish(result.result) + else: + await omega.finish('Success') + else: + logger.error(f"Private friend: {event.user_id}, {sub_command}, Failed, {result.info}") + if sub_command in need_reply: + await omega.finish(result.result) + else: + await omega.finish('Failed QAQ') + + +async def friend_init(bot: Bot, event: PrivateMessageEvent, state: T_State) -> Result.TextResult: + user_id = event.user_id + # 调用api获取好友列表 + friends_list = await bot.call_api('get_friend_list') + actual_friend_list = [int(x.get('user_id')) for x in friends_list] + if user_id not in actual_friend_list: + return Result.TextResult(error=True, info='Not in friends list', result='错误, 不在好友列表中') + + user_info = [x for x in friends_list if int(x.get('user_id')) == user_id][0] + nickname = user_info.get('nickname') + remark = user_info.get('remark') + + friend = DBFriend(user_id=user_id) + + # 更新用户表 + add_user_result = await friend.add(nickname=nickname) + if add_user_result.error: + return Result.TextResult(error=True, info=add_user_result.info, result='错误, 请联系管理员处理') + + # 初始化好友authnode + await init_user_auth_node(user_id=user_id) + + set_friend_result = await friend.set_friend(nickname=nickname, remark=remark, private_permissions=1) + if set_friend_result.success(): + return Result.TextResult(error=False, info='Success', result='成功, 现在可以使用私聊命令了') + else: + return Result.TextResult(error=True, info=set_friend_result.info, result='错误, 请联系管理员处理') + + +async def friend_private_enable(bot: Bot, event: PrivateMessageEvent, state: T_State) -> Result.TextResult: + user_id = event.user_id + + # 初始化好友authnode + await init_user_auth_node(user_id=user_id) + + friend = DBFriend(user_id=user_id) + result = await friend.set_private_permission(private_permissions=1) + if result.success(): + return Result.TextResult(error=False, info='Success', result='成功, 已启用私聊功能, 权限节点已设置为默认值') + else: + return Result.TextResult(error=True, info=result.info, result='失败, 请先尝试"/Omega Init", 若仍失败请联系管理员处理') + + +async def friend_private_disable(bot: Bot, event: PrivateMessageEvent, state: T_State) -> Result.TextResult: + user_id = event.user_id + + # 初始化好友authnode + await init_user_auth_node(user_id=user_id) + + friend = DBFriend(user_id=user_id) + result = await friend.set_private_permission(private_permissions=0) + if result.success(): + return Result.TextResult(error=False, info='Success', result='成功, 已禁用私聊功能, 权限节点已重置为默认值') + else: + return Result.TextResult(error=True, info=result.info, result='失败, 请先尝试"/Omega Init", 若仍失败请联系管理员处理') + + async def group_init(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.IntResult: group_id = event.group_id # 调用api获取群信息 @@ -306,3 +405,26 @@ class AuthNode: res = await auth.set(allow_tag=auth_node.allow_tag, deny_tag=auth_node.deny_tag, auth_info=auth_node.auth_info) if res.error: logger.opt(colors=True).error(f'配置默认权限失败, {auth_node.node}/{group_id}, error: {res.info}') + + +async def init_user_auth_node(user_id: int): + """ + 为好友配置权限节点默认值 + """ + @dataclass + class AuthNode: + node: str + allow_tag: int + deny_tag: int + auth_info: str + + default_auth_nodes = [ + AuthNode(node='Omega_help.skip_cd', allow_tag=1, deny_tag=0, auth_info='默认规则: 好友help免cd'), + AuthNode(node='setu.setu', allow_tag=0, deny_tag=1, auth_info='默认规则: 禁用setu') + ] + + for auth_node in default_auth_nodes: + auth = DBAuth(auth_id=user_id, auth_type='user', auth_node=auth_node.node) + res = await auth.set(allow_tag=auth_node.allow_tag, deny_tag=auth_node.deny_tag, auth_info=auth_node.auth_info) + if res.error: + logger.opt(colors=True).error(f'配置默认权限失败, {auth_node.node}/{user_id}, error: {res.info}') diff --git a/omega_miya/utils/Omega_Permission/__init__.py b/omega_miya/utils/Omega_Permission/__init__.py index 7ecde8e8..580e50cf 100644 --- a/omega_miya/utils/Omega_Permission/__init__.py +++ b/omega_miya/utils/Omega_Permission/__init__.py @@ -11,7 +11,7 @@ @run_preprocessor async def handle_plugin_permission(matcher: Matcher, bot: Bot, event: MessageEvent, state: T_State): - if isinstance(event, PrivateMessageEvent) and event.sub_type == "friend": + if isinstance(event, PrivateMessageEvent): private_mode = True elif isinstance(event, GroupMessageEvent): private_mode = False @@ -40,7 +40,7 @@ async def handle_plugin_permission(matcher: Matcher, bot: Bot, event: MessageEve if command_checker: pass else: - await bot.send(event=event, message=f'没有好友命令权限QAQ') + await bot.send(event=event, message=f'没有好友命令权限QAQ, 请添加好友后使用"/Omega Enable"或"/Omega Init"启用') raise IgnoredException('没有好友命令权限') else: if matcher_command_permission: From dc93e158dcdeca8a850e4e9f03db400916e97d28 Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Thu, 6 May 2021 03:15:01 +0800 Subject: [PATCH 29/33] =?UTF-8?q?Upgrade:=20B=E7=AB=99=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=BA=E7=BE=A4=E8=81=8A/=E7=A7=81?= =?UTF-8?q?=E8=81=8A=E5=8F=AF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - B站插件调整为群聊/私聊可用 - 允许好友私聊订阅 --- .../bilibili_dynamic_monitor/__init__.py | 167 +++++++++++------ .../bilibili_dynamic_monitor/monitor.py | 28 ++- .../plugins/bilibili_live_monitor/__init__.py | 176 ++++++++++++------ .../plugins/bilibili_live_monitor/monitor.py | 65 +++++-- omega_miya/utils/Omega_Base/model/friend.py | 22 +++ .../utils/Omega_Base/model/subscription.py | 43 ++++- 6 files changed, 377 insertions(+), 124 deletions(-) diff --git a/omega_miya/plugins/bilibili_dynamic_monitor/__init__.py b/omega_miya/plugins/bilibili_dynamic_monitor/__init__.py index fb4b5a03..a1f9b680 100644 --- a/omega_miya/plugins/bilibili_dynamic_monitor/__init__.py +++ b/omega_miya/plugins/bilibili_dynamic_monitor/__init__.py @@ -3,9 +3,9 @@ from nonebot.permission import SUPERUSER from nonebot.typing import T_State from nonebot.adapters.cqhttp.bot import Bot -from nonebot.adapters.cqhttp.event import GroupMessageEvent -from nonebot.adapters.cqhttp.permission import GROUP_ADMIN, GROUP_OWNER -from omega_miya.utils.Omega_Base import DBGroup, DBSubscription, Result +from nonebot.adapters.cqhttp.event import MessageEvent, GroupMessageEvent, PrivateMessageEvent +from nonebot.adapters.cqhttp.permission import GROUP_ADMIN, GROUP_OWNER, PRIVATE_FRIEND +from omega_miya.utils.Omega_Base import DBGroup, DBFriend, DBSubscription, Result from omega_miya.utils.Omega_plugin_utils import init_export, init_permission_state from .utils import get_user_info from .monitor import * @@ -15,8 +15,10 @@ __plugin_name__ = 'B站动态订阅' __plugin_usage__ = r'''【B站动态订阅】 随时更新up动态 +群组/私聊可用 **Permission** +Friend Private Command & Lv.20 **Usage** @@ -39,14 +41,14 @@ name='bilibili_dynamic', command=True, level=20), - permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER, + permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER | PRIVATE_FRIEND, priority=20, block=True) # 修改默认参数处理 @bilibili_dynamic.args_parser -async def parse(bot: Bot, event: GroupMessageEvent, state: T_State): +async def parse(bot: Bot, event: MessageEvent, state: T_State): args = str(event.get_plaintext()).strip().lower().split() if not args: await bilibili_dynamic.reject('你似乎没有发送有效的参数呢QAQ, 请重新发送:') @@ -56,7 +58,7 @@ async def parse(bot: Bot, event: GroupMessageEvent, state: T_State): @bilibili_dynamic.handle() -async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_first_receive(bot: Bot, event: MessageEvent, state: T_State): args = str(event.get_plaintext()).strip().lower().split() if not args: pass @@ -70,28 +72,37 @@ async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_Stat @bilibili_dynamic.got('sub_command', prompt='执行操作?\n【订阅/取消订阅/清空订阅/订阅列表】') -async def handle_sub_command_args(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_sub_command_args(bot: Bot, event: MessageEvent, state: T_State): + if isinstance(event, GroupMessageEvent): + group_id = event.group_id + msg = '本群已订阅以下动态:\n' + else: + group_id = 'Private event' + msg = '你已订阅以下动态:\n' + if state['sub_command'] not in ['订阅', '取消订阅', '清空订阅', '订阅列表']: await bilibili_dynamic.finish('没有这个命令哦, 请在【订阅/取消订阅/清空订阅/订阅列表】中选择并重新发送') if state['sub_command'] == '订阅列表': _res = await sub_list(bot=bot, event=event, state=state) if not _res.success(): - logger.error(f"查询群组动态订阅失败, group_id: {event.group_id}, error: {_res.info}") - await bilibili_dynamic.finish('查询群组动态订阅失败QAQ, 请稍后再试吧') - msg = '本群已订阅以下动态:\n' - for sub_id, up_name in _res.result: - msg += f'\n【{sub_id}/{up_name}】' + logger.error(f"查询动态订阅失败, {group_id} / {event.user_id}, error: {_res.info}") + await bilibili_dynamic.finish('查询动态订阅失败QAQ, 请稍后再试吧') + if not _res.result: + msg = '当前没有任何动态订阅' + else: + for sub_id, up_name in _res.result: + msg += f'\n【{sub_id}/{up_name}】' await bilibili_dynamic.finish(msg) elif state['sub_command'] == '清空订阅': state['uid'] = None @bilibili_dynamic.got('uid', prompt='请输入订阅动态用户UID:') -async def handle_uid(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_uid(bot: Bot, event: MessageEvent, state: T_State): sub_command = state['sub_command'] # 针对清空动态操作, 跳过获取动态信息 if state['sub_command'] == '清空订阅': - await bilibili_dynamic.pause('【警告!】\n即将清空本群组的所有订阅!\n请发送任意消息以继续操作:') + await bilibili_dynamic.pause('【警告!】\n即将清空本所有订阅!\n请发送任意消息以继续操作:') # 动态信息获取部分 uid = state['uid'] if not re.match(r'^\d+$', uid): @@ -107,7 +118,12 @@ async def handle_uid(bot: Bot, event: GroupMessageEvent, state: T_State): @bilibili_dynamic.got('check', prompt='确认吗?\n\n【是/否】') -async def handle_check(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_check(bot: Bot, event: MessageEvent, state: T_State): + if isinstance(event, GroupMessageEvent): + group_id = event.group_id + else: + group_id = 'Private event' + check_msg = state['check'] uid = state['uid'] if check_msg != '是': @@ -122,52 +138,99 @@ async def handle_check(bot: Bot, event: GroupMessageEvent, state: T_State): else: _res = Result.IntResult(error=True, info='Unknown error, except sub_command', result=-1) if _res.success(): - logger.info(f"{sub_command}动态成功, group_id: {event.group_id}, uid: {uid}") + logger.info(f"{sub_command}动态成功, {group_id} / {event.user_id}, uid: {uid}") await bilibili_dynamic.finish(f'{sub_command}成功!') else: - logger.error(f"{sub_command}动态失败, group_id: {event.group_id}, uid: {uid}," + logger.error(f"{sub_command}动态失败, {group_id} / {event.user_id}, uid: {uid}," f"info: {_res.info}") await bilibili_dynamic.finish(f'{sub_command}失败了QAQ, 可能并未订阅该用户, 或请稍后再试~') -async def sub_list(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.ListResult: - group_id = event.group_id - group = DBGroup(group_id=group_id) - result = await group.subscription_list_by_type(sub_type=2) - return result +async def sub_list(bot: Bot, event: MessageEvent, state: T_State) -> Result.ListResult: + if isinstance(event, GroupMessageEvent): + group_id = event.group_id + group = DBGroup(group_id=group_id) + result = await group.subscription_list_by_type(sub_type=2) + return result + elif isinstance(event, PrivateMessageEvent): + user_id = event.user_id + friend = DBFriend(user_id=user_id) + result = await friend.subscription_list_by_type(sub_type=2) + return result + else: + return Result.ListResult(error=True, info='Illegal event', result=[]) -async def sub_add(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.IntResult: - group_id = event.group_id - group = DBGroup(group_id=group_id) - uid = state['uid'] - sub = DBSubscription(sub_type=2, sub_id=uid) - _res = await sub.add(up_name=state.get('up_name'), live_info='B站动态') - if not _res.success(): - return _res - _res = await group.subscription_add(sub=sub) - if not _res.success(): - return _res - result = Result.IntResult(error=False, info='Success', result=0) - return result +async def sub_add(bot: Bot, event: MessageEvent, state: T_State) -> Result.IntResult: + if isinstance(event, GroupMessageEvent): + group_id = event.group_id + group = DBGroup(group_id=group_id) + uid = state['uid'] + sub = DBSubscription(sub_type=2, sub_id=uid) + _res = await sub.add(up_name=state.get('up_name'), live_info='B站动态') + if not _res.success(): + return _res + _res = await group.subscription_add(sub=sub) + if not _res.success(): + return _res + result = Result.IntResult(error=False, info='Success', result=0) + return result + elif isinstance(event, PrivateMessageEvent): + user_id = event.user_id + friend = DBFriend(user_id=user_id) + uid = state['uid'] + sub = DBSubscription(sub_type=2, sub_id=uid) + _res = await sub.add(up_name=state.get('up_name'), live_info='B站动态') + if not _res.success(): + return _res + _res = await friend.subscription_add(sub=sub) + if not _res.success(): + return _res + result = Result.IntResult(error=False, info='Success', result=0) + return result + else: + return Result.IntResult(error=True, info='Illegal event', result=-1) -async def sub_del(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.IntResult: - group_id = event.group_id - group = DBGroup(group_id=group_id) - uid = state['uid'] - _res = await group.subscription_del(sub=DBSubscription(sub_type=2, sub_id=uid)) - if not _res.success(): - return _res - result = Result.IntResult(error=False, info='Success', result=0) - return result +async def sub_del(bot: Bot, event: MessageEvent, state: T_State) -> Result.IntResult: + if isinstance(event, GroupMessageEvent): + group_id = event.group_id + group = DBGroup(group_id=group_id) + uid = state['uid'] + _res = await group.subscription_del(sub=DBSubscription(sub_type=2, sub_id=uid)) + if not _res.success(): + return _res + result = Result.IntResult(error=False, info='Success', result=0) + return result + elif isinstance(event, PrivateMessageEvent): + user_id = event.user_id + friend = DBFriend(user_id=user_id) + uid = state['uid'] + _res = await friend.subscription_del(sub=DBSubscription(sub_type=2, sub_id=uid)) + if not _res.success(): + return _res + result = Result.IntResult(error=False, info='Success', result=0) + return result + else: + return Result.IntResult(error=True, info='Illegal event', result=-1) -async def sub_clear(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.IntResult: - group_id = event.group_id - group = DBGroup(group_id=group_id) - _res = await group.subscription_clear_by_type(sub_type=2) - if not _res.success(): - return _res - result = Result.IntResult(error=False, info='Success', result=0) - return result +async def sub_clear(bot: Bot, event: MessageEvent, state: T_State) -> Result.IntResult: + if isinstance(event, GroupMessageEvent): + group_id = event.group_id + group = DBGroup(group_id=group_id) + _res = await group.subscription_clear_by_type(sub_type=2) + if not _res.success(): + return _res + result = Result.IntResult(error=False, info='Success', result=0) + return result + elif isinstance(event, PrivateMessageEvent): + user_id = event.user_id + friend = DBFriend(user_id=user_id) + _res = await friend.subscription_clear_by_type(sub_type=2) + if not _res.success(): + return _res + result = Result.IntResult(error=False, info='Success', result=0) + return result + else: + return Result.IntResult(error=True, info='Illegal event', result=-1) diff --git a/omega_miya/plugins/bilibili_dynamic_monitor/monitor.py b/omega_miya/plugins/bilibili_dynamic_monitor/monitor.py index 208bf6d4..66435a4e 100644 --- a/omega_miya/plugins/bilibili_dynamic_monitor/monitor.py +++ b/omega_miya/plugins/bilibili_dynamic_monitor/monitor.py @@ -2,7 +2,7 @@ import random from nonebot import logger, require, get_bots from nonebot.adapters.cqhttp import MessageSegment -from omega_miya.utils.Omega_Base import DBSubscription, DBDynamic, DBTable +from omega_miya.utils.Omega_Base import DBFriend, DBSubscription, DBDynamic, DBTable from .utils import get_user_dynamic_history, get_user_info, get_user_dynamic, get_dynamic_info, pic_2_base64 from .utils import ENABLE_DYNAMIC_CHECK_POOL_MODE @@ -64,6 +64,10 @@ async def bilibili_dynamic_monitor(): group_res = await t.list_col_with_condition('group_id', 'notice_permissions', 1) all_noitce_groups = [int(x) for x in group_res.result] + # 获取所有启用了私聊功能的好友 + friend_res = await DBFriend.list_exist_friends_by_private_permission(private_permission=1) + all_noitce_friends = [int(x) for x in friend_res.result] + # 获取订阅表中的所有动态订阅 t = DBTable(table_name='Subscription') sub_res = await t.list_col_with_condition('sub_id', 'sub_type', 2) @@ -100,7 +104,13 @@ async def check_dynamic(dy_uid): sub_group_res = await sub.sub_group_list() sub_group = sub_group_res.result # 需通知的群 - notice_group = list(set(all_noitce_groups) & set(sub_group)) + notice_groups = list(set(all_noitce_groups) & set(sub_group)) + + # 获取订阅了该直播间的所有好友 + sub_friend_res = await sub.sub_user_list() + sub_friend = sub_friend_res.result + # 需通知的好友 + notice_friends = list(set(all_noitce_friends) & set(sub_friend)) for num in range(len(dynamic_info)): try: @@ -188,9 +198,9 @@ async def check_dynamic(dy_uid): logger.warning(f"未知的动态类型: {dynamic_info[num]['type']}, id: {dynamic_info[num]['id']}") msg = None - # 向群组发送消息 if msg: - for group_id in notice_group: + # 向群组发送消息 + for group_id in notice_groups: for _bot in bots: try: await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg) @@ -199,6 +209,16 @@ async def check_dynamic(dy_uid): logger.warning(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']} 失败, " f"error: {repr(_e)}") continue + # 向好友发送消息 + for user_id in notice_friends: + for _bot in bots: + try: + await _bot.call_api(api='send_private_msg', user_id=user_id, message=msg) + logger.info(f"向好友: {user_id} 发送新动态通知: {dynamic_info[num]['id']}") + except Exception as _e: + logger.warning(f"向好友: {user_id} 发送新动态通知: {dynamic_info[num]['id']} 失败, " + f"error: {repr(_e)}") + continue # 更新动态内容到数据库 dy_id = dynamic_info[num]['id'] diff --git a/omega_miya/plugins/bilibili_live_monitor/__init__.py b/omega_miya/plugins/bilibili_live_monitor/__init__.py index 662e584d..f045e352 100644 --- a/omega_miya/plugins/bilibili_live_monitor/__init__.py +++ b/omega_miya/plugins/bilibili_live_monitor/__init__.py @@ -3,9 +3,9 @@ from nonebot.permission import SUPERUSER from nonebot.typing import T_State from nonebot.adapters.cqhttp.bot import Bot -from nonebot.adapters.cqhttp.event import GroupMessageEvent -from nonebot.adapters.cqhttp.permission import GROUP_ADMIN, GROUP_OWNER -from omega_miya.utils.Omega_Base import DBGroup, DBSubscription, Result +from nonebot.adapters.cqhttp.event import MessageEvent, GroupMessageEvent, PrivateMessageEvent +from nonebot.adapters.cqhttp.permission import GROUP_ADMIN, GROUP_OWNER, PRIVATE_FRIEND +from omega_miya.utils.Omega_Base import DBGroup, DBFriend, DBSubscription, Result from omega_miya.utils.Omega_plugin_utils import init_export, init_permission_state from .utils import get_live_info, get_user_info from .monitor import * @@ -16,8 +16,10 @@ __plugin_usage__ = r'''【B站直播间订阅】 监控直播间状态 开播、下播、直播间换标题提醒 +群组/私聊可用 **Permission** +Friend Private Command & Lv.20 **Usage** @@ -40,14 +42,14 @@ name='bilibili_live', command=True, level=20), - permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER, + permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER | PRIVATE_FRIEND, priority=20, block=True) # 修改默认参数处理 @bilibili_live.args_parser -async def parse(bot: Bot, event: GroupMessageEvent, state: T_State): +async def parse(bot: Bot, event: MessageEvent, state: T_State): args = str(event.get_plaintext()).strip().lower().split() if not args: await bilibili_live.reject('你似乎没有发送有效的参数呢QAQ, 请重新发送:') @@ -57,7 +59,7 @@ async def parse(bot: Bot, event: GroupMessageEvent, state: T_State): @bilibili_live.handle() -async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_first_receive(bot: Bot, event: MessageEvent, state: T_State): args = str(event.get_plaintext()).strip().lower().split() if not args: pass @@ -71,28 +73,37 @@ async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_Stat @bilibili_live.got('sub_command', prompt='执行操作?\n【订阅/取消订阅/清空订阅/订阅列表】') -async def handle_sub_command_args(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_sub_command_args(bot: Bot, event: MessageEvent, state: T_State): + if isinstance(event, GroupMessageEvent): + group_id = event.group_id + msg = '本群已订阅以下直播间:\n' + else: + group_id = 'Private event' + msg = '你已订阅以下直播间:\n' + if state['sub_command'] not in ['订阅', '取消订阅', '清空订阅', '订阅列表']: await bilibili_live.finish('没有这个命令哦, 请在【订阅/取消订阅/清空订阅/订阅列表】中选择并重新发送') if state['sub_command'] == '订阅列表': _res = await sub_list(bot=bot, event=event, state=state) if not _res.success(): - logger.error(f"查询群组直播间订阅失败, group_id: {event.group_id}, error: {_res.info}") - await bilibili_live.finish('查询群组直播间订阅失败QAQ, 请稍后再试吧') - msg = '本群已订阅以下直播间:\n' - for sub_id, up_name in _res.result: - msg += f'\n【{sub_id}/{up_name}】' + logger.error(f"查询直播间订阅失败, {group_id} / {event.user_id}, error: {_res.info}") + await bilibili_live.finish('查询直播间订阅失败QAQ, 请稍后再试吧') + if not _res.result: + msg = '当前没有任何直播间订阅' + else: + for sub_id, up_name in _res.result: + msg += f'\n【{sub_id}/{up_name}】' await bilibili_live.finish(msg) elif state['sub_command'] == '清空订阅': state['room_id'] = None @bilibili_live.got('room_id', prompt='请输入直播间房间号:') -async def handle_room_id(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_room_id(bot: Bot, event: MessageEvent, state: T_State): sub_command = state['sub_command'] # 针对清空直播间操作, 跳过获取直播间信息 if state['sub_command'] == '清空订阅': - await bilibili_live.pause('【警告!】\n即将清空本群组的所有订阅!\n请发送任意消息以继续操作:') + await bilibili_live.pause('【警告!】\n即将清空本的所有订阅!\n请发送任意消息以继续操作:') # 直播间信息获取部分 room_id = state['room_id'] if not re.match(r'^\d+$', room_id): @@ -113,7 +124,12 @@ async def handle_room_id(bot: Bot, event: GroupMessageEvent, state: T_State): @bilibili_live.got('check', prompt='确认吗?\n\n【是/否】') -async def handle_check(bot: Bot, event: GroupMessageEvent, state: T_State): +async def handle_check(bot: Bot, event: MessageEvent, state: T_State): + if isinstance(event, GroupMessageEvent): + group_id = event.group_id + else: + group_id = 'Private event' + check_msg = state['check'] room_id = state['room_id'] if check_msg != '是': @@ -128,55 +144,105 @@ async def handle_check(bot: Bot, event: GroupMessageEvent, state: T_State): else: _res = Result.IntResult(error=True, info='Unknown error, except sub_command', result=-1) if _res.success(): - logger.info(f"{sub_command}直播间成功, group_id: {event.group_id}, room_id: {room_id}") + logger.info(f"{sub_command}直播间成功, {group_id} / {event.user_id}, room_id: {room_id}") await bilibili_live.finish(f'{sub_command}成功!') else: - logger.error(f"{sub_command}直播间失败, group_id: {event.group_id}, room_id: {room_id}," + logger.error(f"{sub_command}直播间失败, {group_id} / {event.user_id}, room_id: {room_id}," f"info: {_res.info}") await bilibili_live.finish(f'{sub_command}失败了QAQ, 可能并未订阅该用户, 或请稍后再试~') -async def sub_list(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.ListResult: - group_id = event.group_id - group = DBGroup(group_id=group_id) - result = await group.subscription_list_by_type(sub_type=1) - return result +async def sub_list(bot: Bot, event: MessageEvent, state: T_State) -> Result.ListResult: + if isinstance(event, GroupMessageEvent): + group_id = event.group_id + group = DBGroup(group_id=group_id) + result = await group.subscription_list_by_type(sub_type=1) + return result + elif isinstance(event, PrivateMessageEvent): + user_id = event.user_id + friend = DBFriend(user_id=user_id) + result = await friend.subscription_list_by_type(sub_type=1) + return result + else: + return Result.ListResult(error=True, info='Illegal event', result=[]) -async def sub_add(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.IntResult: - group_id = event.group_id - group = DBGroup(group_id=group_id) - room_id = state['room_id'] - sub = DBSubscription(sub_type=1, sub_id=room_id) - _res = await sub.add(up_name=state.get('up_name'), live_info='B站直播间') - if not _res.success(): - return _res - _res = await group.subscription_add(sub=sub) - if not _res.success(): - return _res - # 添加直播间时需要刷新全局监控列表 - # 执行一次初始化 - await init_add_live_info(room_id=room_id) - result = Result.IntResult(error=False, info='Success', result=0) - return result +async def sub_add(bot: Bot, event: MessageEvent, state: T_State) -> Result.IntResult: + if isinstance(event, GroupMessageEvent): + group_id = event.group_id + group = DBGroup(group_id=group_id) + room_id = state['room_id'] + sub = DBSubscription(sub_type=1, sub_id=room_id) + _res = await sub.add(up_name=state.get('up_name'), live_info='B站直播间') + if not _res.success(): + return _res + _res = await group.subscription_add(sub=sub) + if not _res.success(): + return _res + # 添加直播间时需要刷新全局监控列表 + # 执行一次初始化 + await init_add_live_info(room_id=room_id) + result = Result.IntResult(error=False, info='Success', result=0) + return result + elif isinstance(event, PrivateMessageEvent): + user_id = event.user_id + friend = DBFriend(user_id=user_id) + room_id = state['room_id'] + sub = DBSubscription(sub_type=1, sub_id=room_id) + _res = await sub.add(up_name=state.get('up_name'), live_info='B站直播间') + if not _res.success(): + return _res + _res = await friend.subscription_add(sub=sub) + if not _res.success(): + return _res + # 添加直播间时需要刷新全局监控列表 + # 执行一次初始化 + await init_add_live_info(room_id=room_id) + result = Result.IntResult(error=False, info='Success', result=0) + return result + else: + return Result.IntResult(error=True, info='Illegal event', result=-1) -async def sub_del(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.IntResult: - group_id = event.group_id - group = DBGroup(group_id=group_id) - room_id = state['room_id'] - _res = await group.subscription_del(sub=DBSubscription(sub_type=1, sub_id=room_id)) - if not _res.success(): - return _res - result = Result.IntResult(error=False, info='Success', result=0) - return result +async def sub_del(bot: Bot, event: MessageEvent, state: T_State) -> Result.IntResult: + if isinstance(event, GroupMessageEvent): + group_id = event.group_id + group = DBGroup(group_id=group_id) + room_id = state['room_id'] + _res = await group.subscription_del(sub=DBSubscription(sub_type=1, sub_id=room_id)) + if not _res.success(): + return _res + result = Result.IntResult(error=False, info='Success', result=0) + return result + elif isinstance(event, PrivateMessageEvent): + user_id = event.user_id + friend = DBFriend(user_id=user_id) + room_id = state['room_id'] + _res = await friend.subscription_del(sub=DBSubscription(sub_type=1, sub_id=room_id)) + if not _res.success(): + return _res + result = Result.IntResult(error=False, info='Success', result=0) + return result + else: + return Result.IntResult(error=True, info='Illegal event', result=-1) -async def sub_clear(bot: Bot, event: GroupMessageEvent, state: T_State) -> Result.IntResult: - group_id = event.group_id - group = DBGroup(group_id=group_id) - _res = await group.subscription_clear_by_type(sub_type=1) - if not _res.success(): - return _res - result = Result.IntResult(error=False, info='Success', result=0) - return result +async def sub_clear(bot: Bot, event: MessageEvent, state: T_State) -> Result.IntResult: + if isinstance(event, GroupMessageEvent): + group_id = event.group_id + group = DBGroup(group_id=group_id) + _res = await group.subscription_clear_by_type(sub_type=1) + if not _res.success(): + return _res + result = Result.IntResult(error=False, info='Success', result=0) + return result + elif isinstance(event, PrivateMessageEvent): + user_id = event.user_id + friend = DBFriend(user_id=user_id) + _res = await friend.subscription_clear_by_type(sub_type=1) + if not _res.success(): + return _res + result = Result.IntResult(error=False, info='Success', result=0) + return result + else: + return Result.IntResult(error=True, info='Illegal event', result=-1) diff --git a/omega_miya/plugins/bilibili_live_monitor/monitor.py b/omega_miya/plugins/bilibili_live_monitor/monitor.py index d3628184..1f6488f6 100644 --- a/omega_miya/plugins/bilibili_live_monitor/monitor.py +++ b/omega_miya/plugins/bilibili_live_monitor/monitor.py @@ -5,7 +5,7 @@ from nonebot import logger, require, get_driver, get_bots from nonebot.adapters import Bot from nonebot.adapters.cqhttp import MessageSegment -from omega_miya.utils.Omega_Base import DBSubscription, DBHistory, DBTable +from omega_miya.utils.Omega_Base import DBFriend, DBSubscription, DBHistory, DBTable from .utils import get_live_info, get_live_info_by_uid_list, get_user_info, pic_2_base64, verify_cookies from .utils import ENABLE_NEW_LIVE_API, ENABLE_LIVE_CHECK_POOL_MODE @@ -174,13 +174,15 @@ async def live_db_upgrade(): # 直播间检查及消息发送函数 -async def live_status_sender(room_id: int, live_info: dict, bots: List[Bot], all_groups: List[int]): +async def live_status_sender( + room_id: int, live_info: dict, bots: List[Bot], all_groups: List[int], all_friends: List[int]): """ 检查直播间状态并向群组发送消息 :param room_id: 直播间房间id :param live_info: 由 get_live_info 或 get_live_info_by_uid_list 获取的直播间信息 :param bots: bots 列表 :param all_groups: 所有可能需要通知的群组列表 + :param all_friends: 所有可能需要通知的好友列表 """ global live_title global live_status @@ -194,6 +196,12 @@ async def live_status_sender(room_id: int, live_info: dict, bots: List[Bot], all # 需通知的群 notice_group = list(set(all_groups) & set(sub_group)) + # 获取订阅了该直播间的所有好友 + sub_friend_res = await sub.sub_user_list() + sub_friend = sub_friend_res.result + # 需通知的好友 + notice_friends = list(set(all_friends) & set(sub_friend)) + try: up_name = live_up_name[room_id] status = live_status[room_id] @@ -217,13 +225,17 @@ async def live_status_sender(room_id: int, live_info: dict, bots: List[Bot], all live_title[room_id] = live_info['title'] logger.info(f"直播间: {room_id}/{up_name} 标题变更为: {live_info['title']}") elif live_info['status'] == 1 and live_info['title'] != live_title[room_id]: - # 通知有通知权限且订阅了该直播间的群 - cover_pic = await pic_2_base64(url=live_info.get('cover_img')) - if cover_pic.success(): - msg = f"{up_name}的直播间换标题啦!\n\n【{live_info['title']}】\n{MessageSegment.image(cover_pic.result)}" + if live_info.get('cover_img'): + cover_pic = await pic_2_base64(url=live_info.get('cover_img')) + if cover_pic.success(): + msg = f"{up_name}的直播间换标题啦!\n\n【{live_info['title']}】\n{MessageSegment.image(cover_pic.result)}" + else: + msg = f"{up_name}的直播间换标题啦!\n\n【{live_info['title']}】" else: # msg = f"{up_name}的直播间换标题啦!\n\n【{live_info['title']}】\n{live_info['url']}" msg = f"{up_name}的直播间换标题啦!\n\n【{live_info['title']}】" + + # 通知有通知权限且订阅了该直播间的群 for group_id in notice_group: for _bot in bots: try: @@ -232,6 +244,16 @@ async def live_status_sender(room_id: int, live_info: dict, bots: List[Bot], all except Exception as _e: logger.warning(f"向群组: {group_id} 发送直播间: {room_id} 标题变更通知失败, error: {repr(_e)}") continue + # 通知有通知权限且订阅了该直播间的好友 + for user_id in notice_friends: + for _bot in bots: + try: + await _bot.call_api(api='send_private_msg', user_id=user_id, message=msg) + logger.info(f"向好友: {user_id} 发送直播间: {room_id} 标题变更通知") + except Exception as _e: + logger.warning(f"向好友: {user_id} 发送直播间: {room_id} 标题变更通知失败, error: {repr(_e)}") + continue + live_title[room_id] = live_info['title'] logger.info(f"直播间: {room_id}/{up_name} 标题变更为: {live_info['title']}") @@ -261,10 +283,13 @@ async def live_status_sender(room_id: int, live_info: dict, bots: List[Bot], all await new_event.add(sub_type='live_start', user_id=room_id, user_name=up_name, raw_data=repr(live_info), msg_data=live_start_info) - cover_pic = await pic_2_base64(url=live_info.get('cover_img')) - if cover_pic.success(): - msg = f"{live_info['time']}\n{up_name}开播啦!\n\n【{live_info['title']}】" \ - f"\n{MessageSegment.image(cover_pic.result)}" + if live_info.get('cover_img'): + cover_pic = await pic_2_base64(url=live_info.get('cover_img')) + if cover_pic.success(): + msg = f"{live_info['time']}\n{up_name}开播啦!\n\n【{live_info['title']}】" \ + f"\n{MessageSegment.image(cover_pic.result)}" + else: + msg = f"{live_info['time']}\n{up_name}开播啦!\n\n【{live_info['title']}】" else: # msg = f"{live_info['time']}\n{up_name}开播啦!\n\n【{live_info['title']}】\n{live_info['url']}" msg = f"{live_info['time']}\n{up_name}开播啦!\n\n【{live_info['title']}】" @@ -305,6 +330,16 @@ async def live_status_sender(room_id: int, live_info: dict, bots: List[Bot], all except Exception as _e: logger.warning(f"向群组: {group_id} 发送直播间: {room_id}/{up_name} 直播通知失败, error: {repr(_e)}") continue + # 通知有通知权限且订阅了该直播间的好友 + for user_id in notice_friends: + for _bot in bots: + try: + await _bot.call_api(api='send_private_msg', user_id=user_id, message=msg) + logger.info( + f"向好友: {user_id} 发送直播间: {room_id}/{up_name} 直播通知, status: {live_info['status']}") + except Exception as _e: + logger.warning(f"向好友: {user_id} 发送直播间: {room_id}/{up_name} 直播通知失败, error: {repr(_e)}") + continue # 创建直播检查函数 @@ -321,6 +356,10 @@ async def bilibili_live_monitor(): group_res = await t.list_col_with_condition('group_id', 'notice_permissions', 1) all_noitce_groups = [int(x) for x in group_res.result] + # 获取所有启用了私聊功能的好友 + friend_res = await DBFriend.list_exist_friends_by_private_permission(private_permission=1) + all_noitce_friends = [int(x) for x in friend_res.result] + # 获取订阅表中的所有直播间订阅 t = DBTable(table_name='Subscription') sub_res = await t.list_col_with_condition('sub_id', 'sub_type', 1) @@ -340,7 +379,8 @@ async def check_live(room_id: int): live_info = _res.result try: - await live_status_sender(room_id=room_id, live_info=live_info, bots=bots, all_groups=all_noitce_groups) + await live_status_sender(room_id=room_id, live_info=live_info, + bots=bots, all_groups=all_noitce_groups, all_friends=all_noitce_friends) except Exception as _e: logger.error(f'bilibili_live_monitor: 处理直播间 {room_id} 状态信息是发生错误: {repr(_e)}') @@ -373,7 +413,8 @@ async def check_live_by_rids(room_id_list: list): # 依次处理各直播间信息 for room_id, live_info in live_info_.items(): try: - await live_status_sender(room_id=room_id, live_info=live_info, bots=bots, all_groups=all_noitce_groups) + await live_status_sender(room_id=room_id, live_info=live_info, + bots=bots, all_groups=all_noitce_groups, all_friends=all_noitce_friends) except Exception as _e: logger.error(f'bilibili_live_monitor: 处理直播间 {room_id} 状态信息是发生错误: {repr(_e)}') continue diff --git a/omega_miya/utils/Omega_Base/model/friend.py b/omega_miya/utils/Omega_Base/model/friend.py index d4d2b6fe..d0bed521 100644 --- a/omega_miya/utils/Omega_Base/model/friend.py +++ b/omega_miya/utils/Omega_Base/model/friend.py @@ -31,6 +31,28 @@ async def list_exist_friends(cls) -> Result.ListResult: result = Result.ListResult(error=True, info=repr(e), result=[]) return result + @classmethod + async def list_exist_friends_by_private_permission(cls, private_permission: int) -> Result.ListResult: + async_session = NBdb().get_async_session() + async with async_session() as session: + try: + async with session.begin(): + session_result = await session.execute( + select(User.qq). + join(Friends). + where(User.id == Friends.user_id). + where(Friends.private_permissions == private_permission) + ) + exist_friends = [x for x in session_result.scalars().all()] + result = Result.ListResult(error=False, info='Success', result=exist_friends) + except NoResultFound: + result = Result.ListResult(error=True, info='NoResultFound', result=[]) + except MultipleResultsFound: + result = Result.ListResult(error=True, info='MultipleResultsFound', result=[]) + except Exception as e: + result = Result.ListResult(error=True, info=repr(e), result=[]) + return result + async def exist(self) -> bool: user_id_result = await self.id() if user_id_result.error: diff --git a/omega_miya/utils/Omega_Base/model/subscription.py b/omega_miya/utils/Omega_Base/model/subscription.py index 35ba3bdf..9f036dbb 100644 --- a/omega_miya/utils/Omega_Base/model/subscription.py +++ b/omega_miya/utils/Omega_Base/model/subscription.py @@ -1,6 +1,6 @@ from omega_miya.utils.Omega_Base.database import NBdb from omega_miya.utils.Omega_Base.class_result import Result -from omega_miya.utils.Omega_Base.tables import Subscription, Group, GroupSub +from omega_miya.utils.Omega_Base.tables import Subscription, Group, GroupSub, User, UserSub from datetime import datetime from sqlalchemy.future import select from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound @@ -137,3 +137,44 @@ async def sub_group_clear(self) -> Result.IntResult: await session.rollback() result = Result.IntResult(error=True, info=repr(e), result=-1) return result + + async def sub_user_list(self) -> Result.ListResult: + id_result = await self.id() + if id_result.error: + return Result.ListResult(error=True, info='Subscription not exist', result=[]) + + async_session = NBdb().get_async_session() + async with async_session() as session: + async with session.begin(): + try: + session_result = await session.execute( + select(User.qq).join(UserSub). + where(User.id == UserSub.user_id). + where(UserSub.sub_id == id_result.result) + ) + res = [x for x in session_result.scalars().all()] + result = Result.ListResult(error=False, info='Success', result=res) + except Exception as e: + result = Result.ListResult(error=True, info=repr(e), result=[]) + return result + + async def sub_user_clear(self) -> Result.IntResult: + id_result = await self.id() + if id_result.error: + return Result.IntResult(error=True, info='Subscription not exist', result=-1) + + async_session = NBdb().get_async_session() + async with async_session() as session: + try: + async with session.begin(): + session_result = await session.execute( + select(UserSub).where(UserSub.sub_id == id_result.result) + ) + for exist_user_sub in session_result.scalars().all(): + await session.delete(exist_user_sub) + await session.commit() + result = Result.IntResult(error=False, info='Success', result=0) + except Exception as e: + await session.rollback() + result = Result.IntResult(error=True, info=repr(e), result=-1) + return result From 4dc4e8d85d90098fabe8d5d2125689c873a020b0 Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Thu, 6 May 2021 03:15:15 +0800 Subject: [PATCH 30/33] =?UTF-8?q?Upgrade:=20=E6=9B=B4=E6=96=B0README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 更新README.md --- README.md | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 8fe39a6f..b76f26b5 100644 --- a/README.md +++ b/README.md @@ -22,24 +22,26 @@ - 基于插件节点的权限管理系统 - 命令冷却系统 - HTTP 代理功能 -- 插件帮助功能 -- Bot对群组公告功能 -- B站动态订阅 (建议配置B站cookies) -- B站直播间监控 (建议配置B站cookies) -- 求签 -- 抽卡 -- Pixiv助手 (需要 HTTP 代理, 除非部署在外网) -- Pixivision订阅 (需要 HTTP 代理, 除非部署在外网) -- 复读姬 -- roll点抽奖 -- 搜番剧 (trace.moe API / 建议使用 HTTP 代理) -- 搜二次元图 (Saucenao API 和 ascii2d / 建议使用 HTTP 代理) -- 来点萌图 / 来点涩图 (需要 HTTP 代理, 除非部署在外网 / 图片数据库需要自己导入) -- 表情包制作器 -- 猫按钮 (测试) -- 自动锤轴姬 (需要 go-cqhttp v0.9.40 及以上版本) -- 邮箱插件 (仅支持IMAP收件) -- 腾讯云组件 (测试) +- 自动处理加好友和被邀请进群 +- 插件帮助功能 (支持群聊 / 私聊) +- Bot对群组公告功能 (仅支持对群组) +- B站动态订阅 (建议配置B站cookies) (支持群聊 / 私聊) +- B站直播间监控 (建议配置B站cookies) (支持群聊 / 私聊) +- 求签 (仅支持群聊) +- 抽卡 (仅支持群聊) +- 能不能好好说话 (lab.magiconch.com API) (支持群聊 / 私聊) +- Pixiv助手 (需要 HTTP 代理, 除非部署在外网) (需要 go-cqhttp v0.9.40 及以上版本) (仅支持群聊) +- Pixivision订阅 (需要 HTTP 代理, 除非部署在外网) (仅支持群聊) +- 复读姬 (仅支持群聊) +- roll点抽奖 (仅支持群聊) +- 搜番剧 (trace.moe API / 建议使用 HTTP 代理) (支持群聊 / 私聊) +- 搜二次元图 (Saucenao API 和 ascii2d / 建议使用 HTTP 代理) (支持群聊 / 私聊) +- 来点萌图 / 来点涩图 (需要 HTTP 代理, 除非部署在外网 / 图片数据库需要自己导入) (支持群聊 / 私聊) +- 表情包制作器 (支持群聊 / 私聊) +- 猫按钮 (测试) (仅支持群聊) +- 自动锤轴姬 (需要 go-cqhttp v0.9.40 及以上版本) (仅支持群聊) +- 邮箱插件 (仅支持IMAP收件) (仅支持群聊) +- 腾讯云组件 (测试) (仅支持群聊) ## 如何使用 From 55527e294089fb3b9d3af5d6ace04f8fa93a2005 Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Thu, 6 May 2021 20:23:14 +0800 Subject: [PATCH 31/33] =?UTF-8?q?Change:=20=E5=86=B7=E5=8D=B4=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E6=A8=A1=E5=9D=97=E5=A4=84=E7=90=86=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 冷却事件模块处理消息类型调整 --- omega_miya/utils/Omega_CoolDown/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/omega_miya/utils/Omega_CoolDown/__init__.py b/omega_miya/utils/Omega_CoolDown/__init__.py index ee2e41af..ebc33b98 100644 --- a/omega_miya/utils/Omega_CoolDown/__init__.py +++ b/omega_miya/utils/Omega_CoolDown/__init__.py @@ -11,7 +11,7 @@ from nonebot.typing import T_State from nonebot.matcher import Matcher from nonebot.adapters.cqhttp.bot import Bot -from nonebot.adapters.cqhttp.event import Event +from nonebot.adapters.cqhttp.event import MessageEvent from omega_miya.utils.Omega_plugin_utils import \ check_and_set_global_cool_down, check_and_set_plugin_cool_down, \ check_and_set_group_cool_down, check_and_set_user_cool_down, PluginCoolDown @@ -19,7 +19,7 @@ @run_preprocessor -async def handle_plugin_cooldown(matcher: Matcher, bot: Bot, event: Event, state: T_State): +async def handle_plugin_cooldown(matcher: Matcher, bot: Bot, event: MessageEvent, state: T_State): group_id = event.dict().get('group_id') user_id = event.dict().get('user_id') From 71c49e7a179bd566f87c8d1b3f1060b88b2d69cc Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Thu, 6 May 2021 20:23:28 +0800 Subject: [PATCH 32/33] =?UTF-8?q?Fix:=20=E4=BF=AE=E5=A4=8D=E6=9D=83?= =?UTF-8?q?=E9=99=90=E6=A8=A1=E5=9D=97=E9=92=88=E5=AF=B9permission=20level?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E9=83=A8=E5=88=86=E5=9C=A8=E7=A7=81=E8=81=8A?= =?UTF-8?q?=E4=B8=AD=E6=9C=89=E9=97=AE=E9=A2=98=E7=9A=84=E5=A4=84=E7=90=86?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复权限模块针对permission level验证部分在私聊中有问题的处理逻辑 --- omega_miya/utils/Omega_Permission/__init__.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/omega_miya/utils/Omega_Permission/__init__.py b/omega_miya/utils/Omega_Permission/__init__.py index 580e50cf..48c9c267 100644 --- a/omega_miya/utils/Omega_Permission/__init__.py +++ b/omega_miya/utils/Omega_Permission/__init__.py @@ -52,13 +52,13 @@ async def handle_plugin_permission(matcher: Matcher, bot: Bot, event: MessageEve raise IgnoredException('没有群组命令权限') # 检查权限等级 好友私聊跳过 - if private_mode: - level_checker = True - else: - if matcher_permission_level: - level_checker = await check_permission_level(group_id=group_id, level=matcher_permission_level) + if matcher_permission_level: + if private_mode: + level_checker = True else: - level_checker = False + level_checker = await check_permission_level(group_id=group_id, level=matcher_permission_level) + else: + level_checker = False # 检查权限节点 if matcher_auth_node: From 4a88fd7c4393ac9655dddbb063f7f3bbc32c2603 Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Thu, 6 May 2021 20:23:49 +0800 Subject: [PATCH 33/33] =?UTF-8?q?Upgrade:=20B=E7=AB=99=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E8=A7=86=E9=A2=91=E5=8A=A8=E6=80=81=E5=8F=91?= =?UTF-8?q?=E9=80=81=E5=B0=81=E9=9D=A2=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - B站动态插件视频动态发送封面图片 --- .../bilibili_dynamic_monitor/monitor.py | 18 +++++++++++++----- .../plugins/bilibili_dynamic_monitor/utils.py | 8 +++++++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/omega_miya/plugins/bilibili_dynamic_monitor/monitor.py b/omega_miya/plugins/bilibili_dynamic_monitor/monitor.py index 66435a4e..52c67f02 100644 --- a/omega_miya/plugins/bilibili_dynamic_monitor/monitor.py +++ b/omega_miya/plugins/bilibili_dynamic_monitor/monitor.py @@ -130,8 +130,8 @@ async def check_dynamic(dy_uid): ) else: origin_dynamic_info = _dy_res.result - # 原动态type=2, 带图片 - if origin_dynamic_info['type'] == 2: + # 原动态type=2 或 8, 带图片 + if origin_dynamic_info['type'] in [2, 8]: # 处理图片序列 pic_segs = '' for pic_url in origin_dynamic_info['origin_pics']: @@ -168,9 +168,17 @@ async def check_dynamic(dy_uid): dynamic_info[num]['name'], dynamic_info[num]['content'], dynamic_info[num]['url']) # 视频 elif dynamic_info[num]['type'] == 8: - msg = '{}发布了新的视频!\n\n《{}》\n“{}”\n{}'.format( - dynamic_info[num]['name'], dynamic_info[num]['origin'], - dynamic_info[num]['content'], dynamic_info[num]['url']) + cover_pic_url = dynamic_info[num].get('cover_pic_url') + _res = await pic_2_base64(cover_pic_url) + pic_seg = MessageSegment.image(_res.result) + if dynamic_info[num]['content']: + msg = '{}发布了新的视频!\n\n《{}》\n“{}”\n{}\n{}'.format( + dynamic_info[num]['name'], dynamic_info[num]['origin'], + dynamic_info[num]['content'], dynamic_info[num]['url'], pic_seg) + else: + msg = '{}发布了新的视频!\n\n《{}》\n{}\n{}'.format( + dynamic_info[num]['name'], dynamic_info[num]['origin'], + dynamic_info[num]['url'], pic_seg) # 小视频 elif dynamic_info[num]['type'] == 16: msg = '{}发布了新的小视频动态!\n\n“{}”\n{}'.format( diff --git a/omega_miya/plugins/bilibili_dynamic_monitor/utils.py b/omega_miya/plugins/bilibili_dynamic_monitor/utils.py index a0263b56..efc4e343 100644 --- a/omega_miya/plugins/bilibili_dynamic_monitor/utils.py +++ b/omega_miya/plugins/bilibili_dynamic_monitor/utils.py @@ -200,7 +200,9 @@ async def get_user_dynamic_history(dy_uid) -> Result.DictResult: # 这是视频的简介和标题 content = card['dynamic'] title = card['title'] - card_dic = dict({'id': dy_id, 'type': 8, 'url': url, + # 这是视频封面 + cover_pic_url = card.get('pic') + card_dic = dict({'id': dy_id, 'type': 8, 'url': url, 'cover_pic_url': cover_pic_url, 'name': name, 'content': content, 'origin': title}) _DYNAMIC_INFO[card_num] = card_dic # type=16, 这是小视频(现在似乎已经失效?) @@ -327,6 +329,10 @@ async def get_dynamic_info(dynamic_id) -> Result.DictResult: origin_description = json.loads(origin_card['card'])['dynamic'] if not origin_description: origin_description = json.loads(origin_card['card'])['title'] + try: + origin_pics_list.append(json.loads(origin_card['card'])['pic']) + except (KeyError, TypeError): + pass elif origin_card['desc']['type'] == 16: origin_description = json.loads(origin_card['card'])['item']['description'] elif origin_card['desc']['type'] == 32: