@zhin.js/adapter-icqq 1.1.15 → 1.1.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +62 -0
- package/PERMITS.md +14 -18
- package/README.md +12 -0
- package/adapters/icqq/index.js +2 -0
- package/adapters/icqq/index.ts +2 -0
- package/agents/icqq/conversation.js +72 -0
- package/agents/icqq/conversation.ts +67 -0
- package/agents/icqq/members.js +16 -0
- package/agents/icqq/members.ts +17 -0
- package/agents/icqq/messages.js +144 -0
- package/agents/icqq/messages.ts +144 -0
- package/agents/icqq/skills/icqq-conversation/SKILL.md +24 -0
- package/agents/icqq/skills/icqq-conversation/tools/conversation_info/index.js +61 -0
- package/agents/icqq/skills/icqq-conversation/tools/conversation_info/index.ts +61 -0
- package/agents/icqq/skills/icqq-directory/tools/user_info/index.js +2 -1
- package/agents/icqq/skills/icqq-directory/tools/user_info/index.ts +2 -1
- package/agents/icqq/skills/icqq-group-admin/SKILL.md +11 -1
- package/agents/icqq/skills/icqq-group-admin/tools/announce/index.js +2 -1
- package/agents/icqq/skills/icqq-group-admin/tools/announce/index.ts +2 -1
- package/agents/icqq/skills/icqq-group-admin/tools/essence/index.js +3 -2
- package/agents/icqq/skills/icqq-group-admin/tools/essence/index.ts +3 -2
- package/agents/icqq/skills/icqq-group-admin/tools/group_invite/index.js +6 -5
- package/agents/icqq/skills/icqq-group-admin/tools/group_invite/index.ts +5 -4
- package/agents/icqq/skills/icqq-group-admin/tools/group_kick/index.js +4 -3
- package/agents/icqq/skills/icqq-group-admin/tools/group_kick/index.ts +4 -3
- package/agents/icqq/skills/icqq-group-admin/tools/group_leave/index.js +34 -0
- package/agents/icqq/skills/icqq-group-admin/tools/group_leave/index.ts +33 -0
- package/agents/icqq/skills/icqq-group-admin/tools/recall_member_message/index.js +34 -0
- package/agents/icqq/skills/icqq-group-admin/tools/recall_member_message/index.ts +33 -0
- package/agents/icqq/skills/icqq-group-admin/tools/set_anonymous/index.js +5 -4
- package/agents/icqq/skills/icqq-group-admin/tools/set_anonymous/index.ts +4 -3
- package/agents/icqq/skills/icqq-group-admin/tools/set_mute/index.js +8 -7
- package/agents/icqq/skills/icqq-group-admin/tools/set_mute/index.ts +6 -5
- package/agents/icqq/skills/icqq-group-admin/tools/set_title/index.js +8 -7
- package/agents/icqq/skills/icqq-group-admin/tools/set_title/index.ts +6 -5
- package/agents/icqq/skills/icqq-group-directory/tools/group_member_info/index.js +18 -7
- package/agents/icqq/skills/icqq-group-directory/tools/group_member_info/index.ts +17 -5
- package/agents/icqq/skills/icqq-group-interaction/tools/group_sign/index.js +3 -2
- package/agents/icqq/skills/icqq-group-interaction/tools/group_sign/index.ts +3 -2
- package/agents/icqq/skills/icqq-group-interaction/tools/poke/index.js +2 -1
- package/agents/icqq/skills/icqq-group-interaction/tools/poke/index.ts +2 -1
- package/agents/icqq/skills/icqq-group-state/tools/group_files/index.js +2 -1
- package/agents/icqq/skills/icqq-group-state/tools/group_files/index.ts +2 -1
- package/agents/icqq/skills/icqq-interaction/tools/send_user_like/index.js +3 -2
- package/agents/icqq/skills/icqq-interaction/tools/send_user_like/index.ts +3 -2
- package/agents/icqq/skills/icqq-messages/SKILL.md +28 -0
- package/agents/icqq/skills/icqq-messages/tools/forward_messages/index.js +42 -0
- package/agents/icqq/skills/icqq-messages/tools/forward_messages/index.ts +40 -0
- package/agents/icqq/skills/icqq-messages/tools/quote_reply/index.js +24 -0
- package/agents/icqq/skills/icqq-messages/tools/quote_reply/index.ts +24 -0
- package/agents/icqq/skills/icqq-messages/tools/recall_own_message/index.js +18 -0
- package/agents/icqq/skills/icqq-messages/tools/recall_own_message/index.ts +17 -0
- package/agents/icqq/system.md +5 -1
- package/commands/icqq/endpoint/definition.js +9 -7
- package/commands/icqq/endpoint/definition.ts +9 -9
- package/lib/endpoint.d.ts +1 -0
- package/lib/endpoint.js +12 -8
- package/lib/group-moderation.js +7 -2
- package/lib/group-scene.d.ts +11 -0
- package/lib/group-scene.js +71 -0
- package/lib/i18n.d.ts +1 -0
- package/lib/i18n.js +47 -0
- package/lib/icqq-inbound.d.ts +2 -0
- package/lib/icqq-inbound.js +3 -0
- package/lib/icqq-inbox.d.ts +5 -0
- package/lib/icqq-inbox.js +14 -0
- package/lib/icqq-login-assist.d.ts +2 -0
- package/lib/icqq-login-assist.js +8 -7
- package/lib/protocol.d.ts +3 -0
- package/lib/protocol.js +18 -3
- package/package.json +16 -16
- package/schema.json +250 -42
- package/src/endpoint.ts +13 -7
- package/src/group-moderation.ts +7 -2
- package/src/group-scene.ts +76 -0
- package/src/i18n.ts +48 -0
- package/src/icqq-inbound.ts +5 -0
- package/src/icqq-inbox.ts +15 -0
- package/src/icqq-login-assist.ts +10 -7
- package/src/protocol.ts +19 -3
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
|
+
import { defineAgentTool } from '@zhin.js/tool';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { currentConversation } from '../../../../conversation.js';
|
|
5
|
+
export default defineAgentTool({
|
|
6
|
+
description: '读取当前 ICQQ 会话及机器人自己的群/频道身份;区分调用者权限、机器人平台权限和不支持的操作',
|
|
7
|
+
adapter: 'icqq',
|
|
8
|
+
requiresApproval: 'never',
|
|
9
|
+
inputSchema: z.object({}),
|
|
10
|
+
async execute(_input, context) {
|
|
11
|
+
const conversation = currentConversation(context);
|
|
12
|
+
const client = context.$client;
|
|
13
|
+
const roles = context.principal.roles;
|
|
14
|
+
const common = {
|
|
15
|
+
conversation,
|
|
16
|
+
requester: {
|
|
17
|
+
roles,
|
|
18
|
+
canRequestGroupModeration: roles.some(role => ['master', 'admin', 'trusted', 'owner'].includes(role)),
|
|
19
|
+
canRequestLeave: roles.includes('master'),
|
|
20
|
+
},
|
|
21
|
+
operations: {
|
|
22
|
+
quoteReply: conversation.kind !== 'channel',
|
|
23
|
+
forwardMessages: conversation.kind !== 'channel',
|
|
24
|
+
recallOwnMessage: conversation.kind !== 'channel',
|
|
25
|
+
recallMemberMessage: conversation.kind === 'group',
|
|
26
|
+
leaveGroup: conversation.kind === 'group',
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
if (conversation.kind === 'group') {
|
|
30
|
+
const id = Number(conversation.id);
|
|
31
|
+
const [group, self] = await Promise.all([
|
|
32
|
+
client.getGroupInfo(id, true),
|
|
33
|
+
client.getGroupMemberInfo(id, client.uin, true),
|
|
34
|
+
]);
|
|
35
|
+
context.signal.throwIfAborted();
|
|
36
|
+
const role = group.owner_id === client.uin ? 'owner' : self.role;
|
|
37
|
+
return {
|
|
38
|
+
...common,
|
|
39
|
+
group: { id: group.group_id, name: group.group_name, ownerId: group.owner_id, memberCount: group.member_count },
|
|
40
|
+
bot: { id: client.uin, role, canModerateMembers: role === 'owner' || role === 'admin', canLeave: role === 'admin' || role === 'member' },
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
if (conversation.kind === 'channel') {
|
|
44
|
+
const guildId = conversation.parent?.id;
|
|
45
|
+
const guild = guildId ? client.guilds.get(guildId) : undefined;
|
|
46
|
+
const channel = guild?.channels.get(conversation.id);
|
|
47
|
+
const members = guildId ? await client.getGuildMemberList(guildId) : [];
|
|
48
|
+
context.signal.throwIfAborted();
|
|
49
|
+
const self = members.find(member => member.tiny_id === client.tiny_id);
|
|
50
|
+
const role = self?.role === 4 ? 'owner' : self?.role === 2 ? 'admin'
|
|
51
|
+
: self?.role === 5 ? 'channel_admin' : self?.role === 1 ? 'member' : 'unknown';
|
|
52
|
+
return {
|
|
53
|
+
...common,
|
|
54
|
+
guild: { id: guildId, name: guild?.guild_name },
|
|
55
|
+
channel: { id: conversation.id, name: channel?.channel_name, type: channel?.channel_type },
|
|
56
|
+
bot: { id: client.tiny_id, role, channelAdminScope: 'unknown' },
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return { ...common, bot: { id: client.uin, role: 'not_applicable' } };
|
|
60
|
+
},
|
|
61
|
+
});
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { defineAgentTool } from '@zhin.js/tool';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { currentConversation } from '../../../../conversation.js';
|
|
4
|
+
|
|
5
|
+
export default defineAgentTool({
|
|
6
|
+
description: '读取当前 ICQQ 会话及机器人自己的群/频道身份;区分调用者权限、机器人平台权限和不支持的操作',
|
|
7
|
+
adapter: 'icqq',
|
|
8
|
+
requiresApproval: 'never',
|
|
9
|
+
inputSchema: z.object({}),
|
|
10
|
+
async execute(_input, context) {
|
|
11
|
+
const conversation = currentConversation(context);
|
|
12
|
+
const client = context.$client;
|
|
13
|
+
const roles = context.principal.roles;
|
|
14
|
+
const common = {
|
|
15
|
+
conversation,
|
|
16
|
+
requester: {
|
|
17
|
+
roles,
|
|
18
|
+
canRequestGroupModeration: roles.some(role => ['master', 'admin', 'trusted', 'owner'].includes(role)),
|
|
19
|
+
canRequestLeave: roles.includes('master'),
|
|
20
|
+
},
|
|
21
|
+
operations: {
|
|
22
|
+
quoteReply: conversation.kind !== 'channel',
|
|
23
|
+
forwardMessages: conversation.kind !== 'channel',
|
|
24
|
+
recallOwnMessage: conversation.kind !== 'channel',
|
|
25
|
+
recallMemberMessage: conversation.kind === 'group',
|
|
26
|
+
leaveGroup: conversation.kind === 'group',
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
if (conversation.kind === 'group') {
|
|
30
|
+
const id = Number(conversation.id);
|
|
31
|
+
const [group, self] = await Promise.all([
|
|
32
|
+
client.getGroupInfo(id, true),
|
|
33
|
+
client.getGroupMemberInfo(id, client.uin, true),
|
|
34
|
+
]);
|
|
35
|
+
context.signal.throwIfAborted();
|
|
36
|
+
const role = group.owner_id === client.uin ? 'owner' : self.role;
|
|
37
|
+
return {
|
|
38
|
+
...common,
|
|
39
|
+
group: { id: group.group_id, name: group.group_name, ownerId: group.owner_id, memberCount: group.member_count },
|
|
40
|
+
bot: { id: client.uin, role, canModerateMembers: role === 'owner' || role === 'admin', canLeave: role === 'admin' || role === 'member' },
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
if (conversation.kind === 'channel') {
|
|
44
|
+
const guildId = conversation.parent?.id;
|
|
45
|
+
const guild = guildId ? client.guilds.get(guildId) : undefined;
|
|
46
|
+
const channel = guild?.channels.get(conversation.id);
|
|
47
|
+
const members = guildId ? await client.getGuildMemberList(guildId) : [];
|
|
48
|
+
context.signal.throwIfAborted();
|
|
49
|
+
const self = members.find(member => member.tiny_id === client.tiny_id);
|
|
50
|
+
const role = self?.role === 4 ? 'owner' : self?.role === 2 ? 'admin'
|
|
51
|
+
: self?.role === 5 ? 'channel_admin' : self?.role === 1 ? 'member' : 'unknown';
|
|
52
|
+
return {
|
|
53
|
+
...common,
|
|
54
|
+
guild: { id: guildId, name: guild?.guild_name },
|
|
55
|
+
channel: { id: conversation.id, name: channel?.channel_name, type: channel?.channel_type },
|
|
56
|
+
bot: { id: client.tiny_id, role, channelAdminScope: 'unknown' },
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return { ...common, bot: { id: client.uin, role: 'not_applicable' } };
|
|
60
|
+
},
|
|
61
|
+
});
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
|
+
import { messages as t } from "../../../../messages.js";
|
|
2
3
|
import { defineAgentTool } from '@zhin.js/tool';
|
|
3
4
|
import { z } from 'zod';
|
|
4
5
|
export default defineAgentTool({
|
|
@@ -10,6 +11,6 @@ export default defineAgentTool({
|
|
|
10
11
|
requiresApproval: 'never',
|
|
11
12
|
async execute({ user_id }, context) {
|
|
12
13
|
const profile = await context.$client.getProfile(user_id);
|
|
13
|
-
return { success: true, message:
|
|
14
|
+
return { success: true, message: t(context.locale, 'userInfo', { p0: user_id, p1: JSON.stringify(profile, null, 2) }) };
|
|
14
15
|
},
|
|
15
16
|
});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { messages as t } from "../../../../messages.js";
|
|
1
2
|
import { defineAgentTool } from '@zhin.js/tool';
|
|
2
3
|
import { z } from 'zod';
|
|
3
4
|
export default defineAgentTool<{ user_id: number }>({
|
|
@@ -9,6 +10,6 @@ export default defineAgentTool<{ user_id: number }>({
|
|
|
9
10
|
requiresApproval: 'never',
|
|
10
11
|
async execute({ user_id }, context) {
|
|
11
12
|
const profile = await context.$client.getProfile(user_id);
|
|
12
|
-
return { success: true, message:
|
|
13
|
+
return { success: true, message: t(context.locale, 'userInfo', { p0: user_id, p1: JSON.stringify(profile,null,2) }) };
|
|
13
14
|
},
|
|
14
15
|
});
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: icqq-group-admin
|
|
3
3
|
platforms:
|
|
4
4
|
- icqq
|
|
5
|
-
description: ICQQ
|
|
5
|
+
description: ICQQ 群管理、撤回他人消息,以及仅主人可申请的退群操作;工具分别声明权限与审批要求。
|
|
6
6
|
keywords:
|
|
7
7
|
- icqq
|
|
8
8
|
- 群管理
|
|
@@ -10,6 +10,8 @@ keywords:
|
|
|
10
10
|
- 踢人
|
|
11
11
|
- 公告
|
|
12
12
|
- 精华
|
|
13
|
+
- 退群
|
|
14
|
+
- 撤回他人消息
|
|
13
15
|
tools:
|
|
14
16
|
- group_invite
|
|
15
17
|
- group_kick
|
|
@@ -18,6 +20,8 @@ tools:
|
|
|
18
20
|
- set_anonymous
|
|
19
21
|
- announce
|
|
20
22
|
- essence
|
|
23
|
+
- group_leave
|
|
24
|
+
- recall_member_message
|
|
21
25
|
scopes:
|
|
22
26
|
- group
|
|
23
27
|
---
|
|
@@ -30,3 +34,9 @@ scopes:
|
|
|
30
34
|
本技能的踢人工具每次都需人工审批,必须展示本次目标群、目标成员和理由;上一笔操作的批准不能授权下一笔踢人。
|
|
31
35
|
|
|
32
36
|
已配置的自动审核流程可对入群 10 分钟内的明确广告直接踢出;该例外由审核流程核验,不授权本技能或普通对话绕过人工审批。
|
|
37
|
+
|
|
38
|
+
`group_leave` 仅主人(master)可发起,每次人工审批,只能退出当前群。Bot 为群主时拒绝执行,因为 SDK 的退群会解散群。
|
|
39
|
+
|
|
40
|
+
`recall_member_message` 沿用 master/admin/trusted/owner 发起权限,无需逐次审批;目标固定在当前群中的真实消息。执行前实时查询 Bot 与目标成员角色:管理员只能撤回普通成员,群主可撤回管理员或普通成员。平台时限与执行结果仍然有效,不自动重试未确认的结果。
|
|
41
|
+
|
|
42
|
+
撤回 Bot 自己的消息不要求群管角色:使用 `icqq-messages` 的 `recall_own_message`。已配置自动群审核的撤回继续走原有审核路径,不因本工具新增审批,也不扩大审核类别或目标群。
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
|
+
import { messages as t } from "../../../../messages.js";
|
|
2
3
|
import { defineAgentTool } from '@zhin.js/tool';
|
|
3
4
|
import { z } from 'zod';
|
|
4
5
|
export default defineAgentTool({
|
|
@@ -13,6 +14,6 @@ export default defineAgentTool({
|
|
|
13
14
|
permissions: ['role(master,admin,trusted,owner)'],
|
|
14
15
|
async execute({ group_id, content }, context) {
|
|
15
16
|
await context.$client.sendGroupNotice(group_id, content);
|
|
16
|
-
return { success: true, message: '
|
|
17
|
+
return { success: true, message: t(context.locale, 'announcementSent') };
|
|
17
18
|
},
|
|
18
19
|
});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { messages as t } from "../../../../messages.js";
|
|
1
2
|
import { defineAgentTool } from '@zhin.js/tool';
|
|
2
3
|
import { z } from 'zod';
|
|
3
4
|
export default defineAgentTool<{ group_id: number; content: string }>({
|
|
@@ -12,6 +13,6 @@ export default defineAgentTool<{ group_id: number; content: string }>({
|
|
|
12
13
|
permissions: ['role(master,admin,trusted,owner)'],
|
|
13
14
|
async execute({ group_id, content }, context) {
|
|
14
15
|
await context.$client.sendGroupNotice(group_id, content);
|
|
15
|
-
return { success: true, message: '
|
|
16
|
+
return { success: true, message: t(context.locale, 'announcementSent') };
|
|
16
17
|
},
|
|
17
18
|
});
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
|
+
import { messages as t } from "../../../../messages.js";
|
|
2
3
|
import { defineAgentTool } from '@zhin.js/tool';
|
|
3
4
|
import { z } from 'zod';
|
|
4
5
|
export default defineAgentTool({
|
|
5
6
|
description: '设置或移除 QQ 群精华消息',
|
|
6
7
|
inputSchema: z.object({
|
|
7
|
-
message_id: z.string().describe('消息 ID'),
|
|
8
|
+
message_id: z.string().describe('消息 ID,或消息头里的 m<n> 别名'),
|
|
8
9
|
action: z.enum(['add', 'remove']).describe('add=设为精华, remove=移除精华'),
|
|
9
10
|
}),
|
|
10
11
|
adapter: 'icqq',
|
|
@@ -19,6 +20,6 @@ export default defineAgentTool({
|
|
|
19
20
|
else {
|
|
20
21
|
await client.removeEssenceMessage(message_id);
|
|
21
22
|
}
|
|
22
|
-
return { success: true, message: action === 'add' ? '
|
|
23
|
+
return { success: true, message: action === 'add' ? t(context.locale, 'essenceAdded') : t(context.locale, 'essenceRemoved') };
|
|
23
24
|
},
|
|
24
25
|
});
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { messages as t } from "../../../../messages.js";
|
|
1
2
|
import { defineAgentTool } from '@zhin.js/tool';
|
|
2
3
|
import { z } from 'zod';
|
|
3
4
|
export default defineAgentTool<{ message_id: string; action: 'add' | 'remove' }>({
|
|
4
5
|
description: '设置或移除 QQ 群精华消息',
|
|
5
6
|
inputSchema: z.object({
|
|
6
|
-
message_id: z.string().describe('消息 ID'),
|
|
7
|
+
message_id: z.string().describe('消息 ID,或消息头里的 m<n> 别名'),
|
|
7
8
|
action: z.enum(['add', 'remove']).describe('add=设为精华, remove=移除精华'),
|
|
8
9
|
}),
|
|
9
10
|
adapter: 'icqq',
|
|
@@ -17,6 +18,6 @@ export default defineAgentTool<{ message_id: string; action: 'add' | 'remove' }>
|
|
|
17
18
|
} else {
|
|
18
19
|
await client.removeEssenceMessage(message_id);
|
|
19
20
|
}
|
|
20
|
-
return { success: true, message: action === 'add' ? '
|
|
21
|
+
return { success: true, message: action === 'add' ? t(context.locale, 'essenceAdded') : t(context.locale, 'essenceRemoved') };
|
|
21
22
|
},
|
|
22
23
|
});
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
|
+
import { messages as t } from "../../../../messages.js";
|
|
3
|
+
import { freshMember } from "../../../../members.js";
|
|
2
4
|
import { defineAgentTool } from '@zhin.js/tool';
|
|
3
5
|
import { z } from 'zod';
|
|
4
6
|
export default defineAgentTool({
|
|
@@ -14,11 +16,10 @@ export default defineAgentTool({
|
|
|
14
16
|
const client = context.$client;
|
|
15
17
|
const groupInfo = client.pickGroup(group_id);
|
|
16
18
|
if (!groupInfo)
|
|
17
|
-
return { success: false, message: '
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
return { success: false, message: '目标成员已加入群' };
|
|
19
|
+
return { success: false, message: t(context.locale, 'groupMissing') };
|
|
20
|
+
if (await freshMember(client, group_id, user_id))
|
|
21
|
+
return { success: false, message: t(context.locale, 'memberExists') };
|
|
21
22
|
await client.inviteFriend(group_id, user_id);
|
|
22
|
-
return { success: true, message:
|
|
23
|
+
return { success: true, message: t(context.locale, 'inviteAttempted', { p0: user_id, p1: group_id }) };
|
|
23
24
|
},
|
|
24
25
|
});
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { messages as t } from "../../../../messages.js";
|
|
2
|
+
import { freshMember } from "../../../../members.js";
|
|
1
3
|
import { defineAgentTool } from '@zhin.js/tool';
|
|
2
4
|
import { z } from 'zod';
|
|
3
5
|
export default defineAgentTool<{ group_id: number; user_id: number }>({
|
|
@@ -12,10 +14,9 @@ export default defineAgentTool<{ group_id: number; user_id: number }>({
|
|
|
12
14
|
async execute({ group_id, user_id }, context) {
|
|
13
15
|
const client = context.$client;
|
|
14
16
|
const groupInfo= client.pickGroup(group_id);
|
|
15
|
-
if(!groupInfo) return { success: false, message: '
|
|
16
|
-
|
|
17
|
-
if(memberInfo) return { success: false, message: '目标成员已加入群' };
|
|
17
|
+
if(!groupInfo) return { success: false, message: t(context.locale, 'groupMissing') };
|
|
18
|
+
if (await freshMember(client, group_id, user_id)) return { success: false, message: t(context.locale, 'memberExists') };
|
|
18
19
|
await client.inviteFriend(group_id, user_id);
|
|
19
|
-
return { success: true, message:
|
|
20
|
+
return { success: true, message: t(context.locale, 'inviteAttempted', { p0: user_id, p1: group_id }) };
|
|
20
21
|
},
|
|
21
22
|
});
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
|
+
import { messages as t } from "../../../../messages.js";
|
|
2
3
|
import { defineAgentTool } from '@zhin.js/tool';
|
|
3
4
|
import { z } from 'zod';
|
|
4
5
|
export default defineAgentTool({
|
|
@@ -20,10 +21,10 @@ export default defineAgentTool({
|
|
|
20
21
|
]);
|
|
21
22
|
if (user_id === client.uin || (self.role !== 'owner' && self.role !== 'admin')
|
|
22
23
|
|| member.role !== 'member')
|
|
23
|
-
return { success: false, message: '
|
|
24
|
+
return { success: false, message: t(context.locale, 'kickForbidden') };
|
|
24
25
|
context.signal.throwIfAborted();
|
|
25
26
|
if (!await client.setGroupKick(group_id, user_id))
|
|
26
|
-
return { success: false, message: '
|
|
27
|
-
return { success: true, message:
|
|
27
|
+
return { success: false, message: t(context.locale, 'kickUnconfirmed') };
|
|
28
|
+
return { success: true, message: t(context.locale, 'memberKicked', { p0: user_id }) };
|
|
28
29
|
},
|
|
29
30
|
});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { messages as t } from "../../../../messages.js";
|
|
1
2
|
import { defineAgentTool } from '@zhin.js/tool';
|
|
2
3
|
import { z } from 'zod';
|
|
3
4
|
export default defineAgentTool<{ group_id: number; user_id: number; reason: string }>({
|
|
@@ -18,9 +19,9 @@ export default defineAgentTool<{ group_id: number; user_id: number; reason: stri
|
|
|
18
19
|
client.getGroupMemberInfo(group_id, user_id, true),
|
|
19
20
|
]);
|
|
20
21
|
if (user_id === client.uin || (self.role !== 'owner' && self.role !== 'admin')
|
|
21
|
-
|| member.role !== 'member') return { success: false, message: '
|
|
22
|
+
|| member.role !== 'member') return { success: false, message: t(context.locale, 'kickForbidden') };
|
|
22
23
|
context.signal.throwIfAborted();
|
|
23
|
-
if (!await client.setGroupKick(group_id, user_id)) return { success: false, message: '
|
|
24
|
-
return { success: true, message:
|
|
24
|
+
if (!await client.setGroupKick(group_id, user_id)) return { success: false, message: t(context.locale, 'kickUnconfirmed') };
|
|
25
|
+
return { success: true, message: t(context.locale, 'memberKicked', { p0: user_id }) };
|
|
25
26
|
},
|
|
26
27
|
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
|
+
import { defineAgentTool } from '@zhin.js/tool';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { currentGroup } from '../../../../conversation.js';
|
|
5
|
+
import { messages as t } from '../../../../messages.js';
|
|
6
|
+
export default defineAgentTool({
|
|
7
|
+
description: '让机器人退出当前 QQ 群;仅主人可发起且每次人工审批,机器人是群主时拒绝执行以免解散群',
|
|
8
|
+
adapter: 'icqq',
|
|
9
|
+
scopes: ['group'],
|
|
10
|
+
currentConversationBotRoles: ['admin', 'member'],
|
|
11
|
+
permissions: ['role(master)'],
|
|
12
|
+
requiresApproval: 'human',
|
|
13
|
+
risk: 'dangerous',
|
|
14
|
+
riskCategory: 'member',
|
|
15
|
+
inputSchema: z.object({
|
|
16
|
+
group_id: z.number().int().positive().describe('当前群号,展示于本次退群审批'),
|
|
17
|
+
reason: z.string().min(1).describe('本次退群原因,供主人逐次确认'),
|
|
18
|
+
}),
|
|
19
|
+
async execute({ group_id }, context) {
|
|
20
|
+
if (currentGroup(context) !== group_id)
|
|
21
|
+
return { success: false, message: t(context.locale, 'leaveForbidden') };
|
|
22
|
+
const client = context.$client;
|
|
23
|
+
const [group, self] = await Promise.all([
|
|
24
|
+
client.getGroupInfo(group_id, true),
|
|
25
|
+
client.getGroupMemberInfo(group_id, client.uin, true),
|
|
26
|
+
]);
|
|
27
|
+
if (group.owner_id === client.uin || (self.role !== 'admin' && self.role !== 'member')) {
|
|
28
|
+
return { success: false, message: t(context.locale, 'leaveForbidden') };
|
|
29
|
+
}
|
|
30
|
+
context.signal.throwIfAborted();
|
|
31
|
+
const success = await client.setGroupLeave(group_id);
|
|
32
|
+
return { success, message: t(context.locale, success ? 'groupLeft' : 'leaveUnconfirmed') };
|
|
33
|
+
},
|
|
34
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { defineAgentTool } from '@zhin.js/tool';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { currentGroup } from '../../../../conversation.js';
|
|
4
|
+
import { messages as t } from '../../../../messages.js';
|
|
5
|
+
|
|
6
|
+
export default defineAgentTool({
|
|
7
|
+
description: '让机器人退出当前 QQ 群;仅主人可发起且每次人工审批,机器人是群主时拒绝执行以免解散群',
|
|
8
|
+
adapter: 'icqq',
|
|
9
|
+
scopes: ['group'],
|
|
10
|
+
currentConversationBotRoles: ['admin', 'member'],
|
|
11
|
+
permissions: ['role(master)'],
|
|
12
|
+
requiresApproval: 'human',
|
|
13
|
+
risk: 'dangerous',
|
|
14
|
+
riskCategory: 'member',
|
|
15
|
+
inputSchema: z.object({
|
|
16
|
+
group_id: z.number().int().positive().describe('当前群号,展示于本次退群审批'),
|
|
17
|
+
reason: z.string().min(1).describe('本次退群原因,供主人逐次确认'),
|
|
18
|
+
}),
|
|
19
|
+
async execute({ group_id }, context) {
|
|
20
|
+
if (currentGroup(context) !== group_id) return { success: false, message: t(context.locale, 'leaveForbidden') };
|
|
21
|
+
const client = context.$client;
|
|
22
|
+
const [group, self] = await Promise.all([
|
|
23
|
+
client.getGroupInfo(group_id, true),
|
|
24
|
+
client.getGroupMemberInfo(group_id, client.uin, true),
|
|
25
|
+
]);
|
|
26
|
+
if (group.owner_id === client.uin || (self.role !== 'admin' && self.role !== 'member')) {
|
|
27
|
+
return { success: false, message: t(context.locale, 'leaveForbidden') };
|
|
28
|
+
}
|
|
29
|
+
context.signal.throwIfAborted();
|
|
30
|
+
const success = await client.setGroupLeave(group_id);
|
|
31
|
+
return { success, message: t(context.locale, success ? 'groupLeft' : 'leaveUnconfirmed') };
|
|
32
|
+
},
|
|
33
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
|
+
import { defineAgentTool } from '@zhin.js/tool';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { currentGroup, recallMessage, resolveMessage } from '../../../../conversation.js';
|
|
5
|
+
import { messages as t } from '../../../../messages.js';
|
|
6
|
+
export default defineAgentTool({
|
|
7
|
+
description: '撤回当前 QQ 群内他人的真实消息;需调用方具备群管发起权限及机器人具备实时平台权限,无需逐次审批',
|
|
8
|
+
adapter: 'icqq',
|
|
9
|
+
scopes: ['group'],
|
|
10
|
+
currentConversationBotRoles: ['owner', 'admin'],
|
|
11
|
+
permissions: ['role(master,admin,trusted,owner)'],
|
|
12
|
+
requiresApproval: 'never',
|
|
13
|
+
inputSchema: z.object({
|
|
14
|
+
message_id: z.string().min(1).describe('当前群中要撤回的真实消息 ID,或消息头里的 m<n> 别名'),
|
|
15
|
+
reason: z.string().min(1).describe('撤回的具体原因,自动处理必须依据已确认的群规'),
|
|
16
|
+
}),
|
|
17
|
+
async execute({ message_id }, context) {
|
|
18
|
+
const group = currentGroup(context);
|
|
19
|
+
const message = await resolveMessage(context, message_id);
|
|
20
|
+
const client = context.$client;
|
|
21
|
+
// Own messages do not depend on membership administration rights.
|
|
22
|
+
if (message.sender.user_id === client.uin)
|
|
23
|
+
return recallMessage(context, message_id);
|
|
24
|
+
const [self, target] = await Promise.all([
|
|
25
|
+
client.getGroupMemberInfo(group, client.uin, true),
|
|
26
|
+
client.getGroupMemberInfo(group, message.sender.user_id, true),
|
|
27
|
+
]);
|
|
28
|
+
if (!(self.role === 'owner' && (target.role === 'admin' || target.role === 'member'))
|
|
29
|
+
&& !(self.role === 'admin' && target.role === 'member')) {
|
|
30
|
+
return { success: false, message: t(context.locale, 'recallForbidden') };
|
|
31
|
+
}
|
|
32
|
+
return recallMessage(context, message_id);
|
|
33
|
+
},
|
|
34
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { defineAgentTool } from '@zhin.js/tool';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { currentGroup, recallMessage, resolveMessage } from '../../../../conversation.js';
|
|
4
|
+
import { messages as t } from '../../../../messages.js';
|
|
5
|
+
|
|
6
|
+
export default defineAgentTool({
|
|
7
|
+
description: '撤回当前 QQ 群内他人的真实消息;需调用方具备群管发起权限及机器人具备实时平台权限,无需逐次审批',
|
|
8
|
+
adapter: 'icqq',
|
|
9
|
+
scopes: ['group'],
|
|
10
|
+
currentConversationBotRoles: ['owner', 'admin'],
|
|
11
|
+
permissions: ['role(master,admin,trusted,owner)'],
|
|
12
|
+
requiresApproval: 'never',
|
|
13
|
+
inputSchema: z.object({
|
|
14
|
+
message_id: z.string().min(1).describe('当前群中要撤回的真实消息 ID,或消息头里的 m<n> 别名'),
|
|
15
|
+
reason: z.string().min(1).describe('撤回的具体原因,自动处理必须依据已确认的群规'),
|
|
16
|
+
}),
|
|
17
|
+
async execute({ message_id }, context) {
|
|
18
|
+
const group = currentGroup(context);
|
|
19
|
+
const message = await resolveMessage(context, message_id);
|
|
20
|
+
const client = context.$client;
|
|
21
|
+
// Own messages do not depend on membership administration rights.
|
|
22
|
+
if (message.sender.user_id === client.uin) return recallMessage(context, message_id);
|
|
23
|
+
const [self, target] = await Promise.all([
|
|
24
|
+
client.getGroupMemberInfo(group, client.uin, true),
|
|
25
|
+
client.getGroupMemberInfo(group, message.sender.user_id, true),
|
|
26
|
+
]);
|
|
27
|
+
if (!(self.role === 'owner' && (target.role === 'admin' || target.role === 'member'))
|
|
28
|
+
&& !(self.role === 'admin' && target.role === 'member')) {
|
|
29
|
+
return { success: false, message: t(context.locale, 'recallForbidden') };
|
|
30
|
+
}
|
|
31
|
+
return recallMessage(context, message_id);
|
|
32
|
+
},
|
|
33
|
+
});
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
|
+
import { messages as t } from "../../../../messages.js";
|
|
3
|
+
import { freshMember, isGroupManager } from "../../../../members.js";
|
|
2
4
|
import { defineAgentTool } from '@zhin.js/tool';
|
|
3
5
|
import { z } from 'zod';
|
|
4
6
|
export default defineAgentTool({
|
|
@@ -14,10 +16,9 @@ export default defineAgentTool({
|
|
|
14
16
|
async execute({ group_id, enable }, context) {
|
|
15
17
|
const client = context.$client;
|
|
16
18
|
const on = enable ?? true;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
return { success: false, message: '机器人不是群主或管理员,无法开启或关闭匿名聊天' };
|
|
19
|
+
if (!isGroupManager(await freshMember(client, group_id, client.uin)))
|
|
20
|
+
return { success: false, message: t(context.locale, 'anonymousForbidden') };
|
|
20
21
|
await client.setGroupAnonymous(group_id, on);
|
|
21
|
-
return { success: true, message: on ? '
|
|
22
|
+
return { success: true, message: on ? t(context.locale, 'anonymousEnabled') : t(context.locale, 'anonymousDisabled') };
|
|
22
23
|
},
|
|
23
24
|
});
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { messages as t } from "../../../../messages.js";
|
|
2
|
+
import { freshMember, isGroupManager } from "../../../../members.js";
|
|
1
3
|
import { defineAgentTool } from '@zhin.js/tool';
|
|
2
4
|
import { z } from 'zod';
|
|
3
5
|
export default defineAgentTool<{ group_id: number; enable?: boolean }>({
|
|
@@ -13,9 +15,8 @@ export default defineAgentTool<{ group_id: number; enable?: boolean }>({
|
|
|
13
15
|
async execute({ group_id, enable }, context) {
|
|
14
16
|
const client = context.$client;
|
|
15
17
|
const on = enable ?? true;
|
|
16
|
-
|
|
17
|
-
if(!selfInfo.is_admin && !selfInfo.is_owner) return { success: false, message: '机器人不是群主或管理员,无法开启或关闭匿名聊天' };
|
|
18
|
+
if (!isGroupManager(await freshMember(client, group_id, client.uin))) return { success: false, message: t(context.locale, 'anonymousForbidden') };
|
|
18
19
|
await client.setGroupAnonymous(group_id, on);
|
|
19
|
-
return { success: true, message: on ? '
|
|
20
|
+
return { success: true, message: on ? t(context.locale, 'anonymousEnabled') : t(context.locale, 'anonymousDisabled') };
|
|
20
21
|
},
|
|
21
22
|
});
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
|
+
import { messages as t } from "../../../../messages.js";
|
|
3
|
+
import { freshMember, isGroupManager } from "../../../../members.js";
|
|
2
4
|
import { defineAgentTool } from '@zhin.js/tool';
|
|
3
5
|
import { z } from 'zod';
|
|
4
6
|
export default defineAgentTool({
|
|
@@ -13,13 +15,12 @@ export default defineAgentTool({
|
|
|
13
15
|
requiresApproval: 'always',
|
|
14
16
|
async execute({ group_id, user_id, duration }, context) {
|
|
15
17
|
const client = context.$client;
|
|
16
|
-
const
|
|
17
|
-
if (!
|
|
18
|
-
return { success: false, message: '
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
return { success: false, message: '目标成员不存在' };
|
|
18
|
+
const [self, member] = await Promise.all([freshMember(client, group_id, client.uin), freshMember(client, group_id, user_id)]);
|
|
19
|
+
if (!isGroupManager(self))
|
|
20
|
+
return { success: false, message: t(context.locale, 'muteForbidden') };
|
|
21
|
+
if (!member)
|
|
22
|
+
return { success: false, message: t(context.locale, 'memberMissing') };
|
|
22
23
|
await client.setGroupBan(group_id, user_id, duration === 0 ? 0 : duration);
|
|
23
|
-
return { success: true, message:
|
|
24
|
+
return { success: true, message: duration === 0 ? t(context.locale, 'unmuted', { user: user_id }) : t(context.locale, 'muted', { user: user_id, seconds: duration ?? 0 }) };
|
|
24
25
|
},
|
|
25
26
|
});
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { messages as t } from "../../../../messages.js";
|
|
2
|
+
import { freshMember, isGroupManager } from "../../../../members.js";
|
|
1
3
|
import { defineAgentTool } from '@zhin.js/tool';
|
|
2
4
|
import { z } from 'zod';
|
|
3
5
|
export default defineAgentTool<{ group_id: number; user_id: number; duration?: number }>({
|
|
@@ -12,11 +14,10 @@ export default defineAgentTool<{ group_id: number; user_id: number; duration?: n
|
|
|
12
14
|
requiresApproval: 'always',
|
|
13
15
|
async execute({ group_id, user_id, duration }, context) {
|
|
14
16
|
const client = context.$client;
|
|
15
|
-
const
|
|
16
|
-
if(!
|
|
17
|
-
|
|
18
|
-
if(!memberInfo) return { success: false, message: '目标成员不存在' };
|
|
17
|
+
const [self, member] = await Promise.all([freshMember(client, group_id, client.uin), freshMember(client, group_id, user_id)]);
|
|
18
|
+
if (!isGroupManager(self)) return { success: false, message: t(context.locale, 'muteForbidden') };
|
|
19
|
+
if (!member) return { success: false, message: t(context.locale, 'memberMissing') };
|
|
19
20
|
await client.setGroupBan(group_id, user_id, duration === 0 ? 0 : duration);
|
|
20
|
-
return { success: true, message:
|
|
21
|
+
return { success: true, message: duration === 0 ? t(context.locale, 'unmuted', { user: user_id }) : t(context.locale, 'muted', { user: user_id, seconds: duration ?? 0 }) };
|
|
21
22
|
},
|
|
22
23
|
});
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
// Generated by build-plugin-runtime-entries.mjs. Do not edit.
|
|
2
|
+
import { messages as t } from "../../../../messages.js";
|
|
3
|
+
import { freshMember, isGroupManager } from "../../../../members.js";
|
|
2
4
|
import { defineAgentTool } from '@zhin.js/tool';
|
|
3
5
|
import { z } from 'zod';
|
|
4
6
|
export default defineAgentTool({
|
|
@@ -14,13 +16,12 @@ export default defineAgentTool({
|
|
|
14
16
|
requiresApproval: 'always',
|
|
15
17
|
async execute({ group_id, user_id, title, duration }, context) {
|
|
16
18
|
const client = context.$client;
|
|
17
|
-
const
|
|
18
|
-
if (!
|
|
19
|
-
return { success: false, message: '
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
return { success: false, message: '目标成员不存在' };
|
|
19
|
+
const [self, member] = await Promise.all([freshMember(client, group_id, client.uin), freshMember(client, group_id, user_id)]);
|
|
20
|
+
if (!isGroupManager(self))
|
|
21
|
+
return { success: false, message: t(context.locale, 'titleForbidden') };
|
|
22
|
+
if (!member)
|
|
23
|
+
return { success: false, message: t(context.locale, 'memberMissing') };
|
|
23
24
|
await client.setGroupSpecialTitle(group_id, user_id, title, duration ?? -1);
|
|
24
|
-
return { success: true, message:
|
|
25
|
+
return { success: true, message: t(context.locale, 'titleChanged', { p0: user_id, p1: title }) };
|
|
25
26
|
},
|
|
26
27
|
});
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { messages as t } from "../../../../messages.js";
|
|
2
|
+
import { freshMember, isGroupManager } from "../../../../members.js";
|
|
1
3
|
import { defineAgentTool } from '@zhin.js/tool';
|
|
2
4
|
import { z } from 'zod';
|
|
3
5
|
export default defineAgentTool<{ group_id: number; user_id: number; title: string; duration?: number }>({
|
|
@@ -13,11 +15,10 @@ export default defineAgentTool<{ group_id: number; user_id: number; title: strin
|
|
|
13
15
|
requiresApproval: 'always',
|
|
14
16
|
async execute({ group_id, user_id, title, duration }, context) {
|
|
15
17
|
const client = context.$client;
|
|
16
|
-
const
|
|
17
|
-
if(!
|
|
18
|
-
|
|
19
|
-
if(!memberInfo) return { success: false, message: '目标成员不存在' };
|
|
18
|
+
const [self, member] = await Promise.all([freshMember(client, group_id, client.uin), freshMember(client, group_id, user_id)]);
|
|
19
|
+
if (!isGroupManager(self)) return { success: false, message: t(context.locale, 'titleForbidden') };
|
|
20
|
+
if (!member) return { success: false, message: t(context.locale, 'memberMissing') };
|
|
20
21
|
await client.setGroupSpecialTitle(group_id, user_id, title, duration ?? -1);
|
|
21
|
-
return { success: true, message:
|
|
22
|
+
return { success: true, message: t(context.locale, 'titleChanged', { p0: user_id, p1: title }) };
|
|
22
23
|
},
|
|
23
24
|
});
|