Merge pull request #1556 from HibiKier/dev

Dev
This commit is contained in:
HibiKier 2024-08-15 23:54:50 +08:00 committed by GitHub
commit b4ccbb0f80
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 97 additions and 64 deletions

View File

@ -16,8 +16,8 @@
[![license](https://img.shields.io/badge/license-AGPL3.0-FE7D37)](https://github.com/HibiKier/zhenxun_bot/blob/main/LICENSE) [![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-是真寻酱哒-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=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=logo=tencent-qq)](https://qm.qq.com/q/YYYt5rkMYc)
</div> </div>

View File

@ -57,10 +57,13 @@ async def _():
not await UserConsole.annotate().count() not await UserConsole.annotate().count()
and not await SignUser.annotate().count() and not await SignUser.annotate().count()
): ):
try:
group_user = []
try: try:
group_user = await GroupInfoUser.filter(uid__isnull=False).all() 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} user2uid = {u.user_id: u.uid for u in group_user}
flag = False
db = Tortoise.get_connection("default") db = Tortoise.get_connection("default")
old_sign_list = await db.execute_query_dict(SIGN_SQL) old_sign_list = await db.execute_query_dict(SIGN_SQL)
old_bag_list = await db.execute_query_dict(BAG_SQL) old_bag_list = await db.execute_query_dict(BAG_SQL)
@ -70,6 +73,8 @@ async def _():
} }
create_list = [] create_list = []
sign_id_list = [] sign_id_list = []
max_uid = 0
if user2uid:
max_uid = max(user2uid.values()) + 1 max_uid = max(user2uid.values()) + 1
for old_sign in old_sign_list: for old_sign in old_sign_list:
sign_id_list.append(old_sign["user_id"]) sign_id_list.append(old_sign["user_id"])

View File

