Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions COMMANDS.md
Original file line number Diff line number Diff line change
Expand Up @@ -404,6 +404,8 @@ Moonlark 投票
- `/chat reset (清除当前会话所有历史消息并重置会话状态)`
- `/chat stop (强制停止当前正在生成的响应)`
- `/chat stats (查看时间统计数据)`
- `/chat dropping <on|off> (开关礼物掉落功能)`
- `/chat compact [会话ID] (压缩消息队列,生成即时记忆后重置[SU])`
## `decision`: 虚假处分通知

根据群内最近 300 条消息,对指定群员生成一份符合公文格式的虚假处分通知(整活用)。
Expand Down
141 changes: 71 additions & 70 deletions poetry.lock

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions src/lang/en_us/chat.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,11 @@ command:
done: 完成
not_available: 该功能在此节点不可用!
stop: 已强制停止响应。
compact:
no_permission: 权限不足,仅超级用户可以使用此命令。
not_found: 未找到会话 {},请确认会话 ID 是否正确。
memory_generated: 已生成即时记忆,正在重置消息队列……
success: 已压缩会话 {} 的消息队列(即时记忆已保留)。
stats:
result: |
📊 Chat 时间统计
Expand Down Expand Up @@ -275,6 +280,7 @@ help:
usage12: chat reset (清除当前会话所有历史消息并重置会话状态)
usage13: chat stop (强制停止当前正在生成的响应)
usage14: chat stats (查看时间统计数据)
usage16: chat compact [会话ID] (压缩消息队列,生成即时记忆后重置[SU])
help_rua:
description: 互动
details: 通过 rua 指令与 Moonlark 进行亲密互动(如戳一戳、摸头、拥抱等)。不同的互动动作需要不同的好感度才能解锁。
Expand Down
6 changes: 6 additions & 0 deletions src/lang/zh_hans/chat.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,11 @@ command:
done: 完成
not_available: 该功能在此节点不可用!
stop: 已强制停止响应。
compact:
no_permission: 权限不足,仅超级用户可以使用此命令。
not_found: 未找到会话 {},请确认会话 ID 是否正确。
memory_generated: 已生成即时记忆,正在重置消息队列……
success: 已压缩会话 {} 的消息队列(即时记忆已保留)。
stats:
result: |
📊 Chat 时间统计
Expand Down Expand Up @@ -163,6 +168,7 @@ help:
usage12: chat reset (清除当前会话所有历史消息并重置会话状态)
usage13: chat stop (强制停止当前正在生成的响应)
usage14: chat stats (查看时间统计数据)
usage16: chat compact [会话ID] (压缩消息队列,生成即时记忆后重置[SU])

help_rua:
description: 互动
Expand Down
6 changes: 6 additions & 0 deletions src/lang/zh_tw/chat.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,11 @@ command:
done: 完成
not_available: 该功能在此节点不可用!
stop: 已强制停止响应。
compact:
no_permission: 权限不足,仅超级用户可以使用此命令。
not_found: 未找到会话 {},请确认会话 ID 是否正确。
memory_generated: 已生成即时记忆,正在重置消息队列……
success: 已压缩会话 {} 的消息队列(即时记忆已保留)。
stats:
result: |
📊 Chat 时间统计
Expand Down Expand Up @@ -275,6 +280,7 @@ help:
usage12: chat reset (清除当前会话所有历史消息并重置会话状态)
usage13: chat stop (强制停止当前正在生成的响应)
usage14: chat stats (查看时间统计数据)
usage16: chat compact [会话ID] (压缩消息队列,生成即时记忆后重置[SU])
help_rua:
description: 互动
details: 通过 rua 指令与 Moonlark 进行亲密互动(如戳一戳、摸头、拥抱等)。不同的互动动作需要不同的好感度才能解锁。
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/nonebot_plugin_chat/help.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
plugin: 'chat'
commands:
chat: help;14;community
chat: help;16;community
rua: help_rua;7;community
34 changes: 33 additions & 1 deletion src/plugins/nonebot_plugin_chat/matcher/chat.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

import json

from nonebot_plugin_chat.core.session import get_session_directly, group_disable, reset_session
from nonebot_plugin_chat.core.session import get_session_directly, group_disable, reset_session, groups
from nonebot_plugin_chat.core.session.base import BaseSession
from nonebot.adapters.qq import Bot as BotQQ
from nonebot.params import CommandArg
Expand Down Expand Up @@ -266,6 +266,36 @@ async def handle_dropping(self) -> None:
else:
await lang.finish("command.no_argv", self.user_id)

async def handle_compact(self) -> None:
"""处理 compact 命令:生成即时记忆并重置消息队列"""
from nonebot_plugin_larkutils.config import config as lark_config

# 验证 superuser
if self.user_id not in lark_config.superusers:
await lang.finish("command.compact.no_permission", self.user_id)

# 解析可选的会话 ID
target_session_id = self.argv[1] if len(self.argv) > 1 else self.group_id

# 获取目标会话
if target_session_id not in groups:
await lang.finish("command.compact.not_found", self.user_id, target_session_id)

session = groups[target_session_id]

# 如果有缓存消息,先生成即时记忆
if session.cached_messages:
await session.instant_memory_manager.generate()
await lang.send("command.compact.memory_generated", self.user_id)

# 重置消息队列
await session.processor.openai_messages._reset_and_clear_db(target_session_id)

# 重新注入即时记忆
await session.processor.openai_messages._inject_instant_memories(target_session_id)

await lang.finish("command.compact.success", self.user_id, target_session_id)

async def handle(self) -> None:
match self.argv[0]:
case "switch":
Expand Down Expand Up @@ -294,6 +324,8 @@ async def handle(self) -> None:
await self.handle_stats()
case "dropping":
await self.handle_dropping()
case "compact":
await self.handle_compact()
case _:
await lang.finish("command.no_argv", self.user_id)

Expand Down