alemonjs 1.0.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/LICENSE +340 -0
- package/README.md +54 -0
- package/lib/alemon/app.js +38 -0
- package/lib/alemon/apps.js +121 -0
- package/lib/alemon/buffer.js +38 -0
- package/lib/alemon/dealmsg.js +423 -0
- package/lib/alemon/dialogue.js +61 -0
- package/lib/alemon/index.js +40 -0
- package/lib/alemon/message.js +27 -0
- package/lib/alemon/plugin.js +44 -0
- package/lib/alemon/puppeteer.js +226 -0
- package/lib/alemon/qrcode.js +66 -0
- package/lib/alemon/screenshot.js +126 -0
- package/lib/alemon/typings.js +96 -0
- package/lib/config.js +25 -0
- package/lib/discord/alemon/api.js +44 -0
- package/lib/discord/alemon/bot.js +11 -0
- package/lib/discord/alemon/conversation.js +7 -0
- package/lib/discord/alemon/message/PUBLIC_GUILD_MESSAGES.js +185 -0
- package/lib/discord/alemon/segment.js +62 -0
- package/lib/discord/index.js +50 -0
- package/lib/discord/login.js +99 -0
- package/lib/index.js +12 -0
- package/lib/kook/alemon/bot.js +11 -0
- package/lib/kook/alemon/conversation.js +56 -0
- package/lib/kook/alemon/message/PUBLIC_GUILD_MESSAGES.js +195 -0
- package/lib/kook/alemon/segment.js +90 -0
- package/lib/kook/index.js +39 -0
- package/lib/kook/login.js +53 -0
- package/lib/login.js +112 -0
- package/lib/main.js +106 -0
- package/lib/ntqq/alemon/bot.js +11 -0
- package/lib/ntqq/alemon/conversation.js +18 -0
- package/lib/ntqq/alemon/message/C2C_MESSAGE_CREATE.js +142 -0
- package/lib/ntqq/alemon/message/GROUP_AT_MESSAGE_CREATE.js +218 -0
- package/lib/ntqq/alemon/segment.js +29 -0
- package/lib/ntqq/alemon/types.js +1 -0
- package/lib/ntqq/index.js +77 -0
- package/lib/ntqq/login.js +74 -0
- package/lib/ntqq/sdk/api.js +158 -0
- package/lib/ntqq/sdk/config.js +46 -0
- package/lib/ntqq/sdk/index.js +5 -0
- package/lib/ntqq/sdk/intents.js +69 -0
- package/lib/ntqq/sdk/types.js +1 -0
- package/lib/ntqq/sdk/typings.js +9 -0
- package/lib/ntqq/sdk/web/client.js +89 -0
- package/lib/ntqq/sdk/web/img.js +76 -0
- package/lib/ntqq/sdk/web/index.js +4 -0
- package/lib/ntqq/sdk/web/ip.js +24 -0
- package/lib/ntqq/sdk/wss.js +178 -0
- package/lib/qq/alemon/apidoc.js +216 -0
- package/lib/qq/alemon/bot.js +11 -0
- package/lib/qq/alemon/console.js +13 -0
- package/lib/qq/alemon/conversation.js +139 -0
- package/lib/qq/alemon/doc.js +93 -0
- package/lib/qq/alemon/e.js +41 -0
- package/lib/qq/alemon/message/AUDIO_ACTION.js +57 -0
- package/lib/qq/alemon/message/DIRECT_MESSAGE.js +202 -0
- package/lib/qq/alemon/message/FORUMS_EVENT.js +66 -0
- package/lib/qq/alemon/message/GUILDS.js +65 -0
- package/lib/qq/alemon/message/GUILD_MEMBERS.js +153 -0
- package/lib/qq/alemon/message/GUILD_MESSAGES.js +50 -0
- package/lib/qq/alemon/message/GUILD_MESSAGE_REACTIONS.js +37 -0
- package/lib/qq/alemon/message/INTERACTION.js +36 -0
- package/lib/qq/alemon/message/MESSAGE.js +303 -0
- package/lib/qq/alemon/message/MESSAGE_AUDIT.js +41 -0
- package/lib/qq/alemon/message/OPEN_FORUMS_EVENT.js +74 -0
- package/lib/qq/alemon/message/PUBLIC_GUILD_MESSAGES.js +52 -0
- package/lib/qq/alemon/permissions.js +43 -0
- package/lib/qq/alemon/privatechat.js +78 -0
- package/lib/qq/alemon/segment.js +25 -0
- package/lib/qq/alemon/types.js +25 -0
- package/lib/qq/index.js +44 -0
- package/lib/qq/login.js +151 -0
- package/lib/types.js +5 -0
- package/lib/villa/alemon/conversation.js +48 -0
- package/lib/villa/alemon/message/GUILDS.js +124 -0
- package/lib/villa/alemon/message/GUILD_MEMBERS.js +128 -0
- package/lib/villa/alemon/message/GUILD_MESSAGE_REACTIONS.js +127 -0
- package/lib/villa/alemon/message/MESSAGES.js +334 -0
- package/lib/villa/alemon/message/MESSAGE_AUDIT.js +128 -0
- package/lib/villa/alemon/message/e.js +41 -0
- package/lib/villa/alemon/segment.js +34 -0
- package/lib/villa/index.js +46 -0
- package/lib/villa/login.js +62 -0
- package/package.json +63 -0
- package/types/alemon/app.d.ts +22 -0
- package/types/alemon/apps.d.ts +41 -0
- package/types/alemon/buffer.d.ts +13 -0
- package/types/alemon/dealmsg.d.ts +41 -0
- package/types/alemon/dialogue.d.ts +55 -0
- package/types/alemon/index.d.ts +40 -0
- package/types/alemon/message.d.ts +17 -0
- package/types/alemon/plugin.d.ts +69 -0
- package/types/alemon/puppeteer.d.ts +53 -0
- package/types/alemon/qrcode.d.ts +20 -0
- package/types/alemon/screenshot.d.ts +23 -0
- package/types/alemon/typings.d.ts +525 -0
- package/types/config.d.ts +12 -0
- package/types/discord/alemon/api.d.ts +11 -0
- package/types/discord/alemon/bot.d.ts +6 -0
- package/types/discord/alemon/conversation.d.ts +6 -0
- package/types/discord/alemon/message/PUBLIC_GUILD_MESSAGES.d.ts +7 -0
- package/types/discord/alemon/segment.d.ts +46 -0
- package/types/discord/index.d.ts +1 -0
- package/types/discord/login.d.ts +7 -0
- package/types/index.d.ts +6 -0
- package/types/kook/alemon/bot.d.ts +8 -0
- package/types/kook/alemon/conversation.d.ts +7 -0
- package/types/kook/alemon/message/PUBLIC_GUILD_MESSAGES.d.ts +6 -0
- package/types/kook/alemon/segment.d.ts +66 -0
- package/types/kook/index.d.ts +5 -0
- package/types/kook/login.d.ts +7 -0
- package/types/login.d.ts +18 -0
- package/types/main.d.ts +15 -0
- package/types/ntqq/alemon/bot.d.ts +8 -0
- package/types/ntqq/alemon/conversation.d.ts +8 -0
- package/types/ntqq/alemon/message/C2C_MESSAGE_CREATE.d.ts +2 -0
- package/types/ntqq/alemon/message/GROUP_AT_MESSAGE_CREATE.d.ts +8 -0
- package/types/ntqq/alemon/segment.d.ts +20 -0
- package/types/ntqq/alemon/types.d.ts +11 -0
- package/types/ntqq/index.d.ts +1 -0
- package/types/ntqq/login.d.ts +6 -0
- package/types/ntqq/sdk/api.d.ts +44 -0
- package/types/ntqq/sdk/config.d.ts +23 -0
- package/types/ntqq/sdk/index.d.ts +5 -0
- package/types/ntqq/sdk/intents.d.ts +2 -0
- package/types/ntqq/sdk/types.d.ts +11 -0
- package/types/ntqq/sdk/typings.d.ts +17 -0
- package/types/ntqq/sdk/web/client.d.ts +8 -0
- package/types/ntqq/sdk/web/img.d.ts +20 -0
- package/types/ntqq/sdk/web/index.d.ts +4 -0
- package/types/ntqq/sdk/web/ip.d.ts +5 -0
- package/types/ntqq/sdk/wss.d.ts +35 -0
- package/types/qq/alemon/apidoc.d.ts +154 -0
- package/types/qq/alemon/bot.d.ts +8 -0
- package/types/qq/alemon/console.d.ts +1 -0
- package/types/qq/alemon/conversation.d.ts +5 -0
- package/types/qq/alemon/doc.d.ts +93 -0
- package/types/qq/alemon/e.d.ts +38 -0
- package/types/qq/alemon/message/AUDIO_ACTION.d.ts +15 -0
- package/types/qq/alemon/message/DIRECT_MESSAGE.d.ts +16 -0
- package/types/qq/alemon/message/FORUMS_EVENT.d.ts +25 -0
- package/types/qq/alemon/message/GUILDS.d.ts +19 -0
- package/types/qq/alemon/message/GUILD_MEMBERS.d.ts +11 -0
- package/types/qq/alemon/message/GUILD_MESSAGES.d.ts +12 -0
- package/types/qq/alemon/message/GUILD_MESSAGE_REACTIONS.d.ts +9 -0
- package/types/qq/alemon/message/INTERACTION.d.ts +8 -0
- package/types/qq/alemon/message/MESSAGE.d.ts +16 -0
- package/types/qq/alemon/message/MESSAGE_AUDIT.d.ts +9 -0
- package/types/qq/alemon/message/OPEN_FORUMS_EVENT.d.ts +28 -0
- package/types/qq/alemon/message/PUBLIC_GUILD_MESSAGES.d.ts +12 -0
- package/types/qq/alemon/permissions.d.ts +29 -0
- package/types/qq/alemon/privatechat.d.ts +14 -0
- package/types/qq/alemon/segment.d.ts +19 -0
- package/types/qq/alemon/types.d.ts +82 -0
- package/types/qq/index.d.ts +6 -0
- package/types/qq/login.d.ts +6 -0
- package/types/types.d.ts +85 -0
- package/types/villa/alemon/conversation.d.ts +7 -0
- package/types/villa/alemon/message/GUILDS.d.ts +10 -0
- package/types/villa/alemon/message/GUILD_MEMBERS.d.ts +14 -0
- package/types/villa/alemon/message/GUILD_MESSAGE_REACTIONS.d.ts +7 -0
- package/types/villa/alemon/message/MESSAGES.d.ts +7 -0
- package/types/villa/alemon/message/MESSAGE_AUDIT.d.ts +10 -0
- package/types/villa/alemon/message/e.d.ts +37 -0
- package/types/villa/alemon/segment.d.ts +26 -0
- package/types/villa/index.d.ts +1 -0
- package/types/villa/login.d.ts +7 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import puppeteer from 'puppeteer';
|
|
2
|
+
import queryString from 'querystring';
|
|
3
|
+
/**
|
|
4
|
+
* 截图次数
|
|
5
|
+
*/
|
|
6
|
+
let pic = 0;
|
|
7
|
+
/**
|
|
8
|
+
* 超过200次截图重启工具
|
|
9
|
+
*/
|
|
10
|
+
const RestartControl = 200;
|
|
11
|
+
/**
|
|
12
|
+
* 实例
|
|
13
|
+
*/
|
|
14
|
+
let browser;
|
|
15
|
+
/**
|
|
16
|
+
* 实例控制
|
|
17
|
+
*/
|
|
18
|
+
let isBrowser = false;
|
|
19
|
+
/**
|
|
20
|
+
* 对每个页面进行缓存
|
|
21
|
+
*/
|
|
22
|
+
const pageCache = {};
|
|
23
|
+
/**
|
|
24
|
+
* 清除缓存
|
|
25
|
+
*/
|
|
26
|
+
function delCache() {
|
|
27
|
+
for (const item in pageCache) {
|
|
28
|
+
delete pageCache[item];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 实例配置
|
|
33
|
+
*/
|
|
34
|
+
let LaunchCfg;
|
|
35
|
+
/**
|
|
36
|
+
* 配置浏览器参数
|
|
37
|
+
* @param val
|
|
38
|
+
*/
|
|
39
|
+
export function setLanchConfig(val) {
|
|
40
|
+
LaunchCfg = val;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 得到pup配置
|
|
44
|
+
* @returns
|
|
45
|
+
*/
|
|
46
|
+
export function getLanchConfig() {
|
|
47
|
+
return LaunchCfg;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 启动检查
|
|
51
|
+
* @returns
|
|
52
|
+
*/
|
|
53
|
+
export async function pupStartCheck() {
|
|
54
|
+
/**
|
|
55
|
+
* 检测是否开启
|
|
56
|
+
*/
|
|
57
|
+
if (isBrowser == false) {
|
|
58
|
+
if (!(await startChrom()))
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
if (pic <= RestartControl) {
|
|
62
|
+
/**
|
|
63
|
+
* 记录次数
|
|
64
|
+
*/
|
|
65
|
+
pic++;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
/**
|
|
69
|
+
* 重置次数
|
|
70
|
+
*/
|
|
71
|
+
pic = 0;
|
|
72
|
+
console.info('[puppeteer] close');
|
|
73
|
+
delCache();
|
|
74
|
+
isBrowser = false;
|
|
75
|
+
browser.close().catch(err => console.error(err));
|
|
76
|
+
console.info('[puppeteer] reopen');
|
|
77
|
+
if (!(await startChrom()))
|
|
78
|
+
return false;
|
|
79
|
+
pic++;
|
|
80
|
+
}
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 截图并返回buffer
|
|
85
|
+
* @param htmlPath 绝对路径
|
|
86
|
+
* @param tab 截图元素位
|
|
87
|
+
* @param type 图片类型
|
|
88
|
+
* @param quality 清晰度
|
|
89
|
+
* @param timeout 响应检查
|
|
90
|
+
* @returns
|
|
91
|
+
*/
|
|
92
|
+
export async function screenshotByFile(htmlPath, Options) {
|
|
93
|
+
if (!pupStartCheck())
|
|
94
|
+
return false;
|
|
95
|
+
const { SOptions, tab = 'body', timeout = 120000 } = Options;
|
|
96
|
+
try {
|
|
97
|
+
/**
|
|
98
|
+
* 开始
|
|
99
|
+
*/
|
|
100
|
+
if (!isBrowser) {
|
|
101
|
+
if (!(await startChrom()))
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
console.info('[puppeteer] start');
|
|
105
|
+
/**
|
|
106
|
+
* 实例化
|
|
107
|
+
*/
|
|
108
|
+
const page = await browser.newPage();
|
|
109
|
+
/**
|
|
110
|
+
* 挂载网页
|
|
111
|
+
*/
|
|
112
|
+
await page.goto(`file://${htmlPath}`, {
|
|
113
|
+
timeout
|
|
114
|
+
});
|
|
115
|
+
/**
|
|
116
|
+
* 获取元素
|
|
117
|
+
*/
|
|
118
|
+
const body = await page.$(tab);
|
|
119
|
+
/**
|
|
120
|
+
* 得到图片
|
|
121
|
+
*/
|
|
122
|
+
console.info('[puppeteer] success');
|
|
123
|
+
const buff = await body
|
|
124
|
+
.screenshot(SOptions)
|
|
125
|
+
.catch(err => {
|
|
126
|
+
console.error(err);
|
|
127
|
+
return false;
|
|
128
|
+
});
|
|
129
|
+
/**
|
|
130
|
+
* 关闭
|
|
131
|
+
*/
|
|
132
|
+
page.close().catch((err) => console.error(err));
|
|
133
|
+
/**
|
|
134
|
+
* 空的
|
|
135
|
+
*/
|
|
136
|
+
if (!buff)
|
|
137
|
+
console.error('[puppeteer]', htmlPath);
|
|
138
|
+
return buff;
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
console.error(err);
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* 截图
|
|
147
|
+
* @param val
|
|
148
|
+
* @returns
|
|
149
|
+
*/
|
|
150
|
+
export async function screenshotByUrl(val) {
|
|
151
|
+
if (!pupStartCheck())
|
|
152
|
+
return false;
|
|
153
|
+
if (!isBrowser) {
|
|
154
|
+
if (!(await startChrom()))
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
console.info('[puppeteer] start');
|
|
158
|
+
const { url, time, rand, params, tab, cache } = val;
|
|
159
|
+
if (!pageCache[url]) {
|
|
160
|
+
pageCache[url] = await browser.newPage();
|
|
161
|
+
}
|
|
162
|
+
const isurl = params == undefined ? url : `${url}?${queryString.stringify(params ?? {})}`;
|
|
163
|
+
/**
|
|
164
|
+
* 启用页面缓存
|
|
165
|
+
*/
|
|
166
|
+
await pageCache[url].setCacheEnabled(cache == undefined ? true : cache);
|
|
167
|
+
/**
|
|
168
|
+
* 启动网页
|
|
169
|
+
*/
|
|
170
|
+
await pageCache[url].goto(isurl);
|
|
171
|
+
console.info(`open ${isurl}`);
|
|
172
|
+
/**
|
|
173
|
+
* 找到元素
|
|
174
|
+
*/
|
|
175
|
+
const body = await pageCache[url].$(tab ?? 'body');
|
|
176
|
+
if (!body) {
|
|
177
|
+
delete pageCache[url];
|
|
178
|
+
console.error(`tab err`);
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* 延迟
|
|
183
|
+
*/
|
|
184
|
+
await new Promise(resolve => setTimeout(resolve, time ?? 1000));
|
|
185
|
+
/**
|
|
186
|
+
* 截图
|
|
187
|
+
*/
|
|
188
|
+
const buff = await body
|
|
189
|
+
.screenshot(rand ?? {
|
|
190
|
+
type: 'jpeg',
|
|
191
|
+
quality: 90,
|
|
192
|
+
path: ''
|
|
193
|
+
})
|
|
194
|
+
.catch(err => {
|
|
195
|
+
console.error(err);
|
|
196
|
+
return false;
|
|
197
|
+
});
|
|
198
|
+
/**
|
|
199
|
+
* 打印错误
|
|
200
|
+
*/
|
|
201
|
+
if (!buff) {
|
|
202
|
+
delete pageCache[url];
|
|
203
|
+
console.error(`buff err:${url}`);
|
|
204
|
+
}
|
|
205
|
+
return buff;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* 启动浏览器
|
|
209
|
+
* @returns
|
|
210
|
+
*/
|
|
211
|
+
export async function startChrom() {
|
|
212
|
+
try {
|
|
213
|
+
browser = await puppeteer.launch(LaunchCfg);
|
|
214
|
+
isBrowser = true;
|
|
215
|
+
delCache();
|
|
216
|
+
console.info('[puppeteer] open success');
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
console.error(err);
|
|
221
|
+
isBrowser = false;
|
|
222
|
+
delCache();
|
|
223
|
+
console.error('[puppeteer] open fail');
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { toDataURL } from 'qrcode';
|
|
2
|
+
import { writeFile, readFile } from 'fs';
|
|
3
|
+
/**
|
|
4
|
+
* 链接转化为二维码
|
|
5
|
+
* @param text 链接
|
|
6
|
+
* @param localpath 可选,要保存的路径
|
|
7
|
+
* @returns
|
|
8
|
+
*/
|
|
9
|
+
export async function createQrcode(text, localpath) {
|
|
10
|
+
try {
|
|
11
|
+
const qrDataURL = await new Promise((resolve, reject) => {
|
|
12
|
+
toDataURL(text, {
|
|
13
|
+
margin: 2,
|
|
14
|
+
width: 500
|
|
15
|
+
}, (err, qrDataURL) => {
|
|
16
|
+
if (err) {
|
|
17
|
+
console.error(err);
|
|
18
|
+
reject(err);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
resolve(qrDataURL);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
const bufferData = Buffer.from(qrDataURL.split(',')[1], 'base64');
|
|
26
|
+
if (localpath != undefined) {
|
|
27
|
+
setBuffer(localpath, bufferData);
|
|
28
|
+
}
|
|
29
|
+
return bufferData;
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
console.error(err);
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 读取buffer文件
|
|
38
|
+
* @param localpath 读取地址
|
|
39
|
+
* @returns
|
|
40
|
+
*/
|
|
41
|
+
export const getBuffer = (localpath) => {
|
|
42
|
+
return new Promise((resolve, reject) => {
|
|
43
|
+
readFile(localpath, (err, bufferData) => {
|
|
44
|
+
if (err) {
|
|
45
|
+
reject(err);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
console.info('[BUFFER][READ]', localpath);
|
|
49
|
+
resolve(bufferData);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* 写入buffer
|
|
56
|
+
* @param localpath 写入地址
|
|
57
|
+
* @param bufferData 数据
|
|
58
|
+
*/
|
|
59
|
+
export const setBuffer = (localpath, bufferData) => {
|
|
60
|
+
writeFile(localpath, bufferData, (err) => {
|
|
61
|
+
if (err)
|
|
62
|
+
throw err;
|
|
63
|
+
console.info('[BUFFER][SET]', localpath);
|
|
64
|
+
});
|
|
65
|
+
return;
|
|
66
|
+
};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import lodash from 'lodash';
|
|
2
|
+
import { join, basename } from 'path';
|
|
3
|
+
import { readFileSync, watch, mkdirSync } from 'fs';
|
|
4
|
+
import { getAppDir } from './dealmsg.js';
|
|
5
|
+
/**
|
|
6
|
+
* 源码缓存
|
|
7
|
+
*/
|
|
8
|
+
const html = {};
|
|
9
|
+
/**
|
|
10
|
+
* 监听器
|
|
11
|
+
*/
|
|
12
|
+
const watcher = {};
|
|
13
|
+
/**
|
|
14
|
+
* 数据缓存
|
|
15
|
+
*/
|
|
16
|
+
const CacheData = {};
|
|
17
|
+
/**
|
|
18
|
+
* 模板缓存
|
|
19
|
+
*/
|
|
20
|
+
const absolutePathTemplateCache = {};
|
|
21
|
+
/**
|
|
22
|
+
* 缓存监听
|
|
23
|
+
* @param tplFile 模板地址
|
|
24
|
+
* @returns
|
|
25
|
+
*/
|
|
26
|
+
function watchCT(tplFile) {
|
|
27
|
+
/**
|
|
28
|
+
* 监听存在,直接返回
|
|
29
|
+
*/
|
|
30
|
+
if (watcher[tplFile])
|
|
31
|
+
return;
|
|
32
|
+
/**
|
|
33
|
+
* 监听不存在,增加监听
|
|
34
|
+
*/
|
|
35
|
+
watcher[tplFile] = watch(tplFile)
|
|
36
|
+
.on('change', () => {
|
|
37
|
+
/**
|
|
38
|
+
* 模板改变,删除模板
|
|
39
|
+
*/
|
|
40
|
+
delete html[tplFile];
|
|
41
|
+
console.info('[HTML][UPDATA]', tplFile);
|
|
42
|
+
})
|
|
43
|
+
.on('close', () => {
|
|
44
|
+
/**
|
|
45
|
+
* 监听器被移除,删除监听器
|
|
46
|
+
*/
|
|
47
|
+
delete watcher[tplFile];
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 如果control为真则需重新用art渲染
|
|
52
|
+
* @param Options
|
|
53
|
+
* @returns
|
|
54
|
+
*/
|
|
55
|
+
export function createStr(Options) {
|
|
56
|
+
const { AppName, tplFile, data } = Options;
|
|
57
|
+
const appDir = getAppDir();
|
|
58
|
+
/**
|
|
59
|
+
* 插件路径
|
|
60
|
+
*/
|
|
61
|
+
const basePath = join(process.cwd(), appDir, AppName);
|
|
62
|
+
/**
|
|
63
|
+
* 写入地址
|
|
64
|
+
*/
|
|
65
|
+
const AdressHtml = join(process.cwd(), 'data', AppName, basename(tplFile));
|
|
66
|
+
/**
|
|
67
|
+
* 确保写入目录存在
|
|
68
|
+
*/
|
|
69
|
+
mkdirSync(join(process.cwd(), 'data', AppName), { recursive: true });
|
|
70
|
+
/**
|
|
71
|
+
* 判断初始模板是否改变
|
|
72
|
+
*/
|
|
73
|
+
let control = false;
|
|
74
|
+
/**
|
|
75
|
+
* 缓存不存在
|
|
76
|
+
*/
|
|
77
|
+
if (!html[tplFile]) {
|
|
78
|
+
/**
|
|
79
|
+
* 读取文件
|
|
80
|
+
*/
|
|
81
|
+
html[tplFile] = readFileSync(tplFile, 'utf8');
|
|
82
|
+
/**
|
|
83
|
+
* 读取后监听文件
|
|
84
|
+
*/
|
|
85
|
+
watchCT(tplFile);
|
|
86
|
+
control = true;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* 模板对象不同需要更新数据
|
|
90
|
+
*/
|
|
91
|
+
if (!lodash.isEqual(CacheData[tplFile], data ?? {})) {
|
|
92
|
+
CacheData[tplFile] = data ?? {};
|
|
93
|
+
control = true;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* 模板更改和数据更改都会生成生成html
|
|
97
|
+
*/
|
|
98
|
+
if (control) {
|
|
99
|
+
const reg = /url\(['"](@[^'"]+)['"]\)|href=['"](@[^'"]+)['"]|src=['"](@[^'"]+)['"]/g;
|
|
100
|
+
absolutePathTemplateCache[tplFile] = html[tplFile].replace(reg, (match, urlPath, hrefPath, srcPath) => {
|
|
101
|
+
const relativePath = urlPath ?? hrefPath ?? srcPath;
|
|
102
|
+
/**
|
|
103
|
+
* 去掉路径开头的 @ 符号
|
|
104
|
+
* 转义\/
|
|
105
|
+
*/
|
|
106
|
+
const absolutePath = join(basePath, relativePath.substr(1)).replace(/\\/g, '/');
|
|
107
|
+
if (urlPath)
|
|
108
|
+
return `url('${absolutePath}')`;
|
|
109
|
+
if (hrefPath)
|
|
110
|
+
return `href='${absolutePath}'`;
|
|
111
|
+
if (srcPath)
|
|
112
|
+
return `src='${absolutePath}'`;
|
|
113
|
+
});
|
|
114
|
+
/**
|
|
115
|
+
* 打印反馈生成后的地址
|
|
116
|
+
*/
|
|
117
|
+
console.info('[HTML][CREATE]', AdressHtml);
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
control,
|
|
121
|
+
// 模板地址
|
|
122
|
+
AdressHtml,
|
|
123
|
+
// 模板字符
|
|
124
|
+
template: absolutePathTemplateCache[tplFile]
|
|
125
|
+
};
|
|
126
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 平台枚举
|
|
3
|
+
*/
|
|
4
|
+
export const PlatformEnum = [
|
|
5
|
+
'qq',
|
|
6
|
+
'kook',
|
|
7
|
+
'discord',
|
|
8
|
+
'villa',
|
|
9
|
+
'ntqq',
|
|
10
|
+
'wechat',
|
|
11
|
+
'telegram',
|
|
12
|
+
'dodo'
|
|
13
|
+
];
|
|
14
|
+
/**
|
|
15
|
+
* 消息枚举
|
|
16
|
+
*/
|
|
17
|
+
export const EventEnum = [
|
|
18
|
+
/**
|
|
19
|
+
* 频道消息
|
|
20
|
+
*/
|
|
21
|
+
'GUILD',
|
|
22
|
+
/**
|
|
23
|
+
* 子频道消息
|
|
24
|
+
*/
|
|
25
|
+
'CHANNEL',
|
|
26
|
+
/**
|
|
27
|
+
* 成员频道进出变动消息
|
|
28
|
+
*/
|
|
29
|
+
'GUILD_MEMBERS',
|
|
30
|
+
/**
|
|
31
|
+
* 审核消息
|
|
32
|
+
*/
|
|
33
|
+
'MESSAGE_AUDIT',
|
|
34
|
+
/**
|
|
35
|
+
* 私聊会话消息
|
|
36
|
+
*/
|
|
37
|
+
'DIRECT_MESSAGE',
|
|
38
|
+
/**
|
|
39
|
+
* 论坛主题
|
|
40
|
+
*/
|
|
41
|
+
'FORUMS_THREAD',
|
|
42
|
+
/**
|
|
43
|
+
* 论坛POST
|
|
44
|
+
*/
|
|
45
|
+
'FORUMS_POST',
|
|
46
|
+
/**
|
|
47
|
+
* 论坛评论
|
|
48
|
+
*/
|
|
49
|
+
'FORUMS_REPLY',
|
|
50
|
+
/**
|
|
51
|
+
* 会话消息:公私合并
|
|
52
|
+
*/
|
|
53
|
+
'MESSAGES',
|
|
54
|
+
/**
|
|
55
|
+
* 小写兼容层
|
|
56
|
+
*/
|
|
57
|
+
'message',
|
|
58
|
+
/**
|
|
59
|
+
* 频道表情点击会话消息
|
|
60
|
+
*/
|
|
61
|
+
'GUILD_MESSAGE_REACTIONS',
|
|
62
|
+
/**
|
|
63
|
+
* 互动事件监听
|
|
64
|
+
*/
|
|
65
|
+
'INTERACTION',
|
|
66
|
+
/**
|
|
67
|
+
* 音频事件
|
|
68
|
+
*/
|
|
69
|
+
'AUDIO_FREQUENCY',
|
|
70
|
+
/**
|
|
71
|
+
* 麦克风事件
|
|
72
|
+
*/
|
|
73
|
+
'AUDIO_MICROPHONE',
|
|
74
|
+
/**
|
|
75
|
+
* 兼容不响应
|
|
76
|
+
*/
|
|
77
|
+
'notice.*.poke'
|
|
78
|
+
];
|
|
79
|
+
/**
|
|
80
|
+
* 消息判断
|
|
81
|
+
*/
|
|
82
|
+
export const EventType = ['CREATE', 'UPDATE', 'DELETE'];
|
|
83
|
+
export const CacrdEnum = [
|
|
84
|
+
/**
|
|
85
|
+
* qq频道
|
|
86
|
+
*/
|
|
87
|
+
'qq_embed',
|
|
88
|
+
/**
|
|
89
|
+
* QQ频道
|
|
90
|
+
*/
|
|
91
|
+
'qq_ark',
|
|
92
|
+
/**
|
|
93
|
+
* kook
|
|
94
|
+
*/
|
|
95
|
+
'kook_card'
|
|
96
|
+
];
|
package/lib/config.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { parse } from '@iarna/toml';
|
|
4
|
+
import { stringify } from '@iarna/toml';
|
|
5
|
+
let urlVal = '/alemon.toml';
|
|
6
|
+
/**
|
|
7
|
+
* 读取配置文件
|
|
8
|
+
* @param url
|
|
9
|
+
* @returns
|
|
10
|
+
*/
|
|
11
|
+
export function getToml(url = urlVal) {
|
|
12
|
+
// 检验文件是否存在
|
|
13
|
+
urlVal = url;
|
|
14
|
+
const u = join(process.cwd(), urlVal);
|
|
15
|
+
if (!existsSync(u))
|
|
16
|
+
return {};
|
|
17
|
+
return parse(readFileSync(u, 'utf8'));
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 写入配置文件
|
|
21
|
+
* @param data
|
|
22
|
+
*/
|
|
23
|
+
export function writeToml(data) {
|
|
24
|
+
writeFileSync(join(process.cwd(), urlVal), stringify(data));
|
|
25
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { existsSync, createReadStream } from 'fs';
|
|
2
|
+
import { Readable, isReadable } from 'stream';
|
|
3
|
+
import { basename } from 'path';
|
|
4
|
+
import { fileTypeFromBuffer, fileTypeFromStream } from 'file-type';
|
|
5
|
+
import { AttachmentBuilder } from 'discord.js';
|
|
6
|
+
/**
|
|
7
|
+
* 发送资源
|
|
8
|
+
* @param file
|
|
9
|
+
* @param name
|
|
10
|
+
* @returns
|
|
11
|
+
*/
|
|
12
|
+
export async function postImage(file, name = 'image.jpg') {
|
|
13
|
+
let picData;
|
|
14
|
+
if (typeof file === 'string') {
|
|
15
|
+
if (!existsSync(file)) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
if (!name) {
|
|
19
|
+
name = basename(file);
|
|
20
|
+
}
|
|
21
|
+
picData = createReadStream(file);
|
|
22
|
+
}
|
|
23
|
+
else if (Buffer.isBuffer(file)) {
|
|
24
|
+
if (!name) {
|
|
25
|
+
name = 'file.' + (await fileTypeFromBuffer(file)).ext;
|
|
26
|
+
}
|
|
27
|
+
picData = new Readable();
|
|
28
|
+
picData.push(file);
|
|
29
|
+
picData.push(null);
|
|
30
|
+
}
|
|
31
|
+
else if (isReadable(file)) {
|
|
32
|
+
if (!name) {
|
|
33
|
+
name = 'file.' + (await fileTypeFromStream(file)).ext;
|
|
34
|
+
}
|
|
35
|
+
picData = file;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
const attach = new AttachmentBuilder(picData, {
|
|
41
|
+
name
|
|
42
|
+
});
|
|
43
|
+
return attach;
|
|
44
|
+
}
|