@ -88,49 +88,67 @@ class MemberUpdateManage:
exist_member_list = [] exist_member_list = []
default_auth = Config.get_config("admin_bot_manage", "ADMIN_DEFAULT_AUTH") 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)) 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: 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"] nickname = user_info["card"] or user_info["nickname"]
role = user_info["role"] role = user_info["role"]
if default_auth: if default_auth:
if role in ["owner", "admin"] and not await LevelUser.is_group_flag( 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) await LevelUser.set_level(user_id, group_id, default_auth)
if str(user_id) in bot.config.superusers: if user_id in bot.config.superusers:
await LevelUser.set_level(str(user_id), group_id, 9) await LevelUser.set_level(user_id, group_id, 9)
join_time = datetime.strptime( join_time = datetime.strptime(
time.strftime( time.strftime(
"%Y-%m-%d %H:%M:%S", time.localtime(user_info["join_time"]) "%Y-%m-%d %H:%M:%S", time.localtime(user_info["join_time"])
), ),
"%Y-%m-%d %H:%M:%S", "%Y-%m-%d %H:%M:%S",
) ).replace(tzinfo=timezone(timedelta(hours=8)))
cnt = await GroupInfoUser.filter( if cnt := db_user_uid.count(user_id):
user_id=str(user_id), group_id=group_id users = [u for u in db_user if u.user_id == user_id]
).count() user = users[0]
if cnt > 1: if cnt > 1:
await GroupInfoUser.filter( for u in users[1:]:
user_id=str(user_id), group_id=group_id delete_list.append(u.id)
).delete() user.user_name = nickname
await GroupInfoUser.update_or_create( update_list.append(user)
user_id=str(user_id), else:
create_list.append(
GroupInfoUser(
user_id=user_id,
group_id=group_id, group_id=group_id,
defaults={ user_name=nickname,
"user_name": nickname, user_join_time=join_time,
"user_join_time": join_time.replace( platform="qq",
tzinfo=timezone(timedelta(hours=8))
),
"platform": "qq",
},
) )
exist_member_list.append(str(user_id)) )
exist_member_list.append(user_id)
logger.debug( logger.debug(
"更新成功", "更新群组成员信息", session=user_id, group_id=group_id "更新成功", "更新群组成员信息", session=user_id, group_id=group_id
) )
if delete_member_list := list( if create_list:
set(exist_member_list).difference( await GroupInfoUser.bulk_create(create_list, 30)
set(await GroupInfoUser.get_group_member_id_list(group_id)) 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( await GroupInfoUser.filter(
user_id__in=delete_member_list, group_id=group_id user_id__in=delete_member_list, group_id=group_id

View File

@ -47,7 +47,9 @@ class HelpImageBuild:
""" """
if not self._data: if not self._data:
self._data = await PluginInfo.filter( 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: if not self._sort_data:
for plugin in self._data: for plugin in self._data:

View File

@ -14,7 +14,6 @@ from zhenxun.models.ban_console import BanConsole
from zhenxun.models.group_console import GroupConsole from zhenxun.models.group_console import GroupConsole
from zhenxun.models.plugin_info import PluginInfo from zhenxun.models.plugin_info import PluginInfo
from zhenxun.services.log import logger from zhenxun.services.log import logger
from zhenxun.utils._build_image import BuildImage
from zhenxun.utils.enum import PluginType from zhenxun.utils.enum import PluginType
from zhenxun.utils.message import MessageUtils from zhenxun.utils.message import MessageUtils

View File

@ -48,6 +48,10 @@ async def _handle_setting(
setting = extra_data.setting or PluginSetting() setting = extra_data.setting or PluginSetting()
if metadata.type == "library": if metadata.type == "library":
extra_data.plugin_type = PluginType.HIDDEN extra_data.plugin_type = PluginType.HIDDEN
if (
extra_data.plugin_type == PluginType.HIDDEN
and extra_data.plugin_type != "功能"
):
extra_data.menu_type = "" extra_data.menu_type = ""
plugin_list.append( plugin_list.append(
PluginInfo( PluginInfo(

View File

@ -1,10 +1,9 @@
from typing import Set from typing import Set
from tortoise import fields 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.db_context import Model
from zhenxun.services.log import logger
class GroupInfoUser(Model): class GroupInfoUser(Model):
@ -31,7 +30,7 @@ class GroupInfoUser(Model):
unique_together = ("user_id", "group_id") unique_together = ("user_id", "group_id")
@classmethod @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 """获取该群所有用户id
参数: 参数:
@ -99,7 +98,6 @@ class GroupInfoUser(Model):
return user.nickname return user.nickname
return "" return ""
@classmethod @classmethod
async def _run_script(cls): async def _run_script(cls):
return [ return [

View File

@ -33,7 +33,7 @@ class PluginInfo(Model):
"""进群默认开关状态""" """进群默认开关状态"""
limit_superuser = fields.BooleanField(default=False, description="是否限制超级用户") 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="插件类型") plugin_type = fields.CharEnumField(PluginType, null=True, description="插件类型")
"""插件类型""" """插件类型"""

View File

@ -10,6 +10,7 @@ from zhenxun.configs.path_config import IMAGE_PATH, RECORD_PATH
from zhenxun.configs.utils import PluginExtraData from zhenxun.configs.utils import PluginExtraData
from zhenxun.models.ban_console import BanConsole from zhenxun.models.ban_console import BanConsole
from zhenxun.services.log import logger from zhenxun.services.log import logger
from zhenxun.utils.enum import PluginType
from zhenxun.utils.message import MessageUtils from zhenxun.utils.message import MessageUtils
from zhenxun.utils.utils import CountLimiter from zhenxun.utils.utils import CountLimiter
@ -19,7 +20,12 @@ __plugin_meta__ = PluginMetadata(
usage=""" usage="""
戳一戳随机掉落语音或美图萝莉图 戳一戳随机掉落语音或美图萝莉图
""".strip(), """.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 = [ REPLY_MESSAGE = [

View File

@ -92,7 +92,7 @@ async def _(
global ws_conn, ID2NAME, ID_LIST global ws_conn, ID2NAME, ID_LIST
uid = session.id1 uid = session.id1
gid = session.id3 or session.id2 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 msg_id = event.message_id
if msg_id in ID_LIST: if msg_id in ID_LIST:
return return

View File

@ -4,8 +4,8 @@ import sys
from nonebot import get_driver from nonebot import get_driver
from playwright.__main__ import main from playwright.__main__ import main
from playwright.async_api import Browser, Playwright, async_playwright 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 from zhenxun.services.log import logger
driver = get_driver() driver = get_driver()
@ -14,36 +14,37 @@ _playwright: Playwright | None = None
_browser: Browser | None = None _browser: Browser | None = None
@driver.on_startup # @driver.on_startup
async def start_browser(): # async def start_browser():
global _playwright # global _playwright
global _browser # global _browser
install() # install()
await check_playwright_env() # await check_playwright_env()
_playwright = await async_playwright().start() # _playwright = await async_playwright().start()
_browser = await _playwright.chromium.launch() # _browser = await _playwright.chromium.launch()
@driver.on_shutdown # @driver.on_shutdown
async def shutdown_browser(): # async def shutdown_browser():
if _browser: # if _browser:
await _browser.close() # await _browser.close()
if _playwright: # if _playwright:
await _playwright.stop() # type: ignore # await _playwright.stop() # type: ignore
def get_browser() -> Browser: # def get_browser() -> Browser:
if not _browser: # if not _browser:
raise RuntimeError("playwright is not initalized") # raise RuntimeError("playwright is not initalized")
return _browser # return _browser
def install(): def install():
"""自动安装、更新 Chromium""" """自动安装、更新 Chromium"""
def set_env_variables(): def set_env_variables():
os.environ[ os.environ["PLAYWRIGHT_DOWNLOAD_HOST"] = (
"PLAYWRIGHT_DOWNLOAD_HOST"] = "https://npmmirror.com/mirrors/playwright/" "https://npmmirror.com/mirrors/playwright/"
)
if SYSTEM_PROXY: if SYSTEM_PROXY:
os.environ["HTTPS_PROXY"] = SYSTEM_PROXY os.environ["HTTPS_PROXY"] = SYSTEM_PROXY

View File

@ -8,8 +8,8 @@ import aiofiles
import httpx import httpx
import rich import rich
from httpx import ConnectTimeout, Response from httpx import ConnectTimeout, Response
from nonebot import require
from nonebot_plugin_alconna import UniMessage from nonebot_plugin_alconna import UniMessage
from nonebot_plugin_htmlrender import get_browser
from playwright.async_api import Page from playwright.async_api import Page
from retrying import retry from retrying import retry
@ -18,7 +18,7 @@ from zhenxun.services.log import logger
from zhenxun.utils.message import MessageUtils from zhenxun.utils.message import MessageUtils
from zhenxun.utils.user_agent import get_user_agent from zhenxun.utils.user_agent import get_user_agent
from .browser import get_browser # from .browser import get_browser
class AsyncHttpx: class AsyncHttpx: