zhenxun_bot/zhenxun/builtin_plugins/init/__init__.py

199 lines
5.7 KiB
Python
Raw Normal View History

2022-12-27 11:31:34 +08:00
from pathlib import Path
2025-01-08 15:23:10 +08:00
from typing import Any
2021-10-03 14:24:07 +08:00
2022-12-27 11:31:34 +08:00
import nonebot
2024-08-10 14:18:05 +08:00
from nonebot.adapters import Bot
2025-01-07 18:29:35 +08:00
from zhenxun.models.ban_console import BanConsole
from zhenxun.models.bot_console import BotConsole
from zhenxun.models.group_console import GroupConsole
2025-01-08 15:23:10 +08:00
from zhenxun.models.level_user import LevelUser
2025-01-07 18:29:35 +08:00
from zhenxun.models.plugin_info import PluginInfo
2025-01-08 15:23:10 +08:00
from zhenxun.models.user_console import UserConsole
from zhenxun.services.cache import CacheRoot
2024-08-10 14:18:05 +08:00
from zhenxun.services.log import logger
2025-01-07 18:29:35 +08:00
from zhenxun.utils.enum import CacheType
2024-08-10 14:18:05 +08:00
from zhenxun.utils.platform import PlatformUtils
2021-11-23 21:44:59 +08:00
2022-12-27 11:31:34 +08:00
nonebot.load_plugins(str(Path(__file__).parent.resolve()))
2024-08-10 14:18:05 +08:00
driver = nonebot.get_driver()
@driver.on_bot_connect
async def _(bot: Bot):
"""将bot已存在的群组添加群认证
参数:
bot: Bot
"""
if PlatformUtils.get_platform(bot) != "qq":
return
logger.debug(f"更新Bot: {bot.self_id} 的群认证...")
group_list, _ = await PlatformUtils.get_group_list(bot)
db_group_list = await GroupConsole.all().values_list("group_id", flat=True)
create_list = []
update_id = []
for group in group_list:
if group.group_id not in db_group_list:
group.group_flag = 1
create_list.append(group)
2024-08-10 14:18:05 +08:00
else:
update_id.append(group.group_id)
if create_list:
await GroupConsole.bulk_create(create_list, 10)
else:
await GroupConsole.filter(group_id__in=update_id).update(group_flag=1)
logger.debug(
f"更新Bot: {bot.self_id} 的群认证完成,共创建 {len(create_list)} 条数据,"
2024-09-02 21:45:37 +08:00
f"共修改 {len(update_id)} 条数据..."
)
2025-01-07 18:29:35 +08:00
2025-01-08 15:23:10 +08:00
@CacheRoot.new(CacheType.PLUGINS)
async def _(data: dict[str, PluginInfo] = {}, key: str | None = None):
if data and key:
if plugin := await PluginInfo.get_plugin(module=key):
data[key] = plugin
else:
data_list = await PluginInfo.get_plugins()
return {p.module: p for p in data_list}
2025-01-07 18:29:35 +08:00
2025-01-08 15:23:10 +08:00
@CacheRoot.updater(CacheType.PLUGINS)
async def _(data: dict[str, PluginInfo], key: str, value: Any):
if value:
data[key] = value
elif plugin := await PluginInfo.get_plugin(module=key):
data[key] = plugin
2025-01-07 18:29:35 +08:00
2025-01-08 15:23:10 +08:00
@CacheRoot.getter(CacheType.PLUGINS, result_model=PluginInfo)
async def _(data: dict[str, PluginInfo], module: str):
result = data.get(module, None)
if not result:
result = await PluginInfo.get_plugin(module=module)
if result:
data[module] = result
return result
2025-01-07 18:29:35 +08:00
2025-01-08 15:23:10 +08:00
@CacheRoot.new(CacheType.GROUPS)
2025-01-07 18:29:35 +08:00
async def _():
data_list = await GroupConsole.all()
2025-01-08 15:23:10 +08:00
return {p.group_id: p for p in data_list if not p.channel_id}
@CacheRoot.updater(CacheType.GROUPS)
async def _(data: dict[str, GroupConsole], key: str, value: Any):
if value:
data[key] = value
elif group := await GroupConsole.get_group(group_id=key):
data[key] = group
2025-01-07 18:29:35 +08:00
2025-01-08 15:23:10 +08:00
@CacheRoot.getter(CacheType.GROUPS, result_model=GroupConsole)
async def _(data: dict[str, GroupConsole], group_id: str):
result = data.get(group_id, None)
if not result:
result = await GroupConsole.get_group(group_id=group_id)
if result:
data[group_id] = result
return result
2025-01-07 18:29:35 +08:00
2025-01-08 15:23:10 +08:00
@CacheRoot.new(CacheType.BOT)
2025-01-07 18:29:35 +08:00
async def _():
data_list = await BotConsole.all()
return {p.bot_id: p for p in data_list}
2025-01-08 15:23:10 +08:00
@CacheRoot.updater(CacheType.BOT)
async def _(data: dict[str, BotConsole], key: str, value: Any):
if value:
data[key] = value
elif bot := await BotConsole.get_or_none(bot_id=key):
data[key] = bot
@CacheRoot.getter(CacheType.BOT, result_model=BotConsole)
async def _(data: dict[str, BotConsole], bot_id: str):
result = data.get(bot_id, None)
if not result:
result = await BotConsole.get_or_none(bot_id=bot_id)
if result:
data[bot_id] = result
return result
@CacheRoot.new(CacheType.USERS)
async def _():
data_list = await UserConsole.all()
return {p.user_id: p for p in data_list}
@CacheRoot.updater(CacheType.USERS)
async def _(data: dict[str, UserConsole], key: str, value: Any):
if value:
data[key] = value
elif user := await UserConsole.get_user(user_id=key):
data[key] = user
@CacheRoot.getter(CacheType.USERS, result_model=UserConsole)
async def _(data: dict[str, UserConsole], user_id: str):
result = data.get(user_id, None)
if not result:
result = await UserConsole.get_user(user_id=user_id)
if result:
data[user_id] = result
return result
@CacheRoot.new(CacheType.LEVEL)
async def _():
return await LevelUser().all()
@CacheRoot.getter(CacheType.LEVEL, result_model=list[LevelUser])
def _(data_list: list[LevelUser], user_id: str, group_id: str | None = None):
if not group_id:
return [
data for data in data_list if data.user_id == user_id and not data.group_id
]
else:
return [
data
for data in data_list
if data.user_id == user_id and data.group_id == group_id
]
2025-01-07 18:29:35 +08:00
2025-01-08 15:23:10 +08:00
@CacheRoot.new(CacheType.BAN)
2025-01-07 18:29:35 +08:00
async def _():
return await BanConsole.all()
2025-01-08 15:23:10 +08:00
@CacheRoot.getter(CacheType.BAN, result_model=list[BanConsole])
def _(data_list: list[BanConsole], user_id: str | None, group_id: str | None = None):
2025-01-07 18:29:35 +08:00
if user_id:
return (
[
2025-01-07 18:29:35 +08:00
data
for data in data_list
if data.user_id == user_id and data.group_id == group_id
]
if group_id
else [
2025-01-07 18:29:35 +08:00
data
for data in data_list
if data.user_id == user_id and not data.group_id
]
)
if group_id:
return [
data for data in data_list if not data.user_id and data.group_id == group_id
]
2025-01-07 18:29:35 +08:00
return None