koishi-plugin-onebot-group-manage 0.0.7 → 0.0.8
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/lib/index.js +50 -41
- package/lib/tools.d.ts +3 -3
- package/package.json +1 -1
package/lib/index.js
CHANGED
|
@@ -31,11 +31,10 @@ var import_koishi = require("koishi");
|
|
|
31
31
|
var import_tools = require("@langchain/core/tools");
|
|
32
32
|
var import_zod = require("zod");
|
|
33
33
|
var GroupMuteTool = class extends import_tools.StructuredTool {
|
|
34
|
-
constructor(ctx, handlers,
|
|
34
|
+
constructor(ctx, handlers, logger, logVerbose) {
|
|
35
35
|
super();
|
|
36
36
|
this.ctx = ctx;
|
|
37
37
|
this.handlers = handlers;
|
|
38
|
-
this.config = config;
|
|
39
38
|
this.logger = logger;
|
|
40
39
|
this.logVerbose = logVerbose;
|
|
41
40
|
}
|
|
@@ -57,7 +56,6 @@ var GroupMuteTool = class extends import_tools.StructuredTool {
|
|
|
57
56
|
this.ctx,
|
|
58
57
|
session,
|
|
59
58
|
{ targetId: input.userId, duration: input.duration, guildId: input.groupId },
|
|
60
|
-
this.config,
|
|
61
59
|
this.logger,
|
|
62
60
|
this.logVerbose
|
|
63
61
|
);
|
|
@@ -69,11 +67,10 @@ var GroupMuteTool = class extends import_tools.StructuredTool {
|
|
|
69
67
|
}
|
|
70
68
|
};
|
|
71
69
|
var GroupTitleTool = class extends import_tools.StructuredTool {
|
|
72
|
-
constructor(ctx, handlers,
|
|
70
|
+
constructor(ctx, handlers, logger, logVerbose) {
|
|
73
71
|
super();
|
|
74
72
|
this.ctx = ctx;
|
|
75
73
|
this.handlers = handlers;
|
|
76
|
-
this.config = config;
|
|
77
74
|
this.logger = logger;
|
|
78
75
|
this.logVerbose = logVerbose;
|
|
79
76
|
}
|
|
@@ -95,7 +92,6 @@ var GroupTitleTool = class extends import_tools.StructuredTool {
|
|
|
95
92
|
this.ctx,
|
|
96
93
|
session,
|
|
97
94
|
{ targetId: input.userId, title: input.title, guildId: input.groupId },
|
|
98
|
-
this.config,
|
|
99
95
|
this.logger,
|
|
100
96
|
this.logVerbose
|
|
101
97
|
);
|
|
@@ -106,7 +102,7 @@ var GroupTitleTool = class extends import_tools.StructuredTool {
|
|
|
106
102
|
}
|
|
107
103
|
}
|
|
108
104
|
};
|
|
109
|
-
function registerChatlunaTools(ctx,
|
|
105
|
+
function registerChatlunaTools(ctx, _config, logger, verbose, handlers) {
|
|
110
106
|
const platform = ctx.chatluna?.platform;
|
|
111
107
|
if (!platform) {
|
|
112
108
|
logger.debug("chatluna 未安装,跳过群管工具注册");
|
|
@@ -114,13 +110,13 @@ function registerChatlunaTools(ctx, config, logger, verbose, handlers) {
|
|
|
114
110
|
}
|
|
115
111
|
ctx.effect(
|
|
116
112
|
() => platform.registerTool("group_mute", {
|
|
117
|
-
createTool: /* @__PURE__ */ __name(() => new GroupMuteTool(ctx, handlers,
|
|
113
|
+
createTool: /* @__PURE__ */ __name(() => new GroupMuteTool(ctx, handlers, logger, verbose), "createTool"),
|
|
118
114
|
selector: /* @__PURE__ */ __name(() => true, "selector")
|
|
119
115
|
})
|
|
120
116
|
);
|
|
121
117
|
ctx.effect(
|
|
122
118
|
() => platform.registerTool("group_set_title", {
|
|
123
|
-
createTool: /* @__PURE__ */ __name(() => new GroupTitleTool(ctx, handlers,
|
|
119
|
+
createTool: /* @__PURE__ */ __name(() => new GroupTitleTool(ctx, handlers, logger, verbose), "createTool"),
|
|
124
120
|
selector: /* @__PURE__ */ __name(() => true, "selector")
|
|
125
121
|
})
|
|
126
122
|
);
|
|
@@ -351,26 +347,26 @@ function randomInt(min, max) {
|
|
|
351
347
|
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
352
348
|
}
|
|
353
349
|
__name(randomInt, "randomInt");
|
|
354
|
-
async function performMute(ctx, session, params,
|
|
350
|
+
async function performMute(ctx, session, params, logger, verbose) {
|
|
355
351
|
const guildId = params.guildId ?? session.guildId;
|
|
356
352
|
if (!guildId) return "仅限群聊使用";
|
|
357
353
|
const targetId = params.targetId ?? parseTargetId(params.targetRaw || "", session);
|
|
358
354
|
if (!targetId) return "请提供要禁言的用户(@ 或 QQ 号)";
|
|
359
355
|
const seconds = Number(params.duration);
|
|
360
356
|
if (!Number.isFinite(seconds) || seconds < 0) return "禁言时长必须为大于等于 0 的整数(秒)";
|
|
361
|
-
if (!params.skipPermCheck) {
|
|
362
|
-
const msg = await verifyCaller(session, config.mute, logger, verbose, guildId);
|
|
363
|
-
if (msg) return msg;
|
|
364
|
-
}
|
|
365
357
|
verbose && logger.info(
|
|
366
358
|
`mute: guild=${guildId} caller=${session.userId} bot=${botKey(session.bot)} target=${targetId} seconds=${seconds}`
|
|
367
359
|
);
|
|
368
|
-
const
|
|
369
|
-
|
|
370
|
-
const targetRole = await getMemberRole(picked.probeOnebot, picked.bot, guildId, targetId, logger, verbose);
|
|
360
|
+
const probeOnebot = session.onebot || getBotOnebot(session.bot);
|
|
361
|
+
const targetRole = await getMemberRole(probeOnebot, session.bot, guildId, targetId, logger, verbose);
|
|
371
362
|
if (targetRole === "owner") return "无法对群主执行该操作";
|
|
363
|
+
const requireOwner = targetRole === "admin";
|
|
364
|
+
const picked = await pickManageBot(ctx, guildId, requireOwner, logger, session.bot, verbose, probeOnebot);
|
|
365
|
+
if (!picked) {
|
|
366
|
+
return requireOwner ? "目标是管理员,需要群主权限的 Bot,但没有可用" : "没有可用且有群管权限的 Bot";
|
|
367
|
+
}
|
|
372
368
|
const actionOnebot = getBotOnebot(picked.bot);
|
|
373
|
-
if (!actionOnebot) return "
|
|
369
|
+
if (!actionOnebot) return "失败:选中的 Bot 缺少 onebot 实例,无法执行";
|
|
374
370
|
try {
|
|
375
371
|
verbose && logger.info(`mute: use bot=${botKey(picked.bot)} role=${picked.role} duration=${seconds}`);
|
|
376
372
|
if (typeof actionOnebot.setGroupBan === "function") {
|
|
@@ -383,29 +379,33 @@ async function performMute(ctx, session, params, config, logger, verbose) {
|
|
|
383
379
|
});
|
|
384
380
|
}
|
|
385
381
|
roleCache.clear();
|
|
386
|
-
|
|
382
|
+
const targetRoleStr = targetRole ? `(${targetRole})` : "";
|
|
383
|
+
if (seconds === 0) {
|
|
384
|
+
return `成功:使用 ${picked.bot.selfId}(${picked.role})解除 ${targetId}${targetRoleStr} 的禁言`;
|
|
385
|
+
}
|
|
386
|
+
return `成功:使用 ${picked.bot.selfId}(${picked.role})禁言 ${targetId}${targetRoleStr} ${seconds} 秒`;
|
|
387
387
|
} catch (error) {
|
|
388
388
|
logger.warn(error);
|
|
389
|
-
return
|
|
389
|
+
return `失败:禁言操作出错,Bot=${picked.bot.selfId}(${picked.role}),目标=${targetId}(${targetRole || "unknown"})`;
|
|
390
390
|
}
|
|
391
391
|
}
|
|
392
392
|
__name(performMute, "performMute");
|
|
393
|
-
async function performTitle(ctx, session, params,
|
|
393
|
+
async function performTitle(ctx, session, params, logger, verbose) {
|
|
394
394
|
const guildId = params.guildId ?? session.guildId;
|
|
395
395
|
if (!guildId) return "仅限群聊使用";
|
|
396
396
|
const title = params.title?.trim();
|
|
397
397
|
if (!title) return "请提供要设置的头衔";
|
|
398
398
|
const userId = params.targetId ?? parseTargetId(params.targetRaw || "", session);
|
|
399
399
|
if (!userId) return "请提供要设置头衔的用户(@ 或 QQ 号)";
|
|
400
|
-
const msg = await verifyCaller(session, config.title, logger, verbose, guildId);
|
|
401
|
-
if (msg) return msg;
|
|
402
400
|
verbose && logger.info(
|
|
403
401
|
`title: guild=${guildId} caller=${session.userId} bot=${botKey(session.bot)} target=${userId} title=${title}`
|
|
404
402
|
);
|
|
405
|
-
const
|
|
406
|
-
|
|
403
|
+
const probeOnebot = session.onebot || getBotOnebot(session.bot);
|
|
404
|
+
const targetRole = await getMemberRole(probeOnebot, session.bot, guildId, userId, logger, verbose);
|
|
405
|
+
const picked = await pickManageBot(ctx, guildId, true, logger, session.bot, verbose, probeOnebot);
|
|
406
|
+
if (!picked) return "失败:没有具备群主权限的 Bot 可用";
|
|
407
407
|
const actionOnebot = getBotOnebot(picked.bot);
|
|
408
|
-
if (!actionOnebot) return "
|
|
408
|
+
if (!actionOnebot) return "失败:选中的 Bot 缺少 onebot 实例,无法执行";
|
|
409
409
|
try {
|
|
410
410
|
verbose && logger.info(`title: use bot=${botKey(picked.bot)} role=${picked.role}`);
|
|
411
411
|
if (typeof actionOnebot.setGroupSpecialTitle === "function") {
|
|
@@ -419,10 +419,11 @@ async function performTitle(ctx, session, params, config, logger, verbose) {
|
|
|
419
419
|
});
|
|
420
420
|
}
|
|
421
421
|
roleCache.clear();
|
|
422
|
-
|
|
422
|
+
const targetRoleStr = targetRole ? `(${targetRole})` : "";
|
|
423
|
+
return `成功:使用 ${picked.bot.selfId}(${picked.role})为 ${userId}${targetRoleStr} 设置头衔「${title}」`;
|
|
423
424
|
} catch (error) {
|
|
424
425
|
logger.warn(error);
|
|
425
|
-
return
|
|
426
|
+
return `失败:设置头衔出错,Bot=${picked.bot.selfId}(${picked.role}),目标=${userId}(${targetRole || "unknown"})`;
|
|
426
427
|
}
|
|
427
428
|
}
|
|
428
429
|
__name(performTitle, "performTitle");
|
|
@@ -476,11 +477,12 @@ function apply(ctx, config) {
|
|
|
476
477
|
});
|
|
477
478
|
ctx.command("group.manage/mute <target:string> <duration:number>", "禁言目标(秒,必须指定)").alias("gmute").action(async ({ session }, target, duration) => {
|
|
478
479
|
if (!session) return "缺少 session";
|
|
480
|
+
const msg = await verifyCaller(session, config.mute, logger, verbose);
|
|
481
|
+
if (msg) return msg;
|
|
479
482
|
return performMute(
|
|
480
483
|
ctx,
|
|
481
484
|
session,
|
|
482
485
|
{ targetRaw: target, duration: Number(duration) },
|
|
483
|
-
config,
|
|
484
486
|
logger,
|
|
485
487
|
verbose
|
|
486
488
|
);
|
|
@@ -492,10 +494,14 @@ function apply(ctx, config) {
|
|
|
492
494
|
const userId = parseTargetId(target, session);
|
|
493
495
|
if (!userId) return "请提供要解禁的用户(@ 或 QQ 号)";
|
|
494
496
|
verbose && logger.info(`unmute: guild=${session.guildId} caller=${session.userId} bot=${botKey(session.bot)} target=${userId}`);
|
|
495
|
-
const
|
|
496
|
-
|
|
497
|
-
const targetRole = await getMemberRole(picked.probeOnebot, picked.bot, session.guildId, userId, logger, verbose);
|
|
497
|
+
const probeOnebot = session.onebot || getBotOnebot(session.bot);
|
|
498
|
+
const targetRole = await getMemberRole(probeOnebot, session.bot, session.guildId, userId, logger, verbose);
|
|
498
499
|
if (targetRole === "owner") return "无法对群主执行该操作";
|
|
500
|
+
const requireOwner = targetRole === "admin";
|
|
501
|
+
const picked = await pickManageBot(ctx, session.guildId, requireOwner, logger, session.bot, verbose, probeOnebot);
|
|
502
|
+
if (!picked) {
|
|
503
|
+
return requireOwner ? "目标是管理员,需要群主权限的 Bot,但没有可用" : "没有可用且有群管权限的 Bot";
|
|
504
|
+
}
|
|
499
505
|
const actionOnebot = getBotOnebot(picked.bot);
|
|
500
506
|
if (!actionOnebot) return "选中的 Bot 缺少 onebot 实例,无法执行";
|
|
501
507
|
try {
|
|
@@ -524,10 +530,14 @@ function apply(ctx, config) {
|
|
|
524
530
|
if (!userId) return "请提供要踢出的用户(@ 或 QQ 号)";
|
|
525
531
|
const reject = Boolean(options?.reject ?? rejectFlag);
|
|
526
532
|
verbose && logger.info(`kick: guild=${session.guildId} caller=${session.userId} bot=${botKey(session.bot)} target=${userId} reject=${reject}`);
|
|
527
|
-
const
|
|
528
|
-
|
|
529
|
-
const targetRole = await getMemberRole(picked.probeOnebot, picked.bot, session.guildId, userId, logger, verbose);
|
|
533
|
+
const probeOnebot = session.onebot || getBotOnebot(session.bot);
|
|
534
|
+
const targetRole = await getMemberRole(probeOnebot, session.bot, session.guildId, userId, logger, verbose);
|
|
530
535
|
if (targetRole === "owner") return "无法对群主执行该操作";
|
|
536
|
+
const requireOwner = targetRole === "admin";
|
|
537
|
+
const picked = await pickManageBot(ctx, session.guildId, requireOwner, logger, session.bot, verbose, probeOnebot);
|
|
538
|
+
if (!picked) {
|
|
539
|
+
return requireOwner ? "目标是管理员,需要群主权限的 Bot,但没有可用" : "没有可用且有群管权限的 Bot";
|
|
540
|
+
}
|
|
531
541
|
const actionOnebot = getBotOnebot(picked.bot);
|
|
532
542
|
if (!actionOnebot) return "选中的 Bot 缺少 onebot 实例,无法执行";
|
|
533
543
|
try {
|
|
@@ -550,11 +560,12 @@ function apply(ctx, config) {
|
|
|
550
560
|
});
|
|
551
561
|
ctx.command("group.manage/title <target:string> <title:text>", "设置群头衔(需群主 Bot)").alias("gtitle").action(async ({ session }, target, title) => {
|
|
552
562
|
if (!session) return "缺少 session";
|
|
563
|
+
const msg = await verifyCaller(session, config.title, logger, verbose);
|
|
564
|
+
if (msg) return msg;
|
|
553
565
|
return performTitle(
|
|
554
566
|
ctx,
|
|
555
567
|
session,
|
|
556
568
|
{ targetRaw: target, title: title || "", guildId: session.guildId },
|
|
557
|
-
config,
|
|
558
569
|
logger,
|
|
559
570
|
verbose
|
|
560
571
|
);
|
|
@@ -569,12 +580,11 @@ function apply(ctx, config) {
|
|
|
569
580
|
const result = await performMute(
|
|
570
581
|
ctx,
|
|
571
582
|
session,
|
|
572
|
-
{ targetId: session.userId, duration: seconds, guildId: session.guildId
|
|
573
|
-
config,
|
|
583
|
+
{ targetId: session.userId, duration: seconds, guildId: session.guildId },
|
|
574
584
|
logger,
|
|
575
585
|
verbose
|
|
576
586
|
);
|
|
577
|
-
if (typeof result === "string" && result.startsWith("
|
|
587
|
+
if (typeof result === "string" && result.startsWith("成功")) return `你已被禁言 ${seconds} 秒`;
|
|
578
588
|
return result;
|
|
579
589
|
});
|
|
580
590
|
ctx.command("group.manage/title.apply <title:text>", "申请群头衔(给自己)").alias("gtitle.apply").action(async ({ session }, title) => {
|
|
@@ -583,11 +593,10 @@ function apply(ctx, config) {
|
|
|
583
593
|
ctx,
|
|
584
594
|
session,
|
|
585
595
|
{ targetId: session.userId, title: title || "", guildId: session.guildId },
|
|
586
|
-
config,
|
|
587
596
|
logger,
|
|
588
597
|
verbose
|
|
589
598
|
);
|
|
590
|
-
if (typeof result === "string" && result.startsWith("
|
|
599
|
+
if (typeof result === "string" && result.startsWith("成功")) {
|
|
591
600
|
return `已为你设置头衔:${(title || "").trim()}`;
|
|
592
601
|
}
|
|
593
602
|
return result;
|
package/lib/tools.d.ts
CHANGED
|
@@ -5,12 +5,12 @@ interface Handlers {
|
|
|
5
5
|
targetId: string;
|
|
6
6
|
duration: number;
|
|
7
7
|
guildId?: string;
|
|
8
|
-
},
|
|
8
|
+
}, logger: ReturnType<Context['logger']>, verbose?: boolean) => Promise<string>;
|
|
9
9
|
performTitle: (ctx: Context, session: Session, params: {
|
|
10
10
|
targetId: string;
|
|
11
11
|
title: string;
|
|
12
12
|
guildId?: string;
|
|
13
|
-
},
|
|
13
|
+
}, logger: ReturnType<Context['logger']>, verbose?: boolean) => Promise<string>;
|
|
14
14
|
}
|
|
15
|
-
export declare function registerChatlunaTools(ctx: Context,
|
|
15
|
+
export declare function registerChatlunaTools(ctx: Context, _config: Config, logger: ReturnType<Context['logger']>, verbose: boolean | undefined, handlers: Handlers): void;
|
|
16
16
|
export {};
|