Files
adolf/extensions/qqbot/src/engine/commands/builtin/register-group-allways.ts
alvis bedb527145
Some checks failed
ClawSweeper Dispatch / dispatch (push) Has been cancelled
CodeQL / Security High (actions) (push) Has been cancelled
CodeQL / Security High (channel-runtime-boundary) (push) Has been cancelled
CodeQL / Security High (core-auth-secrets) (push) Has been cancelled
CodeQL / Security High (mcp-process-tool-boundary) (push) Has been cancelled
CodeQL / Security High (network-ssrf-boundary) (push) Has been cancelled
CodeQL / Security High (plugin-trust-boundary) (push) Has been cancelled
CodeQL / Security High (process-exec-boundary) (push) Has been cancelled
Docs Sync Publish Repo / sync-publish-repo (push) Has been cancelled
Docs / docs (push) Has been cancelled
OpenClaw Stable Main Closeout / Resolve stable release closeout inputs (push) Has been cancelled
OpenClaw Stable Main Closeout / Verify stable main closeout (push) Has been cancelled
Workflow Sanity / no-tabs (push) Has been cancelled
Workflow Sanity / actionlint (push) Has been cancelled
Workflow Sanity / generated-doc-baselines (push) Has been cancelled
CI / runner-admission (push) Has been cancelled
CI / preflight (push) Has been cancelled
CI / security-fast (push) Has been cancelled
CI / pnpm-store-warmup (push) Has been cancelled
CI / build-artifacts (push) Has been cancelled
CI / native-i18n (push) Has been cancelled
CI / ${{ matrix.check_name }} (push) Has been cancelled
CI / ${{ matrix.checkName }} (push) Has been cancelled
CI / checks-node-compat-node22 (push) Has been cancelled
CI / check-bundled-channel-config-metadata (push) Has been cancelled
CI / check-dependencies (push) Has been cancelled
CI / check-guards (push) Has been cancelled
CI / check-lint (push) Has been cancelled
CI / check-prod-types (push) Has been cancelled
CI / check-shrinkwrap (push) Has been cancelled
CI / check-test-types (push) Has been cancelled
CI / check-additional-boundaries-a (push) Has been cancelled
CI / check-additional-boundaries-bcd (push) Has been cancelled
CI / check-additional-extension-bundled (push) Has been cancelled
CI / check-additional-extension-channels (push) Has been cancelled
CI / check-additional-extension-package-boundary (push) Has been cancelled
CI / check-additional-runtime-topology-architecture (push) Has been cancelled
CI / check-session-accessor-boundary (push) Has been cancelled
CI / check-session-transcript-reader-boundary (push) Has been cancelled
CI / check-docs (push) Has been cancelled
CI / skills-python (push) Has been cancelled
CI / macos-swift (push) Has been cancelled
CI / ios-build (push) Has been cancelled
CI / ci-timings-summary (push) Has been cancelled
Native App Locale Refresh / Refresh native fa (push) Has been cancelled
Native App Locale Refresh / Refresh native fr (push) Has been cancelled
Native App Locale Refresh / Refresh native hi (push) Has been cancelled
Native App Locale Refresh / Refresh native id (push) Has been cancelled
Native App Locale Refresh / Refresh native it (push) Has been cancelled
Native App Locale Refresh / Refresh native ja-JP (push) Has been cancelled
Control UI Locale Refresh / plan (push) Has been cancelled
Control UI Locale Refresh / Refresh ${{ matrix.locale }} (push) Has been cancelled
Control UI Locale Refresh / Commit control UI locale refresh (push) Has been cancelled
Live Media Runner Image / Build live media runner image (push) Has been cancelled
Native App Locale Refresh / Refresh native ar (push) Has been cancelled
Native App Locale Refresh / Refresh native de (push) Has been cancelled
Native App Locale Refresh / Refresh native es (push) Has been cancelled
Native App Locale Refresh / Refresh native ko (push) Has been cancelled
Native App Locale Refresh / Refresh native nl (push) Has been cancelled
Native App Locale Refresh / Refresh native pl (push) Has been cancelled
Native App Locale Refresh / Refresh native pt-BR (push) Has been cancelled
Native App Locale Refresh / Refresh native ru (push) Has been cancelled
Native App Locale Refresh / Refresh native sv (push) Has been cancelled
Native App Locale Refresh / Refresh native th (push) Has been cancelled
Native App Locale Refresh / Refresh native tr (push) Has been cancelled
Native App Locale Refresh / Refresh native uk (push) Has been cancelled
Native App Locale Refresh / Refresh native vi (push) Has been cancelled
Native App Locale Refresh / Refresh native zh-CN (push) Has been cancelled
Native App Locale Refresh / Refresh native zh-TW (push) Has been cancelled
Native App Locale Refresh / Commit native locale refresh (push) Has been cancelled
Plugin Init Scaffold Validation / Validate provider scaffold (push) Has been cancelled
Plugin NPM Release / preview_plugins_npm (push) Has been cancelled
Plugin NPM Release / Validate release publish approval (push) Has been cancelled
Plugin NPM Release / preview_plugin_pack (push) Has been cancelled
Plugin NPM Release / publish_plugins_npm (push) Has been cancelled
Sandbox Common Smoke / sandbox-common-smoke (push) Has been cancelled
Website Installer Sync / static (push) Has been cancelled
Website Installer Sync / linux-docker (push) Has been cancelled
Website Installer Sync / macos-installer (push) Has been cancelled
Website Installer Sync / windows-installer (push) Has been cancelled
Website Installer Sync / sync-website (push) Has been cancelled
Vendor OpenClaw source as Adolf fork baseline
Adolf is a fork/vendored clone of github.com/openclaw/openclaw (v2026.6.11),
free to diverge. Tree copied sans upstream .git; upstream remote added for
future syncs. Node pinned to 24 (.nvmrc); engines already require >=22.19.
Preserves docs/ARCHITECTURE.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LeqyaxJF2nbRXJtae2kNB2
2026-07-05 09:36:54 +00:00

