Skip to content

Commit

Permalink
fix: allow disabled plugin for any bot
Browse files Browse the repository at this point in the history
  • Loading branch information
lc-cn committed Oct 3, 2024
1 parent 489cfe1 commit 3deda8e
Show file tree
Hide file tree
Showing 22 changed files with 342 additions and 189 deletions.
3 changes: 2 additions & 1 deletion core/src/adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@ export class Adapter<I extends object = object, M = {}> extends EventEmitter {
schemas: Schema = Schema.object({
unique_id: Schema.string('请输入机器人唯一标识'),
master: Schema.string('请输入主人id'),
admins: Schema.list(Schema.string(''), '请输入管理员id'),
admins: Schema.list(Schema.string('管理员qq'), '请输入管理员id'),
command_prefix: Schema.string('请输入指令前缀'),
disabled_plugins: Schema.list(Schema.string('插件名'), '请输入禁用的插件').default([]),
quote_self: Schema.boolean('回复是否引用源消息'),
});
#loggers: Dict<Logger> = {};
Expand Down
38 changes: 24 additions & 14 deletions core/src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,11 +87,15 @@ export class App extends EventEmitter {
}

get pluginList() {
return [...this.plugins.values()]
.filter(p => !this.config.disable_plugins.includes(p.id))
.sort((a, b) => {
return a.priority - b.priority;
});
return (
[...this.plugins.values()]
// 过滤系统已禁用的插件
.filter(p => !this.config.disable_plugins.includes(p.id))
// 按插件优先级进行排序
.sort((a, b) => {
return a.priority - b.priority;
})
);
}

get commandList() {
Expand All @@ -113,15 +117,20 @@ export class App extends EventEmitter {
}

getSupportMiddlewares<A extends Adapter>(adapter: A, bot: AdapterBot<A>, event: Message<A>): Middleware[] {
return this.pluginList
.filter(plugin => !plugin.adapters || plugin.adapters.includes(adapter.name))
.reduce(
(result, plugin) => {
result.push(...plugin.middlewares);
return result;
},
[...this.middlewares],
);
return (
this.pluginList
// 过滤不支持当前适配器的插件
.filter(plugin => !plugin.adapters || plugin.adapters.includes(adapter.name))
// 过滤bot禁用的插件
.filter(plugin => !adapter.botConfig(bot)?.disabled_plugins.includes(plugin.name))
.reduce(
(result, plugin) => {
result.push(...plugin.middlewares);
return result;
},
[...this.middlewares],
)
);
}

getSupportCommands<A extends Adapter>(adapter: A, bot: Bot<A>, event: Message<A>) {
Expand Down Expand Up @@ -476,6 +485,7 @@ export namespace App {
master?: string | number;
admins?: (string | number)[];
command_prefix?: string;
disabled_plugins?: string[];
forward_length?: number;
quote_self?: boolean;
} & Adapters[T];
Expand Down
2 changes: 1 addition & 1 deletion packages/adapters/dingtalk/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ const messageHandler = (bot: Adapter.Bot<Bot>, event: DingMsgEvent) => {
message.from_id = event instanceof PrivateMessageEvent ? event.user_id : event.group_id;
message.message_type = event.message_type;
const master = dingTalkAdapter.botConfig(bot)?.master;
const admins = dingTalkAdapter.botConfig(bot)?.admins;
const admins = dingTalkAdapter.botConfig(bot)?.admins.filter(Boolean) || [];
message.sender = {
...event.sender,
permissions: [
Expand Down
2 changes: 1 addition & 1 deletion packages/adapters/discord/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ const messageHandler = (bot: Adapter.Bot<Bot>, event: DingTalkMessageEvent) => {
message.raw_message = sendableToString(event.message).trim();
message.from_id = event instanceof DirectMessageEvent ? event.user_id : event.channel_id;
const master = discordAdapter.botConfig(bot)?.master;
const admins = discordAdapter.botConfig(bot)?.admins;
const admins = discordAdapter.botConfig(bot)?.admins.filter(Boolean) || [];
message.sender = {
...event.sender,
permissions: [
Expand Down
8 changes: 4 additions & 4 deletions packages/adapters/icqq/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,10 +87,10 @@ icqq.schema({
platform: Schema.number('请选择登录平台')
.option([
{ label: '安卓手机(Android)', value: 1 },
{ label: '苹果平板(aPad)', value: 2 },
{ label: '安卓平板(aPad)', value: 2 },
{ label: '安卓手表(Watch)', value: 3 },
{ label: 'MacOS(iMac)', value: 4 },
{ label: 'iPad', value: 5 },
{ label: 'MacOS(Mac电脑)', value: 4 },
{ label: 'iPad(苹果平板)', value: 5 },
])
.required()
.default(3),
Expand Down Expand Up @@ -185,7 +185,7 @@ const messageHandler = (bot: Adapter.Bot<Client>, event: QQMessageEvent) => {
? event.group_id + ''
: event.discuss_id + '';
const master = icqq.botConfig(bot)?.master;
const admins = icqq.botConfig(bot)?.admins;
const admins = icqq.botConfig(bot)?.admins.filter(Boolean) || [];
message.sender = {
...event.sender,
permissions: [
Expand Down
104 changes: 78 additions & 26 deletions packages/adapters/kritor/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ export class Client extends EventEmitter {
return {
scene: Client.sceneMap[target_type],
peer,
sub_peer: sub_peer || undefined,
sub_peer: sub_peer||undefined,
};
}
#emitEvent(eventStream: NodeJS.ReadableStream) {
Expand Down Expand Up @@ -872,55 +872,107 @@ export namespace Client {
export function toKritorElement(type: ElementType, data: Dict) {
switch (type) {
case 'text':
return { text: data };
return {
type:kritor.common.Element.ElementType.TEXT,
text: data,
data:'text'
};
case 'rps':
return { rps: data };
return {
rps: data
};
case 'dice':
return { dice: data };
return {
dice: data
};
case 'image':
return { image: data };
return {
image: data
};
case 'at':
return { at: data };
return {
at: data
};
case 'basketball':
return { basketball: data };
return {
basketball: data
};
case 'bubble':
return { bubble: data };
return {
bubble: data
};
case 'contact':
return { contact: data };
return {
contact: data
};
case 'face':
return { face: data };
return {
face: data
};
case 'file':
return { file: data };
return {
file: data
};
case 'forward':
return { forward: data };
return {
forward: data
};
case 'gift':
return { gift: data };
return {
gift: data
};
case 'json':
return { json: data };
return {
json: data
};
case 'location':
return { location: data };
return {
location: data
};
case 'keyboard':
return { keyboard: data };
return {
keyboard: data
};
case 'markdown':
return { markdown: data };
return {
markdown: data
};
case 'poke':
return { poke: data };
return {
poke: data
};
case 'reply':
return { reply: data };
return {
reply: data
};
case 'music':
return { music: data };
return {
music: data
};
case 'share':
return { share: data };
return {
share: data
};
case 'weather':
return { weather: data };
return {
weather: data
};
case 'voice':
return { voice: data };
return {
voice: data
};
case 'video':
return { video: data };
return {
video: data
};
case 'xml':
return { xml: data };
return {
xml: data
};
case 'market_face':
return { market_face: data };
return {
market_face: data
};
default:
throw new Error(`Unsupported element type: ${type}`);
}
Expand Down
2 changes: 1 addition & 1 deletion packages/adapters/kritor/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ const messageHandler = (bot: Adapter.Bot<Client>, event: kritor.common.IPushMess
.filter(Boolean)
.join(':');
const master = adapter.botConfig(bot)?.master;
const admins = adapter.botConfig(bot)?.admins;
const admins = adapter.botConfig(bot)?.admins.filter(Boolean) || [];
message.sender = {
user_id: event.sender?.uid!,
user_name: event.sender?.nick || '',
Expand Down
7 changes: 5 additions & 2 deletions packages/adapters/onebot-11/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ oneBotV11.schema({
oneBotV11.define('sendMsg', async (bot_id, target_id, target_type, message, source) => {
const bot = oneBotV11.pick(bot_id);
let msg: MessageV11.Sendable = await oneBotV11.app!.renderMessage(message as string, source);
msg = MessageV11.formatSegments(msg, Number(source?.original?.message_id) || undefined);
msg = MessageV11.formatSegments(
msg,
oneBotV11.botConfig(bot)?.quote_self ? Number(source?.original?.message_id) : undefined,
);
switch (target_type) {
case 'group':
return bot.sendGroupMsg(parseInt(target_id), msg);
Expand Down Expand Up @@ -71,7 +74,7 @@ const messageHandler = (bot: Adapter.Bot<OneBotV11>, event: MessageV11) => {
message.message_type = event.message_type;
message.from_id = event.message_type === 'private' ? event.user_id + '' : event.group_id + '';
const master = oneBotV11.botConfig(bot)?.master;
const admins = oneBotV11.botConfig(bot)?.admins;
const admins = oneBotV11.botConfig(bot)?.admins.filter(Boolean) || [];
message.sender = {
user_id: event.sender?.user_id,
user_name: event.sender?.nickname || '',
Expand Down
4 changes: 2 additions & 2 deletions packages/adapters/onebot-12/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ oneBotV12.schema({
oneBotV12.define('sendMsg', async (bot_id, target_id, target_type, message, source) => {
const bot = oneBotV12.pick(bot_id);
let msg: MessageV12.Sendable = await oneBotV12.app!.renderMessage(message as string, source);
msg = MessageV12.formatSegments(msg);
msg = MessageV12.formatSegments(msg, oneBotV12.botConfig(bot)?.quote_self ? source?.original?.message_id : undefined);
switch (target_type) {
case 'guild':
const [guild_id, channel_id] = target_id.split('/');
Expand Down Expand Up @@ -83,7 +83,7 @@ const messageHandler = (bot: Adapter.Bot<OneBotV12>, event: MessageV12) => {
: event.guild_id + '';

const master = bot.config?.master;
const admins = bot.config.admins || [];
const admins = bot.config.admins.filter(Boolean) || [];
message.sender = {
user_id: event.sender.user_id,
user_name: event.sender.nickname || '',
Expand Down
10 changes: 9 additions & 1 deletion packages/adapters/onebot-12/src/message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,16 @@ export namespace MessageV12 {
return result;
}

export function formatSegments(message: Sendable): Segment[] {
export function formatSegments(message: Sendable, reply_id?: string): Segment[] {
const result: Segment[] = [];
if (reply_id) {
result.push({
type: 'reply',
data: {
id: reply_id,
},
});
}
if (!Array.isArray(message)) message = [message];
for (const item of message) {
if (typeof item === 'string') result.push(...parseFromTemplate(item));
Expand Down
2 changes: 1 addition & 1 deletion packages/adapters/qq/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ const messageHandler = (bot: Adapter.Bot<Bot>, event: QQMessageEvent) => {
message.raw_message = sendableToString(event.message).trim();
message.message_type = event.message_type;
const master = qq.botConfig(bot)?.master;
const admins = qq.botConfig(bot)?.admins;
const admins = qq.botConfig(bot)?.admins.filter(Boolean) || [];
message.sender = {
...event.sender,
permissions: [
Expand Down
11 changes: 6 additions & 5 deletions test/plugins/foo.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
import { registerCommand, useContext, definePluginOptions, registerMiddleware } from 'zhin';
definePluginOptions({
import { context, setOptions } from 'zhin';
setOptions({
name: 'setup 测试插件',
});
registerCommand('foo')
const { useMiddleware, useCommand } = context;
useCommand('foo')
.hidden()
.action(({ bot }) => {
return 'bar';
});

registerCommand('bar')
useCommand('bar')
.hidden()
.action(() => {
return '我不知道该说啥呀';
});

registerMiddleware((_adapter, _bot, message, next) => {
useMiddleware((_adapter, _bot, message, next) => {
// console.log(_adapter, _bot, message);
next();
});
2 changes: 1 addition & 1 deletion test/plugins/forwardForum.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Plugin } from 'zhin';
import { OneBotV12Adapter } from '@zhinjs/onebot-12';
import { OneBotV12Adapter } from '@zhinjs/adapter-onebot-12';
const forwardForum = new Plugin({
name: '频道帖子转发插件',
adapters: ['onebot-12'],
Expand Down
Loading

0 comments on commit 3deda8e

Please sign in to comment.