diff --git a/README.md b/README.md index d97ebe70f..3a223929e 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,8 @@ [![license](https://img.shields.io/badge/license-AGPL3.0-FE7D37)](https://github.com/HibiKier/zhenxun_bot/blob/main/LICENSE) -[![tencent-qq](https://img.shields.io/badge/%E7%BE%A4-是真寻酱哒-red?style=flat-square&logo=tencent-qq)](https://jq.qq.com/?_wv=1027&k=u8PgBkMZ) -[![tencent-qq](https://img.shields.io/badge/%E7%BE%A4-真寻的技术群-c73e7e?style=flat-square&logo=tencent-qq)](https://jq.qq.com/?_wv=1027&k=u8PgBkMZ) +[![tencent-qq](https://img.shields.io/badge/%E7%BE%A4-是真寻酱哒-red?style=logo=tencent-qq)](https://jq.qq.com/?_wv=1027&k=u8PgBkMZ) +[![tencent-qq](https://img.shields.io/badge/%E7%BE%A4-真寻的技术群-c73e7e?style=logo=tencent-qq)](https://qm.qq.com/q/YYYt5rkMYc) diff --git a/zhenxun/builtin_plugins/__init__.py b/zhenxun/builtin_plugins/__init__.py index 52042412b..ce689287b 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 066dabe09..211427263 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 @@ async def v11(cls, bot: v11Bot, group_id: str): 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", + ).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 ) - 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", - }, + if create_list: + await GroupInfoUser.bulk_create(create_list, 30) + logger.debug( + f"创建用户数据 {len(create_list)} 条", + "更新群组成员信息", + target=group_id, ) - exist_member_list.append(str(user_id)) + if update_list: + await GroupInfoUser.bulk_update(update_list, ["user_name"], 30) logger.debug( - "更新成功", "更新群组成员信息", session=user_id, group_id=group_id + 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(await GroupInfoUser.get_group_member_id_list(group_id)) - ) + 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/_utils.py b/zhenxun/builtin_plugins/help/_utils.py index 895883141..2de661fbd 100644 --- a/zhenxun/builtin_plugins/help/_utils.py +++ b/zhenxun/builtin_plugins/help/_utils.py @@ -47,7 +47,9 @@ async def sort_type(self): """ if not self._data: self._data = await PluginInfo.filter( - plugin_type=PluginType.NORMAL, load_status=True + menu_type__not="", + load_status=True, + plugin_type__in=[PluginType.NORMAL, PluginType.HIDDEN], ) if not self._sort_data: for plugin in self._data: diff --git a/zhenxun/builtin_plugins/help_help.py b/zhenxun/builtin_plugins/help_help.py index b2682aa40..33a149986 100644 --- a/zhenxun/builtin_plugins/help_help.py +++ b/zhenxun/builtin_plugins/help_help.py @@ -14,7 +14,6 @@ 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/builtin_plugins/init/init_plugin.py b/zhenxun/builtin_plugins/init/init_plugin.py index 49ec8dfb8..f65913e12 100644 --- a/zhenxun/builtin_plugins/init/init_plugin.py +++ b/zhenxun/builtin_plugins/init/init_plugin.py @@ -48,6 +48,10 @@ async def _handle_setting( setting = extra_data.setting or PluginSetting() if metadata.type == "library": extra_data.plugin_type = PluginType.HIDDEN + if ( + extra_data.plugin_type == PluginType.HIDDEN + and extra_data.plugin_type != "功能" + ): extra_data.menu_type = "" plugin_list.append( PluginInfo( diff --git a/zhenxun/models/group_member_info.py b/zhenxun/models/group_member_info.py index cf73f14dc..dc9100caf 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 Meta: 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 @@ async def get_user_nickname(cls, user_id: str, group_id: str) -> str: return user.nickname return "" - @classmethod async def _run_script(cls): return [ diff --git a/zhenxun/models/plugin_info.py b/zhenxun/models/plugin_info.py index 0eaea950c..e5eb1b210 100644 --- a/zhenxun/models/plugin_info.py +++ b/zhenxun/models/plugin_info.py @@ -33,7 +33,7 @@ class PluginInfo(Model): """进群默认开关状态""" limit_superuser = fields.BooleanField(default=False, description="是否限制超级用户") """是否限制超级用户""" - menu_type = fields.CharField(max_length=255, default="功能", description="菜单类型") + menu_type = fields.CharField(max_length=255, default="", description="菜单类型") """菜单类型""" plugin_type = fields.CharEnumField(PluginType, null=True, description="插件类型") """插件类型""" diff --git a/zhenxun/plugins/poke/__init__.py b/zhenxun/plugins/poke/__init__.py index 7f46be962..9dc3d1d8b 100644 --- a/zhenxun/plugins/poke/__init__.py +++ b/zhenxun/plugins/poke/__init__.py @@ -10,6 +10,7 @@ from zhenxun.configs.utils import PluginExtraData from zhenxun.models.ban_console import BanConsole from zhenxun.services.log import logger +from zhenxun.utils.enum import PluginType from zhenxun.utils.message import MessageUtils from zhenxun.utils.utils import CountLimiter @@ -19,7 +20,12 @@ usage=""" 戳一戳随机掉落语音或美图萝莉图 """.strip(), - extra=PluginExtraData(author="HibiKier", version="0.1", menu_type="其他").dict(), + extra=PluginExtraData( + author="HibiKier", + version="0.1", + menu_type="其他", + plugin_type=PluginType.HIDDEN, + ).dict(), ) REPLY_MESSAGE = [ diff --git a/zhenxun/plugins/web_ui/api/tabs/manage/chat.py b/zhenxun/plugins/web_ui/api/tabs/manage/chat.py index 8ee12274a..e01715691 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 432c28ed3..fccfa55e7 100644 --- a/zhenxun/utils/browser.py +++ b/zhenxun/utils/browser.py @@ -4,8 +4,8 @@ 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 @@ _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 b751f9cd1..15da938dd 100644 --- a/zhenxun/utils/http_utils.py +++ b/zhenxun/utils/http_utils.py @@ -8,8 +8,8 @@ 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.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: