From ec24bdf64facf42a2c917c35a8f3f747825779a0 Mon Sep 17 00:00:00 2001 From: HibiKier <775757368@qq.com> Date: Thu, 15 Aug 2024 20:27:19 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zhenxun/builtin_plugins/__init__.py | 11 ++- .../admin/group_member_update/_data_source.py | 72 ++++++++++++------- zhenxun/builtin_plugins/help_help.py | 1 - zhenxun/models/group_member_info.py | 6 +- .../plugins/web_ui/api/tabs/manage/chat.py | 2 +- zhenxun/utils/browser.py | 43 +++++------ zhenxun/utils/http_utils.py | 4 +- 7 files changed, 80 insertions(+), 59 deletions(-) diff --git a/zhenxun/builtin_plugins/__init__.py b/zhenxun/builtin_plugins/__init__.py index 52042412..ce689287 100644 --- a/zhenxun/builtin_plugins/__init__.py +++ b/zhenxun/builtin_plugins/__init__.py @@ -58,9 +58,12 @@ async def _(): and not await SignUser.annotate().count() ): try: - group_user = await GroupInfoUser.filter(uid__isnull=False).all() + group_user = [] + try: + group_user = await GroupInfoUser.filter(uid__isnull=False).all() + except Exception: + logger.warning("获取GroupInfoUser数据uid失败...") user2uid = {u.user_id: u.uid for u in group_user} - flag = False db = Tortoise.get_connection("default") old_sign_list = await db.execute_query_dict(SIGN_SQL) old_bag_list = await db.execute_query_dict(BAG_SQL) @@ -70,7 +73,9 @@ async def _(): } create_list = [] sign_id_list = [] - max_uid = max(user2uid.values()) + 1 + max_uid = 0 + if user2uid: + max_uid = max(user2uid.values()) + 1 for old_sign in old_sign_list: sign_id_list.append(old_sign["user_id"]) old_bag = [ diff --git a/zhenxun/builtin_plugins/admin/group_member_update/_data_source.py b/zhenxun/builtin_plugins/admin/group_member_update/_data_source.py index 066dabe0..21142726 100644 --- a/zhenxun/builtin_plugins/admin/group_member_update/_data_source.py +++ b/zhenxun/builtin_plugins/admin/group_member_update/_data_source.py @@ -88,49 +88,67 @@ class MemberUpdateManage: exist_member_list = [] default_auth = Config.get_config("admin_bot_manage", "ADMIN_DEFAULT_AUTH") group_member_list = await bot.get_group_member_list(group_id=int(group_id)) + db_user = await GroupInfoUser.filter(group_id=group_id).all() + db_user_uid = [u.user_id for u in db_user] + create_list = [] + update_list = [] + delete_list = [] for user_info in group_member_list: - user_id = user_info["user_id"] + user_id = str(user_info["user_id"]) nickname = user_info["card"] or user_info["nickname"] role = user_info["role"] if default_auth: if role in ["owner", "admin"] and not await LevelUser.is_group_flag( - str(user_id), group_id + user_id, group_id ): await LevelUser.set_level(user_id, group_id, default_auth) - if str(user_id) in bot.config.superusers: - await LevelUser.set_level(str(user_id), group_id, 9) + if user_id in bot.config.superusers: + await LevelUser.set_level(user_id, group_id, 9) join_time = datetime.strptime( time.strftime( "%Y-%m-%d %H:%M:%S", time.localtime(user_info["join_time"]) ), "%Y-%m-%d %H:%M:%S", - ) - cnt = await GroupInfoUser.filter( - user_id=str(user_id), group_id=group_id - ).count() - if cnt > 1: - await GroupInfoUser.filter( - user_id=str(user_id), group_id=group_id - ).delete() - await GroupInfoUser.update_or_create( - user_id=str(user_id), - group_id=group_id, - defaults={ - "user_name": nickname, - "user_join_time": join_time.replace( - tzinfo=timezone(timedelta(hours=8)) - ), - "platform": "qq", - }, - ) - exist_member_list.append(str(user_id)) + ).replace(tzinfo=timezone(timedelta(hours=8))) + if cnt := db_user_uid.count(user_id): + users = [u for u in db_user if u.user_id == user_id] + user = users[0] + if cnt > 1: + for u in users[1:]: + delete_list.append(u.id) + user.user_name = nickname + update_list.append(user) + else: + create_list.append( + GroupInfoUser( + user_id=user_id, + group_id=group_id, + user_name=nickname, + user_join_time=join_time, + platform="qq", + ) + ) + exist_member_list.append(user_id) logger.debug( "更新成功", "更新群组成员信息", session=user_id, group_id=group_id ) - if delete_member_list := list( - set(exist_member_list).difference( - set(await GroupInfoUser.get_group_member_id_list(group_id)) + if create_list: + await GroupInfoUser.bulk_create(create_list, 30) + logger.debug( + f"创建用户数据 {len(create_list)} 条", + "更新群组成员信息", + target=group_id, ) + if update_list: + await GroupInfoUser.bulk_update(update_list, ["user_name"], 30) + logger.debug( + f"更新户数据 {len(update_list)} 条", "更新群组成员信息", target=group_id + ) + if delete_list: + await GroupInfoUser.filter(id__in=delete_list).delete() + logger.debug(f"删除重复数据 Ids: {delete_list}", "更新群组成员信息") + if delete_member_list := list( + set(exist_member_list).difference(set(db_user_uid)) ): await GroupInfoUser.filter( user_id__in=delete_member_list, group_id=group_id diff --git a/zhenxun/builtin_plugins/help_help.py b/zhenxun/builtin_plugins/help_help.py index b2682aa4..33a14998 100644 --- a/zhenxun/builtin_plugins/help_help.py +++ b/zhenxun/builtin_plugins/help_help.py @@ -14,7 +14,6 @@ from zhenxun.models.ban_console import BanConsole from zhenxun.models.group_console import GroupConsole from zhenxun.models.plugin_info import PluginInfo from zhenxun.services.log import logger -from zhenxun.utils._build_image import BuildImage from zhenxun.utils.enum import PluginType from zhenxun.utils.message import MessageUtils diff --git a/zhenxun/models/group_member_info.py b/zhenxun/models/group_member_info.py index cf73f14d..dc9100ca 100644 --- a/zhenxun/models/group_member_info.py +++ b/zhenxun/models/group_member_info.py @@ -1,10 +1,9 @@ from typing import Set from tortoise import fields -from zhenxun.configs.config import Config +from zhenxun.configs.config import Config from zhenxun.services.db_context import Model -from zhenxun.services.log import logger class GroupInfoUser(Model): @@ -31,7 +30,7 @@ class GroupInfoUser(Model): unique_together = ("user_id", "group_id") @classmethod - async def get_group_member_id_list(cls, group_id: str) -> Set[int]: + async def get_all_uid(cls, group_id: str) -> Set[int]: """获取该群所有用户id 参数: @@ -99,7 +98,6 @@ class GroupInfoUser(Model): return user.nickname return "" - @classmethod async def _run_script(cls): return [ diff --git a/zhenxun/plugins/web_ui/api/tabs/manage/chat.py b/zhenxun/plugins/web_ui/api/tabs/manage/chat.py index 8ee12274..e0171569 100644 --- a/zhenxun/plugins/web_ui/api/tabs/manage/chat.py +++ b/zhenxun/plugins/web_ui/api/tabs/manage/chat.py @@ -92,7 +92,7 @@ async def _( global ws_conn, ID2NAME, ID_LIST uid = session.id1 gid = session.id3 or session.id2 - if ws_conn and uid: + if ws_conn and ws_conn.client_state == WebSocketState.CONNECTED and uid: msg_id = event.message_id if msg_id in ID_LIST: return diff --git a/zhenxun/utils/browser.py b/zhenxun/utils/browser.py index 432c28ed..fccfa55e 100644 --- a/zhenxun/utils/browser.py +++ b/zhenxun/utils/browser.py @@ -4,8 +4,8 @@ import sys from nonebot import get_driver from playwright.__main__ import main from playwright.async_api import Browser, Playwright, async_playwright -from zhenxun.configs.config import SYSTEM_PROXY +from zhenxun.configs.config import SYSTEM_PROXY from zhenxun.services.log import logger driver = get_driver() @@ -14,36 +14,37 @@ _playwright: Playwright | None = None _browser: Browser | None = None -@driver.on_startup -async def start_browser(): - global _playwright - global _browser - install() - await check_playwright_env() - _playwright = await async_playwright().start() - _browser = await _playwright.chromium.launch() +# @driver.on_startup +# async def start_browser(): +# global _playwright +# global _browser +# install() +# await check_playwright_env() +# _playwright = await async_playwright().start() +# _browser = await _playwright.chromium.launch() -@driver.on_shutdown -async def shutdown_browser(): - if _browser: - await _browser.close() - if _playwright: - await _playwright.stop() # type: ignore +# @driver.on_shutdown +# async def shutdown_browser(): +# if _browser: +# await _browser.close() +# if _playwright: +# await _playwright.stop() # type: ignore -def get_browser() -> Browser: - if not _browser: - raise RuntimeError("playwright is not initalized") - return _browser +# def get_browser() -> Browser: +# if not _browser: +# raise RuntimeError("playwright is not initalized") +# return _browser def install(): """自动安装、更新 Chromium""" def set_env_variables(): - os.environ[ - "PLAYWRIGHT_DOWNLOAD_HOST"] = "https://npmmirror.com/mirrors/playwright/" + os.environ["PLAYWRIGHT_DOWNLOAD_HOST"] = ( + "https://npmmirror.com/mirrors/playwright/" + ) if SYSTEM_PROXY: os.environ["HTTPS_PROXY"] = SYSTEM_PROXY diff --git a/zhenxun/utils/http_utils.py b/zhenxun/utils/http_utils.py index b751f9cd..15da938d 100644 --- a/zhenxun/utils/http_utils.py +++ b/zhenxun/utils/http_utils.py @@ -8,8 +8,8 @@ import aiofiles import httpx import rich from httpx import ConnectTimeout, Response -from nonebot import require from nonebot_plugin_alconna import UniMessage +from nonebot_plugin_htmlrender import get_browser from playwright.async_api import Page from retrying import retry @@ -18,7 +18,7 @@ from zhenxun.services.log import logger from zhenxun.utils.message import MessageUtils from zhenxun.utils.user_agent import get_user_agent -from .browser import get_browser +# from .browser import get_browser class AsyncHttpx: