perf👌: 优化好友群组更新

This commit is contained in:
HibiKier 2024-02-28 13:51:16 +08:00
parent aa68553539
commit 88bda9ce2c
3 changed files with 38 additions and 56 deletions

View File

@ -4,8 +4,7 @@ from nonebot_plugin_apscheduler import scheduler
from zhenxun.models.friend_user import FriendUser from zhenxun.models.friend_user import FriendUser
from zhenxun.models.group_console import GroupConsole from zhenxun.models.group_console import GroupConsole
from zhenxun.services.log import logger from zhenxun.services.log import logger
from zhenxun.utils.platform import PlatformManage
# TODO: 其他平台更新
# 自动更新群组信息 # 自动更新群组信息
@ -19,21 +18,7 @@ async def _():
_used_group = [] _used_group = []
for bot in bots.values(): for bot in bots.values():
try: try:
group_list = await bot.get_group_list() await PlatformManage.update_group(bot)
gl = [g["group_id"] for g in group_list if g["group_id"] not in _used_group]
for g in gl:
_used_group.append(g)
group_info = await bot.get_group_info(group_id=g)
await GroupConsole.update_or_create(
group_id=str(group_info["group_id"]),
defaults={
"group_name": group_info["group_name"],
"max_member_count": group_info["max_member_count"],
"member_count": group_info["member_count"],
"group_flag": 1,
},
)
logger.debug("自动更新群组信息成功", "自动更新群组", group_id=g)
except Exception as e: except Exception as e:
logger.error(f"Bot: {bot.self_id} 自动更新群组信息", e=e) logger.error(f"Bot: {bot.self_id} 自动更新群组信息", e=e)
logger.info("自动更新群组成员信息成功...") logger.info("自动更新群组成员信息成功...")
@ -47,22 +32,9 @@ async def _():
) )
async def _(): async def _():
bots = nonebot.get_bots() bots = nonebot.get_bots()
for key in bots: for bot in bots.values():
try: try:
bot = bots[key] await PlatformManage.update_friend(bot)
fl = await bot.get_friend_list()
for f in fl:
if FriendUser.exists(user_id=str(f["user_id"])):
await FriendUser.create(
user_id=str(f["user_id"]), user_name=f["nickname"]
)
logger.debug(
f"更新好友信息成功", "自动更新好友", session=f["user_id"]
)
else:
logger.debug(
f"好友信息已存在", "自动更新好友", session=f["user_id"]
)
except Exception as e: except Exception as e:
logger.error(f"自动更新好友信息错误", "自动更新好友", e=e) logger.error(f"自动更新好友信息错误", "自动更新好友", e=e)
logger.info("自动更新好友信息成功...") logger.info("自动更新好友信息成功...")

View File

@ -1,5 +1,4 @@
from nonebot.adapters import Bot from nonebot.adapters import Bot
from nonebot.adapters.kaiheila.exception import ApiNotAvailable
from nonebot.permission import SUPERUSER from nonebot.permission import SUPERUSER
from nonebot.plugin import PluginMetadata from nonebot.plugin import PluginMetadata
from nonebot.rule import to_me from nonebot.rule import to_me
@ -8,11 +7,9 @@ from nonebot_plugin_saa import Text
from nonebot_plugin_session import EventSession from nonebot_plugin_session import EventSession
from zhenxun.configs.utils import PluginExtraData from zhenxun.configs.utils import PluginExtraData
from zhenxun.models.friend_user import FriendUser
from zhenxun.services.log import logger from zhenxun.services.log import logger
from zhenxun.utils.enum import PluginType from zhenxun.utils.enum import PluginType
from zhenxun.utils.platform import PlatformManage
from ._data_source import FgUpdateManage
__plugin_meta__ = PluginMetadata( __plugin_meta__ = PluginMetadata(
name="更新群组/好友信息", name="更新群组/好友信息",
@ -57,7 +54,7 @@ async def _(
arparma: Arparma, arparma: Arparma,
): ):
try: try:
num = await FgUpdateManage.update_group(bot, session.platform) num = await PlatformManage.update_group(bot)
logger.info( logger.info(
f"更新群聊信息完成,共更新了 {num} 个群组的信息!", f"更新群聊信息完成,共更新了 {num} 个群组的信息!",
arparma.header_result, arparma.header_result,
@ -78,7 +75,7 @@ async def _(
arparma: Arparma, arparma: Arparma,
): ):
try: try:
num = await FgUpdateManage.update_friend(bot, session.platform) num = await PlatformManage.update_friend(bot, session.platform)
logger.info( logger.info(
f"更新好友信息完成,共更新了 {num} 个好友的信息!", f"更新好友信息完成,共更新了 {num} 个好友的信息!",
arparma.header_result, arparma.header_result,

View File

@ -10,21 +10,21 @@ from zhenxun.models.group_console import GroupConsole
from zhenxun.services.log import logger from zhenxun.services.log import logger
class FgUpdateManage: class PlatformManage:
@classmethod @classmethod
async def update_group(cls, bot: Bot, platform: str) -> int: async def update_group(cls, bot: Bot) -> int:
"""更新群组信息 """更新群组信息
参数: 参数:
bot: Bot bot: Bot
platform: 平台
返回: 返回:
int: 更新个数 int: 更新个数
""" """
create_list = [] create_list = []
if group_list := await cls.__get_group_list(bot): group_list, platform = await cls.__get_group_list(bot)
if group_list:
exists_group_list = await GroupConsole.all().values_list( exists_group_list = await GroupConsole.all().values_list(
"group_id", "channel_id" "group_id", "channel_id"
) )
@ -42,7 +42,7 @@ class FgUpdateManage:
return len(create_list) return len(create_list)
@classmethod @classmethod
async def __get_group_list(cls, bot: Bot) -> list[GroupConsole]: async def __get_group_list(cls, bot: Bot) -> tuple[list[GroupConsole], str]:
"""获取群组列表 """获取群组列表
参数: 参数:
@ -61,7 +61,7 @@ class FgUpdateManage:
member_count=g["member_count"], member_count=g["member_count"],
) )
for g in group_list for g in group_list
] ], "qq"
if isinstance(bot, v12Bot): if isinstance(bot, v12Bot):
group_list = await bot.get_group_list() group_list = await bot.get_group_list()
return [ return [
@ -70,7 +70,7 @@ class FgUpdateManage:
user_name=g.group_name, # type: ignore user_name=g.group_name, # type: ignore
) )
for g in group_list for g in group_list
] ], "qq"
if isinstance(bot, DodoBot): if isinstance(bot, DodoBot):
island_list = await bot.get_island_list() island_list = await bot.get_island_list()
source_id_list = [ source_id_list = [
@ -88,28 +88,41 @@ class FgUpdateManage:
) )
for c in channel_list for c in channel_list
] ]
return group_list return group_list, "dodo"
if isinstance(bot, KaiheilaBot): if isinstance(bot, KaiheilaBot):
# TODO: kaiheila群组列表 group_list = []
pass guilds = await bot.guild_list()
if guilds.guilds:
for guild_id, name in [(g.id_, g.name) for g in guilds.guilds if g.id_]:
view = await bot.guild_view(guild_id=guild_id)
group_list.append(GroupConsole(group_id=guild_id, group_name=name))
if view.channels:
group_list += [
GroupConsole(
group_id=guild_id, group_name=c.name, channel_id=c.id_
)
for c in view.channels
if c.type != 0
]
return group_list, "kaiheila"
if isinstance(bot, DiscordBot): if isinstance(bot, DiscordBot):
# TODO: discord群组列表 # TODO: discord群组列表
pass pass
return [] return [], ""
@classmethod @classmethod
async def update_friend(cls, bot: Bot, platform: str) -> int: async def update_friend(cls, bot: Bot) -> int:
"""更新好友信息 """更新好友信息
参数: 参数:
bot: Bot bot: Bot
platform: 平台
返回: 返回:
int: 更新个数 int: 更新个数
""" """
create_list = [] create_list = []
if friend_list := await cls.__get_friend_list(bot): friend_list, platform = await cls.__get_friend_list(bot)
if friend_list:
user_id_list = await FriendUser.all().values_list("user_id", flat=True) user_id_list = await FriendUser.all().values_list("user_id", flat=True)
for friend in friend_list: for friend in friend_list:
friend.platform = platform friend.platform = platform
@ -120,7 +133,7 @@ class FgUpdateManage:
return len(create_list) return len(create_list)
@classmethod @classmethod
async def __get_friend_list(cls, bot: Bot) -> list[FriendUser]: async def __get_friend_list(cls, bot: Bot) -> tuple[list[FriendUser], str]:
"""获取好友列表 """获取好友列表
参数: 参数:
@ -134,7 +147,7 @@ class FgUpdateManage:
return [ return [
FriendUser(user_id=str(f["user_id"]), user_name=f["nickname"]) FriendUser(user_id=str(f["user_id"]), user_name=f["nickname"])
for f in friend_list for f in friend_list
] ], "qq"
if isinstance(bot, v12Bot): if isinstance(bot, v12Bot):
friend_list = await bot.get_friend_list() friend_list = await bot.get_friend_list()
return [ return [
@ -143,7 +156,7 @@ class FgUpdateManage:
user_name=f.user_displayname or f.user_remark or f.user_name, # type: ignore user_name=f.user_displayname or f.user_remark or f.user_name, # type: ignore
) )
for f in friend_list for f in friend_list
] ], "qq"
if isinstance(bot, DodoBot): if isinstance(bot, DodoBot):
# TODO: dodo好友列表 # TODO: dodo好友列表
pass pass
@ -153,4 +166,4 @@ class FgUpdateManage:
if isinstance(bot, DiscordBot): if isinstance(bot, DiscordBot):
# TODO: discord好友列表 # TODO: discord好友列表
pass pass
return [] return [], ""