zhenxun_bot/zhenxun/models/fg_request.py
HibiKier 205f4ff1fa
添加bot画像
*  新增自我介绍功能及自动发送图片支持

- 在 bot_profile.py 中实现自我介绍指令及重载功能
- 在 group_handle 中添加自动发送自我介绍图片的逻辑
- 在 fg_request 中实现添加好友时自动发送自我介绍图片
- 新增 bot_profile_manager.py 管理 BOT 自我介绍及图片生成
- 更新 models.py 以支持插件自我介绍和注意事项字段

* 🎨 调整管理帮助宽度

*  更新数据访问层,优化获取数据的方法并引入缓存机制

*  更新用户数据访问逻辑,优化获取用户信息的方法,使用新的函数替代原有实现

*  在 BotProfileManager 中添加自我介绍文件不存在的日志记录,优化文件读取逻辑

*  更新 BOT 自我介绍帮助信息,增加文件不存在时自动创建功能
2025-07-16 02:51:06 +08:00

175 lines
5.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from typing_extensions import Self
from nonebot.adapters import Bot
from tortoise import fields
from zhenxun.configs.config import BotConfig
from zhenxun.models.group_console import GroupConsole
from zhenxun.services.db_context import Model
from zhenxun.services.log import logger
from zhenxun.utils.common_utils import SqlUtils
from zhenxun.utils.enum import RequestHandleType, RequestType
from zhenxun.utils.exception import NotFoundError
from zhenxun.utils.manager.bot_profile_manager import BotProfileManager
from zhenxun.utils.message import MessageUtils
from zhenxun.utils.platform import PlatformUtils
class FgRequest(Model):
id = fields.IntField(pk=True, generated=True, auto_increment=True)
"""自增id"""
request_type = fields.CharEnumField(
RequestType, default=None, description="请求类型"
)
"""请求类型"""
platform = fields.CharField(255, description="平台")
"""平台"""
bot_id = fields.CharField(255, description="Bot Id")
"""botId"""
flag = fields.CharField(max_length=255, default="", description="flag")
"""flag"""
user_id = fields.CharField(max_length=255, description="请求用户id")
"""请求用户id"""
group_id = fields.CharField(max_length=255, null=True, description="邀请入群id")
"""邀请入群id"""
nickname = fields.CharField(max_length=255, description="请求人名称")
"""对象名称"""
comment = fields.CharField(max_length=255, null=True, description="验证信息")
"""验证信息"""
handle_type = fields.CharEnumField(
RequestHandleType, null=True, description="处理类型"
)
"""处理类型"""
message_ids = fields.CharField(max_length=255, null=True, description="消息id列表")
"""消息id列表"""
class Meta: # pyright: ignore [reportIncompatibleVariableOverride]
table = "fg_request"
table_description = "好友群组请求"
@classmethod
async def approve(cls, bot: Bot, id: int) -> Self:
"""同意请求
参数:
bot: Bot
id: 请求id
异常:
NotFoundError: 未发现请求
"""
return await cls._handle_request(bot, id, RequestHandleType.APPROVE)
@classmethod
async def refused(cls, bot: Bot, id: int) -> Self:
"""拒绝请求
参数:
bot: Bot
id: 请求id
异常:
NotFoundError: 未发现请求
"""
return await cls._handle_request(bot, id, RequestHandleType.REFUSED)
@classmethod
async def ignore(cls, id: int) -> Self:
"""忽略请求
参数:
id: 请求id
异常:
NotFoundError: 未发现请求
"""
return await cls._handle_request(None, id, RequestHandleType.IGNORE)
@classmethod
async def expire(cls, id: int):
"""忽略请求
参数:
id: 请求id
异常:
NotFoundError: 未发现请求
"""
await cls._handle_request(None, id, RequestHandleType.EXPIRE)
@classmethod
async def _handle_request(
cls,
bot: Bot | None,
id: int,
handle_type: RequestHandleType,
) -> Self:
"""处理请求
参数:
bot: Bot
id: 请求id
handle_type: 处理类型
异常:
NotFoundError: 未发现请求
"""
req = await cls.get_or_none(id=id)
if not req:
raise NotFoundError
req.handle_type = handle_type
await req.save(update_fields=["handle_type"])
if bot and handle_type not in [
RequestHandleType.IGNORE,
RequestHandleType.EXPIRE,
]:
if req.request_type == RequestType.FRIEND:
await bot.set_friend_add_request(
flag=req.flag, approve=handle_type == RequestHandleType.APPROVE
)
if BotProfileManager.is_auto_send_profile():
file_path = await BotProfileManager.build_bot_profile_image(
bot.self_id
)
if file_path:
await PlatformUtils.send_message(
bot,
req.user_id,
None,
MessageUtils.build_message(
[
f"你好,我是{BotConfig.self_nickname} "
"初次见面,希望我们可以好好相处!",
file_path,
]
),
)
logger.info(
"添加好友自动发送BOT自我介绍图片", session=req.user_id
)
else:
await GroupConsole.update_or_create(
group_id=req.group_id, defaults={"group_flag": 1}
)
if req.flag == "0":
# 用户手动申请入群,创建群认证后提醒用户拉群
await bot.send_private_msg(
user_id=req.user_id,
message=f"已同意你对{BotConfig.self_nickname}的申请群组:"
f"{req.group_id},可以直接手动拉入群组,{BotConfig.self_nickname}会自动同意。",
)
else:
# 正常同意群组请求
await bot.set_group_add_request(
flag=req.flag,
sub_type="invite",
approve=handle_type == RequestHandleType.APPROVE,
)
return req
@classmethod
async def _run_script(cls):
return [
SqlUtils.add_column("fg_request", "message_ids", "character varying(255)")
]