132 lines
5.4 KiB
TypeScript
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.
// 导入运行时配置缓存清除函数,确保配置更新后 getRuntimeConfig() 能读取到最新值
import { clearRuntimeConfigSnapshot } from "openclaw/plugin-sdk/runtime-config-snapshot";
// Qqbot plugin module implements register group allways behavior.
import type { ApproveRuntimeGetter } from "../../adapter/commands.port.js";
import type { SlashCommandRegistry } from "../slash-commands.js";
import {
getApproveRuntimeGetter,
getPluginVersionString,
resolveRuntimeServiceVersion,
} from "./state.js";
export function registerGroupAllwaysCommand(registry: SlashCommandRegistry): void {
registry.register({
name: "bot-group-allways",
description: "修改群消息默认响应模式",
requireAuth: true,
c2cOnly: true,
usage: [
`/bot-group-allways on AI 自主判断何时发言(无需 @`,
`/bot-group-allways off 仅在被 @ 时回复`,
`/bot-group-allways 查看当前设置`,
``,
`设为 on 后AI 会自主判断每条消息是否需要回复(无需 @)。`,
`仍可通过 groups.{groupId}.requireMention 对单个群覆盖。`,
``,
`优先级:具体群配置 > 通配符 "*" > defaultRequireMention本指令> 默认 true`,
].join("\n"),
handler: async (ctx) => {
const arg = ctx.args.trim().toLowerCase();
// 读取当前 defaultRequireMention 状态
const currentVal = ctx.accountConfig?.defaultRequireMention;
const currentRequireMention = currentVal ?? true; // 未设置时硬编码默认为 true
// 无参数:查看当前状态
if (!arg) {
return [
`🤖 群自主发言状态:${currentRequireMention ? "❌ 仅被 @ 时回复" : "✅ 自主判断何时发言"}`,
`使用 <qqbot-cmd-input text="/bot-group-allways on" show="/bot-group-allways on"/> 设为自主发言`,
`使用 <qqbot-cmd-input text="/bot-group-allways off" show="/bot-group-allways off"/> 设为仅被 @ 时回复`,
].join("\n");
}
if (arg !== "on" && arg !== "off") {
return `❌ 参数错误,请使用 on 或 off\n\n示例/bot-group-allways on`;
}
const newRequireMention = arg === "off"; // on=自主发言(requireMention=false), off=仅被@时回复(requireMention=true)
// 如果状态没变,直接返回
if (newRequireMention === currentRequireMention) {
return `🤖 群自主发言已经是"${arg}"状态,无需操作`;
}
// 获取运行时配置 API
let runtime: ReturnType<NonNullable<ApproveRuntimeGetter>>;
try {
const getter = getApproveRuntimeGetter();
if (!getter) {
throw new Error("runtime not available");
}
runtime = getter();
} catch {
const fwVer = resolveRuntimeServiceVersion();
const ver = getPluginVersionString();
return [
`❌ 当前版本不支持该指令`,
``,
`🦞框架版本:${fwVer}`,
`🤖QQBot 插件版本v${ver}`,
``,
`可通过以下命令手动设置:`,
``,
`\`\`\`shell`,
`# 设为 AI 自主判断何时发言defaultRequireMention=false`,
`openclaw config set channels.qqbot.defaultRequireMention false`,
`# 或设为仅被 @ 时回复defaultRequireMention=true`,
`openclaw config set channels.qqbot.defaultRequireMention true`,
`\`\`\``,
].join("\n");
}
try {
const configApi = runtime.config;
const currentCfg = structuredClone(configApi.current() as Record<string, unknown>);
const qqbot = ((currentCfg.channels ?? {}) as Record<string, unknown>).qqbot as
| Record<string, unknown>
| undefined;
if (!qqbot) {
return `❌ 配置文件中未找到 qqbot 通道配置`;
}
const accountId = ctx.accountId;
const isNamedAccount =
accountId !== "default" &&
Boolean(
(qqbot.accounts as Record<string, Record<string, unknown>> | undefined)?.[accountId],
);
if (isNamedAccount) {
// 命名账户:更新 accounts.{accountId}.defaultRequireMention
const accounts = (qqbot.accounts as Record<string, Record<string, unknown>>) ?? {};
const nextAccounts = { ...accounts };
const acct = { ...nextAccounts[accountId] };
acct.defaultRequireMention = newRequireMention;
nextAccounts[accountId] = acct;
qqbot.accounts = nextAccounts;
} else {
// 默认账户:更新 qqbot.defaultRequireMention
qqbot.defaultRequireMention = newRequireMention;
}
await configApi.replaceConfigFile({ nextConfig: currentCfg, afterWrite: { mode: "auto" } });
// 清除运行时配置缓存,确保 getRuntimeConfig() 下次调用时重新加载最新配置
clearRuntimeConfigSnapshot();
return [
`✅ 群自主发言已设置为 ${newRequireMention ? "**off**(仅被 @ 时回复)" : "**on**AI 自主判断何时发言)"}`,
``,
newRequireMention
? `仅在被 @ 机器人才会回复。`
: `AI 将自主判断群消息是否需要回复,无需被 @ 即可发言。`,
].join("\n");
} catch (err: unknown) {
return `❌ 配置写入失败: ${err instanceof Error ? err.message : String(err)}`;
}
},
});
}