koishi-plugin-iirose-cut 0.0.9 → 0.1.0
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.d.ts +1 -1
- package/lib/index.js +46 -1
- package/package.json +1 -1
- package/src/index.ts +91 -2
package/lib/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Context, Schema } from 'koishi';
|
|
2
2
|
export declare const name = "iirose-cut";
|
|
3
3
|
export declare const inject: string[];
|
|
4
|
-
export declare const usage = "\n---\n\nBOT\u9700\u8981\u6709\u623F\u95F4\u6210\u5458\u7684\u661F\u6807\u6743\u9650 / \u7BA1\u7406\u6743\u9650\u3002\n\n\u5982\u679C\u4F60\u7684bot\u6CA1\u6709\u6743\u9650\uFF0C\u5219\u53EF\u4EE5\u53D1\u8D77cut\u6295\u7968\uFF0C\u8BF7\u4F7F\u7528 iirose-self-cut \u63D2\u4EF6\u3002\n\n---\n\n\u4F7F\u7528\u6307\u4EE4\
|
|
4
|
+
export declare const usage = "\n---\n\nBOT\u9700\u8981\u6709\u623F\u95F4\u6210\u5458\u7684\u661F\u6807\u6743\u9650 / \u7BA1\u7406\u6743\u9650\u3002\n\n\u5982\u679C\u4F60\u7684bot\u6CA1\u6709\u6743\u9650\uFF0C\u5219\u53EF\u4EE5\u53D1\u8D77cut\u6295\u7968\uFF0C\u8BF7\u4F7F\u7528 iirose-self-cut \u63D2\u4EF6\u3002\n\n---\n\n\u4E5F\u53EF\u4EE5\u4F7F\u7528\u6307\u4EE4\u5207\u6B4C\uFF1A\n\n- iirose.media.cut \uFF1A \u7EC8\u6B62\u5F53\u524D\u6B4C\u66F2\n- iirose.media.cutall \uFF1A \u7EC8\u6B62\u6240\u6709\u6B4C\u66F2\n\n---\n\n\u672C\u63D2\u4EF6\u9700\u8981\u8C03\u7528\u8005\u9700\u8981\u81F3\u5C112\u7EA7\u6743\u9650\u3002\n\n\u5982\u679C\u4F60\u7684\u6743\u9650\u4E0D\u591F\uFF0C\u8BF7\u4F7F\u7528 change-auth-callme \u63D2\u4EF6\u6765\u63D0\u6743\u3002\n\n\u52A1\u5FC5\u4E0D\u8981\u4F7F\u75281\u7EA7\u6743\u9650\uFF0C\u5426\u5219\u53EF\u80FD\u4F1A\u5BFC\u81F4\n\n---\n";
|
|
5
5
|
export interface Config {
|
|
6
6
|
commandAuthority: number;
|
|
7
7
|
}
|
package/lib/index.js
CHANGED
|
@@ -39,7 +39,7 @@ BOT需要有房间成员的星标权限 / 管理权限。
|
|
|
39
39
|
|
|
40
40
|
---
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
也可以使用指令切歌:
|
|
43
43
|
|
|
44
44
|
- iirose.media.cut : 终止当前歌曲
|
|
45
45
|
- iirose.media.cutall : 终止所有歌曲
|
|
@@ -72,6 +72,51 @@ function apply(ctx, config) {
|
|
|
72
72
|
await session.bot.internal.cutAll();
|
|
73
73
|
return;
|
|
74
74
|
});
|
|
75
|
+
const userSongs = /* @__PURE__ */ new Map();
|
|
76
|
+
const leftUsers = /* @__PURE__ */ new Set();
|
|
77
|
+
ctx.on("dispose", () => {
|
|
78
|
+
userSongs.clear();
|
|
79
|
+
leftUsers.clear();
|
|
80
|
+
});
|
|
81
|
+
ctx.platform("iirose").on("message", (session) => {
|
|
82
|
+
if (session.content.startsWith("<json")) {
|
|
83
|
+
try {
|
|
84
|
+
const jsonData = import_koishi.h.parse(session.content)[0].attrs.data;
|
|
85
|
+
if (jsonData?.type === "iirose:music" && jsonData.name && session.username) {
|
|
86
|
+
const username = session.username;
|
|
87
|
+
const songTitle = jsonData.name;
|
|
88
|
+
if (!userSongs.has(username)) {
|
|
89
|
+
userSongs.set(username, /* @__PURE__ */ new Set());
|
|
90
|
+
}
|
|
91
|
+
userSongs.get(username).add(songTitle);
|
|
92
|
+
}
|
|
93
|
+
} catch (e) {
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
ctx.platform("iirose").on("guild-member-added", (session) => {
|
|
98
|
+
if (session.username && leftUsers.has(session.username)) {
|
|
99
|
+
leftUsers.delete(session.username);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
ctx.platform("iirose").on("guild-member-removed", (session) => {
|
|
103
|
+
if (session.username) {
|
|
104
|
+
leftUsers.add(session.username);
|
|
105
|
+
ctx.logger.info(`用户 ${session.username} 已离开,其点播的歌曲将在播放时被切掉。`);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
ctx.platform("iirose").on("iirose/music-play", async (session, data) => {
|
|
109
|
+
if (data?.owner) {
|
|
110
|
+
if (leftUsers.has(data.owner)) {
|
|
111
|
+
try {
|
|
112
|
+
await session.bot.internal.cutOne();
|
|
113
|
+
ctx.logger.info(`检测到点播者 ${data.owner} 已离开,已切掉歌曲: ${data.title}`);
|
|
114
|
+
} catch (e) {
|
|
115
|
+
ctx.logger.warn(`自动切歌失败: ${e}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
});
|
|
75
120
|
}
|
|
76
121
|
__name(apply, "apply");
|
|
77
122
|
// Annotate the CommonJS export names for ESM import in node:
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Context, Schema } from 'koishi';
|
|
1
|
+
import { Context, h, Schema, Session } from 'koishi';
|
|
2
2
|
|
|
3
3
|
export const name = 'iirose-cut';
|
|
4
4
|
|
|
@@ -13,7 +13,7 @@ BOT需要有房间成员的星标权限 / 管理权限。
|
|
|
13
13
|
|
|
14
14
|
---
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
也可以使用指令切歌:
|
|
17
17
|
|
|
18
18
|
- iirose.media.cut : 终止当前歌曲
|
|
19
19
|
- iirose.media.cutall : 终止所有歌曲
|
|
@@ -62,4 +62,93 @@ export function apply(ctx: Context, config: Config)
|
|
|
62
62
|
await session.bot.internal.cutAll();
|
|
63
63
|
return;
|
|
64
64
|
});
|
|
65
|
+
|
|
66
|
+
// 用于存储用户和他们点播的歌曲,主要用于调试和记录
|
|
67
|
+
const userSongs = new Map<string, Set<string>>(); // username -> Set<songTitle>
|
|
68
|
+
// 用于存储已离开房间的用户
|
|
69
|
+
const leftUsers = new Set<string>(); // Set<username>
|
|
70
|
+
|
|
71
|
+
// 插件卸载时清空数据
|
|
72
|
+
ctx.on('dispose', () =>
|
|
73
|
+
{
|
|
74
|
+
userSongs.clear();
|
|
75
|
+
leftUsers.clear();
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
ctx.platform("iirose")
|
|
79
|
+
.on('message', (session: Session) =>
|
|
80
|
+
{
|
|
81
|
+
// 监听消息,解析点歌信息
|
|
82
|
+
if (session.content.startsWith("<json"))
|
|
83
|
+
{
|
|
84
|
+
try
|
|
85
|
+
{
|
|
86
|
+
const jsonData = h.parse(session.content)[0].attrs.data;
|
|
87
|
+
// 确认是音乐点播消息
|
|
88
|
+
if (jsonData?.type === 'iirose:music' && jsonData.name && session.username)
|
|
89
|
+
{
|
|
90
|
+
const username = session.username;
|
|
91
|
+
const songTitle = jsonData.name;
|
|
92
|
+
|
|
93
|
+
// 记录用户点播的歌曲
|
|
94
|
+
if (!userSongs.has(username))
|
|
95
|
+
{
|
|
96
|
+
userSongs.set(username, new Set<string>());
|
|
97
|
+
}
|
|
98
|
+
userSongs.get(username).add(songTitle);
|
|
99
|
+
// ctx.logger.info(`记录到用户 ${username} 点播了歌曲: ${songTitle}`);
|
|
100
|
+
}
|
|
101
|
+
} catch (e)
|
|
102
|
+
{
|
|
103
|
+
// JSON解析失败或格式不符,不是点歌消息,忽略
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
// 监听用户加入房间事件
|
|
109
|
+
ctx.platform("iirose")
|
|
110
|
+
.on('guild-member-added', (session: Session) =>
|
|
111
|
+
{
|
|
112
|
+
// 如果用户重新加入房间,则从“已离开”列表中移除
|
|
113
|
+
if (session.username && leftUsers.has(session.username))
|
|
114
|
+
{
|
|
115
|
+
leftUsers.delete(session.username);
|
|
116
|
+
// ctx.logger.info(`用户 ${session.username} 已重新加入房间。`);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
ctx.platform("iirose")
|
|
122
|
+
.on('guild-member-removed', (session: Session) =>
|
|
123
|
+
{
|
|
124
|
+
// 记录离开房间的用户
|
|
125
|
+
if (session.username)
|
|
126
|
+
{
|
|
127
|
+
leftUsers.add(session.username);
|
|
128
|
+
ctx.logger.info(`用户 ${session.username} 已离开,其点播的歌曲将在播放时被切掉。`);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
ctx.platform("iirose")
|
|
133
|
+
.on('iirose/music-play' as any, async (session: Session, data) =>
|
|
134
|
+
{
|
|
135
|
+
// 检查点播这首歌曲的用户是否已经离开
|
|
136
|
+
if (data?.owner)
|
|
137
|
+
{
|
|
138
|
+
// ctx.logger.info(`正在播放歌曲: ${data.title}, 点播者: ${data.owner}`);
|
|
139
|
+
// 如果点歌者在已离开用户列表中
|
|
140
|
+
if (leftUsers.has(data.owner))
|
|
141
|
+
{
|
|
142
|
+
try
|
|
143
|
+
{
|
|
144
|
+
// 则切掉当前歌曲
|
|
145
|
+
await session.bot.internal.cutOne();
|
|
146
|
+
ctx.logger.info(`检测到点播者 ${data.owner} 已离开,已切掉歌曲: ${data.title}`);
|
|
147
|
+
} catch (e)
|
|
148
|
+
{
|
|
149
|
+
ctx.logger.warn(`自动切歌失败: ${e}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
});
|
|
65
154
|
}
|