mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-15 14:22:55 +08:00
✨ 添加bot消息发送记录
This commit is contained in:
parent
5a0af6a64b
commit
a44c5a9870
@ -49,4 +49,14 @@ Config.add_plugin_config(
|
|||||||
type=bool,
|
type=bool,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Config.add_plugin_config(
|
||||||
|
"hook",
|
||||||
|
"RECORD_BOT_SENT_MESSAGES",
|
||||||
|
True,
|
||||||
|
help="记录bot消息校内",
|
||||||
|
default_value=True,
|
||||||
|
type=bool,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
nonebot.load_plugins(str(Path(__file__).parent.resolve()))
|
nonebot.load_plugins(str(Path(__file__).parent.resolve()))
|
||||||
|
|||||||
@ -1,23 +1,85 @@
|
|||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
from nonebot.adapters import Bot
|
from nonebot.adapters import Bot, Message
|
||||||
|
|
||||||
|
from zhenxun.configs.config import Config
|
||||||
|
from zhenxun.models.bot_message_store import BotMessageStore
|
||||||
from zhenxun.services.log import logger
|
from zhenxun.services.log import logger
|
||||||
|
from zhenxun.utils.enum import BotSentType
|
||||||
from zhenxun.utils.manager.message_manager import MessageManager
|
from zhenxun.utils.manager.message_manager import MessageManager
|
||||||
|
from zhenxun.utils.platform import PlatformUtils
|
||||||
|
|
||||||
|
|
||||||
|
def replace_message(message: Message) -> str:
|
||||||
|
"""将消息中的at、image、record、face替换为字符串
|
||||||
|
|
||||||
|
参数:
|
||||||
|
message: Message
|
||||||
|
|
||||||
|
返回:
|
||||||
|
str: 文本消息
|
||||||
|
"""
|
||||||
|
result = ""
|
||||||
|
for msg in message:
|
||||||
|
if isinstance(msg, str):
|
||||||
|
result += msg
|
||||||
|
elif msg.type == "at":
|
||||||
|
result += f"@{msg.data['qq']}"
|
||||||
|
elif msg.type == "image":
|
||||||
|
result += "[image]"
|
||||||
|
elif msg.type == "record":
|
||||||
|
result += "[record]"
|
||||||
|
elif msg.type == "face":
|
||||||
|
result += f"[face:{msg.data['id']}]"
|
||||||
|
elif msg.type == "reply":
|
||||||
|
result += ""
|
||||||
|
else:
|
||||||
|
result += str(msg)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
@Bot.on_called_api
|
@Bot.on_called_api
|
||||||
async def handle_api_result(
|
async def handle_api_result(
|
||||||
bot: Bot, exception: Exception | None, api: str, data: dict[str, Any], result: Any
|
bot: Bot, exception: Exception | None, api: str, data: dict[str, Any], result: Any
|
||||||
):
|
):
|
||||||
if not exception and api == "send_msg":
|
if exception or api != "send_msg":
|
||||||
try:
|
return
|
||||||
if (uid := data.get("user_id")) and (msg_id := result.get("message_id")):
|
user_id = data.get("user_id")
|
||||||
MessageManager.add(str(uid), str(msg_id))
|
group_id = data.get("group_id")
|
||||||
logger.debug(
|
message_id = result.get("message_id")
|
||||||
f"收集消息id,user_id: {uid}, msg_id: {msg_id}", "msg_hook"
|
message: Message = data.get("message", "")
|
||||||
)
|
message_type = data.get("message_type")
|
||||||
except Exception as e:
|
try:
|
||||||
logger.warning(
|
# 记录消息id
|
||||||
f"收集消息id发生错误...data: {data}, result: {result}", "msg_hook", e=e
|
if user_id and message_id:
|
||||||
|
MessageManager.add(str(user_id), str(message_id))
|
||||||
|
logger.debug(
|
||||||
|
f"收集消息id,user_id: {user_id}, msg_id: {message_id}", "msg_hook"
|
||||||
)
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning(
|
||||||
|
f"收集消息id发生错误...data: {data}, result: {result}", "msg_hook", e=e
|
||||||
|
)
|
||||||
|
if not Config.get_config("hook", "RECORD_BOT_SENT_MESSAGES"):
|
||||||
|
return
|
||||||
|
try:
|
||||||
|
await BotMessageStore.create(
|
||||||
|
bot_id=bot.self_id,
|
||||||
|
user_id=user_id,
|
||||||
|
group_id=group_id,
|
||||||
|
sent_type=BotSentType.GROUP
|
||||||
|
if message_type == "group"
|
||||||
|
else BotSentType.PRIVATE,
|
||||||
|
text=replace_message(message),
|
||||||
|
plain_text=message.extract_plain_text()
|
||||||
|
if isinstance(message, Message)
|
||||||
|
else replace_message(message),
|
||||||
|
platform=PlatformUtils.get_platform(bot),
|
||||||
|
)
|
||||||
|
logger.debug(f"消息发送记录,message: {message}")
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning(
|
||||||
|
f"消息发送记录发生错误...data: {data}, result: {result}",
|
||||||
|
"msg_hook",
|
||||||
|
e=e,
|
||||||
|
)
|
||||||
|
|||||||
29
zhenxun/models/bot_message_store.py
Normal file
29
zhenxun/models/bot_message_store.py
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
from tortoise import fields
|
||||||
|
|
||||||
|
from zhenxun.services.db_context import Model
|
||||||
|
from zhenxun.utils.enum import BotSentType
|
||||||
|
|
||||||
|
|
||||||
|
class BotMessageStore(Model):
|
||||||
|
id = fields.IntField(pk=True, generated=True, auto_increment=True)
|
||||||
|
"""自增id"""
|
||||||
|
bot_id = fields.CharField(255, null=True)
|
||||||
|
"""bot id"""
|
||||||
|
user_id = fields.CharField(255, null=True)
|
||||||
|
"""目标id"""
|
||||||
|
group_id = fields.CharField(255, null=True)
|
||||||
|
"""群组id"""
|
||||||
|
sent_type = fields.CharEnumField(BotSentType)
|
||||||
|
"""类型"""
|
||||||
|
text = fields.TextField(null=True)
|
||||||
|
"""文本内容"""
|
||||||
|
plain_text = fields.TextField(null=True)
|
||||||
|
"""纯文本"""
|
||||||
|
platform = fields.CharField(255, null=True)
|
||||||
|
"""平台"""
|
||||||
|
create_time = fields.DatetimeField(auto_now_add=True)
|
||||||
|
"""创建时间"""
|
||||||
|
|
||||||
|
class Meta: # pyright: ignore [reportIncompatibleVariableOverride]
|
||||||
|
table = "bot_message_store"
|
||||||
|
table_description = "Bot发送消息列表"
|
||||||
@ -1,6 +1,11 @@
|
|||||||
from strenum import StrEnum
|
from strenum import StrEnum
|
||||||
|
|
||||||
|
|
||||||
|
class BotSentType(StrEnum):
|
||||||
|
GROUP = "GROUP"
|
||||||
|
PRIVATE = "PRIVATE"
|
||||||
|
|
||||||
|
|
||||||
class GoldHandle(StrEnum):
|
class GoldHandle(StrEnum):
|
||||||
"""
|
"""
|
||||||
金币处理
|
金币处理
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user