🎨 代码优化

This commit is contained in:
HibiKier 2024-08-15 20:27:19 +08:00
parent 7dfcd0983a
commit ec24bdf64f
7 changed files with 80 additions and 59 deletions

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

@ -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

@ -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

@ -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: