mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-07-19 12:03:37 +00:00
Compare commits
375 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
9c382c639b | ||
![]() |
a43cde38f1 | ||
![]() |
c35d2e08cd | ||
![]() |
3377c383c1 | ||
![]() |
c00e6d95cd | ||
![]() |
725fccf4ed | ||
![]() |
13129bd219 | ||
![]() |
4561977bcf | ||
![]() |
40be8a91f5 | ||
![]() |
2a04d5830b | ||
![]() |
82a38574f3 | ||
![]() |
fea3a33c2b | ||
![]() |
9a502cdf6f | ||
![]() |
4b616299cf | ||
![]() |
102243e064 | ||
![]() |
4b21ac5ebe | ||
![]() |
4dd7363dd3 | ||
![]() |
3d5e5ab78f | ||
![]() |
73045a1b21 | ||
![]() |
871173a7cf | ||
![]() |
0002313093 | ||
![]() |
948cf5cca6 | ||
![]() |
d40230879c | ||
![]() |
ab22b775f1 | ||
![]() |
42c85224ba | ||
![]() |
e57444a353 | ||
![]() |
3c6503d495 | ||
![]() |
149b518f48 | ||
![]() |
74621447ff | ||
![]() |
3280952931 | ||
![]() |
9e670e2736 | ||
![]() |
9fc6347a2f | ||
![]() |
ec7a15a192 | ||
![]() |
7f99982810 | ||
![]() |
935d83aaf8 | ||
![]() |
0ff6edd546 | ||
![]() |
94f629585a | ||
![]() |
89c04be02f | ||
![]() |
3151965ea8 | ||
![]() |
bdf5159be1 | ||
![]() |
0499ebbea3 | ||
![]() |
d5843b7236 | ||
![]() |
1c9c574a90 | ||
![]() |
39acf20e48 | ||
![]() |
52eb6ed5ab | ||
![]() |
ee78d2d59d | ||
![]() |
60dc5c4a38 | ||
![]() |
50a0dc0355 | ||
![]() |
3f681ec914 | ||
![]() |
0bf499f191 | ||
![]() |
389695a0d6 | ||
![]() |
07f1afb312 | ||
![]() |
ae91e61304 | ||
![]() |
6248991b01 | ||
![]() |
7f2d57ef62 | ||
![]() |
31f8f884f1 | ||
![]() |
4f4af5985a | ||
![]() |
a716fdf6d4 | ||
![]() |
9717f64abd | ||
![]() |
adf239183a | ||
![]() |
6cf209c79c | ||
![]() |
decc5fb3c0 | ||
![]() |
1e0820d613 | ||
![]() |
70124d5177 | ||
![]() |
269de65201 | ||
![]() |
1d11abbfb6 | ||
![]() |
700f308d6e | ||
![]() |
21b6928ca6 | ||
![]() |
998c67a649 | ||
![]() |
fb99e878b0 | ||
![]() |
1619adfc27 | ||
![]() |
5510fb473f | ||
![]() |
be1878cb2b | ||
![]() |
15ab121cbd | ||
![]() |
aa79b0e861 | ||
![]() |
b80e550bcd | ||
![]() |
dbc40b5814 | ||
![]() |
0d5696a644 | ||
![]() |
ceffa05802 | ||
![]() |
d5668920b6 | ||
![]() |
516f2da144 | ||
![]() |
33c94e1888 | ||
![]() |
51ab58cd91 | ||
![]() |
aa7798d1d1 | ||
![]() |
9067a1fc92 | ||
![]() |
4024b6c564 | ||
![]() |
d39730928b | ||
![]() |
e1f049229c | ||
![]() |
8f2676ec19 | ||
![]() |
32d26248dc | ||
![]() |
16f926401b | ||
![]() |
66d60d3599 | ||
![]() |
5a35ab6c34 | ||
![]() |
ba1542bd31 | ||
![]() |
453060945a | ||
![]() |
c8351be461 | ||
![]() |
9954da22a6 | ||
![]() |
907b5611eb | ||
![]() |
5f075de212 | ||
![]() |
8fcf3c5079 | ||
![]() |
07cee90c7a | ||
![]() |
75ad495b98 | ||
![]() |
0bb7288ad2 | ||
![]() |
ad72415532 | ||
![]() |
0ad0353fc0 | ||
![]() |
9fa0dcd7aa | ||
![]() |
1f2e80cd39 | ||
![]() |
6cb6034d43 | ||
![]() |
25134c6ac6 | ||
![]() |
92bf42878a | ||
![]() |
9f4582d158 | ||
![]() |
68af73970e | ||
![]() |
b6ed8d4975 | ||
![]() |
d07d3645ce | ||
![]() |
123759ab17 | ||
![]() |
f2f1f893d8 | ||
![]() |
db93a8eed2 | ||
![]() |
12ab6d4a7d | ||
![]() |
add759e889 | ||
![]() |
f315f7977d | ||
![]() |
f2f6701ebd | ||
![]() |
1a92794d33 | ||
![]() |
7640deb798 | ||
![]() |
f1e8ef1cf6 | ||
![]() |
5e5ac0162e | ||
![]() |
0c013820f0 | ||
![]() |
4b3a9e5847 | ||
![]() |
e4982256a4 | ||
![]() |
babc4927a8 | ||
![]() |
6dd84cf469 | ||
![]() |
a8800e3899 | ||
![]() |
5f03496046 | ||
![]() |
41500c17a2 | ||
![]() |
2dcfde8b9a | ||
![]() |
5c3305d8fa | ||
![]() |
0d1fe99f53 | ||
![]() |
4c03ffeec7 | ||
![]() |
8101d17482 | ||
![]() |
bc7b4dcc2a | ||
![]() |
3db8b9078d | ||
![]() |
943dbbefd3 | ||
![]() |
480abcb853 | ||
![]() |
60aaaff58e | ||
![]() |
e3b889bbe8 | ||
![]() |
ac5506a43b | ||
![]() |
b29f533a3b | ||
![]() |
a8ee86b09e | ||
![]() |
0238c53302 | ||
![]() |
665e3c806f | ||
![]() |
8c96838441 | ||
![]() |
4a722daec6 | ||
![]() |
4e0cdbcb91 | ||
![]() |
08976624cd | ||
![]() |
fdeba94653 | ||
![]() |
d3b100b7e5 | ||
![]() |
1de3e18b08 | ||
![]() |
d5c3c95682 | ||
![]() |
dabe1e29ed | ||
![]() |
203d1c0cfc | ||
![]() |
7edd8601be | ||
![]() |
a4423247f4 | ||
![]() |
4834b203a0 | ||
![]() |
bbabb32d13 | ||
![]() |
95112d6bdf | ||
![]() |
36cdca5a3e | ||
![]() |
6980a9f3fc | ||
![]() |
7b09479cd2 | ||
![]() |
5825fd6f36 | ||
![]() |
2d5b45dd82 | ||
![]() |
52dda1d1fe | ||
![]() |
420624bee4 | ||
![]() |
8abde7b7d0 | ||
![]() |
9e5b1ba28e | ||
![]() |
b9c7d3c18e | ||
![]() |
10aeccbbe5 | ||
![]() |
15d351ebc2 | ||
![]() |
7194f31cb6 | ||
![]() |
84b7e82446 | ||
![]() |
8264423b1a | ||
![]() |
37f897f3bf | ||
![]() |
fe3efac145 | ||
![]() |
9773aebefc | ||
![]() |
06f2b8c371 | ||
![]() |
e8f0bb8350 | ||
![]() |
9bfa6b827b | ||
![]() |
b21bc17a58 | ||
![]() |
f4d5d417d0 | ||
![]() |
91fc83621e | ||
![]() |
461feca0ca | ||
![]() |
5e9afab3f7 | ||
![]() |
2599ca6450 | ||
![]() |
fc99ad3a39 | ||
![]() |
10e1c3e72c | ||
![]() |
af5dedd4d4 | ||
![]() |
3b986c1076 | ||
![]() |
72f77e8b7c | ||
![]() |
e893bf676f | ||
![]() |
80eb34f611 | ||
![]() |
5d01947552 | ||
![]() |
d3a025ef7b | ||
![]() |
c466df841e | ||
![]() |
b3c6e2a0f3 | ||
![]() |
076c9cfed7 | ||
![]() |
c3f3d12f83 | ||
![]() |
44974034ec | ||
![]() |
d6175acd38 | ||
![]() |
62eee5f05c | ||
![]() |
d4e5201913 | ||
![]() |
f4d584765a | ||
![]() |
26e224f852 | ||
![]() |
252358ed66 | ||
![]() |
475afeb7c8 | ||
![]() |
7cbbb846eb | ||
![]() |
25f947968c | ||
![]() |
cad824dcbc | ||
![]() |
e506f50b00 | ||
![]() |
96ec149a98 | ||
![]() |
8c913512f6 | ||
![]() |
4cc307299d | ||
![]() |
407c6b4c5f | ||
![]() |
8f87070434 | ||
![]() |
4a63996ee2 | ||
![]() |
0358fe7620 | ||
![]() |
55e64395ed | ||
![]() |
ff5fb18e14 | ||
![]() |
52dd960857 | ||
![]() |
430221c2de | ||
![]() |
217bdf8f92 | ||
![]() |
38c6c869bf | ||
![]() |
84d46da67e | ||
![]() |
eb9d6240d7 | ||
![]() |
2d44a871b0 | ||
![]() |
3f89f350ff | ||
![]() |
1a8407a782 | ||
![]() |
cf288a3f73 | ||
![]() |
f1f37fb180 | ||
![]() |
fb0dd079fd | ||
![]() |
a6c584c85c | ||
![]() |
77adf35a30 | ||
![]() |
dc6951c2a9 | ||
![]() |
d14ba3f0f7 | ||
![]() |
78ddf36e35 | ||
![]() |
d42734624d | ||
![]() |
b5dbd9d59b | ||
![]() |
bed3e1289b | ||
![]() |
b11ca4e60e | ||
![]() |
4fcf3aa2bd | ||
![]() |
dc39da8ca5 | ||
![]() |
c10c87d28e | ||
![]() |
c6fe6f1cc5 | ||
![]() |
1c2bbeb26d | ||
![]() |
17ed3692d0 | ||
![]() |
966a00f41e | ||
![]() |
fd8d8f89aa | ||
![]() |
305bb74072 | ||
![]() |
7f4dcdd134 | ||
![]() |
aac37dcce1 | ||
![]() |
f539c662a5 | ||
![]() |
c82f346dd0 | ||
![]() |
21b4a87837 | ||
![]() |
ae73bcf24b | ||
![]() |
2a3b56bde1 | ||
![]() |
b8ebededd8 | ||
![]() |
227c4c422c | ||
![]() |
652bfb93cc | ||
![]() |
c2278e3536 | ||
![]() |
caa2fca4e8 | ||
![]() |
745cb0175c | ||
![]() |
e5165a780f | ||
![]() |
b4b91af02b | ||
![]() |
5649ff9c2e | ||
![]() |
5b4bf6c62a | ||
![]() |
93cb662282 | ||
![]() |
00a8715e58 | ||
![]() |
7ecd479b3e | ||
![]() |
8fe7d3aaec | ||
![]() |
f32a693393 | ||
![]() |
17ebc01597 | ||
![]() |
827fb698e1 | ||
![]() |
32bdf10fd2 | ||
![]() |
b795e6c3d2 | ||
![]() |
42ba524e4e | ||
![]() |
317c6d96e3 | ||
![]() |
3692d1499f | ||
![]() |
b21fbad8a3 | ||
![]() |
743334a68a | ||
![]() |
951413eb38 | ||
![]() |
32dcdef853 | ||
![]() |
34c9254d4a | ||
![]() |
14012a4668 | ||
![]() |
575debca63 | ||
![]() |
763cac8532 | ||
![]() |
43faacd7a7 | ||
![]() |
1d4e307e96 | ||
![]() |
7f8933b0de | ||
![]() |
81608ff025 | ||
![]() |
db63675b8e | ||
![]() |
f74a83bc46 | ||
![]() |
bc1deba3e4 | ||
![]() |
d6113a8f0a | ||
![]() |
2062cd48ea | ||
![]() |
1c965ef515 | ||
![]() |
58291b7156 | ||
![]() |
afd1648d80 | ||
![]() |
21814ffa9a | ||
![]() |
9d3522da54 | ||
![]() |
e07a76755e | ||
![]() |
ba46bcdeae | ||
![]() |
8d7e44314c | ||
![]() |
35a67498c7 | ||
![]() |
90dd934f95 | ||
![]() |
4087045542 | ||
![]() |
d11cef5907 | ||
![]() |
76c91d226c | ||
![]() |
c2b4dd2afd | ||
![]() |
25b39cb39a | ||
![]() |
35dcb7b88b | ||
![]() |
e5f7e7c26e | ||
![]() |
c5c11fd6a6 | ||
![]() |
8134083419 | ||
![]() |
a87e624198 | ||
![]() |
e4c62d20b4 | ||
![]() |
fa195d9e55 | ||
![]() |
5ef5773d23 | ||
![]() |
6eea52afdf | ||
![]() |
80e64af30f | ||
![]() |
563b6ddc36 | ||
![]() |
c051ab9dc4 | ||
![]() |
87737a8bdb | ||
![]() |
94273d80b0 | ||
![]() |
a08ec2a4bd | ||
![]() |
d246c556f4 | ||
![]() |
65aa365e38 | ||
![]() |
eeeae449b4 | ||
![]() |
17c10a7ba2 | ||
![]() |
69f4383678 | ||
![]() |
07852a7295 | ||
![]() |
20b7e9b6b5 | ||
![]() |
75f43ccea4 | ||
![]() |
59e5785e93 | ||
![]() |
b38f52dba9 | ||
![]() |
2a6b17a48e | ||
![]() |
a6c056a894 | ||
![]() |
5c3442a71f | ||
![]() |
390253242f | ||
![]() |
9ab80fe1ac | ||
![]() |
91fdd09e7a | ||
![]() |
db5bd5c8a4 | ||
![]() |
ef94c2fe7c | ||
![]() |
72a25ed8e1 | ||
![]() |
eb065e218f | ||
![]() |
33426736fc | ||
![]() |
896658d5ce | ||
![]() |
b14135ed72 | ||
![]() |
a1baf2e32d | ||
![]() |
f9aa2d3bce | ||
![]() |
c95d0e0696 | ||
![]() |
ad4b84d446 | ||
![]() |
3e27d5fcb0 | ||
![]() |
48a100f49a | ||
![]() |
698649f981 | ||
![]() |
780078c3aa | ||
![]() |
4c25e4ddee | ||
![]() |
c0a5ac2ac5 | ||
![]() |
0435409870 | ||
![]() |
c521269409 | ||
![]() |
1e252b7e4c | ||
![]() |
d72b1edc48 | ||
![]() |
f7307e8e01 | ||
![]() |
127905f04b | ||
![]() |
261c6dabd5 | ||
![]() |
cae84bbf02 | ||
![]() |
cdb2bc52fa | ||
![]() |
cd2972eee0 | ||
![]() |
4036aa8d0e |
@@ -5,7 +5,7 @@ root = true
|
|||||||
|
|
||||||
# Unix-style newlines with a newline ending every file
|
# Unix-style newlines with a newline ending every file
|
||||||
[*]
|
[*]
|
||||||
end_of_line = lf
|
end_of_line = lf|crlf
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
|
|
||||||
# Matches multiple files with brace expansion notation
|
# Matches multiple files with brace expansion notation
|
||||||
@@ -18,4 +18,4 @@ indent_style = space
|
|||||||
indent_size = 2
|
indent_size = 2
|
||||||
|
|
||||||
# Unfortunately, EditorConfig doesn't support space configuration inside import braces directly.
|
# Unfortunately, EditorConfig doesn't support space configuration inside import braces directly.
|
||||||
# You'll need to rely on your linter/formatter like ESLint or Prettier for that.
|
# You'll need to rely on your linter/formatter like ESLint or Prettier for that.
|
@@ -1 +1 @@
|
|||||||
VITE_BUILD_TYPE = Production
|
VITE_BUILD_TYPE = Production
|
||||||
|
@@ -1,9 +1,10 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
'env': {
|
'env': {
|
||||||
|
'browser': true,
|
||||||
'es2021': true,
|
'es2021': true,
|
||||||
'node': true
|
'node': true
|
||||||
},
|
},
|
||||||
'ignorePatterns': ['src/core/', 'src/core.lib/'],
|
'ignorePatterns': ['src/core/', 'src/core.lib/','src/proto/'],
|
||||||
'extends': [
|
'extends': [
|
||||||
'eslint:recommended',
|
'eslint:recommended',
|
||||||
'plugin:@typescript-eslint/recommended'
|
'plugin:@typescript-eslint/recommended'
|
||||||
|
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@@ -121,7 +121,7 @@ jobs:
|
|||||||
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
|
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Clone Changes Log
|
- name: Clone Changes Log
|
||||||
run: curl -o CHANGELOG.md https://fastly.jsdelivr.net/gh/NapNeko/NapCatQQ@main/CHANGELOG.md
|
run: curl -o CHANGELOG.md https://fastly.jsdelivr.net/gh/NapNeko/NapCatQQ@main/docs/changelogs/CHANGELOG.v${{ env.VERSION }}.md
|
||||||
|
|
||||||
- name: Create Release Draft and Upload Artifacts
|
- name: Create Release Draft and Upload Artifacts
|
||||||
uses: softprops/action-gh-release@v1
|
uses: softprops/action-gh-release@v1
|
||||||
|
5
.gitignore
vendored
5
.gitignore
vendored
@@ -1,10 +1,11 @@
|
|||||||
# Develop
|
# Develop
|
||||||
node_modules/
|
node_modules/
|
||||||
package-lock.json
|
package-lock.json
|
||||||
|
pnpm-lock.yaml
|
||||||
out/
|
out/
|
||||||
dist/
|
dist/
|
||||||
src/core.lib/common/
|
/src/core.lib/common/
|
||||||
test
|
/localdebug/
|
||||||
|
|
||||||
# Editor
|
# Editor
|
||||||
.vscode/*
|
.vscode/*
|
||||||
|
15
CHANGELOG.md
15
CHANGELOG.md
@@ -1,15 +0,0 @@
|
|||||||
# v1.3.0
|
|
||||||
|
|
||||||
QQ Version: Windows 9.9.9-23424 / Linux 3.2.7-23361
|
|
||||||
|
|
||||||
## 修复与优化
|
|
||||||
* 修复了一个导致每个图片都自动下载的 bug
|
|
||||||
* 再一次修复图片URL,支持 Win/Linux X64 获取Rkey,暂时不支持arm64
|
|
||||||
* 修复了设置消息群聊与私聊已读接口
|
|
||||||
* 修复无法获取进群申请人员信息
|
|
||||||
## 新增与调整
|
|
||||||
* 再一次对获取Cookies与获取群成员优化,分别添加30/60/120分钟缓存
|
|
||||||
* 新增 WebUi 支持远程配置设置 详细参考官方教程
|
|
||||||
* 新增二维码过期自动刷新功能
|
|
||||||
|
|
||||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
|
13
docs/changelogs/CHANGELOG.v1.5.2.md
Normal file
13
docs/changelogs/CHANGELOG.v1.5.2.md
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# v1.5.2
|
||||||
|
|
||||||
|
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||||
|
|
||||||
|
## 修复与优化
|
||||||
|
* 替换Uid/Uin为内部实现
|
||||||
|
* 增加HttpApi调用稳定性
|
||||||
|
* 修复 GetMsg 兼容性
|
||||||
|
|
||||||
|
## 新增与调整
|
||||||
|
* 支持真正意义上的陌生人信息获取 Api: GoCQHTTP_GetStrangerInfo
|
||||||
|
|
||||||
|
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
17
docs/changelogs/old/CHANGELOG.v1.3.3.md
Normal file
17
docs/changelogs/old/CHANGELOG.v1.3.3.md
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# v1.3.3
|
||||||
|
|
||||||
|
QQ Version: Windows 9.9.9-23424 / Linux 3.2.7-23361
|
||||||
|
|
||||||
|
## 修复与优化
|
||||||
|
* 尝试修复多开崩溃问题
|
||||||
|
* 修复群列表更新问题
|
||||||
|
* 修复兼容性问题支持Win7
|
||||||
|
* 修复下载 http 资源缺少UA
|
||||||
|
* 优化少量消息合并转发速度
|
||||||
|
* 修复加载群通知时出现 getUserDetailInfo timeout 导致程序崩溃
|
||||||
|
|
||||||
|
## 新增与调整
|
||||||
|
* 新增设置群公告 Api: /_send_group_notice
|
||||||
|
* 新增重启实现 包括重启快速登录/普通重启 副作用: 原进程 无法清理
|
||||||
|
|
||||||
|
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
18
docs/changelogs/old/CHANGELOG.v1.3.5.md
Normal file
18
docs/changelogs/old/CHANGELOG.v1.3.5.md
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# v1.3.5
|
||||||
|
|
||||||
|
QQ Version: Windows 9.9.9-23424 / Linux 3.2.7-23361
|
||||||
|
|
||||||
|
## 修复与优化
|
||||||
|
* 优化启动脚本
|
||||||
|
* 修复非管理时群成员减少事件上报 **无法获取操作者与操作类型**
|
||||||
|
* 修复快速重启进程清理问题
|
||||||
|
* 优化配置文件格式 支持自动更新配置 但仍然建议 **备份配置**
|
||||||
|
* 修复正向反向ws多个客户端周期多次心跳问题
|
||||||
|
|
||||||
|
## 新增与调整
|
||||||
|
* 支持WebUi热重载
|
||||||
|
* 新增启动输出WEBUI秘钥
|
||||||
|
* 新增群荣誉信息 /get_group_honor_info
|
||||||
|
* 支持获取群系统消息 /get_group_system_msg
|
||||||
|
|
||||||
|
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
11
docs/changelogs/old/CHANGELOG.v1.3.6.md
Normal file
11
docs/changelogs/old/CHANGELOG.v1.3.6.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# v1.3.6
|
||||||
|
|
||||||
|
QQ Version: Windows 9.9.9-23424 / Linux 3.2.7-23361
|
||||||
|
|
||||||
|
## 修复与优化
|
||||||
|
* 修复戳一戳多次上报问题
|
||||||
|
|
||||||
|
## 新增与调整
|
||||||
|
|
||||||
|
|
||||||
|
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
15
docs/changelogs/old/CHANGELOG.v1.3.8.md
Normal file
15
docs/changelogs/old/CHANGELOG.v1.3.8.md
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# v1.3.8
|
||||||
|
|
||||||
|
QQ Version: Windows 9.9.9-23873 / Linux 3.2.7-23361
|
||||||
|
|
||||||
|
## 修复与优化
|
||||||
|
* 优化打包后体积问题
|
||||||
|
* 修复QQ等级获取
|
||||||
|
* 兼容 9.7.x 版本换行符 统一为 \n
|
||||||
|
* 修复处理加群请求 字段异常情况
|
||||||
|
* 修复退群通知问题
|
||||||
|
|
||||||
|
## 新增与调整
|
||||||
|
|
||||||
|
|
||||||
|
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
11
docs/changelogs/old/CHANGELOG.v1.3.9.md
Normal file
11
docs/changelogs/old/CHANGELOG.v1.3.9.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# v1.3.9
|
||||||
|
|
||||||
|
QQ Version: Windows 9.9.10-23873 / Linux 3.2.7-23361
|
||||||
|
|
||||||
|
## 修复与优化
|
||||||
|
* 修复QQ等级获取与兼容性问题
|
||||||
|
|
||||||
|
## 新增与调整
|
||||||
|
|
||||||
|
|
||||||
|
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
12
docs/changelogs/old/CHANGELOG.v1.4.0.md
Normal file
12
docs/changelogs/old/CHANGELOG.v1.4.0.md
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# v1.4.0
|
||||||
|
|
||||||
|
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||||
|
|
||||||
|
## 修复与优化
|
||||||
|
|
||||||
|
## 新增与调整
|
||||||
|
* 支持空间Cookies获取
|
||||||
|
* 支持获取在线设备 API /get_online_clients
|
||||||
|
* 支持图片OCR API: /.ocr_image /ocr_image
|
||||||
|
|
||||||
|
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
14
docs/changelogs/old/CHANGELOG.v1.4.1.md
Normal file
14
docs/changelogs/old/CHANGELOG.v1.4.1.md
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# v1.4.1
|
||||||
|
|
||||||
|
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||||
|
|
||||||
|
## 修复与优化
|
||||||
|
* 提高部分Api兼容性
|
||||||
|
* 优化日志膨胀问题
|
||||||
|
* 在线状态刷新问题修复
|
||||||
|
## 新增与调整
|
||||||
|
* 支持非管理群 本地记录时间数据 (建议 **备份配置 清空配置 重新配置**)
|
||||||
|
* 新增英译中接口 Api: /translate_en2zh
|
||||||
|
* 新增群文件管理相关扩展接口 Api: /get_group_file_count /get_group_file_list /set_group_file_folder /del_group_file /del_group_file_folder
|
||||||
|
|
||||||
|
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
12
docs/changelogs/old/CHANGELOG.v1.4.2.md
Normal file
12
docs/changelogs/old/CHANGELOG.v1.4.2.md
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# v1.4.2
|
||||||
|
|
||||||
|
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||||
|
|
||||||
|
## 修复与优化
|
||||||
|
* 修复获取群文件列表Api
|
||||||
|
* 修复退群通知问题
|
||||||
|
|
||||||
|
## 新增与调整
|
||||||
|
|
||||||
|
|
||||||
|
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
11
docs/changelogs/old/CHANGELOG.v1.4.3.md
Normal file
11
docs/changelogs/old/CHANGELOG.v1.4.3.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# v1.4.3
|
||||||
|
|
||||||
|
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||||
|
|
||||||
|
## 修复与优化
|
||||||
|
* 修复名片通知
|
||||||
|
|
||||||
|
## 新增与调整
|
||||||
|
|
||||||
|
|
||||||
|
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
10
docs/changelogs/old/CHANGELOG.v1.4.4.md
Normal file
10
docs/changelogs/old/CHANGELOG.v1.4.4.md
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# v1.4.4
|
||||||
|
|
||||||
|
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||||
|
|
||||||
|
## 更新
|
||||||
|
* **重大更新:**更新了版本号
|
||||||
|
|
||||||
|
|
||||||
|
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
||||||
|
|
12
docs/changelogs/old/CHANGELOG.v1.4.5.md
Normal file
12
docs/changelogs/old/CHANGELOG.v1.4.5.md
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# v1.4.5
|
||||||
|
|
||||||
|
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||||
|
|
||||||
|
## 修复与优化
|
||||||
|
* 紧急修复二维扫码问题
|
||||||
|
|
||||||
|
## 新增与调整
|
||||||
|
|
||||||
|
|
||||||
|
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
||||||
|
|
12
docs/changelogs/old/CHANGELOG.v1.4.6.md
Normal file
12
docs/changelogs/old/CHANGELOG.v1.4.6.md
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# v1.4.6
|
||||||
|
|
||||||
|
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||||
|
|
||||||
|
## 修复与优化
|
||||||
|
* 优化整体稳定性
|
||||||
|
|
||||||
|
## 新增与调整
|
||||||
|
|
||||||
|
|
||||||
|
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
||||||
|
|
11
docs/changelogs/old/CHANGELOG.v1.4.7.md
Normal file
11
docs/changelogs/old/CHANGELOG.v1.4.7.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# v1.4.7
|
||||||
|
|
||||||
|
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||||
|
|
||||||
|
## 修复与优化
|
||||||
|
* 临时扩展 Api: GoCQHTTPUploadGroupFile folder_id字段 用于选择文件夹
|
||||||
|
|
||||||
|
## 新增与调整
|
||||||
|
|
||||||
|
|
||||||
|
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
12
docs/changelogs/old/CHANGELOG.v1.4.8.md
Normal file
12
docs/changelogs/old/CHANGELOG.v1.4.8.md
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# v1.4.8
|
||||||
|
|
||||||
|
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||||
|
|
||||||
|
## 修复与优化
|
||||||
|
* 优化Guid的生成方式
|
||||||
|
* 支持临时消息获取群来源
|
||||||
|
|
||||||
|
## 新增与调整
|
||||||
|
|
||||||
|
|
||||||
|
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
11
docs/changelogs/old/CHANGELOG.v1.4.9.md
Normal file
11
docs/changelogs/old/CHANGELOG.v1.4.9.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# v1.4.9
|
||||||
|
|
||||||
|
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||||
|
|
||||||
|
## 修复与优化
|
||||||
|
* 修复接口调用问题 接口标准化 API:set_group_add_request
|
||||||
|
|
||||||
|
## 新增与调整
|
||||||
|
|
||||||
|
|
||||||
|
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
11
docs/changelogs/old/CHANGELOG.v1.5.0.md
Normal file
11
docs/changelogs/old/CHANGELOG.v1.5.0.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# v1.5.0
|
||||||
|
|
||||||
|
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||||
|
|
||||||
|
## 修复与优化
|
||||||
|
* 修正各Api默认值
|
||||||
|
|
||||||
|
## 新增与调整
|
||||||
|
|
||||||
|
|
||||||
|
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
12
docs/changelogs/old/CHANGELOG.v1.5.1.md
Normal file
12
docs/changelogs/old/CHANGELOG.v1.5.1.md
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# v1.5.1
|
||||||
|
|
||||||
|
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||||
|
|
||||||
|
## 修复与优化
|
||||||
|
* 支持 新Api: set_self_profile 可设置个性签名
|
||||||
|
* 修复 Api: get_group_system_msg
|
||||||
|
* 整理日志、添加颜色、使用统一的日志函数以提高日志可读性
|
||||||
|
## 新增与调整
|
||||||
|
|
||||||
|
|
||||||
|
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
132
package.json
132
package.json
@@ -1,65 +1,67 @@
|
|||||||
{
|
{
|
||||||
"name": "napcat",
|
"name": "napcat",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "1.3.0",
|
"version": "1.5.1",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"watch:dev": "vite --mode development",
|
"watch:dev": "vite --mode development",
|
||||||
"watch:prod": "vite --mode production",
|
"watch:prod": "vite --mode production",
|
||||||
"build:dev": "vite build --mode development",
|
"build:dev": "vite build --mode development",
|
||||||
"build:prod": "vite build --mode production",
|
"build:prod": "vite build --mode production",
|
||||||
"build": "npm run build:dev",
|
"build": "npm run build:dev",
|
||||||
"build:core": "cd ./src/core && npm run build && cd ../.. && node ./script/copy-core.cjs",
|
"build:core": "cd ./src/core && npm run build && cd ../.. && node ./script/copy-core.cjs",
|
||||||
"build:webui": "cd ./src/webui && vite build",
|
"build:webui": "cd ./src/webui && vite build",
|
||||||
"watch": "npm run watch:dev",
|
"watch": "npm run watch:dev",
|
||||||
"debug-win": "powershell dist/napcat.ps1",
|
"debug-win": "powershell dist/napcat.ps1",
|
||||||
"lint": "eslint --fix src/**/*.{js,ts}",
|
"lint": "eslint --fix src/**/*.{js,ts}",
|
||||||
"release": "npm run build:prod",
|
"release": "npm run build:prod",
|
||||||
"depend": "cd dist && npm install --omit=dev"
|
"depend": "cd dist && npm install --omit=dev"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@log4js-node/log4js-api": "^1.0.2",
|
"@log4js-node/log4js-api": "^1.0.2",
|
||||||
"@rollup/plugin-commonjs": "^25.0.7",
|
"@protobuf-ts/plugin": "^2.9.4",
|
||||||
"@rollup/plugin-node-resolve": "^15.2.3",
|
"@rollup/plugin-node-resolve": "^15.2.3",
|
||||||
"@rollup/plugin-typescript": "^11.1.6",
|
"@rollup/plugin-typescript": "^11.1.6",
|
||||||
"@types/cors": "^2.8.17",
|
"@types/cors": "^2.8.17",
|
||||||
"@types/express": "^4.17.21",
|
"@types/express": "^4.17.21",
|
||||||
"@types/figlet": "^1.5.8",
|
"@types/figlet": "^1.5.8",
|
||||||
"@types/fluent-ffmpeg": "^2.1.24",
|
"@types/fluent-ffmpeg": "^2.1.24",
|
||||||
"@types/node": "^20.11.30",
|
"@types/node": "^20.11.30",
|
||||||
"@types/qrcode-terminal": "^0.12.2",
|
"@types/qrcode-terminal": "^0.12.2",
|
||||||
"@types/uuid": "^9.0.8",
|
"@types/uuid": "^9.0.8",
|
||||||
"@types/ws": "^8.5.10",
|
"@types/ws": "^8.5.10",
|
||||||
"@typescript-eslint/eslint-plugin": "^7.4.0",
|
"@typescript-eslint/eslint-plugin": "^7.4.0",
|
||||||
"@typescript-eslint/parser": "^7.4.0",
|
"@typescript-eslint/parser": "^7.4.0",
|
||||||
"eslint": "^8.57.0",
|
"eslint": "^8.57.0",
|
||||||
"eslint-import-resolver-typescript": "^3.6.1",
|
"eslint-import-resolver-typescript": "^3.6.1",
|
||||||
"eslint-plugin-import": "^2.29.1",
|
"eslint-plugin-import": "^2.29.1",
|
||||||
"i": "^0.3.7",
|
"i": "^0.3.7",
|
||||||
"javascript-obfuscator": "^4.1.0",
|
"javascript-obfuscator": "^4.1.0",
|
||||||
"protobufjs-cli": "^1.1.2",
|
"rollup": "^4.13.2",
|
||||||
"rollup": "^4.13.2",
|
"rollup-plugin-dts": "^6.1.0",
|
||||||
"rollup-plugin-dts": "^6.1.0",
|
"rollup-plugin-obfuscator": "^1.1.0",
|
||||||
"rollup-plugin-obfuscator": "^1.1.0",
|
"typescript": "^5.3.3",
|
||||||
"typescript": "^5.3.3",
|
"vite": "^5.2.6",
|
||||||
"vite": "^5.2.6",
|
"vite-plugin-cp": "^4.0.8",
|
||||||
"vite-plugin-cp": "^4.0.8",
|
"vite-plugin-dts": "^3.8.2",
|
||||||
"vite-plugin-dts": "^3.8.2",
|
"vite-tsconfig-paths": "^4.3.2"
|
||||||
"vite-tsconfig-paths": "^4.3.2"
|
},
|
||||||
},
|
"dependencies": {
|
||||||
"dependencies": {
|
"ajv": "^8.13.0",
|
||||||
"commander": "^12.0.0",
|
"chalk": "^5.3.0",
|
||||||
"cors": "^2.8.5",
|
"commander": "^12.0.0",
|
||||||
"express": "^5.0.0-beta.2",
|
"cors": "^2.8.5",
|
||||||
"fast-xml-parser": "^4.3.6",
|
"express": "^5.0.0-beta.2",
|
||||||
"file-type": "^19.0.0",
|
"fast-xml-parser": "^4.3.6",
|
||||||
"fluent-ffmpeg": "^2.1.2",
|
"file-type": "^19.0.0",
|
||||||
"image-size": "^1.1.1",
|
"fluent-ffmpeg": "^2.1.2",
|
||||||
"log4js": "^6.9.1",
|
"image-size": "^1.1.1",
|
||||||
"qrcode-terminal": "^0.12.0",
|
"json-schema-to-ts": "^3.1.0",
|
||||||
"silk-wasm": "^3.3.4",
|
"log4js": "^6.9.1",
|
||||||
"sqlite3": "^5.1.7",
|
"qrcode-terminal": "^0.12.0",
|
||||||
"uuid": "^9.0.1",
|
"silk-wasm": "^3.3.4",
|
||||||
"ws": "^8.16.0"
|
"sqlite3": "^5.1.7",
|
||||||
}
|
"uuid": "^9.0.1",
|
||||||
}
|
"ws": "^8.16.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -1,13 +1,42 @@
|
|||||||
let fs = require("fs");
|
const fs = require("fs");
|
||||||
let process = require("process")
|
const process = require("process");
|
||||||
|
|
||||||
console.log("[NapCat] [CheckVersion] 开始检测当前仓库版本...");
|
console.log("[NapCat] [CheckVersion] 开始检测当前仓库版本...");
|
||||||
let currentVersion = require("../package.json").version;
|
try {
|
||||||
let targetVersion = process.env.VERSION;
|
const packageJson = require("../package.json");
|
||||||
console.log("[NapCat] [CheckVersion] currentVersion:", currentVersion, " targetVersion:", targetVersion);
|
const currentVersion = packageJson.version;
|
||||||
// fs.mkdirSync("./dist");
|
const targetVersion = process.env.VERSION;
|
||||||
if (currentVersion === targetVersion) {
|
|
||||||
fs.writeFileSync("./checkVersion.sh", "#!/bin/bashe\necho \"CheckVersion Is Done\"")
|
console.log("[NapCat] [CheckVersion] currentVersion:", currentVersion, "targetVersion:", targetVersion);
|
||||||
} else {
|
|
||||||
let runscript = "sed -i 's/\"version\": \"" + currentVersion + "\"/\"version\": \"" + targetVersion + "\"/g' package.json";
|
// 验证 targetVersion 格式
|
||||||
fs.writeFileSync("./checkVersion.sh", "#!/bin/bashe\ngit config --global user.email \"bot@test.wumiao.wang\"\n git config --global user.name \"Version\"\n" + runscript + "\ngit add .\n git commit -m \"chore:version change\"\n git push -u origin main")
|
if (!targetVersion || typeof targetVersion !== 'string') {
|
||||||
}
|
console.error("[NapCat] [CheckVersion] 目标版本格式不正确或未设置!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 写入脚本文件的统一函数
|
||||||
|
const writeScriptToFile = (content) => {
|
||||||
|
fs.writeFileSync("./checkVersion.sh", content, { flag: 'w' });
|
||||||
|
console.log("[NapCat] [CheckVersion] checkVersion.sh 文件已更新。");
|
||||||
|
};
|
||||||
|
|
||||||
|
if (currentVersion === targetVersion) {
|
||||||
|
// 不需要更新版本,写入一个简单的脚本
|
||||||
|
const simpleScript = "#!/bin/bash\necho \"CheckVersion Is Done\"";
|
||||||
|
writeScriptToFile(simpleScript);
|
||||||
|
} else {
|
||||||
|
// 更新版本,构建安全的sed命令
|
||||||
|
const safeScriptContent = `
|
||||||
|
#!/bin/bash
|
||||||
|
git config --global user.email "bot@test.wumiao.wang"
|
||||||
|
git config --global user.name "Version"
|
||||||
|
sed -i "s/\\\"version\\\": \\\"${currentVersion}\\\"/\\\"version\\\": \\\"${targetVersion}\\\"/g" package.json
|
||||||
|
git add .
|
||||||
|
git commit -m "chore:version change"
|
||||||
|
git push -u origin main`;
|
||||||
|
writeScriptToFile(safeScriptContent);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error("[NapCat] [CheckVersion] 检测过程中发生错误:", error);
|
||||||
|
}
|
@@ -15,4 +15,4 @@ for %%a in ("!RetString!") do (
|
|||||||
set "QQPath=!pathWithoutUninstall!QQ.exe"
|
set "QQPath=!pathWithoutUninstall!QQ.exe"
|
||||||
set ELECTRON_RUN_AS_NODE=1
|
set ELECTRON_RUN_AS_NODE=1
|
||||||
echo !QQPath!
|
echo !QQPath!
|
||||||
"!QQPath!" ./napcat.cjs %*
|
"!QQPath!" ./napcat.mjs %*
|
||||||
|
@@ -5,11 +5,39 @@ function Get-QQpath {
|
|||||||
return [System.IO.Path]::GetDirectoryName($uninstallString) + "\QQ.exe"
|
return [System.IO.Path]::GetDirectoryName($uninstallString) + "\QQ.exe"
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
return "D:\QQ.exe"
|
throw "get QQ path error: $_"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
function Select-QQPath {
|
||||||
|
Add-Type -AssemblyName System.Windows.Forms
|
||||||
|
[System.Windows.Forms.Application]::EnableVisualStyles()
|
||||||
|
|
||||||
|
$dialogTitle = "Select QQ.exe"
|
||||||
|
|
||||||
|
$filePicker = New-Object System.Windows.Forms.OpenFileDialog
|
||||||
|
$filePicker.Title = $dialogTitle
|
||||||
|
$filePicker.Filter = "Executable Files (*.exe)|*.exe|All Files (*.*)|*.*"
|
||||||
|
$filePicker.FilterIndex = 1
|
||||||
|
$null = $filePicker.ShowDialog()
|
||||||
|
if (-not ($filePicker.FileName)) {
|
||||||
|
throw "User did not select an .exe file."
|
||||||
|
}
|
||||||
|
return $filePicker.FileName
|
||||||
|
}
|
||||||
|
|
||||||
$params = $args -join " "
|
$params = $args -join " "
|
||||||
$QQpath = Get-QQpath
|
Try {
|
||||||
$Bootfile = Join-Path $PSScriptRoot "napcat.cjs"
|
$QQpath = Get-QQpath
|
||||||
|
}
|
||||||
|
Catch {
|
||||||
|
$QQpath = Select-QQPath
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(Test-Path $QQpath)) {
|
||||||
|
throw "provided QQ path is invalid: $QQpath"
|
||||||
|
}
|
||||||
|
|
||||||
|
$Bootfile = Join-Path $PSScriptRoot "napcat.mjs"
|
||||||
$env:ELECTRON_RUN_AS_NODE = 1
|
$env:ELECTRON_RUN_AS_NODE = 1
|
||||||
Start-Process powershell -ArgumentList "-noexit", "-noprofile", "-command &{& chcp 65001;& '$QQpath' $Bootfile $params}"
|
$commandInfo = Get-Command $QQpath -ErrorAction Stop
|
||||||
|
Start-Process powershell -ArgumentList "-noexit", "-noprofile", "-command &{& chcp 65001;& '$($commandInfo.Path)' $Bootfile $params}"
|
@@ -14,4 +14,4 @@ for %%a in ("!RetString!") do (
|
|||||||
set "QQPath=!pathWithoutUninstall!QQ.exe"
|
set "QQPath=!pathWithoutUninstall!QQ.exe"
|
||||||
set ELECTRON_RUN_AS_NODE=1
|
set ELECTRON_RUN_AS_NODE=1
|
||||||
echo !QQPath!
|
echo !QQPath!
|
||||||
"!QQPath!" ./napcat.cjs %*
|
"!QQPath!" ./napcat.mjs %*
|
||||||
|
@@ -5,11 +5,39 @@ function Get-QQpath {
|
|||||||
return [System.IO.Path]::GetDirectoryName($uninstallString) + "\QQ.exe"
|
return [System.IO.Path]::GetDirectoryName($uninstallString) + "\QQ.exe"
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
return "D:\QQ.exe"
|
throw "get QQ path error: $_"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
function Select-QQPath {
|
||||||
|
Add-Type -AssemblyName System.Windows.Forms
|
||||||
|
[System.Windows.Forms.Application]::EnableVisualStyles()
|
||||||
|
|
||||||
|
$dialogTitle = "Select QQ.exe"
|
||||||
|
|
||||||
|
$filePicker = New-Object System.Windows.Forms.OpenFileDialog
|
||||||
|
$filePicker.Title = $dialogTitle
|
||||||
|
$filePicker.Filter = "Executable Files (*.exe)|*.exe|All Files (*.*)|*.*"
|
||||||
|
$filePicker.FilterIndex = 1
|
||||||
|
$null = $filePicker.ShowDialog()
|
||||||
|
if (-not ($filePicker.FileName)) {
|
||||||
|
throw "User did not select an .exe file."
|
||||||
|
}
|
||||||
|
return $filePicker.FileName
|
||||||
|
}
|
||||||
|
|
||||||
$params = $args -join " "
|
$params = $args -join " "
|
||||||
$QQpath = Get-QQpath
|
Try {
|
||||||
$Bootfile = Join-Path $PSScriptRoot "napcat.cjs"
|
$QQpath = Get-QQpath
|
||||||
|
}
|
||||||
|
Catch {
|
||||||
|
$QQpath = Select-QQPath
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(Test-Path $QQpath)) {
|
||||||
|
throw "provided QQ path is invalid: $QQpath"
|
||||||
|
}
|
||||||
|
|
||||||
|
$Bootfile = Join-Path $PSScriptRoot "napcat.mjs"
|
||||||
$env:ELECTRON_RUN_AS_NODE = 1
|
$env:ELECTRON_RUN_AS_NODE = 1
|
||||||
Start-Process powershell -ArgumentList "-noexit", "-noprofile", "-command &{& '$QQpath' $Bootfile $params}"
|
$commandInfo = Get-Command $QQpath -ErrorAction Stop
|
||||||
|
Start-Process powershell -ArgumentList "-noexit", "-noprofile", "-command &{& '$($commandInfo.Path)' $Bootfile $params}"
|
@@ -1,4 +1,21 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
SCRIPT_DIR=$(realpath $(dirname "${BASH_SOURCE[0]}"))
|
|
||||||
|
get_script_dir() {
|
||||||
|
local script_path="${1:-$0}"
|
||||||
|
local script_dir
|
||||||
|
script_path=$(readlink -f "$script_path")
|
||||||
|
script_dir=$(dirname "$script_path")
|
||||||
|
|
||||||
|
echo "$script_dir"
|
||||||
|
}
|
||||||
|
|
||||||
|
SCRIPT_DIR=$(get_script_dir)
|
||||||
|
|
||||||
export ELECTRON_RUN_AS_NODE=1
|
export ELECTRON_RUN_AS_NODE=1
|
||||||
/opt/QQ/qq ${SCRIPT_DIR}/napcat.cjs $@
|
|
||||||
|
if ! [ -x /opt/QQ/qq ]; then
|
||||||
|
echo "Error: /opt/QQ/qq is not executable or does not exist." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
/opt/QQ/qq "${SCRIPT_DIR}/napcat.mjs" "$@"
|
||||||
|
@@ -37,14 +37,14 @@ export abstract class HttpServerBase {
|
|||||||
const authHeader = req.get('authorization');
|
const authHeader = req.get('authorization');
|
||||||
if (authHeader) {
|
if (authHeader) {
|
||||||
clientToken = authHeader.split('Bearer ').pop() || '';
|
clientToken = authHeader.split('Bearer ').pop() || '';
|
||||||
logDebug('receive http header token', clientToken);
|
//logDebug('receive http header token', clientToken);
|
||||||
} else if (req.query.access_token) {
|
} else if (req.query.access_token) {
|
||||||
if (Array.isArray(req.query.access_token)) {
|
if (Array.isArray(req.query.access_token)) {
|
||||||
clientToken = req.query.access_token[0].toString();
|
clientToken = req.query.access_token[0].toString();
|
||||||
} else {
|
} else {
|
||||||
clientToken = req.query.access_token.toString();
|
clientToken = req.query.access_token.toString();
|
||||||
}
|
}
|
||||||
logDebug('receive http url token', clientToken);
|
//logDebug('receive http url token', clientToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (serverToken && clientToken != serverToken) {
|
if (serverToken && clientToken != serverToken) {
|
||||||
@@ -61,12 +61,12 @@ export abstract class HttpServerBase {
|
|||||||
this.listen(port, host);
|
this.listen(port, host);
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
logError('HTTP服务启动失败', e.toString());
|
logError('HTTP服务启动失败', e.toString());
|
||||||
// llonebotError.httpServerError = "HTTP服务启动失败, " + e.toString()
|
// httpServerError = "HTTP服务启动失败, " + e.toString()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stop() {
|
stop() {
|
||||||
// llonebotError.httpServerError = ""
|
// httpServerError = ""
|
||||||
if (this.server) {
|
if (this.server) {
|
||||||
this.server.close();
|
this.server.close();
|
||||||
this.server = null;
|
this.server = null;
|
||||||
@@ -114,8 +114,10 @@ export abstract class HttpServerBase {
|
|||||||
this.server = this.expressAPP.listen(port, host, () => {
|
this.server = this.expressAPP.listen(port, host, () => {
|
||||||
const info = `${this.name} started ${host}:${port}`;
|
const info = `${this.name} started ${host}:${port}`;
|
||||||
log(info);
|
log(info);
|
||||||
|
}).on('error', (err) => {
|
||||||
|
logError('HTTP服务启动失败', err.toString());
|
||||||
});
|
});
|
||||||
}catch (e: any) {
|
} catch (e: any) {
|
||||||
logError('HTTP服务启动失败, 请检查监听的ip地址和端口', e.stack.toString());
|
logError('HTTP服务启动失败, 请检查监听的ip地址和端口', e.stack.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -30,9 +30,10 @@ export class WebsocketServerBase {
|
|||||||
start(port: number, host: string = '') {
|
start(port: number, host: string = '') {
|
||||||
try {
|
try {
|
||||||
this.ws = new WebSocketServer({
|
this.ws = new WebSocketServer({
|
||||||
port ,
|
port,
|
||||||
host: '',
|
host: '',
|
||||||
maxPayload: 1024 * 1024 * 1024
|
maxPayload: 1024 * 1024 * 1024
|
||||||
|
}).on('error', () => {
|
||||||
});
|
});
|
||||||
log(`ws服务启动成功, ${host}:${port}`);
|
log(`ws服务启动成功, ${host}:${port}`);
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
import { sleep } from '@/common/utils/helper';
|
import { sleep } from '@/common/utils/helper';
|
||||||
|
import { logError } from './log';
|
||||||
type AsyncQueueTask = (() => void) | (()=>Promise<void>);
|
type AsyncQueueTask = (() => void) | (()=>Promise<void>);
|
||||||
|
|
||||||
|
|
||||||
@@ -26,7 +26,8 @@ export class AsyncQueue {
|
|||||||
await taskRet;
|
await taskRet;
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(e);
|
// console.error(e);
|
||||||
|
logError(e);
|
||||||
}
|
}
|
||||||
this.tasks.shift();
|
this.tasks.shift();
|
||||||
await sleep(100);
|
await sleep(100);
|
||||||
|
@@ -1,6 +1,12 @@
|
|||||||
import path from 'node:path';
|
import path from 'node:path';
|
||||||
import fs from 'node:fs';
|
import fs from 'node:fs';
|
||||||
import { log, logDebug, logError } from '@/common/utils/log';
|
import { log, logDebug, logError } from '@/common/utils/log';
|
||||||
|
import { dirname } from 'node:path';
|
||||||
|
import { fileURLToPath } from 'node:url';
|
||||||
|
|
||||||
|
|
||||||
|
const __filename = fileURLToPath(import.meta.url);
|
||||||
|
const __dirname = dirname(__filename);
|
||||||
|
|
||||||
const configDir = path.resolve(__dirname, 'config');
|
const configDir = path.resolve(__dirname, 'config');
|
||||||
fs.mkdirSync(configDir, { recursive: true });
|
fs.mkdirSync(configDir, { recursive: true });
|
||||||
|
182
src/common/utils/EventTask.ts
Normal file
182
src/common/utils/EventTask.ts
Normal file
@@ -0,0 +1,182 @@
|
|||||||
|
import { NodeIKernelMsgListener } from '@/core';
|
||||||
|
import { NodeIQQNTWrapperSession } from '@/core/wrapper';
|
||||||
|
import { randomUUID } from 'crypto';
|
||||||
|
|
||||||
|
interface Internal_MapKey {
|
||||||
|
timeout: number,
|
||||||
|
createtime: number,
|
||||||
|
func: (...arg: any[]) => any,
|
||||||
|
}
|
||||||
|
|
||||||
|
export class ListenerClassBase {
|
||||||
|
[key: string]: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ListenerIBase {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-misused-new
|
||||||
|
new(listener: any): ListenerClassBase;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class NTEventWrapper {
|
||||||
|
|
||||||
|
private ListenerMap: { [key: string]: ListenerIBase } | undefined;//ListenerName-Unique -> Listener构造函数
|
||||||
|
private WrapperSession: NodeIQQNTWrapperSession | undefined;//WrapperSession
|
||||||
|
private ListenerManger: Map<string, ListenerClassBase> = new Map<string, ListenerClassBase>(); //ListenerName-Unique -> Listener实例
|
||||||
|
private EventTask = new Map<string, Map<string, Map<string, Internal_MapKey>>>();//tasks ListenerMainName -> ListenerSubName-> uuid -> {timeout,createtime,func}
|
||||||
|
constructor() {
|
||||||
|
|
||||||
|
}
|
||||||
|
createProxyDispatch(ListenerMainName: string) {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
||||||
|
const current = this;
|
||||||
|
return new Proxy({}, {
|
||||||
|
get(target: any, prop: any, receiver: any) {
|
||||||
|
// console.log('get', prop, typeof target[prop]);
|
||||||
|
if (typeof target[prop] === 'undefined') {
|
||||||
|
// 如果方法不存在,返回一个函数,这个函数调用existentMethod
|
||||||
|
return (...args: any[]) => {
|
||||||
|
current.DispatcherListener.apply(current, [ListenerMainName, prop, ...args]).then();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// 如果方法存在,正常返回
|
||||||
|
return Reflect.get(target, prop, receiver);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
init({ ListenerMap, WrapperSession }: { ListenerMap: { [key: string]: typeof ListenerClassBase }, WrapperSession: NodeIQQNTWrapperSession }) {
|
||||||
|
this.ListenerMap = ListenerMap;
|
||||||
|
this.WrapperSession = WrapperSession;
|
||||||
|
}
|
||||||
|
CreatEventFunction<T extends (...args: any) => any>(eventName: string): T | undefined {
|
||||||
|
const eventNameArr = eventName.split('/');
|
||||||
|
type eventType = {
|
||||||
|
[key: string]: () => { [key: string]: (...params: Parameters<T>) => Promise<ReturnType<T>> }
|
||||||
|
}
|
||||||
|
if (eventNameArr.length > 1) {
|
||||||
|
const serviceName = 'get' + eventNameArr[0].replace('NodeIKernel', '');
|
||||||
|
const eventName = eventNameArr[1];
|
||||||
|
//getNodeIKernelGroupListener,GroupService
|
||||||
|
//console.log('2', eventName);
|
||||||
|
const services = (this.WrapperSession as unknown as eventType)[serviceName]();
|
||||||
|
let event = services[eventName];
|
||||||
|
//重新绑定this
|
||||||
|
event = event.bind(services);
|
||||||
|
if (event) {
|
||||||
|
return event as T;
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
CreatListenerFunction<T>(listenerMainName: string, uniqueCode: string = ''): T {
|
||||||
|
const ListenerType = this.ListenerMap![listenerMainName];
|
||||||
|
let Listener = this.ListenerManger.get(listenerMainName + uniqueCode);
|
||||||
|
if (!Listener && ListenerType) {
|
||||||
|
Listener = new ListenerType(this.createProxyDispatch(listenerMainName));
|
||||||
|
const ServiceSubName = listenerMainName.match(/^NodeIKernel(.*?)Listener$/)![1];
|
||||||
|
const Service = 'NodeIKernel' + ServiceSubName + 'Service/addKernel' + ServiceSubName + 'Listener';
|
||||||
|
const addfunc = this.CreatEventFunction<(listener: T) => number>(Service);
|
||||||
|
addfunc!(Listener as T);
|
||||||
|
//console.log(addfunc!(Listener as T));
|
||||||
|
this.ListenerManger.set(listenerMainName + uniqueCode, Listener);
|
||||||
|
}
|
||||||
|
return Listener as T;
|
||||||
|
}
|
||||||
|
//统一回调清理事件
|
||||||
|
async DispatcherListener(ListenerMainName: string, ListenerSubName: string, ...args: any[]) {
|
||||||
|
//console.log(ListenerMainName, this.EventTask.get(ListenerMainName), ListenerSubName, this.EventTask.get(ListenerMainName)?.get(ListenerSubName));
|
||||||
|
this.EventTask.get(ListenerMainName)?.get(ListenerSubName)?.forEach((task, uuid) => {
|
||||||
|
//console.log(task.func, uuid, task.createtime, task.timeout);
|
||||||
|
if (task.createtime + task.timeout < Date.now()) {
|
||||||
|
this.EventTask.get(ListenerMainName)?.get(ListenerSubName)?.delete(uuid);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
task.func(...args);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
async CallNoListenerEvent<EventType extends (...args: any[]) => Promise<any>,>(EventName = '', timeout: number = 3000, ...args: Parameters<EventType>) {
|
||||||
|
return new Promise<Awaited<ReturnType<EventType>>>(async (resolve, reject) => {
|
||||||
|
const EventFunc = this.CreatEventFunction<EventType>(EventName);
|
||||||
|
let complete = false;
|
||||||
|
const Timeouter = setTimeout(() => {
|
||||||
|
if (!complete) {
|
||||||
|
reject(new Error('NTEvent EventName:' + EventName + ' timeout'));
|
||||||
|
}
|
||||||
|
}, timeout);
|
||||||
|
const retData = await EventFunc!(...args);
|
||||||
|
complete = true;
|
||||||
|
resolve(retData);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
async CallNormalEvent<EventType extends (...args: any[]) => Promise<any>, ListenerType extends (...args: any[]) => void>(EventName = '', ListenerName = '', waitTimes = 1, timeout: number = 3000, ...args: Parameters<EventType>) {
|
||||||
|
return new Promise<[EventRet: Awaited<ReturnType<EventType>>, ...Parameters<ListenerType>]>(async (resolve, reject) => {
|
||||||
|
const id = randomUUID();
|
||||||
|
let complete = 0;
|
||||||
|
let retData: Parameters<ListenerType> | undefined = undefined;
|
||||||
|
let retEvent: any = {};
|
||||||
|
const databack = () => {
|
||||||
|
if (complete < waitTimes) {
|
||||||
|
reject(new Error('NTEvent EventName:' + EventName + ' ListenerName:' + ListenerName + ' timeout'));
|
||||||
|
} else {
|
||||||
|
resolve([retEvent as Awaited<ReturnType<EventType>>, ...retData!]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const Timeouter = setTimeout(databack, timeout);
|
||||||
|
|
||||||
|
const ListenerNameList = ListenerName.split('/');
|
||||||
|
const ListenerMainName = ListenerNameList[0];
|
||||||
|
const ListenerSubName = ListenerNameList[1];
|
||||||
|
const eventCallbak = {
|
||||||
|
timeout: timeout,
|
||||||
|
createtime: Date.now(),
|
||||||
|
func: (...args: any[]) => {
|
||||||
|
complete++;
|
||||||
|
//console.log('func', ...args);
|
||||||
|
retData = args as Parameters<ListenerType>;
|
||||||
|
if (complete >= waitTimes) {
|
||||||
|
clearTimeout(Timeouter);
|
||||||
|
databack();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if (!this.EventTask.get(ListenerMainName)) {
|
||||||
|
this.EventTask.set(ListenerMainName, new Map());
|
||||||
|
}
|
||||||
|
if (!(this.EventTask.get(ListenerMainName)?.get(ListenerSubName))) {
|
||||||
|
this.EventTask.get(ListenerMainName)?.set(ListenerSubName, new Map());
|
||||||
|
}
|
||||||
|
this.EventTask.get(ListenerMainName)?.get(ListenerSubName)?.set(id, eventCallbak);
|
||||||
|
this.CreatListenerFunction(ListenerMainName);
|
||||||
|
const EventFunc = this.CreatEventFunction<EventType>(EventName);
|
||||||
|
//console.log("测试打点", args);
|
||||||
|
retEvent = await EventFunc!(...(args as any[]));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export const NTEventDispatch = new NTEventWrapper();
|
||||||
|
|
||||||
|
// 示例代码 快速创建事件
|
||||||
|
// let NTEvent = new NTEventWrapper();
|
||||||
|
// let TestEvent = NTEvent.CreatEventFunction<(force: boolean) => Promise<Number>>('NodeIKernelProfileLikeService/GetTest');
|
||||||
|
// if (TestEvent) {
|
||||||
|
// TestEvent(true);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// 示例代码 快速创建监听Listener类
|
||||||
|
// let NTEvent = new NTEventWrapper();
|
||||||
|
// NTEvent.CreatListenerFunction<NodeIKernelMsgListener>('NodeIKernelMsgListener', 'core')
|
||||||
|
|
||||||
|
|
||||||
|
// 调用接口
|
||||||
|
//let NTEvent = new NTEventWrapper();
|
||||||
|
//let ret = await NTEvent.CallNormalEvent<(force: boolean) => Promise<Number>, (data1: string, data2: number) => void>('NodeIKernelProfileLikeService/GetTest', 'NodeIKernelMsgListener/onAddSendMsg', 1, 3000, true);
|
||||||
|
|
||||||
|
// 注册监听 解除监听
|
||||||
|
// NTEventDispatch.RigisterListener('NodeIKernelMsgListener/onAddSendMsg','core',cb);
|
||||||
|
// NTEventDispatch.UnRigisterListener('NodeIKernelMsgListener/onAddSendMsg','core');
|
||||||
|
|
||||||
|
// let GetTest = NTEventDispatch.CreatEvent('NodeIKernelProfileLikeService/GetTest','NodeIKernelMsgListener/onAddSendMsg',Mode);
|
||||||
|
// GetTest('test');
|
||||||
|
|
||||||
|
// always模式
|
||||||
|
// NTEventDispatch.CreatEvent('NodeIKernelProfileLikeService/GetTest','NodeIKernelMsgListener/onAddSendMsg',Mode,(...args:any[])=>{ console.log(args) });
|
145
src/common/utils/LRUCache.ts
Normal file
145
src/common/utils/LRUCache.ts
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
import { logError, logDebug } from '@/common/utils/log';
|
||||||
|
|
||||||
|
type group_id = number;
|
||||||
|
type user_id = number;
|
||||||
|
|
||||||
|
class cacheNode<T> {
|
||||||
|
value: T;
|
||||||
|
groupId: group_id;
|
||||||
|
userId: user_id;
|
||||||
|
prev: cacheNode<T> | null;
|
||||||
|
next: cacheNode<T> | null;
|
||||||
|
timestamp: number;
|
||||||
|
|
||||||
|
constructor(groupId: group_id, userId: user_id, value: T) {
|
||||||
|
this.groupId = groupId;
|
||||||
|
this.userId = userId;
|
||||||
|
this.value = value;
|
||||||
|
this.prev = null;
|
||||||
|
this.next = null;
|
||||||
|
this.timestamp = Date.now();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type cache<T> = { [key: group_id]: { [key: user_id]: cacheNode<T> } };
|
||||||
|
class LRU<T> {
|
||||||
|
private maxAge: number;
|
||||||
|
private maxSize: number;
|
||||||
|
private currentSize: number;
|
||||||
|
private cache: cache<T>;
|
||||||
|
private head: cacheNode<T> | null = null;
|
||||||
|
private tail: cacheNode<T> | null = null;
|
||||||
|
private onFuncs: ((node: cacheNode<T>) => void)[] = [];
|
||||||
|
|
||||||
|
constructor(maxAge: number = 2e4, maxSize: number = 5e3) {
|
||||||
|
this.maxAge = maxAge;
|
||||||
|
this.maxSize = maxSize;
|
||||||
|
this.cache = Object.create(null);
|
||||||
|
this.currentSize = 0;
|
||||||
|
|
||||||
|
if (maxSize == 0) return;
|
||||||
|
setInterval(() => this.removeExpired(), this.maxAge);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 移除LRU节点
|
||||||
|
private removeLRUNode(node: cacheNode<T>) {
|
||||||
|
logDebug(
|
||||||
|
'removeLRUNode',
|
||||||
|
node.groupId,
|
||||||
|
node.userId,
|
||||||
|
node.value,
|
||||||
|
this.currentSize
|
||||||
|
);
|
||||||
|
node.prev = node.next = null;
|
||||||
|
delete this.cache[node.groupId][node.userId];
|
||||||
|
this.removeNode(node);
|
||||||
|
this.onFuncs.forEach((func) => func(node));
|
||||||
|
this.currentSize--;
|
||||||
|
}
|
||||||
|
|
||||||
|
public on(func: (node: cacheNode<T>) => void) {
|
||||||
|
this.onFuncs.push(func);
|
||||||
|
}
|
||||||
|
|
||||||
|
private removeExpired() {
|
||||||
|
const now = Date.now();
|
||||||
|
let current = this.tail;
|
||||||
|
const nodesToRemove: cacheNode<T>[] = [];
|
||||||
|
let removedCount = 0;
|
||||||
|
|
||||||
|
// 收集需要删除的节点
|
||||||
|
while (current && now - current.timestamp > this.maxAge) {
|
||||||
|
nodesToRemove.push(current);
|
||||||
|
current = current.prev;
|
||||||
|
removedCount++;
|
||||||
|
if (removedCount >= 100) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新链表指向
|
||||||
|
if (nodesToRemove.length > 0) {
|
||||||
|
const newTail = nodesToRemove[nodesToRemove.length - 1].prev;
|
||||||
|
if (newTail) {
|
||||||
|
newTail.next = null;
|
||||||
|
} else {
|
||||||
|
this.head = null;
|
||||||
|
}
|
||||||
|
this.tail = newTail;
|
||||||
|
}
|
||||||
|
|
||||||
|
nodesToRemove.forEach((node) => {
|
||||||
|
node.prev = node.next = null;
|
||||||
|
delete this.cache[node.groupId][node.userId];
|
||||||
|
|
||||||
|
this.currentSize--;
|
||||||
|
this.onFuncs.forEach((func) => func(node));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private addNode(node: cacheNode<T>) {
|
||||||
|
node.next = this.head;
|
||||||
|
if (this.head) this.head.prev = node;
|
||||||
|
if (!this.tail) this.tail = node;
|
||||||
|
this.head = node;
|
||||||
|
}
|
||||||
|
|
||||||
|
private removeNode(node: cacheNode<T>) {
|
||||||
|
if (node.prev) node.prev.next = node.next;
|
||||||
|
if (node.next) node.next.prev = node.prev;
|
||||||
|
if (node === this.head) this.head = node.next;
|
||||||
|
if (node === this.tail) this.tail = node.prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
private moveToHead(node: cacheNode<T>) {
|
||||||
|
if (this.head === node) return;
|
||||||
|
|
||||||
|
this.removeNode(node);
|
||||||
|
this.addNode(node);
|
||||||
|
node.prev = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public set(groupId: group_id, userId: user_id, value: T) {
|
||||||
|
if (!this.cache[groupId]) {
|
||||||
|
this.cache[groupId] = Object.create(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
const groupObject = this.cache[groupId];
|
||||||
|
|
||||||
|
if (groupObject[userId]) {
|
||||||
|
const node = groupObject[userId];
|
||||||
|
node.value = value;
|
||||||
|
node.timestamp = Date.now();
|
||||||
|
this.moveToHead(node);
|
||||||
|
} else {
|
||||||
|
const node = new cacheNode(groupId, userId, value);
|
||||||
|
groupObject[userId] = node;
|
||||||
|
this.currentSize++;
|
||||||
|
this.addNode(node);
|
||||||
|
if (this.currentSize > this.maxSize) {
|
||||||
|
const tail = this.tail!;
|
||||||
|
this.removeLRUNode(tail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default LRU;
|
@@ -2,6 +2,7 @@ import path from 'node:path';
|
|||||||
import fs from 'node:fs';
|
import fs from 'node:fs';
|
||||||
import os from 'node:os';
|
import os from 'node:os';
|
||||||
import { systemPlatform } from '@/common/utils/system';
|
import { systemPlatform } from '@/common/utils/system';
|
||||||
|
import { logError } from '@/common/utils/log';
|
||||||
|
|
||||||
export const exePath = process.execPath;
|
export const exePath = process.execPath;
|
||||||
|
|
||||||
@@ -49,13 +50,13 @@ if (fs.existsSync(configVersionInfoPath)) {
|
|||||||
const _ =JSON.parse(fs.readFileSync(configVersionInfoPath).toString());
|
const _ =JSON.parse(fs.readFileSync(configVersionInfoPath).toString());
|
||||||
_qqVersionConfigInfo = Object.assign(_qqVersionConfigInfo, _);
|
_qqVersionConfigInfo = Object.assign(_qqVersionConfigInfo, _);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('Load QQ version config info failed, Use default version', e);
|
logError('Load QQ version config info failed, Use default version', e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const qqVersionConfigInfo: QQVersionConfigInfo = _qqVersionConfigInfo;
|
export const qqVersionConfigInfo: QQVersionConfigInfo = _qqVersionConfigInfo;
|
||||||
|
|
||||||
export const qqPkgInfo: QQPkgInfo = require(pkgInfoPath);
|
export const qqPkgInfo: QQPkgInfo = JSON.parse(fs.readFileSync(pkgInfoPath).toString());
|
||||||
// platform_type: 3,
|
// platform_type: 3,
|
||||||
// app_type: 4,
|
// app_type: 4,
|
||||||
// app_version: '9.9.9-23159',
|
// app_version: '9.9.9-23159',
|
||||||
|
@@ -24,7 +24,7 @@ export async function encodeSilk(filePath: string) {
|
|||||||
const fileHeader = buffer.toString('hex', 0, bytesToRead);
|
const fileHeader = buffer.toString('hex', 0, bytesToRead);
|
||||||
return fileHeader;
|
return fileHeader;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('读取文件错误:', err);
|
logError('读取文件错误:', err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,11 @@
|
|||||||
import * as os from 'os';
|
import * as os from 'os';
|
||||||
import path from 'node:path';
|
import path from 'node:path';
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
|
import { dirname } from 'node:path';
|
||||||
|
import { fileURLToPath } from 'node:url';
|
||||||
|
|
||||||
|
const __filename = fileURLToPath(import.meta.url);
|
||||||
|
const __dirname = dirname(__filename);
|
||||||
export function getModuleWithArchName(moduleName: string) {
|
export function getModuleWithArchName(moduleName: string) {
|
||||||
const systemPlatform = os.platform();
|
const systemPlatform = os.platform();
|
||||||
const cpuArch = os.arch();
|
const cpuArch = os.arch();
|
||||||
@@ -14,6 +18,6 @@ export function cpModule(moduleName: string) {
|
|||||||
try {
|
try {
|
||||||
fs.copyFileSync(path.join(currentDir, fileName), path.join(currentDir, `${moduleName}.node`));
|
fs.copyFileSync(path.join(currentDir, fileName), path.join(currentDir, `${moduleName}.node`));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
509
src/common/utils/db.ts
Normal file
509
src/common/utils/db.ts
Normal file
@@ -0,0 +1,509 @@
|
|||||||
|
import { ElementType, FileElement, PicElement, PttElement, RawMessage, VideoElement } from '../../core/src/entities';
|
||||||
|
|
||||||
|
import sqlite3 from 'sqlite3';
|
||||||
|
import { log, logDebug, logError } from '@/common/utils/log';
|
||||||
|
import { NTQQMsgApi } from '@/core';
|
||||||
|
import LRU from '@/common/utils/LRUCache';
|
||||||
|
|
||||||
|
export interface IRember {
|
||||||
|
last_sent_time: number;
|
||||||
|
join_time: number;
|
||||||
|
user_id: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
type DBMsg = {
|
||||||
|
id: number,
|
||||||
|
shortId: number,
|
||||||
|
longId: string,
|
||||||
|
seq: number,
|
||||||
|
peerUid: string,
|
||||||
|
chatType: number,
|
||||||
|
}
|
||||||
|
|
||||||
|
type DBFile = {
|
||||||
|
name: string; // 文件名
|
||||||
|
path: string;
|
||||||
|
url: string;
|
||||||
|
size: number;
|
||||||
|
uuid: string;
|
||||||
|
msgId: string;
|
||||||
|
elementId: string;
|
||||||
|
element: PicElement | VideoElement | FileElement | PttElement;
|
||||||
|
elementType: ElementType.PIC | ElementType.VIDEO | ElementType.FILE | ElementType.PTT;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class DBUtilBase {
|
||||||
|
protected db: sqlite3.Database | undefined;
|
||||||
|
|
||||||
|
async init(dbPath: string) {
|
||||||
|
if (this.db) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return new Promise<void>((resolve, reject) => {
|
||||||
|
this.db = new sqlite3.Database(dbPath, sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, (err) => {
|
||||||
|
if (err) {
|
||||||
|
logError('Could not connect to database', err);
|
||||||
|
reject(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.createTable();
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected createTable() {
|
||||||
|
throw new Error('Method not implemented.');
|
||||||
|
}
|
||||||
|
|
||||||
|
close() {
|
||||||
|
this.db?.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class DBUtil extends DBUtilBase {
|
||||||
|
private msgCache: Map<string | number, RawMessage> = new Map<string | number, RawMessage>();
|
||||||
|
private globalMsgShortId = -2147483640;
|
||||||
|
private groupIds: number[] = [];
|
||||||
|
private LURCache = new LRU<number>();
|
||||||
|
private LastSentCache = new (class {
|
||||||
|
private cache: { gid: number; uid: number }[] = [];
|
||||||
|
private maxSize: number;
|
||||||
|
|
||||||
|
constructor(maxSize: number = 5000) {
|
||||||
|
this.maxSize = maxSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
get(gid: number, uid: number): boolean {
|
||||||
|
const exists = this.cache.some(
|
||||||
|
(entry) => entry.gid === gid && entry.uid === uid
|
||||||
|
);
|
||||||
|
if (!exists) {
|
||||||
|
this.cache.push({ gid, uid });
|
||||||
|
if (this.cache.length > this.maxSize) {
|
||||||
|
this.cache.shift();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return exists;
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
const interval = 1000 * 60 * 10; // 10分钟清理一次缓存
|
||||||
|
setInterval(() => {
|
||||||
|
logDebug('清理消息缓存');
|
||||||
|
this.msgCache.forEach((msg, key) => {
|
||||||
|
if ((Date.now() - parseInt(msg.msgTime) * 1000) > interval) {
|
||||||
|
this.msgCache.delete(key);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, interval);
|
||||||
|
}
|
||||||
|
|
||||||
|
async init(dbPath: string) {
|
||||||
|
await super.init(dbPath);
|
||||||
|
this.globalMsgShortId = await this.getCurrentMaxShortId();
|
||||||
|
|
||||||
|
|
||||||
|
// 初始化群缓存列表
|
||||||
|
this.db!.serialize(() => {
|
||||||
|
const sql = 'SELECT * FROM sqlite_master WHERE type=\'table\'';
|
||||||
|
this.db!.all(sql, [], (err, rows: { name: string }[]) => {
|
||||||
|
if (err) return logError(err);
|
||||||
|
rows.forEach((row) => this.groupIds.push(parseInt(row.name)));
|
||||||
|
//logDebug(`已加载 ${groupIds.length} 个群`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
this.LURCache.on(async (node) => {
|
||||||
|
const { value: time, groupId, userId } = node;
|
||||||
|
|
||||||
|
logDebug('插入发言时间', userId, groupId);
|
||||||
|
await this.createGroupInfoTimeTableIfNotExist(groupId);
|
||||||
|
|
||||||
|
const method = await this.getDataSetMethod(groupId, userId);
|
||||||
|
logDebug('插入发言时间方法判断', userId, groupId, method);
|
||||||
|
|
||||||
|
const sql =
|
||||||
|
method == 'update'
|
||||||
|
? `UPDATE "${groupId}" SET last_sent_time = ? WHERE user_id = ?`
|
||||||
|
: `INSERT INTO "${groupId}" (last_sent_time, user_id) VALUES (?, ?)`;
|
||||||
|
|
||||||
|
this.db!.all(sql, [time, userId], (err) => {
|
||||||
|
if (err) {
|
||||||
|
return logError('插入/更新发言时间失败', userId, groupId);
|
||||||
|
}
|
||||||
|
logDebug('插入/更新发言时间成功', userId, groupId);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
async getDataSetMethod(groupId: number, userId: number) {
|
||||||
|
// 缓存记录
|
||||||
|
if (this.LastSentCache.get(groupId, userId)) {
|
||||||
|
logDebug('缓存命中', userId, groupId);
|
||||||
|
return 'update';
|
||||||
|
}
|
||||||
|
|
||||||
|
// 数据库判断
|
||||||
|
return new Promise<'insert' | 'update'>((resolve, reject) => {
|
||||||
|
this.db!.all(
|
||||||
|
`SELECT * FROM "${groupId}" WHERE user_id = ?`,
|
||||||
|
[userId],
|
||||||
|
(err, rows) => {
|
||||||
|
if (err) {
|
||||||
|
logError('查询发言时间存在失败', userId, groupId, err);
|
||||||
|
return logError('插入发言时间失败', userId, groupId, err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rows.length === 0) {
|
||||||
|
logDebug('查询发言时间不存在', userId, groupId);
|
||||||
|
return resolve('insert');
|
||||||
|
}
|
||||||
|
|
||||||
|
logDebug('查询发言时间存在', userId, groupId);
|
||||||
|
resolve('update');
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
async createGroupInfoTimeTableIfNotExist(groupId: number) {
|
||||||
|
const createTableSQL = (groupId: number) =>
|
||||||
|
`CREATE TABLE IF NOT EXISTS "${groupId}" (
|
||||||
|
user_id INTEGER,
|
||||||
|
last_sent_time INTEGER,
|
||||||
|
join_time INTEGER,
|
||||||
|
PRIMARY KEY (user_id)
|
||||||
|
);`;
|
||||||
|
|
||||||
|
if (this.groupIds.includes(groupId)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const sql = createTableSQL(groupId);
|
||||||
|
this.db!.all(sql, (err) => {
|
||||||
|
if (err) {
|
||||||
|
reject(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.groupIds.push(groupId);
|
||||||
|
resolve(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
protected createTable() {
|
||||||
|
// 消息记录
|
||||||
|
const createTableSQL = `
|
||||||
|
CREATE TABLE IF NOT EXISTS msgs (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
shortId INTEGER NOT NULL UNIQUE,
|
||||||
|
longId TEXT NOT NULL UNIQUE,
|
||||||
|
seq INTEGER NOT NULL,
|
||||||
|
peerUid TEXT NOT NULL,
|
||||||
|
chatType INTEGER NOT NULL
|
||||||
|
)`;
|
||||||
|
this.db!.run(createTableSQL, function (err) {
|
||||||
|
if (err) {
|
||||||
|
logError('Could not create table msgs', err.stack);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 文件缓存
|
||||||
|
const createFileTableSQL = `
|
||||||
|
CREATE TABLE IF NOT EXISTS files (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
name TEXT NOT NULL,
|
||||||
|
path TEXT NOT NULL,
|
||||||
|
url TEXT,
|
||||||
|
size INTEGER NOT NULL,
|
||||||
|
uuid TEXT,
|
||||||
|
elementType INTEGER,
|
||||||
|
element TEXT NOT NULL,
|
||||||
|
elementId TEXT NOT NULL,
|
||||||
|
msgId TEXT NOT NULL
|
||||||
|
)`;
|
||||||
|
this.db!.run(createFileTableSQL, function (err) {
|
||||||
|
if (err) {
|
||||||
|
logError('Could not create table files', err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 接收到的临时会话消息uid
|
||||||
|
const createTempUinTableSQL = `
|
||||||
|
CREATE TABLE IF NOT EXISTS temp_uins (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
uid TEXT,
|
||||||
|
uin TEXT
|
||||||
|
)`;
|
||||||
|
this.db!.run(createTempUinTableSQL, function (err) {
|
||||||
|
if (err) {
|
||||||
|
logError('Could not create table temp_uins', err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private async getCurrentMaxShortId() {
|
||||||
|
return new Promise<number>((resolve, reject) => {
|
||||||
|
this.db!.get('SELECT MAX(shortId) as maxId FROM msgs', (err, row: { maxId: number }) => {
|
||||||
|
if (err) {
|
||||||
|
logDebug('Could not get max short id, Use default -2147483640', err);
|
||||||
|
return resolve(-2147483640);
|
||||||
|
}
|
||||||
|
logDebug('数据库中消息最大短id', row?.maxId);
|
||||||
|
resolve(row?.maxId ?? -2147483640);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private async getMsg(query: string, params: any[]) {
|
||||||
|
const stmt = this.db!.prepare(query);
|
||||||
|
return new Promise<RawMessage | null>((resolve, reject) => {
|
||||||
|
stmt.get(...params, (err: any, row: DBMsg) => {
|
||||||
|
// log("getMsg", row, err);
|
||||||
|
if (err) {
|
||||||
|
logError('Could not get msg', err, query, params);
|
||||||
|
return resolve(null);
|
||||||
|
}
|
||||||
|
if (!row) {
|
||||||
|
// logDebug('不存在数据库中的消息,不进行处理', query, params);
|
||||||
|
resolve(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const msgId = row.longId;
|
||||||
|
NTQQMsgApi.getMsgsByMsgId({ peerUid: row.peerUid, chatType: row.chatType }, [msgId]).then(res => {
|
||||||
|
const msg = res.msgList[0];
|
||||||
|
if (!msg) {
|
||||||
|
resolve(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
msg.id = row.shortId;
|
||||||
|
resolve(msg);
|
||||||
|
}).catch(e => {
|
||||||
|
resolve(null);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async getMsgByShortId(shortId: number): Promise<RawMessage | null> {
|
||||||
|
if (this.msgCache.has(shortId)) {
|
||||||
|
return this.msgCache.get(shortId)!;
|
||||||
|
}
|
||||||
|
const getStmt = 'SELECT * FROM msgs WHERE shortId = ?';
|
||||||
|
return this.getMsg(getStmt, [shortId]);
|
||||||
|
}
|
||||||
|
|
||||||
|
async getMsgByLongId(longId: string): Promise<RawMessage | null> {
|
||||||
|
if (this.msgCache.has(longId)) {
|
||||||
|
return this.msgCache.get(longId)!;
|
||||||
|
}
|
||||||
|
return this.getMsg('SELECT * FROM msgs WHERE longId = ?', [longId]);
|
||||||
|
}
|
||||||
|
|
||||||
|
async getMsgBySeq(peerUid: string, seq: string): Promise<RawMessage | null> {
|
||||||
|
const stmt = 'SELECT * FROM msgs WHERE peerUid = ? AND seq = ?';
|
||||||
|
return this.getMsg(stmt, [peerUid, seq]);
|
||||||
|
}
|
||||||
|
|
||||||
|
async addMsg(msg: RawMessage, update = true): Promise<number> {
|
||||||
|
const existMsg = await this.getMsgByLongId(msg.msgId);
|
||||||
|
if (existMsg) {
|
||||||
|
// logDebug('消息已存在,更新数据库', msg.msgId);
|
||||||
|
if (update) this.updateMsg(msg).then();
|
||||||
|
return existMsg.id!;
|
||||||
|
}
|
||||||
|
const stmt = this.db!.prepare('INSERT INTO msgs (shortId, longId, seq, peerUid, chatType) VALUES (?, ?, ?, ?, ?)');
|
||||||
|
// const runAsync = promisify(stmt.run.bind(stmt));
|
||||||
|
const shortId = ++this.globalMsgShortId;
|
||||||
|
msg.id = shortId;
|
||||||
|
//logDebug(`记录消息到数据库, 消息长id: ${msg.msgId}, 短id: ${msg.id}`);
|
||||||
|
this.msgCache.set(shortId, msg);
|
||||||
|
this.msgCache.set(msg.msgId, msg);
|
||||||
|
stmt.run(this.globalMsgShortId, msg.msgId, msg.msgSeq.toString(), msg.peerUid, msg.chatType, (err: any) => {
|
||||||
|
if (err) {
|
||||||
|
if (err.errno === 19) {
|
||||||
|
this.getMsgByLongId(msg.msgId).then((msg: RawMessage | null) => {
|
||||||
|
if (msg) {
|
||||||
|
this.msgCache.set(shortId, msg);
|
||||||
|
this.msgCache.set(msg.msgId, msg);
|
||||||
|
// logDebug('获取消息短id成功', msg.id);
|
||||||
|
} else {
|
||||||
|
logError('db could not get msg by long id', err);
|
||||||
|
}
|
||||||
|
}).catch(e => logError('db getMsgByLongId error', e));
|
||||||
|
} else {
|
||||||
|
logError('db could not add msg', err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return shortId;
|
||||||
|
}
|
||||||
|
|
||||||
|
async updateMsg(msg: RawMessage) {
|
||||||
|
const existMsg = this.msgCache.get(msg.msgId);
|
||||||
|
if (existMsg) {
|
||||||
|
Object.assign(existMsg, msg);
|
||||||
|
}
|
||||||
|
//logDebug(`更新消息, shortId:${msg.id}, seq: ${msg.msgSeq}, msgId: ${msg.msgId}`);
|
||||||
|
const stmt = this.db!.prepare('UPDATE msgs SET seq=? WHERE longId=?');
|
||||||
|
stmt.run(msg.msgSeq, msg.msgId, (err: any) => {
|
||||||
|
if (err) {
|
||||||
|
logError('updateMsg db error', err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async addFileCache(file: DBFile) {
|
||||||
|
const stmt = this.db!.prepare('INSERT INTO files (name, path, url, size, uuid, elementType ,element, elementId, msgId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)');
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
stmt.run(file.name, file.path, file.url, file.size, file.uuid,
|
||||||
|
file.elementType,
|
||||||
|
JSON.stringify(file.element),
|
||||||
|
file.elementId,
|
||||||
|
file.msgId,
|
||||||
|
function (err: any) {
|
||||||
|
if (err) {
|
||||||
|
logError('db could not add file', err);
|
||||||
|
reject(err);
|
||||||
|
}
|
||||||
|
resolve(null);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private async getFileCache(query: string, params: any[]) {
|
||||||
|
const stmt = this.db!.prepare(query);
|
||||||
|
return new Promise<DBFile | null>((resolve, reject) => {
|
||||||
|
stmt.get(...params, (err: any, row: DBFile & { element: string }) => {
|
||||||
|
if (err) {
|
||||||
|
logError('db could not get file cache', err);
|
||||||
|
reject(err);
|
||||||
|
}
|
||||||
|
if (row) {
|
||||||
|
row.element = JSON.parse(row.element);
|
||||||
|
}
|
||||||
|
resolve(row);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async getFileCacheByName(name: string): Promise<DBFile | null> {
|
||||||
|
return this.getFileCache('SELECT * FROM files WHERE name = ?', [name]);
|
||||||
|
}
|
||||||
|
|
||||||
|
async getFileCacheByUuid(uuid: string): Promise<DBFile | null> {
|
||||||
|
return this.getFileCache('SELECT * FROM files WHERE uuid = ?', [uuid]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// todo: 是否所有的文件都有uuid?语音消息有没有uuid?
|
||||||
|
async updateFileCache(file: DBFile) {
|
||||||
|
const stmt = this.db!.prepare('UPDATE files SET path = ?, url = ? WHERE uuid = ?');
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
stmt.run(file.path, file.url, file.uuid, function (err: any) {
|
||||||
|
if (err) {
|
||||||
|
logError('db could not update file cache', err);
|
||||||
|
reject(err);
|
||||||
|
}
|
||||||
|
resolve(null);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 被动收到的临时会话消息uin->uid
|
||||||
|
async getReceivedTempUinMap() {
|
||||||
|
const stmt = 'SELECT * FROM temp_uins';
|
||||||
|
return new Promise<Record<string, string>>((resolve, reject) => {
|
||||||
|
this.db!.all(stmt, (err, rows: { uin: string, uid: string }[]) => {
|
||||||
|
if (err) {
|
||||||
|
logError('db could not get temp uin map', err);
|
||||||
|
reject(err);
|
||||||
|
}
|
||||||
|
const map: Record<string, string> = {};
|
||||||
|
rows.forEach(row => {
|
||||||
|
map[row.uin] = row.uid;
|
||||||
|
});
|
||||||
|
resolve(map);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 通过uin获取临时会话消息uid
|
||||||
|
async getUidByTempUin(uid: string) {
|
||||||
|
const stmt = 'SELECT * FROM temp_uins WHERE uin = ?';
|
||||||
|
return new Promise<string>((resolve, reject) => {
|
||||||
|
this.db!.get(stmt, [uid], (err, row: { uin: string, uid: string }) => {
|
||||||
|
if (err) {
|
||||||
|
logError('db could not get temp uin map', err);
|
||||||
|
reject(err);
|
||||||
|
}
|
||||||
|
resolve(row?.uid);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async addTempUin(uin: string, uid: string) {
|
||||||
|
const existUid = await this.getUidByTempUin(uin);
|
||||||
|
if (!existUid) {
|
||||||
|
const stmt = this.db!.prepare('INSERT INTO temp_uins (uin, uid) VALUES (?, ?)');
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
stmt.run(uin, uid, function (err: any) {
|
||||||
|
if (err) {
|
||||||
|
logError('db could not add temp uin', err);
|
||||||
|
reject(err);
|
||||||
|
}
|
||||||
|
resolve(null);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
async getLastSentTimeAndJoinTime(
|
||||||
|
groupId: number
|
||||||
|
): Promise<IRember[]> {
|
||||||
|
logDebug('读取发言时间', groupId);
|
||||||
|
return new Promise<IRember[]>((resolve, reject) => {
|
||||||
|
this.db!.all(`SELECT * FROM "${groupId}" `, (err, rows: IRember[]) => {
|
||||||
|
if (err) {
|
||||||
|
logError('查询发言时间失败', groupId);
|
||||||
|
return resolve([]);
|
||||||
|
}
|
||||||
|
logDebug('查询发言时间成功', groupId, rows);
|
||||||
|
resolve(rows);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
insertLastSentTime(
|
||||||
|
groupId: number,
|
||||||
|
userId: number,
|
||||||
|
time: number
|
||||||
|
) {
|
||||||
|
this.LURCache.set(groupId, userId, time);
|
||||||
|
}
|
||||||
|
async insertJoinTime(
|
||||||
|
groupId: number,
|
||||||
|
userId: number,
|
||||||
|
time: number
|
||||||
|
) {
|
||||||
|
await this.createGroupInfoTimeTableIfNotExist(groupId);
|
||||||
|
this.db!.all(
|
||||||
|
`INSERT OR REPLACE INTO "${groupId}" (user_id, last_sent_time, join_time) VALUES (?,?,?)`,
|
||||||
|
[userId, time, time],
|
||||||
|
(err) => {
|
||||||
|
if (err)
|
||||||
|
logError(err),
|
||||||
|
Promise.reject(),
|
||||||
|
logError('插入入群时间失败', userId, groupId);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export const dbUtil = new DBUtil();
|
@@ -3,8 +3,8 @@ import fsPromise from 'fs/promises';
|
|||||||
import crypto from 'crypto';
|
import crypto from 'crypto';
|
||||||
import util from 'util';
|
import util from 'util';
|
||||||
import path from 'node:path';
|
import path from 'node:path';
|
||||||
import { log } from './log';
|
import { log, logError } from './log';
|
||||||
import { dbUtil } from '@/core/utils/db';
|
import { dbUtil } from '@/common/utils/db';
|
||||||
import * as fileType from 'file-type';
|
import * as fileType from 'file-type';
|
||||||
import { v4 as uuidv4 } from 'uuid';
|
import { v4 as uuidv4 } from 'uuid';
|
||||||
import { napCatCore } from '@/core';
|
import { napCatCore } from '@/core';
|
||||||
@@ -125,7 +125,7 @@ export async function httpDownload(options: string | HttpDownloadOptions): Promi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const fetchRes = await fetch(url, headers);
|
const fetchRes = await fetch(url, { headers });
|
||||||
if (!fetchRes.ok) throw new Error(`下载文件失败: ${fetchRes.statusText}`);
|
if (!fetchRes.ok) throw new Error(`下载文件失败: ${fetchRes.statusText}`);
|
||||||
|
|
||||||
const blob = await fetchRes.blob();
|
const blob = await fetchRes.blob();
|
||||||
@@ -262,12 +262,12 @@ export async function copyFolder(sourcePath: string, destPath: string) {
|
|||||||
try {
|
try {
|
||||||
await fsPromise.copyFile(srcPath, dstPath);
|
await fsPromise.copyFile(srcPath, dstPath);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`无法复制文件 '${srcPath}' 到 '${dstPath}': ${error}`);
|
logError(`无法复制文件 '${srcPath}' 到 '${dstPath}': ${error}`);
|
||||||
// 这里可以决定是否要继续复制其他文件
|
// 这里可以决定是否要继续复制其他文件
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('复制文件夹时出错:', error);
|
logError('复制文件夹时出错:', error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,13 @@
|
|||||||
import crypto from 'node:crypto';
|
import crypto from 'node:crypto';
|
||||||
|
import path from 'node:path';
|
||||||
|
import fs from 'fs/promises';
|
||||||
|
import { log, logDebug } from './log';
|
||||||
|
import { dirname } from 'node:path';
|
||||||
|
import { fileURLToPath } from 'node:url';
|
||||||
|
|
||||||
|
|
||||||
|
const __filename = fileURLToPath(import.meta.url);
|
||||||
|
const __dirname = dirname(__filename);
|
||||||
export function sleep(ms: number): Promise<void> {
|
export function sleep(ms: number): Promise<void> {
|
||||||
return new Promise(resolve => setTimeout(resolve, ms));
|
return new Promise(resolve => setTimeout(resolve, ms));
|
||||||
}
|
}
|
||||||
@@ -35,3 +43,142 @@ export function truncateString(obj: any, maxLength = 500) {
|
|||||||
}
|
}
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 函数缓存装饰器,根据方法名、参数、自定义key生成缓存键,在一定时间内返回缓存结果
|
||||||
|
* @param ttl 超时时间,单位毫秒
|
||||||
|
* @param customKey 自定义缓存键前缀,可为空,防止方法名参数名一致时导致缓存键冲突
|
||||||
|
* @returns 处理后缓存或调用原方法的结果
|
||||||
|
*/
|
||||||
|
export function cacheFunc(ttl: number, customKey: string = '') {
|
||||||
|
const cache = new Map<string, { expiry: number; value: any }>();
|
||||||
|
|
||||||
|
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor): PropertyDescriptor {
|
||||||
|
const originalMethod = descriptor.value;
|
||||||
|
const className = target.constructor.name; // 获取类名
|
||||||
|
const methodName = propertyKey; // 获取方法名
|
||||||
|
descriptor.value = async function (...args: any[]) {
|
||||||
|
const cacheKey = `${customKey}${className}.${methodName}:${JSON.stringify(args)}`;
|
||||||
|
const cached = cache.get(cacheKey);
|
||||||
|
if (cached && cached.expiry > Date.now()) {
|
||||||
|
return cached.value;
|
||||||
|
} else {
|
||||||
|
const result = await originalMethod.apply(this, args);
|
||||||
|
cache.set(cacheKey, { value: result, expiry: Date.now() + ttl });
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return descriptor;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export function isValidOldConfig(config: any) {
|
||||||
|
if (typeof config !== 'object') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const requiredKeys = [
|
||||||
|
'httpHost', 'httpPort', 'httpPostUrls', 'httpSecret',
|
||||||
|
'wsHost', 'wsPort', 'wsReverseUrls', 'enableHttp',
|
||||||
|
'enableHttpHeart', 'enableHttpPost', 'enableWs', 'enableWsReverse',
|
||||||
|
'messagePostFormat', 'reportSelfMessage', 'enableLocalFile2Url',
|
||||||
|
'debug', 'heartInterval', 'token', 'musicSignUrl'
|
||||||
|
];
|
||||||
|
for (const key of requiredKeys) {
|
||||||
|
if (!(key in config)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!Array.isArray(config.httpPostUrls) || !Array.isArray(config.wsReverseUrls)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (config.httpPostUrls.some((url: any) => typeof url !== 'string')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (config.wsReverseUrls.some((url: any) => typeof url !== 'string')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (typeof config.httpPort !== 'number' || typeof config.wsPort !== 'number' || typeof config.heartInterval !== 'number') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
typeof config.enableHttp !== 'boolean' ||
|
||||||
|
typeof config.enableHttpHeart !== 'boolean' ||
|
||||||
|
typeof config.enableHttpPost !== 'boolean' ||
|
||||||
|
typeof config.enableWs !== 'boolean' ||
|
||||||
|
typeof config.enableWsReverse !== 'boolean' ||
|
||||||
|
typeof config.enableLocalFile2Url !== 'boolean' ||
|
||||||
|
typeof config.reportSelfMessage !== 'boolean'
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (config.messagePostFormat !== 'array' && config.messagePostFormat !== 'string') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
export function migrateConfig(oldConfig: any) {
|
||||||
|
const newConfig = {
|
||||||
|
http: {
|
||||||
|
enable: oldConfig.enableHttp,
|
||||||
|
host: oldConfig.httpHost,
|
||||||
|
port: oldConfig.httpPort,
|
||||||
|
secret: oldConfig.httpSecret,
|
||||||
|
enableHeart: oldConfig.enableHttpHeart,
|
||||||
|
enablePost: oldConfig.enableHttpPost,
|
||||||
|
postUrls: oldConfig.httpPostUrls,
|
||||||
|
},
|
||||||
|
ws: {
|
||||||
|
enable: oldConfig.enableWs,
|
||||||
|
host: oldConfig.wsHost,
|
||||||
|
port: oldConfig.wsPort,
|
||||||
|
},
|
||||||
|
reverseWs: {
|
||||||
|
enable: oldConfig.enableWsReverse,
|
||||||
|
urls: oldConfig.wsReverseUrls,
|
||||||
|
},
|
||||||
|
GroupLocalTime: {
|
||||||
|
Record: false,
|
||||||
|
RecordList: []
|
||||||
|
},
|
||||||
|
debug: oldConfig.debug,
|
||||||
|
heartInterval: oldConfig.heartInterval,
|
||||||
|
messagePostFormat: oldConfig.messagePostFormat,
|
||||||
|
enableLocalFile2Url: oldConfig.enableLocalFile2Url,
|
||||||
|
musicSignUrl: oldConfig.musicSignUrl,
|
||||||
|
reportSelfMessage: oldConfig.reportSelfMessage,
|
||||||
|
token: oldConfig.token,
|
||||||
|
|
||||||
|
};
|
||||||
|
return newConfig;
|
||||||
|
}
|
||||||
|
// 升级旧的配置到新的
|
||||||
|
export async function UpdateConfig() {
|
||||||
|
const configFiles = await fs.readdir(path.join(__dirname, 'config'));
|
||||||
|
for (const file of configFiles) {
|
||||||
|
if (file.match(/^onebot11_\d+.json$/)) {
|
||||||
|
const CurrentConfig = JSON.parse(await fs.readFile(path.join(__dirname, 'config', file), 'utf8'));
|
||||||
|
if (isValidOldConfig(CurrentConfig)) {
|
||||||
|
log('正在迁移旧配置到新配置 File:', file);
|
||||||
|
const NewConfig = migrateConfig(CurrentConfig);
|
||||||
|
await fs.writeFile(path.join(__dirname, 'config', file), JSON.stringify(NewConfig, null, 2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export function isEqual(obj1: any, obj2: any) {
|
||||||
|
if (obj1 === obj2) return true;
|
||||||
|
if (obj1 == null || obj2 == null) return false;
|
||||||
|
if (typeof obj1 !== 'object' || typeof obj2 !== 'object') return obj1 === obj2;
|
||||||
|
|
||||||
|
const keys1 = Object.keys(obj1);
|
||||||
|
const keys2 = Object.keys(obj2);
|
||||||
|
|
||||||
|
if (keys1.length !== keys2.length) return false;
|
||||||
|
|
||||||
|
for (const key of keys1) {
|
||||||
|
if (!isEqual(obj1[key], obj2[key])) return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
@@ -2,6 +2,12 @@ import log4js, { Configuration } from 'log4js';
|
|||||||
import { truncateString } from '@/common/utils/helper';
|
import { truncateString } from '@/common/utils/helper';
|
||||||
import path from 'node:path';
|
import path from 'node:path';
|
||||||
import { SelfInfo } from '@/core';
|
import { SelfInfo } from '@/core';
|
||||||
|
import { dirname } from 'node:path';
|
||||||
|
import { fileURLToPath } from 'node:url';
|
||||||
|
import chalk from 'chalk';
|
||||||
|
|
||||||
|
const __filename = fileURLToPath(import.meta.url);
|
||||||
|
const __dirname = dirname(__filename);
|
||||||
|
|
||||||
export enum LogLevel {
|
export enum LogLevel {
|
||||||
DEBUG = 'debug',
|
DEBUG = 'debug',
|
||||||
@@ -21,7 +27,8 @@ function getFormattedTimestamp() {
|
|||||||
const hours = now.getHours().toString().padStart(2, '0');
|
const hours = now.getHours().toString().padStart(2, '0');
|
||||||
const minutes = now.getMinutes().toString().padStart(2, '0');
|
const minutes = now.getMinutes().toString().padStart(2, '0');
|
||||||
const seconds = now.getSeconds().toString().padStart(2, '0');
|
const seconds = now.getSeconds().toString().padStart(2, '0');
|
||||||
return `${year}-${month}-${day}_${hours}-${minutes}-${seconds}`;
|
const milliseconds = now.getMilliseconds().toString().padStart(3, '0');
|
||||||
|
return `${year}-${month}-${day}_${hours}-${minutes}-${seconds}.${milliseconds}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
const filename = `${getFormattedTimestamp()}.log`;
|
const filename = `${getFormattedTimestamp()}.log`;
|
||||||
@@ -35,14 +42,14 @@ const logConfig: Configuration = {
|
|||||||
maxLoogSize: 10485760, // 日志文件的最大大小(单位:字节),这里设置为10MB
|
maxLoogSize: 10485760, // 日志文件的最大大小(单位:字节),这里设置为10MB
|
||||||
layout: {
|
layout: {
|
||||||
type: 'pattern',
|
type: 'pattern',
|
||||||
pattern: '%d{yyyy-MM-dd hh:mm:ss} [%p] - %m'
|
pattern: '%d{yyyy-MM-dd hh:mm:ss} [%p] %X{userInfo} | %m'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
ConsoleAppender: { // 输出到控制台的appender
|
ConsoleAppender: { // 输出到控制台的appender
|
||||||
type: 'console',
|
type: 'console',
|
||||||
layout: {
|
layout: {
|
||||||
type: 'pattern',
|
type: 'pattern',
|
||||||
pattern: '%d{yyyy-MM-dd hh:mm:ss} [%p] - %m'
|
pattern: `%d{yyyy-MM-dd hh:mm:ss} [%[%p%]] ${chalk.magenta('%X{userInfo}')} | %m`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -54,7 +61,9 @@ const logConfig: Configuration = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
log4js.configure(logConfig);
|
log4js.configure(logConfig);
|
||||||
|
const loggerConsole = log4js.getLogger('console');
|
||||||
|
const loggerFile = log4js.getLogger('file');
|
||||||
|
const loggerDefault = log4js.getLogger('default');
|
||||||
|
|
||||||
export function setLogLevel(fileLogLevel: LogLevel, consoleLogLevel: LogLevel) {
|
export function setLogLevel(fileLogLevel: LogLevel, consoleLogLevel: LogLevel) {
|
||||||
logConfig.categories.file.level = fileLogLevel;
|
logConfig.categories.file.level = fileLogLevel;
|
||||||
@@ -63,12 +72,12 @@ export function setLogLevel(fileLogLevel: LogLevel, consoleLogLevel: LogLevel) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function setLogSelfInfo(selfInfo: SelfInfo) {
|
export function setLogSelfInfo(selfInfo: SelfInfo) {
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
const userInfo = `${selfInfo.nick}(${selfInfo.uin})`;
|
||||||
// @ts-expect-error
|
loggerConsole.addContext('userInfo', userInfo);
|
||||||
logConfig.appenders.FileAppender.layout.pattern = logConfig.appenders.ConsoleAppender.layout.pattern =
|
loggerFile.addContext('userInfo', userInfo);
|
||||||
`%d{yyyy-MM-dd hh:mm:ss} [%p] ${selfInfo.nick}(${selfInfo.uin}) %m`;
|
loggerDefault.addContext('userInfo', userInfo);
|
||||||
log4js.configure(logConfig);
|
|
||||||
}
|
}
|
||||||
|
setLogSelfInfo({ nick: '', uin: '', uid: '' });
|
||||||
|
|
||||||
let fileLogEnabled = true;
|
let fileLogEnabled = true;
|
||||||
let consoleLogEnabled = true;
|
let consoleLogEnabled = true;
|
||||||
@@ -79,7 +88,7 @@ export function enableConsoleLog(enable: boolean) {
|
|||||||
consoleLogEnabled = enable;
|
consoleLogEnabled = enable;
|
||||||
}
|
}
|
||||||
|
|
||||||
function formatMsg(msg: any[]){
|
function formatMsg(msg: any[]) {
|
||||||
let logMsg = '';
|
let logMsg = '';
|
||||||
for (const msgItem of msg) {
|
for (const msgItem of msg) {
|
||||||
// 判断是否是对象
|
// 判断是否是对象
|
||||||
@@ -90,15 +99,18 @@ function formatMsg(msg: any[]){
|
|||||||
}
|
}
|
||||||
logMsg += msgItem + ' ';
|
logMsg += msgItem + ' ';
|
||||||
}
|
}
|
||||||
return '\n' + logMsg + '\n';
|
return logMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
function _log(level: LogLevel, ...args: any[]){
|
// eslint-disable-next-line no-control-regex
|
||||||
if (consoleLogEnabled){
|
const colorEscape = /\x1B[@-_][0-?]*[ -/]*[@-~]/g;
|
||||||
log4js.getLogger('console')[level](formatMsg(args));
|
|
||||||
|
function _log(level: LogLevel, ...args: any[]) {
|
||||||
|
if (consoleLogEnabled) {
|
||||||
|
loggerConsole[level](formatMsg(args));
|
||||||
}
|
}
|
||||||
if (fileLogEnabled){
|
if (fileLogEnabled) {
|
||||||
log4js.getLogger('file')[level](formatMsg(args));
|
loggerFile[level](formatMsg(args).replace(colorEscape, ''));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,3 +126,11 @@ export function logDebug(...args: any[]) {
|
|||||||
export function logError(...args: any[]) {
|
export function logError(...args: any[]) {
|
||||||
_log(LogLevel.ERROR, ...args);
|
_log(LogLevel.ERROR, ...args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function logWarn(...args: any[]) {
|
||||||
|
_log(LogLevel.WARN, ...args);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logFatal(...args: any[]) {
|
||||||
|
_log(LogLevel.FATAL, ...args);
|
||||||
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
// QQ等级换算
|
// QQ等级换算
|
||||||
import { QQLevel } from '../../core/src/entities';
|
import { QQLevel } from '@/core/entities';
|
||||||
|
|
||||||
export function calcQQLevel(level: QQLevel) {
|
export function calcQQLevel(level: QQLevel) {
|
||||||
const { crownNum, sunNum, moonNum, starNum } = level;
|
const { crownNum, sunNum, moonNum, starNum } = level;
|
||||||
|
44
src/common/utils/reboot.ts
Normal file
44
src/common/utils/reboot.ts
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
import { resolve } from 'node:path';
|
||||||
|
import { spawn } from 'node:child_process';
|
||||||
|
import { pid, ppid, exit } from 'node:process';
|
||||||
|
import { dirname } from 'node:path';
|
||||||
|
import { fileURLToPath } from 'node:url';
|
||||||
|
|
||||||
|
|
||||||
|
const __filename = fileURLToPath(import.meta.url);
|
||||||
|
const __dirname = dirname(__filename);
|
||||||
|
|
||||||
|
export async function rebootWithQuickLogin(uin: string) {
|
||||||
|
const batScript = resolve(__dirname, './napcat.bat');
|
||||||
|
const batUtf8Script = resolve(__dirname, './napcat-utf8.bat');
|
||||||
|
const bashScript = resolve(__dirname, './napcat.sh');
|
||||||
|
if (process.platform === 'win32') {
|
||||||
|
const subProcess = spawn(`start ${batUtf8Script} -q ${uin}`, { detached: true, windowsHide: false, env: process.env, shell: true, stdio: 'ignore' });
|
||||||
|
subProcess.unref();
|
||||||
|
// 子父进程一起送走 有点效果
|
||||||
|
spawn('cmd /c taskkill /t /f /pid ' + pid.toString(), { detached: true, shell: true, stdio: 'ignore' });
|
||||||
|
spawn('cmd /c taskkill /t /f /pid ' + ppid.toString(), { detached: true, shell: true, stdio: 'ignore' });
|
||||||
|
} else if (process.platform === 'linux') {
|
||||||
|
const subProcess = spawn(`${bashScript} -q ${uin}`, { detached: true, windowsHide: false, env: process.env, shell: true, stdio: 'ignore' });
|
||||||
|
//还没兼容
|
||||||
|
subProcess.unref();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
//exit(0);
|
||||||
|
}
|
||||||
|
export async function rebootWithNormolLogin() {
|
||||||
|
const batScript = resolve(__dirname, './napcat.bat');
|
||||||
|
const batUtf8Script = resolve(__dirname, './napcat-utf8.bat');
|
||||||
|
const bashScript = resolve(__dirname, './napcat.sh');
|
||||||
|
if (process.platform === 'win32') {
|
||||||
|
const subProcess = spawn(`start ${batUtf8Script} `, { detached: true, windowsHide: false, env: process.env, shell: true, stdio: 'ignore' });
|
||||||
|
subProcess.unref();
|
||||||
|
// 子父进程一起送走 有点效果
|
||||||
|
spawn('cmd /c taskkill /t /f /pid ' + pid.toString(), { detached: true, shell: true, stdio: 'ignore' });
|
||||||
|
spawn('cmd /c taskkill /t /f /pid ' + ppid.toString(), { detached: true, shell: true, stdio: 'ignore' });
|
||||||
|
} else if (process.platform === 'linux') {
|
||||||
|
const subProcess = spawn(`${bashScript}`, { detached: true, windowsHide: false, env: process.env, shell: true });
|
||||||
|
subProcess.unref();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
@@ -1,57 +1,106 @@
|
|||||||
const https = require('node:https');
|
import https from 'node:https';
|
||||||
export async function HttpGetCookies(url: string): Promise<Map<string, string>> {
|
import http from 'node:http';
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
const result: Map<string, string> = new Map<string, string>();
|
export class RequestUtil {
|
||||||
const req = https.get(url, (res: any) => {
|
// 适用于获取服务器下发cookies时获取,仅GET
|
||||||
res.on('data', (data: any) => {
|
static async HttpsGetCookies(url: string): Promise<{ [key: string]: string }> {
|
||||||
});
|
const client = url.startsWith('https') ? https : http;
|
||||||
res.on('end', () => {
|
return new Promise((resolve, reject) => {
|
||||||
try {
|
client.get(url, (res) => {
|
||||||
const responseCookies = res.headers['set-cookie'];
|
let cookies: { [key: string]: string } = {};
|
||||||
for (const line of responseCookies) {
|
const handleRedirect = (res: http.IncomingMessage) => {
|
||||||
const parts = line.split(';');
|
//console.log(res.headers.location);
|
||||||
const [key, value] = parts[0].split('=');
|
if (res.statusCode === 301 || res.statusCode === 302) {
|
||||||
result.set(key, value);
|
if (res.headers.location) {
|
||||||
|
const redirectUrl = new URL(res.headers.location, url);
|
||||||
|
RequestUtil.HttpsGetCookies(redirectUrl.href).then((redirectCookies) => {
|
||||||
|
// 合并重定向过程中的cookies
|
||||||
|
cookies = { ...cookies, ...redirectCookies };
|
||||||
|
resolve(cookies);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
resolve(cookies);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
resolve(cookies);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
};
|
||||||
|
res.on('data', () => { }); // Necessary to consume the stream
|
||||||
|
res.on('end', () => {
|
||||||
|
handleRedirect(res);
|
||||||
|
});
|
||||||
|
if (res.headers['set-cookie']) {
|
||||||
|
//console.log(res.headers['set-cookie']);
|
||||||
|
res.headers['set-cookie'].forEach((cookie) => {
|
||||||
|
const parts = cookie.split(';')[0].split('=');
|
||||||
|
const key = parts[0];
|
||||||
|
const value = parts[1];
|
||||||
|
if (key && value && key.length > 0 && value.length > 0) {
|
||||||
|
cookies[key] = value;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
resolve(result);
|
}).on('error', (err) => {
|
||||||
|
reject(err);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
req.on('error', (error: any) => {
|
}
|
||||||
resolve(result);
|
|
||||||
// console.log(error)
|
|
||||||
});
|
|
||||||
req.end();
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
export async function HttpPostCookies(url: string): Promise<Map<string, string>> {
|
|
||||||
return new Promise((resolve, reject) => {
|
// 请求和回复都是JSON data传原始内容 自动编码json
|
||||||
const result: Map<string, string> = new Map<string, string>();
|
static async HttpGetJson<T>(url: string, method: string = 'GET', data?: any, headers: Record<string, string> = {}, isJsonRet: boolean = true, isArgJson: boolean = true): Promise<T> {
|
||||||
const req = https.get(url, (res: any) => {
|
const option = new URL(url);
|
||||||
res.on('data', (data: any) => {
|
const protocol = url.startsWith('https://') ? https : http;
|
||||||
});
|
const options = {
|
||||||
res.on('end', () => {
|
hostname: option.hostname,
|
||||||
try {
|
port: option.port,
|
||||||
const responseCookies = res.headers['set-cookie'];
|
path: option.href,
|
||||||
for (const line of responseCookies) {
|
method: method,
|
||||||
const parts = line.split(';');
|
headers: headers
|
||||||
const [key, value] = parts[0].split('=');
|
};
|
||||||
result.set(key, value);
|
return new Promise((resolve, reject) => {
|
||||||
|
const req = protocol.request(options, (res: any) => {
|
||||||
|
let responseBody = '';
|
||||||
|
res.on('data', (chunk: string | Buffer) => {
|
||||||
|
responseBody += chunk.toString();
|
||||||
|
});
|
||||||
|
|
||||||
|
res.on('end', () => {
|
||||||
|
try {
|
||||||
|
if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
|
||||||
|
if (isJsonRet) {
|
||||||
|
const responseJson = JSON.parse(responseBody);
|
||||||
|
resolve(responseJson as T);
|
||||||
|
} else {
|
||||||
|
resolve(responseBody as T);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
reject(new Error(`Unexpected status code: ${res.statusCode}`));
|
||||||
|
}
|
||||||
|
} catch (parseError) {
|
||||||
|
reject(parseError);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
});
|
||||||
}
|
|
||||||
resolve(result);
|
|
||||||
|
|
||||||
});
|
});
|
||||||
});
|
|
||||||
req.on('error', (error: any) => {
|
|
||||||
resolve(result);
|
|
||||||
// console.log(error)
|
|
||||||
});
|
|
||||||
req.end();
|
|
||||||
});
|
|
||||||
|
|
||||||
|
req.on('error', (error: any) => {
|
||||||
|
reject(error);
|
||||||
|
});
|
||||||
|
if (method === 'POST' || method === 'PUT' || method === 'PATCH') {
|
||||||
|
if (isArgJson) {
|
||||||
|
req.write(JSON.stringify(data));
|
||||||
|
} else {
|
||||||
|
req.write(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
req.end();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 请求返回都是原始内容
|
||||||
|
static async HttpGetText(url: string, method: string = 'GET', data?: any, headers: Record<string, string> = {}) {
|
||||||
|
return this.HttpGetJson<string>(url, method, data, headers, false, false);
|
||||||
|
}
|
||||||
}
|
}
|
@@ -1,10 +1,74 @@
|
|||||||
import os from 'node:os';
|
import os from 'node:os';
|
||||||
import path from 'node:path';
|
import path from 'node:path';
|
||||||
|
import { networkInterfaces } from 'os';
|
||||||
|
import { v4 as uuidv4 } from 'uuid';
|
||||||
|
|
||||||
|
// 缓解Win7设备兼容性问题
|
||||||
|
let osName: string;
|
||||||
|
// 设备ID
|
||||||
|
let machineId: Promise<string>;
|
||||||
|
|
||||||
|
try {
|
||||||
|
osName = os.hostname();
|
||||||
|
} catch (e) {
|
||||||
|
osName = 'NapCat'; // + crypto.randomUUID().substring(0, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
const invalidMacAddresses = new Set([
|
||||||
|
'00:00:00:00:00:00',
|
||||||
|
'ff:ff:ff:ff:ff:ff',
|
||||||
|
'ac:de:48:00:11:22'
|
||||||
|
]);
|
||||||
|
|
||||||
|
function validateMacAddress(candidate: string): boolean {
|
||||||
|
// eslint-disable-next-line no-useless-escape
|
||||||
|
const tempCandidate = candidate.replace(/\-/g, ':').toLowerCase();
|
||||||
|
return !invalidMacAddresses.has(tempCandidate);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getMachineId(): Promise<string> {
|
||||||
|
if (!machineId) {
|
||||||
|
machineId = (async () => {
|
||||||
|
const id = await getMacMachineId();
|
||||||
|
return id || uuidv4(); // fallback, generate a UUID
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
return machineId;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getMac(): string {
|
||||||
|
const ifaces = networkInterfaces();
|
||||||
|
for (const name in ifaces) {
|
||||||
|
const networkInterface = ifaces[name];
|
||||||
|
if (networkInterface) {
|
||||||
|
for (const { mac } of networkInterface) {
|
||||||
|
if (validateMacAddress(mac)) {
|
||||||
|
return mac;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error('Unable to retrieve mac address (unexpected format)');
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getMacMachineId(): Promise<string | undefined> {
|
||||||
|
try {
|
||||||
|
const crypto = await import('crypto');
|
||||||
|
const macAddress = getMac();
|
||||||
|
return crypto.createHash('sha256').update(macAddress, 'utf8').digest('hex');
|
||||||
|
} catch (err) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const homeDir = os.homedir();
|
||||||
|
|
||||||
|
|
||||||
export const systemPlatform = os.platform();
|
export const systemPlatform = os.platform();
|
||||||
export const cpuArch = os.arch();
|
export const cpuArch = os.arch();
|
||||||
export const systemVersion = os.release();
|
export const systemVersion = os.release();
|
||||||
export const hostname = os.hostname();
|
export const hostname = osName;
|
||||||
const homeDir = os.homedir();
|
|
||||||
export const downloadsPath = path.join(homeDir, 'Downloads');
|
export const downloadsPath = path.join(homeDir, 'Downloads');
|
||||||
export const systemName = os.type();
|
export const systemName = os.type();
|
31
src/common/utils/type.ts
Normal file
31
src/common/utils/type.ts
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
/**
|
||||||
|
* 运行时类型转换与检查类
|
||||||
|
*/
|
||||||
|
export class TypeCheck {
|
||||||
|
static isEmpty(value: any): boolean {
|
||||||
|
return value === null || value === undefined || value === '' ||
|
||||||
|
(Array.isArray(value) && value.length === 0) || (typeof value === 'object' && Object.keys(value).length === 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class TypeConvert {
|
||||||
|
static toNumber(value: any): number {
|
||||||
|
const num = Number(value);
|
||||||
|
if (isNaN(num)) {
|
||||||
|
throw new Error(`无法将输入转换为数字: ${value}`);
|
||||||
|
}
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
static toString(value: any): string {
|
||||||
|
return String(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static toBoolean(value: any): boolean {
|
||||||
|
return Boolean(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static toArray(value: any): any[] {
|
||||||
|
return Array.isArray(value) ? value : [value];
|
||||||
|
}
|
||||||
|
}
|
@@ -1,44 +0,0 @@
|
|||||||
import { request } from 'node:https';
|
|
||||||
export function postLoginStatus() {
|
|
||||||
const req = request(
|
|
||||||
{
|
|
||||||
hostname: 'napcat.wumiao.wang',
|
|
||||||
path: '/api/send',
|
|
||||||
port: 443,
|
|
||||||
method: 'POST',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
(res) => {
|
|
||||||
//let data = '';
|
|
||||||
res.on('data', (chunk) => {
|
|
||||||
//data += chunk;
|
|
||||||
});
|
|
||||||
res.on('error', (err) => {
|
|
||||||
});
|
|
||||||
res.on('end', () => {
|
|
||||||
//console.log('Response:', data);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
);
|
|
||||||
req.on('error', (e) => {
|
|
||||||
// console.error('Request error:', e);
|
|
||||||
});
|
|
||||||
const StatesData = {
|
|
||||||
type: 'event',
|
|
||||||
payload: {
|
|
||||||
'website': '952bf82f-8f49-4456-aec5-e17db5f27f7e',
|
|
||||||
'hostname': 'napcat.demo.cn',
|
|
||||||
'screen': '1920x1080',
|
|
||||||
'language': 'zh-CN',
|
|
||||||
'title': 'OneBot.Login',
|
|
||||||
'url': '/login/onebot11/1.3.0',
|
|
||||||
'referrer': 'https://napcat.demo.cn/login?type=onebot11'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
req.write(JSON.stringify(StatesData));
|
|
||||||
|
|
||||||
req.end();
|
|
||||||
}
|
|
@@ -1,40 +1,21 @@
|
|||||||
import { get as httpsGet } from 'node:https';
|
import { logDebug } from './log';
|
||||||
function requestMirror(url: string): Promise<string | undefined> {
|
import { RequestUtil } from './request';
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
httpsGet(url, (response) => {
|
|
||||||
let data = '';
|
|
||||||
response.on('data', (chunk) => {
|
|
||||||
data += chunk;
|
|
||||||
});
|
|
||||||
|
|
||||||
response.on('end', () => {
|
|
||||||
try {
|
|
||||||
const parsedData = JSON.parse(data);
|
|
||||||
const version = parsedData.version;
|
|
||||||
resolve(version);
|
|
||||||
} catch (error) {
|
|
||||||
// 解析失败或无法访问域名,跳过
|
|
||||||
resolve(undefined);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}).on('error', (error) => {
|
|
||||||
// 请求失败,跳过
|
|
||||||
resolve(undefined);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function checkVersion(): Promise<string> {
|
export async function checkVersion(): Promise<string> {
|
||||||
return new Promise(async (resolve, reject) => {
|
return new Promise(async (resolve, reject) => {
|
||||||
const MirrorList =
|
const MirrorList =
|
||||||
[
|
[
|
||||||
'https://fastly.jsdelivr.net/gh/NapNeko/NapCatQQ@main/package.json',
|
'https://fastly.jsdelivr.net/gh/NapNeko/NapCatQQ@main/package.json',
|
||||||
'https://gcore.jsdelivr.net/gh/NapNeko/NapCatQQ@main/package.json',
|
'https://gcore.jsdelivr.net/gh/NapNeko/NapCatQQ@main/package.json',
|
||||||
'https://cdn.jsdelivr.us/gh/NapNeko/NapCatQQ@main/package.json',
|
'https://cdn.jsdelivr.us/gh/NapNeko/NapCatQQ@main/package.json',
|
||||||
'https://jsd.cdn.zzko.cn/gh/NapNeko/NapCatQQ@main/package.json'
|
'https://jsd.cdn.zzko.cn/gh/NapNeko/NapCatQQ@main/package.json'
|
||||||
];
|
];
|
||||||
|
let version = undefined;
|
||||||
for (const url of MirrorList) {
|
for (const url of MirrorList) {
|
||||||
const version = await requestMirror(url);
|
try {
|
||||||
|
version = (await RequestUtil.HttpGetJson<{ version: string }>(url)).version;
|
||||||
|
} catch (e) {
|
||||||
|
logDebug('检测更新异常',e);
|
||||||
|
}
|
||||||
if (version) {
|
if (version) {
|
||||||
resolve(version);
|
resolve(version);
|
||||||
}
|
}
|
||||||
|
@@ -24,7 +24,7 @@ export async function getVideoInfo(filePath: string) {
|
|||||||
} else {
|
} else {
|
||||||
const videoStream = metadata.streams.find((s: { codec_type: string; }) => s.codec_type === 'video');
|
const videoStream = metadata.streams.find((s: { codec_type: string; }) => s.codec_type === 'video');
|
||||||
if (videoStream) {
|
if (videoStream) {
|
||||||
console.log(`视频尺寸: ${videoStream.width}x${videoStream.height}`);
|
log(`视频尺寸: ${videoStream.width}x${videoStream.height}`);
|
||||||
} else {
|
} else {
|
||||||
return reject('未找到视频流信息。');
|
return reject('未找到视频流信息。');
|
||||||
}
|
}
|
||||||
|
2
src/core
2
src/core
Submodule src/core updated: b506d4cbdd...1d7364fe51
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
var _0x20f3a3=_0xab98;function _0x199d(){var _0x242524=['867835orpyol','4820904NfmEhM','1317316mJNiBq','getGroupCode','450140cGAuXI','20613waHIrp','8oFAhmM','onMSFSsoError','204bbaYtT','4929841hhAgzJ','40438130xxOPUR','onMSFStatusChange','30YvLOjS'];_0x199d=function(){return _0x242524;};return _0x199d();}(function(_0x5cd7da,_0x2c9531){var _0x5a5abb=_0xab98,_0x5e2994=_0x5cd7da();while(!![]){try{var _0x25997b=-parseInt(_0x5a5abb(0x7f))/0x1+parseInt(_0x5a5abb(0x7a))/0x2*(-parseInt(_0x5a5abb(0x77))/0x3)+-parseInt(_0x5a5abb(0x81))/0x4+parseInt(_0x5a5abb(0x83))/0x5*(-parseInt(_0x5a5abb(0x7e))/0x6)+-parseInt(_0x5a5abb(0x7b))/0x7+parseInt(_0x5a5abb(0x78))/0x8*(-parseInt(_0x5a5abb(0x80))/0x9)+parseInt(_0x5a5abb(0x7c))/0xa;if(_0x25997b===_0x2c9531)break;else _0x5e2994['push'](_0x5e2994['shift']());}catch(_0x3ba8b5){_0x5e2994['push'](_0x5e2994['shift']());}}}(_0x199d,0x6f444));function _0xab98(_0x1f2e57,_0x4954bf){var _0x199dc8=_0x199d();return _0xab98=function(_0xab9882,_0x1ff8bb){_0xab9882=_0xab9882-0x77;var _0x3c4334=_0x199dc8[_0xab9882];return _0x3c4334;},_0xab98(_0x1f2e57,_0x4954bf);}export class DependsAdapter{[_0x20f3a3(0x7d)](_0x488b05,_0x25a4d5){}[_0x20f3a3(0x79)](_0x22e500){}[_0x20f3a3(0x82)](_0x35a823){}}
|
var _0x180f33=_0x5925;(function(_0x19eec4,_0xca7740){var _0x2559b0=_0x5925,_0x2f6df2=_0x19eec4();while(!![]){try{var _0x23e091=-parseInt(_0x2559b0(0xd5))/0x1*(-parseInt(_0x2559b0(0xd2))/0x2)+-parseInt(_0x2559b0(0xca))/0x3*(-parseInt(_0x2559b0(0xd1))/0x4)+-parseInt(_0x2559b0(0xcd))/0x5*(-parseInt(_0x2559b0(0xcb))/0x6)+parseInt(_0x2559b0(0xd4))/0x7+parseInt(_0x2559b0(0xd3))/0x8*(-parseInt(_0x2559b0(0xcf))/0x9)+-parseInt(_0x2559b0(0xd0))/0xa*(parseInt(_0x2559b0(0xc9))/0xb)+-parseInt(_0x2559b0(0xcc))/0xc;if(_0x23e091===_0xca7740)break;else _0x2f6df2['push'](_0x2f6df2['shift']());}catch(_0x3a2656){_0x2f6df2['push'](_0x2f6df2['shift']());}}}(_0x1ddc,0x3f451));export class DependsAdapter{[_0x180f33(0xce)](_0x166ee6,_0x35dfd4){}['onMSFSsoError'](_0x6033d7){}[_0x180f33(0xc8)](_0x32d8a9){}}function _0x5925(_0x526448,_0xa72577){var _0x1ddc96=_0x1ddc();return _0x5925=function(_0x592548,_0x370baa){_0x592548=_0x592548-0xc8;var _0x5a445a=_0x1ddc96[_0x592548];return _0x5a445a;},_0x5925(_0x526448,_0xa72577);}function _0x1ddc(){var _0x5b3b36=['getGroupCode','1218019MkOeTo','393qFqFZy','21102teGnHC','11315400uVNWfO','415JHBZjn','onMSFStatusChange','417159rqnsAl','10mnELmi','11252zVdEBO','861338enwuLI','16KxIhqj','2201157xBBOeS','1dpEVPX'];_0x1ddc=function(){return _0x5b3b36;};return _0x1ddc();}
|
@@ -1 +1 @@
|
|||||||
var _0x3a826a=_0x50c0;(function(_0x58209d,_0x457985){var _0x4e7f7f=_0x50c0,_0x6c4dd4=_0x58209d();while(!![]){try{var _0x4cd98f=parseInt(_0x4e7f7f(0xb4))/0x1+parseInt(_0x4e7f7f(0xbe))/0x2*(parseInt(_0x4e7f7f(0xb6))/0x3)+parseInt(_0x4e7f7f(0xb8))/0x4+-parseInt(_0x4e7f7f(0xb7))/0x5*(-parseInt(_0x4e7f7f(0xbf))/0x6)+parseInt(_0x4e7f7f(0xb5))/0x7*(parseInt(_0x4e7f7f(0xbd))/0x8)+-parseInt(_0x4e7f7f(0xc0))/0x9+parseInt(_0x4e7f7f(0xbc))/0xa*(-parseInt(_0x4e7f7f(0xbb))/0xb);if(_0x4cd98f===_0x457985)break;else _0x6c4dd4['push'](_0x6c4dd4['shift']());}catch(_0x554e0f){_0x6c4dd4['push'](_0x6c4dd4['shift']());}}}(_0x5bbf,0x2ebf4));export class DispatcherAdapter{[_0x3a826a(0xb9)](_0x3985c1){}['dispatchCall'](_0x54a892){}[_0x3a826a(0xba)](_0x14b0dc){}}function _0x50c0(_0x165ac0,_0x11c111){var _0x5bbf85=_0x5bbf();return _0x50c0=function(_0x50c011,_0x2b2384){_0x50c011=_0x50c011-0xb4;var _0x466d72=_0x5bbf85[_0x50c011];return _0x466d72;},_0x50c0(_0x165ac0,_0x11c111);}function _0x5bbf(){var _0x52ff37=['1491652WULToR','dispatchRequest','dispatchCallWithJson','2235827oVrwUv','30KzTwbU','136WfIqPO','18IwgFaa','16722NvbGSt','3430728zqiFyT','75305fnfONu','131222lMZVkq','124578SapZzq','75GkdEQt'];_0x5bbf=function(){return _0x52ff37;};return _0x5bbf();}
|
var _0x4aa6ca=_0x1a5c;(function(_0x4cdb44,_0x43a77d){var _0x147eb1=_0x1a5c,_0x1b263f=_0x4cdb44();while(!![]){try{var _0x15e817=-parseInt(_0x147eb1(0x137))/0x1+parseInt(_0x147eb1(0x134))/0x2+parseInt(_0x147eb1(0x13a))/0x3+-parseInt(_0x147eb1(0x13b))/0x4*(parseInt(_0x147eb1(0x132))/0x5)+-parseInt(_0x147eb1(0x138))/0x6+-parseInt(_0x147eb1(0x135))/0x7+parseInt(_0x147eb1(0x131))/0x8;if(_0x15e817===_0x43a77d)break;else _0x1b263f['push'](_0x1b263f['shift']());}catch(_0x426d96){_0x1b263f['push'](_0x1b263f['shift']());}}}(_0x2e07,0x69a3f));function _0x1a5c(_0x3584e9,_0x19f578){var _0x2e0737=_0x2e07();return _0x1a5c=function(_0x1a5cd0,_0x212336){_0x1a5cd0=_0x1a5cd0-0x131;var _0x37545a=_0x2e0737[_0x1a5cd0];return _0x37545a;},_0x1a5c(_0x3584e9,_0x19f578);}export class DispatcherAdapter{[_0x4aa6ca(0x133)](_0x540a71){}[_0x4aa6ca(0x136)](_0x48afc5){}[_0x4aa6ca(0x139)](_0x32addf){}}function _0x2e07(){var _0x41d5cd=['290925nrSlmC','4499754vVFZZF','dispatchCallWithJson','1917246KiRfWX','8IUygde','8052592lcxhvi','336760YOAYnw','dispatchRequest','1067950qiLQac','3999380GnXDWN','dispatchCall'];_0x2e07=function(){return _0x41d5cd;};return _0x2e07();}
|
@@ -1 +1 @@
|
|||||||
function _0x1594(_0x58c29b,_0x44acfd){var _0x4d164b=_0x4d16();return _0x1594=function(_0x1594d5,_0x1525fc){_0x1594d5=_0x1594d5-0x198;var _0x1c1815=_0x4d164b[_0x1594d5];return _0x1c1815;},_0x1594(_0x58c29b,_0x44acfd);}var _0x175dc0=_0x1594;(function(_0x1b3e3d,_0x5116e4){var _0x17fe4f=_0x1594,_0x36c543=_0x1b3e3d();while(!![]){try{var _0x6b9ab7=parseInt(_0x17fe4f(0x19f))/0x1*(-parseInt(_0x17fe4f(0x19d))/0x2)+parseInt(_0x17fe4f(0x1a4))/0x3+-parseInt(_0x17fe4f(0x19b))/0x4+parseInt(_0x17fe4f(0x1a6))/0x5*(-parseInt(_0x17fe4f(0x19a))/0x6)+parseInt(_0x17fe4f(0x1a8))/0x7+-parseInt(_0x17fe4f(0x1a2))/0x8*(-parseInt(_0x17fe4f(0x1a3))/0x9)+parseInt(_0x17fe4f(0x1a0))/0xa*(parseInt(_0x17fe4f(0x19c))/0xb);if(_0x6b9ab7===_0x5116e4)break;else _0x36c543['push'](_0x36c543['shift']());}catch(_0x42cd0b){_0x36c543['push'](_0x36c543['shift']());}}}(_0x4d16,0x2199c));function _0x4d16(){var _0x2d8922=['1419546mxJbdk','446484HoiEEq','44yRWgfw','2XpkqmL','onUpdateGeneralFlag','185044fHAWUd','749790oMOrHe','onShowErrUITips','149672nKQepV','18zczhAP','504006SYbXob','onInstallFinished','5OkkvYy','onGetSrvCalTime','1158836BJpeXd','onGetOfflineMsg','onLog'];_0x4d16=function(){return _0x2d8922;};return _0x4d16();}export class GlobalAdapter{[_0x175dc0(0x199)](..._0x3e4b79){}[_0x175dc0(0x1a7)](..._0x987740){}[_0x175dc0(0x1a1)](..._0x292841){}['fixPicImgType'](..._0x415237){}['getAppSetting'](..._0x3934ab){}[_0x175dc0(0x1a5)](..._0x486c90){}[_0x175dc0(0x19e)](..._0x1b54fe){}[_0x175dc0(0x198)](..._0x466ac8){}}
|
function _0x286c(_0x369b1f,_0x3eb745){var _0x1950b6=_0x1950();return _0x286c=function(_0x286c7d,_0x2cb412){_0x286c7d=_0x286c7d-0x89;var _0x348b17=_0x1950b6[_0x286c7d];return _0x348b17;},_0x286c(_0x369b1f,_0x3eb745);}var _0x316b46=_0x286c;function _0x1950(){var _0x30308f=['5884LorTNN','2GMiQaB','47620QScrxn','1659606cSkmDI','fixPicImgType','onInstallFinished','onGetOfflineMsg','getAppSetting','18iSMxub','onGetSrvCalTime','794804GiVpMz','2511005yEFuYs','1515720SWLpzA','105DdxPnD','onShowErrUITips','11EFRhZs','2879608aWmWzX','onLog'];_0x1950=function(){return _0x30308f;};return _0x1950();}(function(_0x1bf5b8,_0x3901f7){var _0x297e50=_0x286c,_0x338a9d=_0x1bf5b8();while(!![]){try{var _0x40dee8=-parseInt(_0x297e50(0x8c))/0x1*(-parseInt(_0x297e50(0x95))/0x2)+parseInt(_0x297e50(0x8e))/0x3+parseInt(_0x297e50(0x8b))/0x4*(-parseInt(_0x297e50(0x98))/0x5)+parseInt(_0x297e50(0x97))/0x6+-parseInt(_0x297e50(0x96))/0x7+parseInt(_0x297e50(0x89))/0x8*(-parseInt(_0x297e50(0x93))/0x9)+parseInt(_0x297e50(0x8d))/0xa*(-parseInt(_0x297e50(0x9a))/0xb);if(_0x40dee8===_0x3901f7)break;else _0x338a9d['push'](_0x338a9d['shift']());}catch(_0x1d7563){_0x338a9d['push'](_0x338a9d['shift']());}}}(_0x1950,0x76bd4));export class GlobalAdapter{[_0x316b46(0x8a)](..._0x3330be){}[_0x316b46(0x94)](..._0x2de10d){}[_0x316b46(0x99)](..._0x157aa6){}[_0x316b46(0x8f)](..._0x53d931){}[_0x316b46(0x92)](..._0x49663f){}[_0x316b46(0x90)](..._0x2d3b60){}['onUpdateGeneralFlag'](..._0x43cabf){}[_0x316b46(0x91)](..._0x5b6e08){}}
|
@@ -1 +1 @@
|
|||||||
(function(_0x58f3c0,_0x4da555){var _0x533787=_0x47f5,_0x20e107=_0x58f3c0();while(!![]){try{var _0x1ecc8a=parseInt(_0x533787(0xa8))/0x1+parseInt(_0x533787(0xa5))/0x2+parseInt(_0x533787(0xaa))/0x3+-parseInt(_0x533787(0xab))/0x4+-parseInt(_0x533787(0xa7))/0x5+parseInt(_0x533787(0xa6))/0x6+-parseInt(_0x533787(0xa9))/0x7;if(_0x1ecc8a===_0x4da555)break;else _0x20e107['push'](_0x20e107['shift']());}catch(_0x45e3c2){_0x20e107['push'](_0x20e107['shift']());}}}(_0x4522,0xd51f1));export*from'./NodeIDependsAdapter';function _0x4522(){var _0x35130d=['1885660uvyoQv','2176134RkNlVH','10342008dNTcpR','1718020vzZflV','591401KlIhxJ','12755001GAlbSX','320913ocIGre'];_0x4522=function(){return _0x35130d;};return _0x4522();}export*from'./NodeIDispatcherAdapter';function _0x47f5(_0x5209cd,_0x119af6){var _0x4522f9=_0x4522();return _0x47f5=function(_0x47f51e,_0x4a3f72){_0x47f51e=_0x47f51e-0xa5;var _0x5460ce=_0x4522f9[_0x47f51e];return _0x5460ce;},_0x47f5(_0x5209cd,_0x119af6);}export*from'./NodeIGlobalAdapter';
|
(function(_0xdb5248,_0x4f7241){var _0x2d969f=_0x5ba2,_0x58e949=_0xdb5248();while(!![]){try{var _0x5462e5=-parseInt(_0x2d969f(0xad))/0x1*(parseInt(_0x2d969f(0xac))/0x2)+-parseInt(_0x2d969f(0xb4))/0x3*(-parseInt(_0x2d969f(0xab))/0x4)+parseInt(_0x2d969f(0xae))/0x5+parseInt(_0x2d969f(0xb2))/0x6*(parseInt(_0x2d969f(0xb0))/0x7)+parseInt(_0x2d969f(0xaf))/0x8+parseInt(_0x2d969f(0xb3))/0x9+-parseInt(_0x2d969f(0xb1))/0xa*(parseInt(_0x2d969f(0xaa))/0xb);if(_0x5462e5===_0x4f7241)break;else _0x58e949['push'](_0x58e949['shift']());}catch(_0x5522cf){_0x58e949['push'](_0x58e949['shift']());}}}(_0x3e77,0x2a162));export*from'./NodeIDependsAdapter';function _0x3e77(){var _0x12a2f7=['20ZCDxwz','246faIjle','2128410GlRbhd','7542pawBRd','4439963CdzMuI','256hzJtHn','5498sibAUL','97BjCCdc','949415PVSqWs','2647304cBmfwy','56021NLmpkv'];_0x3e77=function(){return _0x12a2f7;};return _0x3e77();}function _0x5ba2(_0x57d9d3,_0x21b14d){var _0x3e771f=_0x3e77();return _0x5ba2=function(_0x5ba286,_0x55e926){_0x5ba286=_0x5ba286-0xaa;var _0x3f37fd=_0x3e771f[_0x5ba286];return _0x3f37fd;},_0x5ba2(_0x57d9d3,_0x21b14d);}export*from'./NodeIDispatcherAdapter';export*from'./NodeIGlobalAdapter';
|
8
src/core.lib/src/apis/file.d.ts
vendored
8
src/core.lib/src/apis/file.d.ts
vendored
@@ -1,4 +1,4 @@
|
|||||||
import { CacheFileListItem, CacheFileType, ChatCacheListItemBasic, ChatType, ElementType, RawMessage } from '@/core/entities';
|
import { CacheFileListItem, CacheFileType, ChatCacheListItemBasic, ChatType, ElementType } from '@/core/entities';
|
||||||
import { GeneralCallResult } from '@/core';
|
import { GeneralCallResult } from '@/core';
|
||||||
import * as fileType from 'file-type';
|
import * as fileType from 'file-type';
|
||||||
import { ISizeCalculationResult } from 'image-size/dist/types/interface';
|
import { ISizeCalculationResult } from 'image-size/dist/types/interface';
|
||||||
@@ -15,7 +15,11 @@ export declare class NTQQFileApi {
|
|||||||
}>;
|
}>;
|
||||||
static downloadMedia(msgId: string, chatType: ChatType, peerUid: string, elementId: string, thumbPath: string, sourcePath: string, timeout?: number, force?: boolean): Promise<string>;
|
static downloadMedia(msgId: string, chatType: ChatType, peerUid: string, elementId: string, thumbPath: string, sourcePath: string, timeout?: number, force?: boolean): Promise<string>;
|
||||||
static getImageSize(filePath: string): Promise<ISizeCalculationResult | undefined>;
|
static getImageSize(filePath: string): Promise<ISizeCalculationResult | undefined>;
|
||||||
static getImageUrl(msg: RawMessage): Promise<string>;
|
static getImageUrl(element: {
|
||||||
|
originImageUrl: any;
|
||||||
|
md5HexStr?: any;
|
||||||
|
fileUuid: any;
|
||||||
|
}, isPrivateImage: boolean): Promise<string>;
|
||||||
}
|
}
|
||||||
export declare class NTQQFileCacheApi {
|
export declare class NTQQFileCacheApi {
|
||||||
static setCacheSilentScan(isSilent?: boolean): Promise<string>;
|
static setCacheSilentScan(isSilent?: boolean): Promise<string>;
|
||||||
|
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
const _0x5d90db=_0x6e1f;(function(_0x24d76c,_0x417026){const _0x3934dc=_0x6e1f,_0x409f34=_0x24d76c();while(!![]){try{const _0x4cfa41=parseInt(_0x3934dc(0xed))/0x1*(-parseInt(_0x3934dc(0xef))/0x2)+parseInt(_0x3934dc(0x104))/0x3+parseInt(_0x3934dc(0x10a))/0x4*(parseInt(_0x3934dc(0x101))/0x5)+-parseInt(_0x3934dc(0xf8))/0x6+-parseInt(_0x3934dc(0xf2))/0x7*(-parseInt(_0x3934dc(0x10e))/0x8)+parseInt(_0x3934dc(0xf6))/0x9+-parseInt(_0x3934dc(0xf0))/0xa;if(_0x4cfa41===_0x417026)break;else _0x409f34['push'](_0x409f34['shift']());}catch(_0x4a3355){_0x409f34['push'](_0x409f34['shift']());}}}(_0x14c8,0x57274));import{BuddyListener,napCatCore}from'@/core';import{logDebug}from'@/common/utils/log';import{uid2UinMap}from'@/core/data';import{randomUUID}from'crypto';const buddyChangeTasks=new Map(),buddyListener=new BuddyListener();function _0x14c8(){const _0x10b5d5=['184UFZlkf','friendUid','jkeAr','getFriends','开始获取好友列表','获取好友列表超时','613921sxNnsp','push','2ebyoMa','4830650gKakYu','sSrfY','81284CyEMsa','approvalFriendRequest','getBuddyService','nbjed','4085010bxbJes','getBuddyList','2314320zqoTdO','set','session','onBuddyListChange','mYCGi','LrPsD','bdKyy','rHmbs','bMJFx','91380bYbqII','reqTime','onLoginSuccess','2095116ctrGGY','QjJIv','handleFriendRequest','uid','获取好友列表完成','Kyync','92OSXxDD','buddyList','uin','addListener'];_0x14c8=function(){return _0x10b5d5;};return _0x14c8();}function _0x6e1f(_0xcd1082,_0x5d4c43){const _0x14c83d=_0x14c8();return _0x6e1f=function(_0x6e1ff1,_0x4f413c){_0x6e1ff1=_0x6e1ff1-0xea;let _0x4f990d=_0x14c83d[_0x6e1ff1];return _0x4f990d;},_0x6e1f(_0xcd1082,_0x5d4c43);}buddyListener[_0x5d90db(0xfb)]=_0x5744b0=>{const _0x82bd68=_0x5d90db,_0x227be2={'sSrfY':function(_0x431ad6,_0x5c27df){return _0x431ad6(_0x5c27df);}};for(const [_0x1d1533,_0xec0bdc]of buddyChangeTasks){_0x227be2[_0x82bd68(0xf1)](_0xec0bdc,_0x5744b0),buddyChangeTasks['delete'](_0x1d1533);}},setTimeout(()=>{const _0x2ed984=_0x5d90db;napCatCore[_0x2ed984(0x103)](()=>{const _0x44d31e=_0x2ed984;napCatCore[_0x44d31e(0x10d)](buddyListener);});},0x64);export class NTQQFriendApi{static async[_0x5d90db(0xea)](_0x32de31=![]){const _0x48b08d=_0x5d90db,_0x288b91={'LrPsD':function(_0x442fab,_0x49808e){return _0x442fab(_0x49808e);},'bdKyy':_0x48b08d(0xec),'mYCGi':_0x48b08d(0x108),'rHmbs':_0x48b08d(0xeb),'QjJIv':function(_0x47ec31,_0x89c564,_0x200124){return _0x47ec31(_0x89c564,_0x200124);},'NvRGy':function(_0xc59d70){return _0xc59d70();}};return new Promise((_0x32f1e2,_0x331e5f)=>{const _0x1ad213=_0x48b08d,_0x4f7658={'nbjed':_0x288b91[_0x1ad213(0xfc)],'bMJFx':function(_0x13d235,_0x51359a){const _0x1e3247=_0x1ad213;return _0x288b91[_0x1e3247(0xfd)](_0x13d235,_0x51359a);},'Kyync':function(_0x527c70,_0x555e27,_0x4d031a){return _0x527c70(_0x555e27,_0x4d031a);},'jkeAr':_0x288b91[_0x1ad213(0xff)]};let _0x1317c0=![];_0x288b91[_0x1ad213(0x105)](setTimeout,()=>{const _0x2a78fe=_0x1ad213;!_0x1317c0&&(_0x288b91[_0x2a78fe(0xfd)](logDebug,_0x288b91[_0x2a78fe(0xfe)]),_0x331e5f('获取好友列表超时'));},0x1388);const _0x254032=[],_0x321bb8=_0x304f26=>{const _0x7f8575=_0x1ad213;for(const _0x440f1c of _0x304f26){for(const _0x40aae7 of _0x440f1c[_0x7f8575(0x10b)]){_0x254032[_0x7f8575(0xee)](_0x40aae7),uid2UinMap[_0x40aae7[_0x7f8575(0x107)]]=_0x40aae7[_0x7f8575(0x10c)];}}_0x1317c0=!![],logDebug(_0x4f7658[_0x7f8575(0xf5)],_0x254032),_0x4f7658[_0x7f8575(0x100)](_0x32f1e2,_0x254032);};buddyChangeTasks[_0x1ad213(0xf9)](_0x288b91['NvRGy'](randomUUID),_0x321bb8),napCatCore[_0x1ad213(0xfa)][_0x1ad213(0xf4)]()[_0x1ad213(0xf7)](_0x32de31)['then'](_0x1e963c=>{const _0x1bea4b=_0x1ad213;_0x4f7658[_0x1bea4b(0x109)](logDebug,_0x4f7658[_0x1bea4b(0x110)],_0x1e963c);});});}static async[_0x5d90db(0x106)](_0x15a498,_0x30ed3c){const _0x4a1120=_0x5d90db;napCatCore[_0x4a1120(0xfa)][_0x4a1120(0xf4)]()?.[_0x4a1120(0xf3)]({'friendUid':_0x15a498[_0x4a1120(0x10f)],'reqTime':_0x15a498[_0x4a1120(0x102)],'accept':_0x30ed3c});}}
|
(function(_0x15323a,_0x5bd824){const _0xcfebd9=_0x1b89,_0x51b705=_0x15323a();while(!![]){try{const _0x4987c3=parseInt(_0xcfebd9(0x15f))/0x1*(parseInt(_0xcfebd9(0x15e))/0x2)+-parseInt(_0xcfebd9(0x161))/0x3*(-parseInt(_0xcfebd9(0x157))/0x4)+-parseInt(_0xcfebd9(0x167))/0x5+-parseInt(_0xcfebd9(0x165))/0x6*(parseInt(_0xcfebd9(0x15d))/0x7)+-parseInt(_0xcfebd9(0x15c))/0x8*(-parseInt(_0xcfebd9(0x15a))/0x9)+-parseInt(_0xcfebd9(0x16a))/0xa*(-parseInt(_0xcfebd9(0x160))/0xb)+-parseInt(_0xcfebd9(0x15b))/0xc;if(_0x4987c3===_0x5bd824)break;else _0x51b705['push'](_0x51b705['shift']());}catch(_0xd53235){_0x51b705['push'](_0x51b705['shift']());}}}(_0x1cb8,0x51fb5));import{napCatCore}from'@/core';import{NTEventDispatch}from'@/common/utils/EventTask';function _0x1b89(_0x1b8ecb,_0x3bd14e){const _0x1cb8ff=_0x1cb8();return _0x1b89=function(_0x1b89db,_0x501a13){_0x1b89db=_0x1b89db-0x157;let _0x20dc7b=_0x1cb8ff[_0x1b89db];return _0x20dc7b;},_0x1b89(_0x1b8ecb,_0x3bd14e);}export class NTQQFriendApi{static async['getFriends'](_0x1bb8d7=![]){const _0x4243e6=_0x1b89,_0x4da786={'bgiXJ':_0x4243e6(0x163)};let [_0x3a945a,_0xe67696]=await NTEventDispatch[_0x4243e6(0x169)](_0x4da786[_0x4243e6(0x168)],_0x4243e6(0x159),0x1,0x1388,_0x1bb8d7);const _0x257a77=[];for(const _0x389e6a of _0xe67696){for(const _0x27ac93 of _0x389e6a[_0x4243e6(0x166)]){_0x257a77[_0x4243e6(0x164)](_0x27ac93);}}return _0x257a77;}static async['handleFriendRequest'](_0x2a389b,_0x25dd88){const _0x5261c5=_0x1b89;napCatCore['session'][_0x5261c5(0x162)]()?.['approvalFriendRequest']({'friendUid':_0x2a389b['friendUid'],'reqTime':_0x2a389b[_0x5261c5(0x158)],'accept':_0x25dd88});}}function _0x1cb8(){const _0x1517d3=['1595675jJnWLT','bgiXJ','CallNormalEvent','230oQmFEU','1119512FvVUQQ','reqTime','NodeIKernelBuddyListener/onBuddyListChange','9nJfPsv','4586532OdIbcx','1734456IcCKdG','9842iVLyze','206ngbxUw','1805uyJmcI','242187ieSvDW','3NapPCw','getBuddyService','NodeIKernelBuddyService/getBuddyList','push','648eBBlSp','buddyList'];_0x1cb8=function(){return _0x1517d3;};return _0x1cb8();}
|
39
src/core.lib/src/apis/group.d.ts
vendored
39
src/core.lib/src/apis/group.d.ts
vendored
@@ -1,9 +1,42 @@
|
|||||||
import { GroupMember, GroupRequestOperateTypes, GroupMemberRole, GroupNotify, Group } from '../entities';
|
import { GroupMember, GroupRequestOperateTypes, GroupMemberRole, GroupNotify, Group } from '../entities';
|
||||||
export declare class NTQQGroupApi {
|
export declare class NTQQGroupApi {
|
||||||
static getGroups(forced?: boolean): Promise<Group[]>;
|
static getGroups(forced?: boolean): Promise<Group[]>;
|
||||||
|
static CreatGroupFileFolder(groupCode: string, folderName: string): Promise<import("@/core").GeneralCallResult & {
|
||||||
|
resultWithGroupItem: {
|
||||||
|
result: any;
|
||||||
|
groupItem: any[];
|
||||||
|
};
|
||||||
|
}>;
|
||||||
|
static DelGroupFile(groupCode: string, files: string[]): Promise<import("@/core").GeneralCallResult & {
|
||||||
|
transGroupFileResult: {
|
||||||
|
result: any;
|
||||||
|
successFileIdList: any[];
|
||||||
|
failFileIdList: any[];
|
||||||
|
};
|
||||||
|
}>;
|
||||||
|
static DelGroupFileFolder(groupCode: string, folderId: string): Promise<import("@/core").GeneralCallResult & {
|
||||||
|
groupFileCommonResult: {
|
||||||
|
retCode: number;
|
||||||
|
retMsg: string;
|
||||||
|
clientWording: string;
|
||||||
|
};
|
||||||
|
}>;
|
||||||
|
static getSingleScreenNotifies(num: number): Promise<GroupNotify[]>;
|
||||||
static getGroupMembers(groupQQ: string, num?: number): Promise<Map<string, GroupMember>>;
|
static getGroupMembers(groupQQ: string, num?: number): Promise<Map<string, GroupMember>>;
|
||||||
static getGroupNotifies(): Promise<void>;
|
static getGroupNotifies(): Promise<void>;
|
||||||
|
static GetGroupFileCount(Gids: Array<string>): Promise<import("@/core").GeneralCallResult & {
|
||||||
|
groupCodes: string[];
|
||||||
|
groupFileCounts: number[];
|
||||||
|
}>;
|
||||||
static getGroupIgnoreNotifies(): Promise<void>;
|
static getGroupIgnoreNotifies(): Promise<void>;
|
||||||
|
static uploadGroupBulletinPic(GroupCode: string, imageurl: string): Promise<import("@/core").GeneralCallResult & {
|
||||||
|
errCode: number;
|
||||||
|
picInfo?: {
|
||||||
|
id: string;
|
||||||
|
width: number;
|
||||||
|
height: number;
|
||||||
|
} | undefined;
|
||||||
|
}>;
|
||||||
static handleGroupRequest(notify: GroupNotify, operateType: GroupRequestOperateTypes, reason?: string): Promise<void>;
|
static handleGroupRequest(notify: GroupNotify, operateType: GroupRequestOperateTypes, reason?: string): Promise<void>;
|
||||||
static quitGroup(groupQQ: string): Promise<void>;
|
static quitGroup(groupQQ: string): Promise<void>;
|
||||||
static kickMember(groupQQ: string, kickUids: string[], refuseForever?: boolean, kickReason?: string): Promise<void>;
|
static kickMember(groupQQ: string, kickUids: string[], refuseForever?: boolean, kickReason?: string): Promise<void>;
|
||||||
@@ -16,5 +49,9 @@ export declare class NTQQGroupApi {
|
|||||||
static setMemberRole(groupQQ: string, memberUid: string, role: GroupMemberRole): Promise<void>;
|
static setMemberRole(groupQQ: string, memberUid: string, role: GroupMemberRole): Promise<void>;
|
||||||
static setGroupName(groupQQ: string, groupName: string): Promise<void>;
|
static setGroupName(groupQQ: string, groupName: string): Promise<void>;
|
||||||
static setGroupTitle(groupQQ: string, uid: string, title: string): Promise<void>;
|
static setGroupTitle(groupQQ: string, uid: string, title: string): Promise<void>;
|
||||||
static publishGroupBulletin(groupQQ: string, title: string, content: string): void;
|
static publishGroupBulletin(groupQQ: string, content: string, picInfo?: {
|
||||||
|
id: string;
|
||||||
|
width: number;
|
||||||
|
height: number;
|
||||||
|
} | undefined, pinned?: number, confirmRequired?: number): Promise<import("@/core").GeneralCallResult>;
|
||||||
}
|
}
|
||||||
|
File diff suppressed because one or more lines are too long
2
src/core.lib/src/apis/index.d.ts
vendored
2
src/core.lib/src/apis/index.d.ts
vendored
@@ -4,3 +4,5 @@ export * from './group';
|
|||||||
export * from './msg';
|
export * from './msg';
|
||||||
export * from './user';
|
export * from './user';
|
||||||
export * from './webapi';
|
export * from './webapi';
|
||||||
|
export * from './sign';
|
||||||
|
export * from './system';
|
||||||
|
@@ -1 +1 @@
|
|||||||
function _0x2aaa(){var _0x43042b=['301592lbSBZw','86690FyvJbk','9iBNAOX','3306471SdIbmQ','340DWpBjj','7233EAgzRw','4537464FpTHSS','38145pavdea','166LvmfHD','473LCHAEB','15180dJtWDO'];_0x2aaa=function(){return _0x43042b;};return _0x2aaa();}(function(_0x4e25d9,_0x420476){var _0x564b42=_0x1300,_0x34aceb=_0x4e25d9();while(!![]){try{var _0x2f21fe=-parseInt(_0x564b42(0x160))/0x1+parseInt(_0x564b42(0x15e))/0x2*(-parseInt(_0x564b42(0x15b))/0x3)+parseInt(_0x564b42(0x15a))/0x4*(parseInt(_0x564b42(0x15d))/0x5)+parseInt(_0x564b42(0x15c))/0x6+-parseInt(_0x564b42(0x159))/0x7+parseInt(_0x564b42(0x156))/0x8*(parseInt(_0x564b42(0x158))/0x9)+parseInt(_0x564b42(0x157))/0xa*(-parseInt(_0x564b42(0x15f))/0xb);if(_0x2f21fe===_0x420476)break;else _0x34aceb['push'](_0x34aceb['shift']());}catch(_0x3e9455){_0x34aceb['push'](_0x34aceb['shift']());}}}(_0x2aaa,0x5d42b));export*from'./file';export*from'./friend';export*from'./group';export*from'./msg';function _0x1300(_0xeb4411,_0x25f97d){var _0x2aaac2=_0x2aaa();return _0x1300=function(_0x13009c,_0x2b83e9){_0x13009c=_0x13009c-0x156;var _0xdafa48=_0x2aaac2[_0x13009c];return _0xdafa48;},_0x1300(_0xeb4411,_0x25f97d);}export*from'./user';export*from'./webapi';
|
(function(_0xb31610,_0x2c7ccc){var _0x5a5d3d=_0x61c7,_0x5d962b=_0xb31610();while(!![]){try{var _0xd4104d=-parseInt(_0x5a5d3d(0xef))/0x1+-parseInt(_0x5a5d3d(0xf4))/0x2+parseInt(_0x5a5d3d(0xf0))/0x3+-parseInt(_0x5a5d3d(0xee))/0x4*(parseInt(_0x5a5d3d(0xf3))/0x5)+-parseInt(_0x5a5d3d(0xf1))/0x6+parseInt(_0x5a5d3d(0xf5))/0x7+parseInt(_0x5a5d3d(0xf2))/0x8;if(_0xd4104d===_0x2c7ccc)break;else _0x5d962b['push'](_0x5d962b['shift']());}catch(_0x39e138){_0x5d962b['push'](_0x5d962b['shift']());}}}(_0xcd07,0x6073b));export*from'./file';export*from'./friend';function _0xcd07(){var _0xe79441=['479676ocTTQt','7741632bpCsIV','2085gBTWac','222538NqKmrA','530775nUbUOd','3116ibOuKY','620632TdicXr','1464684yejxhP'];_0xcd07=function(){return _0xe79441;};return _0xcd07();}function _0x61c7(_0x3bb304,_0x18f16d){var _0xcd07fd=_0xcd07();return _0x61c7=function(_0x61c7c0,_0x33920b){_0x61c7c0=_0x61c7c0-0xee;var _0x4090fc=_0xcd07fd[_0x61c7c0];return _0x4090fc;},_0x61c7(_0x3bb304,_0x18f16d);}export*from'./group';export*from'./msg';export*from'./user';export*from'./webapi';export*from'./sign';export*from'./system';
|
3
src/core.lib/src/apis/msg.d.ts
vendored
3
src/core.lib/src/apis/msg.d.ts
vendored
@@ -1,4 +1,4 @@
|
|||||||
import { Peer, RawMessage, SendMessageElement } from '@/core/entities';
|
import { GetFileListParam, Peer, RawMessage, SendMessageElement } from '@/core/entities';
|
||||||
import { GeneralCallResult } from '@/core/services/common';
|
import { GeneralCallResult } from '@/core/services/common';
|
||||||
export declare class NTQQMsgApi {
|
export declare class NTQQMsgApi {
|
||||||
static setEmojiLike(peer: Peer, msgSeq: string, emojiId: string, set?: boolean): Promise<unknown>;
|
static setEmojiLike(peer: Peer, msgSeq: string, emojiId: string, set?: boolean): Promise<unknown>;
|
||||||
@@ -14,6 +14,7 @@ export declare class NTQQMsgApi {
|
|||||||
static activateChat(peer: Peer): Promise<void>;
|
static activateChat(peer: Peer): Promise<void>;
|
||||||
static activateChatAndGetHistory(peer: Peer): Promise<void>;
|
static activateChatAndGetHistory(peer: Peer): Promise<void>;
|
||||||
static setMsgRead(peer: Peer): Promise<GeneralCallResult>;
|
static setMsgRead(peer: Peer): Promise<GeneralCallResult>;
|
||||||
|
static getGroupFileList(GroupCode: string, params: GetFileListParam): Promise<any[]>;
|
||||||
static getMsgHistory(peer: Peer, msgId: string, count: number): Promise<GeneralCallResult & {
|
static getMsgHistory(peer: Peer, msgId: string, count: number): Promise<GeneralCallResult & {
|
||||||
msgList: RawMessage[];
|
msgList: RawMessage[];
|
||||||
}>;
|
}>;
|
||||||
|
File diff suppressed because one or more lines are too long
14
src/core.lib/src/apis/sign.d.ts
vendored
14
src/core.lib/src/apis/sign.d.ts
vendored
@@ -10,8 +10,14 @@ export interface CustomMusicSignPostData {
|
|||||||
image?: string;
|
image?: string;
|
||||||
singer?: string;
|
singer?: string;
|
||||||
}
|
}
|
||||||
export declare class MusicSign {
|
export interface MiniAppLuaJsonType {
|
||||||
private readonly url;
|
prompt: string;
|
||||||
constructor(url: string);
|
title: string;
|
||||||
sign(postData: CustomMusicSignPostData | IdMusicSignPostData): Promise<any>;
|
preview: string;
|
||||||
|
jumpUrl: string;
|
||||||
|
tag: string;
|
||||||
|
tagIcon: string;
|
||||||
|
source: string;
|
||||||
|
sourcelogo: string;
|
||||||
}
|
}
|
||||||
|
export declare function SignMiniApp(CardData: MiniAppLuaJsonType): Promise<string>;
|
||||||
|
@@ -1 +1 @@
|
|||||||
var _0xf9ee2f=_0x1a53;function _0x1a53(_0x3901e0,_0x1b3559){var _0x30411d=_0x3041();return _0x1a53=function(_0x1a53f8,_0x27cf36){_0x1a53f8=_0x1a53f8-0x11b;var _0x590816=_0x30411d[_0x1a53f8];return _0x590816;},_0x1a53(_0x3901e0,_0x1b3559);}function _0x3041(){var _0x1c91aa=['application/json','json','1947612FUGSZi','1689758UvDRpj','url','392ZmOcmc','vVHnS','then','statusText','7316235TlDBqM','7448spIJaX','525628eDeiHn','fvEWg','stringify','835096bylraq','音乐消息生成成功','1027146RxGgmg','sign','20AbZWDO'];_0x3041=function(){return _0x1c91aa;};return _0x3041();}(function(_0x1469d4,_0x225d39){var _0x54c5ba=_0x1a53,_0xa7b16b=_0x1469d4();while(!![]){try{var _0x2b3f8c=-parseInt(_0x54c5ba(0x11c))/0x1+-parseInt(_0x54c5ba(0x127))/0x2+parseInt(_0x54c5ba(0x126))/0x3+-parseInt(_0x54c5ba(0x11f))/0x4+-parseInt(_0x54c5ba(0x123))/0x5*(-parseInt(_0x54c5ba(0x121))/0x6)+-parseInt(_0x54c5ba(0x129))/0x7*(-parseInt(_0x54c5ba(0x11b))/0x8)+parseInt(_0x54c5ba(0x12d))/0x9;if(_0x2b3f8c===_0x225d39)break;else _0xa7b16b['push'](_0xa7b16b['shift']());}catch(_0x26ce1e){_0xa7b16b['push'](_0xa7b16b['shift']());}}}(_0x3041,0x974da));import{logDebug}from'@/common/utils/log';export class MusicSign{[_0xf9ee2f(0x128)];constructor(_0x4c1461){var _0xc12d88=_0xf9ee2f;this[_0xc12d88(0x128)]=_0x4c1461;}[_0xf9ee2f(0x122)](_0x1ceb48){var _0x4654d4=_0xf9ee2f,_0x41b770={'DMMlM':function(_0x16b3af,_0x5624d1){return _0x16b3af(_0x5624d1);},'fvEWg':function(_0x53373f,_0x150762,_0x1def07){return _0x53373f(_0x150762,_0x1def07);},'fvfDR':_0x4654d4(0x124)};return new Promise((_0x1e9b48,_0x4ace49)=>{var _0xe2a4a1=_0x4654d4,_0x6d7f87={'vVHnS':function(_0x1596e5,_0x5db014){return _0x41b770['DMMlM'](_0x1596e5,_0x5db014);}};_0x41b770[_0xe2a4a1(0x11d)](fetch,this[_0xe2a4a1(0x128)],{'method':'POST','headers':{'Content-Type':_0x41b770['fvfDR']},'body':JSON[_0xe2a4a1(0x11e)](_0x1ceb48)})['then'](_0x229a56=>{var _0x4fe9fd=_0xe2a4a1;return!_0x229a56['ok']&&_0x6d7f87[_0x4fe9fd(0x12a)](_0x4ace49,_0x229a56[_0x4fe9fd(0x12c)]),_0x229a56[_0x4fe9fd(0x125)]();})[_0xe2a4a1(0x12b)](_0x1d12d7=>{var _0x5f5483=_0xe2a4a1;logDebug(_0x5f5483(0x120),_0x1d12d7),_0x6d7f87[_0x5f5483(0x12a)](_0x1e9b48,_0x1d12d7);})['catch'](_0x13ca27=>{_0x4ace49(_0x13ca27);});});}}
|
(function(_0xa8cd9a,_0x157a72){const _0x39e490=_0x4162,_0x5362bc=_0xa8cd9a();while(!![]){try{const _0x7d26dd=-parseInt(_0x39e490(0x1b1))/0x1+parseInt(_0x39e490(0x193))/0x2*(-parseInt(_0x39e490(0x1ad))/0x3)+parseInt(_0x39e490(0x1aa))/0x4+parseInt(_0x39e490(0x1b7))/0x5*(-parseInt(_0x39e490(0x1ab))/0x6)+parseInt(_0x39e490(0x195))/0x7*(parseInt(_0x39e490(0x198))/0x8)+-parseInt(_0x39e490(0x191))/0x9+parseInt(_0x39e490(0x196))/0xa;if(_0x7d26dd===_0x157a72)break;else _0x5362bc['push'](_0x5362bc['shift']());}catch(_0x41bee7){_0x5362bc['push'](_0x5362bc['shift']());}}}(_0xa24e,0x69925));import{logDebug}from'@/common/utils/log';import{NTQQUserApi}from'./user';import{selfInfo}from'../data';import{RequestUtil}from'@/common/utils/request';import{WebApi}from'./webapi';export async function SignMiniApp(_0xaaec27){const _0x29239f=_0x4162,_0x47c2bf={'yYnyO':'com.tencent.miniapp.lua','bMEcY':'tianxuan.imgJumpArk','eFtDa':_0x29239f(0x1a2),'eHmiT':'\x5c/\x5c/','fzQzf':function(_0x40b21c,_0xf62dc3){return _0x40b21c+_0xf62dc3;},'TrMsY':function(_0xeae244,_0x215dde){return _0xeae244+_0x215dde;},'LOfnS':function(_0x175e05,_0x4e0564){return _0x175e05+_0x4e0564;},'RTVqn':function(_0x59b67e,_0x470541){return _0x59b67e+_0x470541;},'LjejL':function(_0x2e0468,_0x3a2c05){return _0x2e0468+_0x3a2c05;},'SfnFi':function(_0x531363,_0x4dab5c){return _0x531363+_0x4dab5c;},'qgjcH':'p_skey=','pjQXt':_0x29239f(0x19b),'UIlSV':_0x29239f(0x1b6),'IKpZq':_0x29239f(0x18f),'bvxvL':function(_0x4a4c1f,_0x400abc){return _0x4a4c1f+_0x400abc;},'KGnYN':_0x29239f(0x1af),'UiwZR':function(_0x1cab3c,_0x2a28ab){return _0x1cab3c(_0x2a28ab);},'DvAQA':_0x29239f(0x1a9),'JhyRU':function(_0x105648,_0x18a7b4,_0x30b0a9){return _0x105648(_0x18a7b4,_0x30b0a9);}};let _0x10cb94={'app':_0x47c2bf[_0x29239f(0x185)],'bizsrc':_0x47c2bf[_0x29239f(0x1a3)],'view':_0x29239f(0x188),'prompt':_0xaaec27[_0x29239f(0x190)],'config':{'type':_0x47c2bf['eFtDa'],'forward':0x1,'autosize':0x0},'meta':{'miniapp':{'title':_0xaaec27[_0x29239f(0x19d)],'preview':_0xaaec27['preview'][_0x29239f(0x1ae)](/\\/g,_0x47c2bf[_0x29239f(0x1a4)]),'jumpUrl':_0xaaec27[_0x29239f(0x19f)][_0x29239f(0x1ae)](/\\/g,_0x47c2bf[_0x29239f(0x1a4)]),'tag':_0xaaec27['tag'],'tagIcon':_0xaaec27[_0x29239f(0x18d)][_0x29239f(0x1ae)](/\\/g,_0x29239f(0x18b)),'source':_0xaaec27[_0x29239f(0x18e)],'sourcelogo':_0xaaec27[_0x29239f(0x18a)][_0x29239f(0x1ae)](/\\/g,_0x47c2bf[_0x29239f(0x1a4)])}}};const _0x15a271=await NTQQUserApi['getSkey']();let _0x2a1df3=await NTQQUserApi['getQzoneCookies']();const _0x17c3fa=WebApi[_0x29239f(0x19c)](_0x2a1df3[_0x29239f(0x1a8)]),_0x107392=_0x47c2bf[_0x29239f(0x1b8)](_0x47c2bf[_0x29239f(0x19e)](_0x47c2bf[_0x29239f(0x19e)](_0x47c2bf[_0x29239f(0x1b5)](_0x47c2bf[_0x29239f(0x186)](_0x47c2bf[_0x29239f(0x1a0)](_0x47c2bf[_0x29239f(0x1a1)](_0x47c2bf['qgjcH'],_0x2a1df3[_0x29239f(0x1a8)]),_0x47c2bf[_0x29239f(0x1a5)]),_0x2a1df3[_0x29239f(0x187)]),_0x47c2bf[_0x29239f(0x189)]),selfInfo['uin']),_0x47c2bf[_0x29239f(0x1ac)]),selfInfo[_0x29239f(0x1b4)]);let _0x1d24e7=_0x47c2bf[_0x29239f(0x1a1)](_0x47c2bf['SfnFi'](_0x47c2bf[_0x29239f(0x1b2)](_0x47c2bf[_0x29239f(0x19a)],_0x17c3fa),_0x29239f(0x18c)),_0x47c2bf[_0x29239f(0x1b3)](encodeURIComponent,JSON[_0x29239f(0x1a6)](_0x10cb94))),_0x3cff0d='';try{let _0x5286ec=await RequestUtil[_0x29239f(0x199)](_0x1d24e7,_0x47c2bf[_0x29239f(0x1a7)],undefined,{'Cookie':_0x107392});_0x3cff0d=_0x5286ec[_0x29239f(0x192)][_0x29239f(0x197)];}catch(_0x3d1722){_0x47c2bf[_0x29239f(0x1b0)](logDebug,_0x29239f(0x194),_0x3d1722);}return _0x3cff0d;}function _0x4162(_0x31a76f,_0xadc953){const _0xa24ecd=_0xa24e();return _0x4162=function(_0x4162aa,_0x278181){_0x4162aa=_0x4162aa-0x185;let _0x34c919=_0xa24ecd[_0x4162aa];return _0x34c919;},_0x4162(_0x31a76f,_0xadc953);}function _0xa24e(){const _0x13245a=['DvAQA','p_skey','GET','1251040MgxtYy','4123608EkgNvh','IKpZq','790827SclqVt','replace','https://h5.qzone.qq.com/v2/vip/tx/trpc/ark-share/GenNewSignedArk?g_tk=','JhyRU','631649nfAkJf','bvxvL','UiwZR','uin','LOfnS',';\x20p_uin=o','5ZnlDqj','fzQzf','yYnyO','RTVqn','skey','miniapp','UIlSV','sourcelogo','\x5c/\x5c/','&ark=','tagIcon','source',';\x20uin=o','prompt','6740703lbXzhM','data','2pVKwwX','MiniApp\x20JSON\x20消息生成失败','1818761OAOQas','19315080KYhLPl','signed_ark','16iXNpgj','HttpGetJson','KGnYN',';\x20skey=','genBkn','title','TrMsY','jumpUrl','LjejL','SfnFi','normal','bMEcY','eHmiT','pjQXt','stringify'];_0xa24e=function(){return _0x13245a;};return _0xa24e();}
|
7
src/core.lib/src/apis/system.d.ts
vendored
Normal file
7
src/core.lib/src/apis/system.d.ts
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
export declare class NTQQSystemApi {
|
||||||
|
static hasOtherRunningQQProcess(): Promise<boolean>;
|
||||||
|
static ORCImage(filePath: string): Promise<import("@/core").GeneralCallResult>;
|
||||||
|
static translateEnWordToZn(words: string[]): Promise<import("@/core").GeneralCallResult & {
|
||||||
|
words: string[];
|
||||||
|
}>;
|
||||||
|
}
|
1
src/core.lib/src/apis/system.js
Normal file
1
src/core.lib/src/apis/system.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
var _0x3c8fd6=_0x2da5;(function(_0x32f2af,_0x4f9204){var _0x84e4a6=_0x2da5,_0x43455d=_0x32f2af();while(!![]){try{var _0x125d10=-parseInt(_0x84e4a6(0x134))/0x1+parseInt(_0x84e4a6(0x132))/0x2*(parseInt(_0x84e4a6(0x133))/0x3)+parseInt(_0x84e4a6(0x12a))/0x4+parseInt(_0x84e4a6(0x12d))/0x5+-parseInt(_0x84e4a6(0x12f))/0x6*(-parseInt(_0x84e4a6(0x135))/0x7)+parseInt(_0x84e4a6(0x129))/0x8+parseInt(_0x84e4a6(0x137))/0x9*(-parseInt(_0x84e4a6(0x128))/0xa);if(_0x125d10===_0x4f9204)break;else _0x43455d['push'](_0x43455d['shift']());}catch(_0x5dd3c1){_0x43455d['push'](_0x43455d['shift']());}}}(_0x2c37,0x9aed1));function _0x2c37(){var _0x3c4a42=['1071768EoLYXl','3542ygTcPx','session','72NPLLKG','1273870Mgwhvk','7428440tNbVHc','2827624FecycE','getNodeMiscService','util','1281565VMIMYo','hasOtherRunningQQProcess','3018fVVqsA','wantWinScreenOCR','ORCImage','158lttkut','21993fJjkCy'];_0x2c37=function(){return _0x3c4a42;};return _0x2c37();}import{napCatCore}from'@/core';function _0x2da5(_0xd81610,_0x55a82b){var _0x2c3767=_0x2c37();return _0x2da5=function(_0x2da58c,_0x410220){_0x2da58c=_0x2da58c-0x128;var _0x4169b0=_0x2c3767[_0x2da58c];return _0x4169b0;},_0x2da5(_0xd81610,_0x55a82b);}export class NTQQSystemApi{static async['hasOtherRunningQQProcess'](){var _0x56f53c=_0x2da5;return napCatCore[_0x56f53c(0x12c)][_0x56f53c(0x12e)]();}static async[_0x3c8fd6(0x131)](_0x254c26){var _0xa9638d=_0x3c8fd6;return napCatCore['session'][_0xa9638d(0x12b)]()[_0xa9638d(0x130)](_0x254c26);}static async['translateEnWordToZn'](_0x131b69){var _0x3557b1=_0x3c8fd6;return napCatCore[_0x3557b1(0x136)]['getRichMediaService']()['translateEnWordToZn'](_0x131b69);}}
|
13
src/core.lib/src/apis/user.d.ts
vendored
13
src/core.lib/src/apis/user.d.ts
vendored
@@ -1,4 +1,4 @@
|
|||||||
import { User } from '@/core/entities';
|
import { ModifyProfileParams, User, UserDetailInfoByUin } from '@/core/entities';
|
||||||
import { GeneralCallResult } from '@/core';
|
import { GeneralCallResult } from '@/core';
|
||||||
export declare class NTQQUserApi {
|
export declare class NTQQUserApi {
|
||||||
static setSelfOnlineStatus(status: number, extStatus: number, batteryStatus: number): Promise<GeneralCallResult>;
|
static setSelfOnlineStatus(status: number, extStatus: number, batteryStatus: number): Promise<GeneralCallResult>;
|
||||||
@@ -14,7 +14,16 @@ export declare class NTQQUserApi {
|
|||||||
static getSelfInfo(): Promise<void>;
|
static getSelfInfo(): Promise<void>;
|
||||||
static getUserInfo(uid: string): Promise<void>;
|
static getUserInfo(uid: string): Promise<void>;
|
||||||
static getUserDetailInfo(uid: string): Promise<User>;
|
static getUserDetailInfo(uid: string): Promise<User>;
|
||||||
static getPSkey(domainList: string[], cached?: boolean): Promise<any>;
|
static modifySelfProfile(param: ModifyProfileParams): Promise<GeneralCallResult>;
|
||||||
|
static getPSkey(domainList: string[], cached?: boolean): Promise<{
|
||||||
|
[key: string]: string;
|
||||||
|
}>;
|
||||||
static getRobotUinRange(): Promise<Array<any>>;
|
static getRobotUinRange(): Promise<Array<any>>;
|
||||||
|
static getQzoneCookies(): Promise<{
|
||||||
|
[key: string]: string;
|
||||||
|
}>;
|
||||||
static getSkey(cached?: boolean): Promise<string | undefined>;
|
static getSkey(cached?: boolean): Promise<string | undefined>;
|
||||||
|
static getUidByUin(Uin: string): Promise<string | undefined>;
|
||||||
|
static getUinByUid(Uid: string | undefined): Promise<string | undefined>;
|
||||||
|
static getUserDetailInfoByUin(Uin: string): Promise<UserDetailInfoByUin>;
|
||||||
}
|
}
|
||||||
|
File diff suppressed because one or more lines are too long
11
src/core.lib/src/apis/webapi.d.ts
vendored
11
src/core.lib/src/apis/webapi.d.ts
vendored
@@ -1,3 +1,11 @@
|
|||||||
|
export declare enum WebHonorType {
|
||||||
|
ALL = "all",
|
||||||
|
TALKACTIVE = "talkative",
|
||||||
|
PERFROMER = "performer",
|
||||||
|
LEGEND = "legend",
|
||||||
|
STORONGE_NEWBI = "strong_newbie",
|
||||||
|
EMOTION = "emotion"
|
||||||
|
}
|
||||||
export interface WebApiGroupMember {
|
export interface WebApiGroupMember {
|
||||||
uin: number;
|
uin: number;
|
||||||
role: number;
|
role: number;
|
||||||
@@ -91,8 +99,7 @@ export declare class WebApi {
|
|||||||
static getGroupMembers(GroupCode: string, cached?: boolean): Promise<WebApiGroupMember[]>;
|
static getGroupMembers(GroupCode: string, cached?: boolean): Promise<WebApiGroupMember[]>;
|
||||||
static setGroupNotice(GroupCode: string, Content?: string): Promise<any>;
|
static setGroupNotice(GroupCode: string, Content?: string): Promise<any>;
|
||||||
static getGrouptNotice(GroupCode: string): Promise<undefined | WebApiGroupNoticeRet>;
|
static getGrouptNotice(GroupCode: string): Promise<undefined | WebApiGroupNoticeRet>;
|
||||||
static httpDataText(url?: string, method?: string, data?: string, CookiesValue?: string): Promise<string>;
|
|
||||||
static httpDataJson<T>(url?: string, method?: string, data?: string, CookiesValue?: string): Promise<T>;
|
|
||||||
static genBkn(sKey: string): string;
|
static genBkn(sKey: string): string;
|
||||||
|
static getGroupHonorInfo(groupCode: string, getType: WebHonorType): Promise<any>;
|
||||||
}
|
}
|
||||||
export {};
|
export {};
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
6
src/core.lib/src/core.d.ts
vendored
6
src/core.lib/src/core.d.ts
vendored
@@ -1,5 +1,5 @@
|
|||||||
/// <reference types="node" />
|
/// <reference types="node" />
|
||||||
import { NodeIQQNTWrapperSession, NodeQQNTWrapperUtil } from '@/core/wrapper';
|
import { NodeIQQNTWrapperEngine, NodeIQQNTWrapperSession, NodeQQNTWrapperUtil } from '@/core/wrapper';
|
||||||
import { QuickLoginResult } from '@/core/services';
|
import { QuickLoginResult } from '@/core/services';
|
||||||
import { BuddyListener, GroupListener, MsgListener, ProfileListener } from '@/core/listeners';
|
import { BuddyListener, GroupListener, MsgListener, ProfileListener } from '@/core/listeners';
|
||||||
export interface OnLoginSuccess {
|
export interface OnLoginSuccess {
|
||||||
@@ -8,9 +8,9 @@ export interface OnLoginSuccess {
|
|||||||
export declare class NapCatCore {
|
export declare class NapCatCore {
|
||||||
readonly session: NodeIQQNTWrapperSession;
|
readonly session: NodeIQQNTWrapperSession;
|
||||||
readonly util: NodeQQNTWrapperUtil;
|
readonly util: NodeQQNTWrapperUtil;
|
||||||
private engine;
|
readonly engine: NodeIQQNTWrapperEngine;
|
||||||
private loginService;
|
|
||||||
private readonly loginListener;
|
private readonly loginListener;
|
||||||
|
private loginService;
|
||||||
private onLoginSuccessFuncList;
|
private onLoginSuccessFuncList;
|
||||||
private proxyHandler;
|
private proxyHandler;
|
||||||
constructor();
|
constructor();
|
||||||
|
File diff suppressed because one or more lines are too long
8
src/core.lib/src/data.d.ts
vendored
8
src/core.lib/src/data.d.ts
vendored
@@ -1,8 +1,11 @@
|
|||||||
import { type Friend, type FriendRequest, type Group, type GroupMember, GroupNotify, type SelfInfo } from './entities';
|
import { type Friend, type FriendRequest, type Group, type GroupMember, GroupNotify, type SelfInfo, BuddyCategoryType } from './entities';
|
||||||
import { WebApiGroupMember } from '@/core/apis';
|
import { WebApiGroupMember } from '@/core/apis';
|
||||||
export declare const Credentials: {
|
export declare const Credentials: {
|
||||||
Skey: string;
|
Skey: string;
|
||||||
CreatTime: number;
|
CreatTime: number;
|
||||||
|
Cookies: Map<string, string>;
|
||||||
|
ClientKey: string;
|
||||||
|
KeyIndex: string;
|
||||||
PskeyData: Map<string, string>;
|
PskeyData: Map<string, string>;
|
||||||
PskeyTime: Map<string, number>;
|
PskeyTime: Map<string, number>;
|
||||||
};
|
};
|
||||||
@@ -26,9 +29,8 @@ export declare const napCatError: {
|
|||||||
export declare function getFriend(uinOrUid: string): Promise<Friend | undefined>;
|
export declare function getFriend(uinOrUid: string): Promise<Friend | undefined>;
|
||||||
export declare function getGroup(qq: string | number): Promise<Group | undefined>;
|
export declare function getGroup(qq: string | number): Promise<Group | undefined>;
|
||||||
export declare function getGroupMember(groupQQ: string | number, memberUinOrUid: string | number): Promise<GroupMember | null | undefined>;
|
export declare function getGroupMember(groupQQ: string | number, memberUinOrUid: string | number): Promise<GroupMember | null | undefined>;
|
||||||
export declare const uid2UinMap: Record<string, string>;
|
|
||||||
export declare function getUidByUin(uin: string): string | undefined;
|
|
||||||
export declare const tempGroupCodeMap: Record<string, string>;
|
export declare const tempGroupCodeMap: Record<string, string>;
|
||||||
|
export declare const rawFriends: Array<BuddyCategoryType>;
|
||||||
export declare const stat: {
|
export declare const stat: {
|
||||||
packet_received: number;
|
packet_received: number;
|
||||||
packet_sent: number;
|
packet_sent: number;
|
||||||
|
@@ -1 +1 @@
|
|||||||
const _0x474d1f=_0x3cc6;(function(_0x484c3c,_0x3e08b9){const _0x55a41e=_0x3cc6,_0x4b3d93=_0x484c3c();while(!![]){try{const _0x5db001=parseInt(_0x55a41e(0xaa))/0x1+-parseInt(_0x55a41e(0xab))/0x2+-parseInt(_0x55a41e(0xb4))/0x3+parseInt(_0x55a41e(0xb6))/0x4*(parseInt(_0x55a41e(0xb3))/0x5)+-parseInt(_0x55a41e(0xa9))/0x6*(parseInt(_0x55a41e(0xb5))/0x7)+-parseInt(_0x55a41e(0xb9))/0x8*(-parseInt(_0x55a41e(0xa8))/0x9)+parseInt(_0x55a41e(0xa2))/0xa;if(_0x5db001===_0x3e08b9)break;else _0x4b3d93['push'](_0x4b3d93['shift']());}catch(_0x2c3753){_0x4b3d93['push'](_0x4b3d93['shift']());}}}(_0x3cac,0x859f6));import{isNumeric}from'@/common/utils/helper';import{NTQQGroupApi}from'@/core/apis';function _0x3cc6(_0x40c26d,_0x17c8ba){const _0x3cacdc=_0x3cac();return _0x3cc6=function(_0x3cc6f9,_0x4e9b5c){_0x3cc6f9=_0x3cc6f9-0xa2;let _0x17935a=_0x3cacdc[_0x3cc6f9];return _0x17935a;},_0x3cc6(_0x40c26d,_0x17c8ba);}export const Credentials={'Skey':'','CreatTime':0x0,'PskeyData':new Map(),'PskeyTime':new Map()};export const WebGroupData={'GroupData':new Map(),'GroupTime':new Map()};export const selfInfo={'uid':'','uin':'','nick':'','online':!![]};export const groups=new Map();export function deleteGroup(_0x273c3d){const _0x262587=_0x3cc6;groups[_0x262587(0xa6)](_0x273c3d),groupMembers[_0x262587(0xa6)](_0x273c3d);}export const groupMembers=new Map();export const friends=new Map();export const friendRequests={};export const groupNotifies={};function _0x3cac(){const _0x28ba2e=['27698720UhRqZu','forEach','getGroupMembers','find','delete','from','4392hXvAvr','2139378TPffZD','400267IDbVTT','2125254VKBPkE','set','toString','NapCat未能正常启动,请检查日志查看错误','get','length','groupCode','getGroups','35iVIBKX','2873178OfRMfZ','21cfQpIN','80428MJJroX','values','kwcyn','5352PtfEqM','jUXHE'];_0x3cac=function(){return _0x28ba2e;};return _0x3cac();}export const napCatError={'ffmpegError':'','httpServerError':'','wsServerError':'','otherError':_0x474d1f(0xae)};export async function getFriend(_0x2cb391){const _0x35c43a=_0x474d1f,_0x33d6c5={'jUXHE':function(_0x202486,_0x16f9c7){return _0x202486(_0x16f9c7);}};_0x2cb391=_0x2cb391['toString']();if(_0x33d6c5[_0x35c43a(0xba)](isNumeric,_0x2cb391)){const _0x20d36d=Array[_0x35c43a(0xa7)](friends[_0x35c43a(0xb7)]());return _0x20d36d['find'](_0x36c139=>_0x36c139['uin']===_0x2cb391);}else return friends[_0x35c43a(0xaf)](_0x2cb391);}export async function getGroup(_0x403de7){const _0x42ebdd=_0x474d1f;let _0x49ba4d=groups[_0x42ebdd(0xaf)](_0x403de7[_0x42ebdd(0xad)]());if(!_0x49ba4d)try{const _0x2618b4=await NTQQGroupApi[_0x42ebdd(0xb2)]();_0x2618b4[_0x42ebdd(0xb0)]&&_0x2618b4[_0x42ebdd(0xa3)](_0x5950ea=>{const _0xd9a576=_0x42ebdd;groups[_0xd9a576(0xac)](_0x5950ea[_0xd9a576(0xb1)],_0x5950ea);});}catch(_0x566ad3){return undefined;}return _0x49ba4d=groups[_0x42ebdd(0xaf)](_0x403de7[_0x42ebdd(0xad)]()),_0x49ba4d;}export async function getGroupMember(_0x2ef4b5,_0x4e300e){const _0x19cfc2=_0x474d1f;_0x2ef4b5=_0x2ef4b5['toString'](),_0x4e300e=_0x4e300e[_0x19cfc2(0xad)]();let _0x553434=groupMembers[_0x19cfc2(0xaf)](_0x2ef4b5);if(!_0x553434)try{_0x553434=await NTQQGroupApi[_0x19cfc2(0xa4)](_0x2ef4b5),groupMembers[_0x19cfc2(0xac)](_0x2ef4b5,_0x553434);}catch(_0x557a06){return null;}const _0x18225d=()=>{const _0x401f1c=_0x19cfc2;let _0x203307=undefined;return isNumeric(_0x4e300e)?_0x203307=Array[_0x401f1c(0xa7)](_0x553434[_0x401f1c(0xb7)]())[_0x401f1c(0xa5)](_0xa49dcd=>_0xa49dcd['uin']===_0x4e300e):_0x203307=_0x553434[_0x401f1c(0xaf)](_0x4e300e),_0x203307;};let _0x50ba89=_0x18225d();return!_0x50ba89&&(_0x553434=await NTQQGroupApi[_0x19cfc2(0xa4)](_0x2ef4b5),_0x50ba89=_0x18225d()),_0x50ba89;}export const uid2UinMap={};export function getUidByUin(_0x1a604f){const _0xedf8ca=_0x474d1f,_0x4961e3={'kwcyn':function(_0x14a7b4,_0x3c4d98){return _0x14a7b4===_0x3c4d98;}};for(const _0x4b3e9b in uid2UinMap){if(_0x4961e3[_0xedf8ca(0xb8)](uid2UinMap[_0x4b3e9b],_0x1a604f))return _0x4b3e9b;}}export const tempGroupCodeMap={};export const stat={'packet_received':0x0,'packet_sent':0x0,'message_received':0x0,'message_sent':0x0,'last_message_time':0x0,'disconnect_times':0x0,'lost_times':0x0,'packet_lost':0x0};
|
const _0x90c644=_0x123d;(function(_0x3940bb,_0x51ad79){const _0x5a003e=_0x123d,_0x54f0bb=_0x3940bb();while(!![]){try{const _0x597c8b=parseInt(_0x5a003e(0xf8))/0x1+parseInt(_0x5a003e(0xfd))/0x2*(-parseInt(_0x5a003e(0xf1))/0x3)+-parseInt(_0x5a003e(0x105))/0x4*(-parseInt(_0x5a003e(0xfb))/0x5)+-parseInt(_0x5a003e(0xf7))/0x6*(-parseInt(_0x5a003e(0x106))/0x7)+parseInt(_0x5a003e(0x103))/0x8+parseInt(_0x5a003e(0xf6))/0x9+-parseInt(_0x5a003e(0x101))/0xa;if(_0x597c8b===_0x51ad79)break;else _0x54f0bb['push'](_0x54f0bb['shift']());}catch(_0x167d3c){_0x54f0bb['push'](_0x54f0bb['shift']());}}}(_0x246b,0x71229));import{isNumeric}from'@/common/utils/helper';import{NTQQGroupApi}from'@/core/apis';export const Credentials={'Skey':'','CreatTime':0x0,'Cookies':new Map(),'ClientKey':'','KeyIndex':'','PskeyData':new Map(),'PskeyTime':new Map()};export const WebGroupData={'GroupData':new Map(),'GroupTime':new Map()};export const selfInfo={'uid':'','uin':'','nick':'','online':!![]};export const groups=new Map();export function deleteGroup(_0x3dca23){const _0x8784a9=_0x123d;groups[_0x8784a9(0xf4)](_0x3dca23),groupMembers[_0x8784a9(0xf4)](_0x3dca23);}export const groupMembers=new Map();export const friends=new Map();export const friendRequests={};export const groupNotifies={};export const napCatError={'ffmpegError':'','httpServerError':'','wsServerError':'','otherError':_0x90c644(0xf9)};export async function getFriend(_0x4df720){const _0x1931c8=_0x90c644,_0x4b86d8={'RgFrX':function(_0x123db4,_0x2216ae){return _0x123db4(_0x2216ae);}};_0x4df720=_0x4df720[_0x1931c8(0xff)]();if(_0x4b86d8[_0x1931c8(0x108)](isNumeric,_0x4df720)){const _0x2de032=Array[_0x1931c8(0x100)](friends[_0x1931c8(0x102)]());return _0x2de032['find'](_0xc7230e=>_0xc7230e[_0x1931c8(0xfa)]===_0x4df720);}else return friends[_0x1931c8(0xf0)](_0x4df720);}export async function getGroup(_0x27e68a){const _0x460266=_0x90c644;let _0x22521a=groups[_0x460266(0xf0)](_0x27e68a[_0x460266(0xff)]());if(!_0x22521a)try{const _0x3d52c6=await NTQQGroupApi[_0x460266(0xf5)]();_0x3d52c6['length']&&_0x3d52c6[_0x460266(0xfc)](_0x292473=>{const _0x3b68f1=_0x460266;groups[_0x3b68f1(0x109)](_0x292473[_0x3b68f1(0x107)],_0x292473);});}catch(_0x449a41){return undefined;}return _0x22521a=groups['get'](_0x27e68a[_0x460266(0xff)]()),_0x22521a;}function _0x123d(_0xd7768c,_0x37ef4b){const _0x246b7c=_0x246b();return _0x123d=function(_0x123d56,_0x3b527f){_0x123d56=_0x123d56-0xf0;let _0x3fe38a=_0x246b7c[_0x123d56];return _0x3fe38a;},_0x123d(_0xd7768c,_0x37ef4b);}function _0x246b(){const _0x1bd0f3=['get','9SMTtDy','getGroupMembers','bOSxo','delete','getGroups','5206401anodZZ','2574uhYjfn','277XtWdDB','NapCat未能正常启动,请检查日志查看错误','uin','847385flKNhp','forEach','116462BkuBux','OzWpi','toString','from','12369090LFYdWO','values','2650448wUauQe','find','20Lzbyyv','1918gIFIYs','groupCode','RgFrX','set'];_0x246b=function(){return _0x1bd0f3;};return _0x246b();}export async function getGroupMember(_0x5284d9,_0x20e5c9){const _0x26cdcb=_0x90c644,_0x16274e={'bOSxo':function(_0x4572f5,_0x38831a){return _0x4572f5(_0x38831a);},'xiQEB':function(_0x38e3f6){return _0x38e3f6();},'OzWpi':function(_0x22e0b7){return _0x22e0b7();}};_0x5284d9=_0x5284d9[_0x26cdcb(0xff)](),_0x20e5c9=_0x20e5c9[_0x26cdcb(0xff)]();let _0x3b7e1b=groupMembers[_0x26cdcb(0xf0)](_0x5284d9);if(!_0x3b7e1b)try{_0x3b7e1b=await NTQQGroupApi['getGroupMembers'](_0x5284d9),groupMembers[_0x26cdcb(0x109)](_0x5284d9,_0x3b7e1b);}catch(_0x2803ee){return null;}const _0x1596e7=()=>{const _0x2686cd=_0x26cdcb;let _0x435364=undefined;return _0x16274e[_0x2686cd(0xf3)](isNumeric,_0x20e5c9)?_0x435364=Array['from'](_0x3b7e1b['values']())[_0x2686cd(0x104)](_0x1de9f3=>_0x1de9f3['uin']===_0x20e5c9):_0x435364=_0x3b7e1b['get'](_0x20e5c9),_0x435364;};let _0x477a8f=_0x16274e['xiQEB'](_0x1596e7);return!_0x477a8f&&(_0x3b7e1b=await NTQQGroupApi[_0x26cdcb(0xf2)](_0x5284d9),_0x477a8f=_0x16274e[_0x26cdcb(0xfe)](_0x1596e7)),_0x477a8f;}export const tempGroupCodeMap={};export const rawFriends=[];export const stat={'packet_received':0x0,'packet_sent':0x0,'message_received':0x0,'message_sent':0x0,'last_message_time':0x0,'disconnect_times':0x0,'lost_times':0x0,'packet_lost':0x0};
|
@@ -1 +1 @@
|
|||||||
function _0x4a73(_0x176af7,_0x1a4144){var _0x108d09=_0x108d();return _0x4a73=function(_0x4a731e,_0xf80ae7){_0x4a731e=_0x4a731e-0x115;var _0x3ff7ad=_0x108d09[_0x4a731e];return _0x3ff7ad;},_0x4a73(_0x176af7,_0x1a4144);}(function(_0x20bae8,_0x51024a){var _0x4d4b24=_0x4a73,_0x1df5f2=_0x20bae8();while(!![]){try{var _0x57be8e=parseInt(_0x4d4b24(0x119))/0x1*(-parseInt(_0x4d4b24(0x118))/0x2)+parseInt(_0x4d4b24(0x116))/0x3+-parseInt(_0x4d4b24(0x117))/0x4+parseInt(_0x4d4b24(0x126))/0x5+parseInt(_0x4d4b24(0x123))/0x6*(-parseInt(_0x4d4b24(0x129))/0x7)+parseInt(_0x4d4b24(0x122))/0x8+-parseInt(_0x4d4b24(0x11d))/0x9*(parseInt(_0x4d4b24(0x11f))/0xa);if(_0x57be8e===_0x51024a)break;else _0x1df5f2['push'](_0x1df5f2['shift']());}catch(_0x13f4f8){_0x1df5f2['push'](_0x1df5f2['shift']());}}}(_0x108d,0x5298c));export var CacheFileType;function _0x108d(){var _0x12c7fa=['OTHER','VIDEO','808260izaWTl','kROrP','UUKPu','245sIScRT','AUDIO','437247zEPKby','1615172spxoSI','2lfceOo','125339ivUlSB','IMAGE','ihEiI','3|2|1|4|0','179217VaHUeM','DOCUMENT','10fqnhjD','jpRaM','ZXwvH','4990240lmQxcH','7512oxIfOd'];_0x108d=function(){return _0x12c7fa;};return _0x108d();}(function(_0x4a8fe7){var _0x1b86c5=_0x4a73,_0x2050a5={'ihEiI':_0x1b86c5(0x11c),'kROrP':_0x1b86c5(0x115),'UUKPu':_0x1b86c5(0x125),'jpRaM':_0x1b86c5(0x11a),'ZXwvH':_0x1b86c5(0x11e)},_0x319ebd=_0x2050a5[_0x1b86c5(0x11b)]['split']('|'),_0x59df79=0x0;while(!![]){switch(_0x319ebd[_0x59df79++]){case'0':_0x4a8fe7[_0x4a8fe7[_0x1b86c5(0x124)]=0x4]=_0x1b86c5(0x124);continue;case'1':_0x4a8fe7[_0x4a8fe7[_0x2050a5['kROrP']]=0x2]=_0x2050a5[_0x1b86c5(0x127)];continue;case'2':_0x4a8fe7[_0x4a8fe7[_0x2050a5[_0x1b86c5(0x128)]]=0x1]=_0x2050a5[_0x1b86c5(0x128)];continue;case'3':_0x4a8fe7[_0x4a8fe7[_0x2050a5[_0x1b86c5(0x120)]]=0x0]='IMAGE';continue;case'4':_0x4a8fe7[_0x4a8fe7[_0x2050a5[_0x1b86c5(0x121)]]=0x3]=_0x1b86c5(0x11e);continue;}break;}}(CacheFileType||(CacheFileType={})));
|
(function(_0x571cd6,_0x4f3711){var _0x45c8cc=_0x5742,_0x10d69f=_0x571cd6();while(!![]){try{var _0x1a8798=-parseInt(_0x45c8cc(0xe3))/0x1+-parseInt(_0x45c8cc(0xea))/0x2*(parseInt(_0x45c8cc(0xe7))/0x3)+-parseInt(_0x45c8cc(0xec))/0x4*(-parseInt(_0x45c8cc(0xed))/0x5)+-parseInt(_0x45c8cc(0xf4))/0x6*(-parseInt(_0x45c8cc(0xe4))/0x7)+-parseInt(_0x45c8cc(0xf0))/0x8*(-parseInt(_0x45c8cc(0xee))/0x9)+-parseInt(_0x45c8cc(0xe2))/0xa+parseInt(_0x45c8cc(0xeb))/0xb;if(_0x1a8798===_0x4f3711)break;else _0x10d69f['push'](_0x10d69f['shift']());}catch(_0x5d8ca3){_0x10d69f['push'](_0x10d69f['shift']());}}}(_0x2279,0x3dab5));;export var CacheFileType;function _0x2279(){var _0x559982=['7VpxAZi','SOvfy','split','24675MRwhKn','VIDEO','FYODZ','14zOysSk','663388bHWuoO','8236KdZOhb','205FdyzIS','54nOJghj','DOCUMENT','49880rPqXTH','IMAGE','AUDIO','LUehk','2958198IiuVkN','lOqHC','OTHER','DgAml','3035560wRNTYR','61442IePxgt'];_0x2279=function(){return _0x559982;};return _0x2279();}function _0x5742(_0x550f0d,_0x4125a3){var _0x2279de=_0x2279();return _0x5742=function(_0x574215,_0x55e309){_0x574215=_0x574215-0xe1;var _0x5a0360=_0x2279de[_0x574215];return _0x5a0360;},_0x5742(_0x550f0d,_0x4125a3);}(function(_0x22d635){var _0x4ebe49=_0x5742,_0x29a76f={'DgAml':_0x4ebe49(0xef),'lOqHC':_0x4ebe49(0xe8),'SOvfy':_0x4ebe49(0xf1),'FYODZ':_0x4ebe49(0xf2),'LUehk':_0x4ebe49(0xf6)},_0x3fe20f='2|1|3|0|4'[_0x4ebe49(0xe6)]('|'),_0xd1d66a=0x0;while(!![]){switch(_0x3fe20f[_0xd1d66a++]){case'0':_0x22d635[_0x22d635[_0x29a76f['DgAml']]=0x3]=_0x29a76f[_0x4ebe49(0xe1)];continue;case'1':_0x22d635[_0x22d635[_0x29a76f[_0x4ebe49(0xf5)]]=0x1]=_0x29a76f['lOqHC'];continue;case'2':_0x22d635[_0x22d635[_0x29a76f[_0x4ebe49(0xe5)]]=0x0]=_0x4ebe49(0xf1);continue;case'3':_0x22d635[_0x22d635[_0x29a76f[_0x4ebe49(0xe9)]]=0x2]=_0x29a76f[_0x4ebe49(0xe9)];continue;case'4':_0x22d635[_0x22d635[_0x4ebe49(0xf6)]=0x4]=_0x29a76f[_0x4ebe49(0xf3)];continue;}break;}}(CacheFileType||(CacheFileType={})));
|
3
src/core.lib/src/entities/constructor.d.ts
vendored
3
src/core.lib/src/entities/constructor.d.ts
vendored
@@ -5,7 +5,7 @@ export declare class SendMsgElementConstructor {
|
|||||||
static at(atUid: string, atNtUid: string, atType: AtType, atName: string): SendTextElement;
|
static at(atUid: string, atNtUid: string, atType: AtType, atName: string): SendTextElement;
|
||||||
static reply(msgSeq: string, msgId: string, senderUin: string, senderUinStr: string): SendReplyElement;
|
static reply(msgSeq: string, msgId: string, senderUin: string, senderUinStr: string): SendReplyElement;
|
||||||
static pic(picPath: string, summary?: string, subType?: 0 | 1): Promise<SendPicElement>;
|
static pic(picPath: string, summary?: string, subType?: 0 | 1): Promise<SendPicElement>;
|
||||||
static file(filePath: string, fileName?: string): Promise<SendFileElement>;
|
static file(filePath: string, fileName?: string, folderId?: string): Promise<SendFileElement>;
|
||||||
static video(filePath: string, fileName?: string, diyThumbPath?: string): Promise<SendVideoElement>;
|
static video(filePath: string, fileName?: string, diyThumbPath?: string): Promise<SendVideoElement>;
|
||||||
static ptt(pttPath: string): Promise<SendPttElement>;
|
static ptt(pttPath: string): Promise<SendPttElement>;
|
||||||
static face(faceId: number): SendFaceElement;
|
static face(faceId: number): SendFaceElement;
|
||||||
@@ -14,4 +14,5 @@ export declare class SendMsgElementConstructor {
|
|||||||
static rps(resultId: number | null): SendFaceElement;
|
static rps(resultId: number | null): SendFaceElement;
|
||||||
static ark(data: any): SendArkElement;
|
static ark(data: any): SendArkElement;
|
||||||
static markdown(content: string): SendMarkdownElement;
|
static markdown(content: string): SendMarkdownElement;
|
||||||
|
static miniapp(): Promise<SendArkElement>;
|
||||||
}
|
}
|
||||||
|
File diff suppressed because one or more lines are too long
3665
src/core.lib/src/entities/face_config.json
Normal file
3665
src/core.lib/src/entities/face_config.json
Normal file
File diff suppressed because it is too large
Load Diff
6
src/core.lib/src/entities/group.d.ts
vendored
6
src/core.lib/src/entities/group.d.ts
vendored
@@ -7,7 +7,7 @@ export interface Group {
|
|||||||
groupStatus: 0;
|
groupStatus: 0;
|
||||||
memberRole: 2;
|
memberRole: 2;
|
||||||
isTop: boolean;
|
isTop: boolean;
|
||||||
toppedTimestamp: '0';
|
toppedTimestamp: string;
|
||||||
privilegeFlag: number;
|
privilegeFlag: number;
|
||||||
isConf: boolean;
|
isConf: boolean;
|
||||||
hasModifyConfGroupFace: boolean;
|
hasModifyConfGroupFace: boolean;
|
||||||
@@ -24,8 +24,8 @@ export interface Group {
|
|||||||
groupCreditLevel: number;
|
groupCreditLevel: number;
|
||||||
groupFlagExt3: number;
|
groupFlagExt3: number;
|
||||||
groupOwnerId: {
|
groupOwnerId: {
|
||||||
'memberUin': string;
|
memberUin: string;
|
||||||
'memberUid': string;
|
memberUid: string;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
export declare enum GroupMemberRole {
|
export declare enum GroupMemberRole {
|
||||||
|
@@ -1 +1 @@
|
|||||||
function _0x204c(){var _0x1f7faf=['9wxEkQY','10353eAemMy','owner','219812fhrapW','2345wZzuzb','704008ursPKF','6812090OxESOL','UGBDc','1868VUaSoi','7yZhRZE','eomue','admin','164892ebLTvu','104690iTJmah','Rojuj'];_0x204c=function(){return _0x1f7faf;};return _0x204c();}(function(_0x1cc54f,_0x113489){var _0x49a02c=_0x24c6,_0x49e700=_0x1cc54f();while(!![]){try{var _0x48199e=-parseInt(_0x49a02c(0xc7))/0x1+-parseInt(_0x49a02c(0xcc))/0x2+-parseInt(_0x49a02c(0xca))/0x3+-parseInt(_0x49a02c(0xc2))/0x4*(parseInt(_0x49a02c(0xcd))/0x5)+-parseInt(_0x49a02c(0xc6))/0x6+parseInt(_0x49a02c(0xc3))/0x7*(-parseInt(_0x49a02c(0xce))/0x8)+-parseInt(_0x49a02c(0xc9))/0x9*(-parseInt(_0x49a02c(0xc0))/0xa);if(_0x48199e===_0x113489)break;else _0x49e700['push'](_0x49e700['shift']());}catch(_0x2df5de){_0x49e700['push'](_0x49e700['shift']());}}}(_0x204c,0x1f690));export var GroupMemberRole;function _0x24c6(_0x295792,_0xc820a){var _0x204c3b=_0x204c();return _0x24c6=function(_0x24c63d,_0x3dc32a){_0x24c63d=_0x24c63d-0xc0;var _0x57e55b=_0x204c3b[_0x24c63d];return _0x57e55b;},_0x24c6(_0x295792,_0xc820a);}(function(_0x1feeb7){var _0xec8b18=_0x24c6,_0x14b84c={'UGBDc':'normal','Rojuj':_0xec8b18(0xc5),'eomue':_0xec8b18(0xcb)};_0x1feeb7[_0x1feeb7[_0x14b84c[_0xec8b18(0xc1)]]=0x2]=_0x14b84c[_0xec8b18(0xc1)],_0x1feeb7[_0x1feeb7[_0x14b84c[_0xec8b18(0xc8)]]=0x3]=_0x14b84c[_0xec8b18(0xc8)],_0x1feeb7[_0x1feeb7[_0x14b84c[_0xec8b18(0xc4)]]=0x4]=_0x14b84c[_0xec8b18(0xc4)];}(GroupMemberRole||(GroupMemberRole={})));
|
(function(_0x3eba37,_0x497acf){var _0x57a4ab=_0x55e0,_0x130b4f=_0x3eba37();while(!![]){try{var _0xecf628=parseInt(_0x57a4ab(0x17c))/0x1+-parseInt(_0x57a4ab(0x177))/0x2*(-parseInt(_0x57a4ab(0x175))/0x3)+parseInt(_0x57a4ab(0x170))/0x4+parseInt(_0x57a4ab(0x17a))/0x5*(-parseInt(_0x57a4ab(0x176))/0x6)+-parseInt(_0x57a4ab(0x174))/0x7+parseInt(_0x57a4ab(0x17d))/0x8+-parseInt(_0x57a4ab(0x172))/0x9*(-parseInt(_0x57a4ab(0x17e))/0xa);if(_0xecf628===_0x497acf)break;else _0x130b4f['push'](_0x130b4f['shift']());}catch(_0x2fbf8d){_0x130b4f['push'](_0x130b4f['shift']());}}}(_0x3c9a,0xef86e));export var GroupMemberRole;function _0x55e0(_0x48630f,_0x2ef894){var _0x3c9a72=_0x3c9a();return _0x55e0=function(_0x55e0fb,_0xd5f033){_0x55e0fb=_0x55e0fb-0x16f;var _0x5a2abd=_0x3c9a72[_0x55e0fb];return _0x5a2abd;},_0x55e0(_0x48630f,_0x2ef894);}(function(_0x5ed4fe){var _0x382368=_0x55e0,_0x5ae093={'fJBqw':'normal','DBtFa':_0x382368(0x178),'lspvJ':_0x382368(0x173)};_0x5ed4fe[_0x5ed4fe[_0x5ae093[_0x382368(0x179)]]=0x2]=_0x382368(0x171),_0x5ed4fe[_0x5ed4fe[_0x5ae093[_0x382368(0x17b)]]=0x3]=_0x5ae093[_0x382368(0x17b)],_0x5ed4fe[_0x5ed4fe[_0x5ae093[_0x382368(0x16f)]]=0x4]=_0x5ae093[_0x382368(0x16f)];}(GroupMemberRole||(GroupMemberRole={})));function _0x3c9a(){var _0x57609b=['DBtFa','131804DlumfY','4111680ZHsNib','13235610izFxgw','lspvJ','1084276bJCTmi','normal','9FXJtsd','owner','10114272geIRjz','39hTvjYO','6rBqmVR','231698KnfXFC','admin','fJBqw','6602165hCGwNb'];_0x3c9a=function(){return _0x57609b;};return _0x3c9a();}
|
@@ -1 +1 @@
|
|||||||
(function(_0x39bbc9,_0x3e6ba0){var _0x56e959=_0x3b83,_0x1df56f=_0x39bbc9();while(!![]){try{var _0xfc26b5=parseInt(_0x56e959(0x12d))/0x1*(parseInt(_0x56e959(0x128))/0x2)+parseInt(_0x56e959(0x124))/0x3*(parseInt(_0x56e959(0x123))/0x4)+parseInt(_0x56e959(0x125))/0x5+-parseInt(_0x56e959(0x127))/0x6*(-parseInt(_0x56e959(0x12e))/0x7)+-parseInt(_0x56e959(0x126))/0x8*(-parseInt(_0x56e959(0x12b))/0x9)+parseInt(_0x56e959(0x12a))/0xa*(parseInt(_0x56e959(0x122))/0xb)+parseInt(_0x56e959(0x12c))/0xc*(-parseInt(_0x56e959(0x129))/0xd);if(_0xfc26b5===_0x3e6ba0)break;else _0x1df56f['push'](_0x1df56f['shift']());}catch(_0x4cc5c1){_0x1df56f['push'](_0x1df56f['shift']());}}}(_0x5b0a,0x9d183));export*from'./user';export*from'./group';export*from'./msg';export*from'./notify';export*from'./cache';export*from'./constructor';function _0x3b83(_0x42aa80,_0x8dd778){var _0x5b0a5b=_0x5b0a();return _0x3b83=function(_0x3b83a2,_0x12202f){_0x3b83a2=_0x3b83a2-0x122;var _0x315591=_0x5b0a5b[_0x3b83a2];return _0x315591;},_0x3b83(_0x42aa80,_0x8dd778);}function _0x5b0a(){var _0x1c4b84=['5048950aCiqrm','55400RqVfLv','1914feBawE','14iUfhDF','962LuiHBa','1090vtOYwC','1386qhVdFS','458244rarPMn','44284UdiKYZ','266PMaXEB','75713igBErl','641400zIcqBZ','6vbIaSR'];_0x5b0a=function(){return _0x1c4b84;};return _0x5b0a();}
|
function _0x529c(_0x34841d,_0x2a6039){var _0x498a17=_0x498a();return _0x529c=function(_0x529cee,_0xa4b0aa){_0x529cee=_0x529cee-0xf8;var _0xe4d279=_0x498a17[_0x529cee];return _0xe4d279;},_0x529c(_0x34841d,_0x2a6039);}(function(_0x3f3b10,_0x265363){var _0x3db235=_0x529c,_0x2e527b=_0x3f3b10();while(!![]){try{var _0x13ee98=-parseInt(_0x3db235(0xf8))/0x1*(parseInt(_0x3db235(0x100))/0x2)+parseInt(_0x3db235(0x102))/0x3+-parseInt(_0x3db235(0xfc))/0x4+parseInt(_0x3db235(0xfe))/0x5*(-parseInt(_0x3db235(0x103))/0x6)+-parseInt(_0x3db235(0xff))/0x7*(parseInt(_0x3db235(0x101))/0x8)+-parseInt(_0x3db235(0xf9))/0x9*(-parseInt(_0x3db235(0xfd))/0xa)+parseInt(_0x3db235(0xfa))/0xb*(parseInt(_0x3db235(0xfb))/0xc);if(_0x13ee98===_0x265363)break;else _0x2e527b['push'](_0x2e527b['shift']());}catch(_0x8782c5){_0x2e527b['push'](_0x2e527b['shift']());}}}(_0x498a,0x76326));export*from'./user';export*from'./group';function _0x498a(){var _0x3a2a4d=['744wNyLIN','188608wQddIZ','387570AJVwXd','139575TCDwJF','7fAOeuC','4GmhCJD','4424152BpiXAa','2268201QppAsq','120eBPoGq','481972chQkVc','198gTdWlb','177034rWaAMp'];_0x498a=function(){return _0x3a2a4d;};return _0x498a();}export*from'./msg';export*from'./notify';export*from'./cache';export*from'./constructor';
|
204
src/core.lib/src/entities/msg.d.ts
vendored
204
src/core.lib/src/entities/msg.d.ts
vendored
@@ -2,7 +2,23 @@ import { GroupMemberRole } from './group';
|
|||||||
export interface Peer {
|
export interface Peer {
|
||||||
chatType: ChatType;
|
chatType: ChatType;
|
||||||
peerUid: string;
|
peerUid: string;
|
||||||
guildId?: '';
|
guildId?: string;
|
||||||
|
}
|
||||||
|
export interface KickedOffLineInfo {
|
||||||
|
appId: number;
|
||||||
|
instanceId: number;
|
||||||
|
sameDevice: boolean;
|
||||||
|
tipsDesc: string;
|
||||||
|
tipsTitle: string;
|
||||||
|
kickedType: number;
|
||||||
|
securityKickedType: number;
|
||||||
|
}
|
||||||
|
export interface GetFileListParam {
|
||||||
|
sortType: number;
|
||||||
|
fileCount: number;
|
||||||
|
startIndex: number;
|
||||||
|
sortOrder: number;
|
||||||
|
showOnlinedocFolder: number;
|
||||||
}
|
}
|
||||||
export declare enum ElementType {
|
export declare enum ElementType {
|
||||||
TEXT = 1,
|
TEXT = 1,
|
||||||
@@ -18,7 +34,7 @@ export declare enum ElementType {
|
|||||||
}
|
}
|
||||||
export interface SendTextElement {
|
export interface SendTextElement {
|
||||||
elementType: ElementType.TEXT;
|
elementType: ElementType.TEXT;
|
||||||
elementId: '';
|
elementId: string;
|
||||||
textElement: {
|
textElement: {
|
||||||
content: string;
|
content: string;
|
||||||
atType: number;
|
atType: number;
|
||||||
@@ -29,7 +45,7 @@ export interface SendTextElement {
|
|||||||
}
|
}
|
||||||
export interface SendPttElement {
|
export interface SendPttElement {
|
||||||
elementType: ElementType.PTT;
|
elementType: ElementType.PTT;
|
||||||
elementId: '';
|
elementId: string;
|
||||||
pttElement: {
|
pttElement: {
|
||||||
fileName: string;
|
fileName: string;
|
||||||
filePath: string;
|
filePath: string;
|
||||||
@@ -41,7 +57,7 @@ export interface SendPttElement {
|
|||||||
voiceChangeType: number;
|
voiceChangeType: number;
|
||||||
canConvert2Text: boolean;
|
canConvert2Text: boolean;
|
||||||
waveAmplitudes: number[];
|
waveAmplitudes: number[];
|
||||||
fileSubId: '';
|
fileSubId: string;
|
||||||
playState: number;
|
playState: number;
|
||||||
autoConvertText: number;
|
autoConvertText: number;
|
||||||
};
|
};
|
||||||
@@ -56,7 +72,7 @@ export declare enum PicSubType {
|
|||||||
}
|
}
|
||||||
export interface SendPicElement {
|
export interface SendPicElement {
|
||||||
elementType: ElementType.PIC;
|
elementType: ElementType.PIC;
|
||||||
elementId: '';
|
elementId: string;
|
||||||
picElement: {
|
picElement: {
|
||||||
md5HexStr: string;
|
md5HexStr: string;
|
||||||
fileSize: number | string;
|
fileSize: number | string;
|
||||||
@@ -75,7 +91,7 @@ export interface SendPicElement {
|
|||||||
}
|
}
|
||||||
export interface SendReplyElement {
|
export interface SendReplyElement {
|
||||||
elementType: ElementType.REPLY;
|
elementType: ElementType.REPLY;
|
||||||
elementId: '';
|
elementId: string;
|
||||||
replyElement: {
|
replyElement: {
|
||||||
replayMsgSeq: string;
|
replayMsgSeq: string;
|
||||||
replayMsgId: string;
|
replayMsgId: string;
|
||||||
@@ -85,7 +101,7 @@ export interface SendReplyElement {
|
|||||||
}
|
}
|
||||||
export interface SendFaceElement {
|
export interface SendFaceElement {
|
||||||
elementType: ElementType.FACE;
|
elementType: ElementType.FACE;
|
||||||
elementId: '';
|
elementId: string;
|
||||||
faceElement: FaceElement;
|
faceElement: FaceElement;
|
||||||
}
|
}
|
||||||
export interface SendMarketFaceElement {
|
export interface SendMarketFaceElement {
|
||||||
@@ -93,39 +109,40 @@ export interface SendMarketFaceElement {
|
|||||||
marketFaceElement: MarketFaceElement;
|
marketFaceElement: MarketFaceElement;
|
||||||
}
|
}
|
||||||
export interface FileElement {
|
export interface FileElement {
|
||||||
'fileMd5'?: '';
|
fileMd5?: string;
|
||||||
'fileName': string;
|
fileName: string;
|
||||||
'filePath': string;
|
filePath: string;
|
||||||
fileSize: string;
|
fileSize: string;
|
||||||
'picHeight'?: number;
|
picHeight?: number;
|
||||||
'picWidth'?: number;
|
picWidth?: number;
|
||||||
'picThumbPath'?: Map<number, string>;
|
folderId?: string;
|
||||||
'file10MMd5'?: '';
|
picThumbPath?: Map<number, string>;
|
||||||
'fileSha'?: '';
|
file10MMd5?: string;
|
||||||
'fileSha3'?: '';
|
fileSha?: string;
|
||||||
'fileUuid'?: '';
|
fileSha3?: string;
|
||||||
'fileSubId'?: '';
|
fileUuid?: string;
|
||||||
'thumbFileSize'?: number;
|
fileSubId?: string;
|
||||||
|
thumbFileSize?: number;
|
||||||
fileBizId?: number;
|
fileBizId?: number;
|
||||||
}
|
}
|
||||||
export interface SendFileElement {
|
export interface SendFileElement {
|
||||||
elementType: ElementType.FILE;
|
elementType: ElementType.FILE;
|
||||||
elementId: '';
|
elementId: string;
|
||||||
fileElement: FileElement;
|
fileElement: FileElement;
|
||||||
}
|
}
|
||||||
export interface SendVideoElement {
|
export interface SendVideoElement {
|
||||||
elementType: ElementType.VIDEO;
|
elementType: ElementType.VIDEO;
|
||||||
elementId: '';
|
elementId: string;
|
||||||
videoElement: VideoElement;
|
videoElement: VideoElement;
|
||||||
}
|
}
|
||||||
export interface SendArkElement {
|
export interface SendArkElement {
|
||||||
elementType: ElementType.ARK;
|
elementType: ElementType.ARK;
|
||||||
elementId: '';
|
elementId: string;
|
||||||
arkElement: ArkElement;
|
arkElement: ArkElement;
|
||||||
}
|
}
|
||||||
export interface SendMarkdownElement {
|
export interface SendMarkdownElement {
|
||||||
elementType: ElementType.MARKDOWN;
|
elementType: ElementType.MARKDOWN;
|
||||||
elementId: '';
|
elementId: string;
|
||||||
markdownElement: MarkdownElement;
|
markdownElement: MarkdownElement;
|
||||||
}
|
}
|
||||||
export type SendMessageElement = SendTextElement | SendPttElement | SendPicElement | SendReplyElement | SendFaceElement | SendMarketFaceElement | SendFileElement | SendVideoElement | SendArkElement | SendMarkdownElement;
|
export type SendMessageElement = SendTextElement | SendPttElement | SendPicElement | SendReplyElement | SendFaceElement | SendMarketFaceElement | SendFileElement | SendVideoElement | SendArkElement | SendMarkdownElement;
|
||||||
@@ -137,6 +154,7 @@ export declare enum AtType {
|
|||||||
export declare enum ChatType {
|
export declare enum ChatType {
|
||||||
friend = 1,
|
friend = 1,
|
||||||
group = 2,
|
group = 2,
|
||||||
|
chatDevice = 8,//移动设备?
|
||||||
temp = 100
|
temp = 100
|
||||||
}
|
}
|
||||||
export interface PttElement {
|
export interface PttElement {
|
||||||
@@ -232,49 +250,49 @@ export interface MarketFaceElement {
|
|||||||
key: string;
|
key: string;
|
||||||
}
|
}
|
||||||
export interface VideoElement {
|
export interface VideoElement {
|
||||||
'filePath': string;
|
filePath: string;
|
||||||
'fileName': string;
|
fileName: string;
|
||||||
'videoMd5'?: string;
|
videoMd5?: string;
|
||||||
'thumbMd5'?: string;
|
thumbMd5?: string;
|
||||||
'fileTime'?: number;
|
fileTime?: number;
|
||||||
'thumbSize'?: number;
|
thumbSize?: number;
|
||||||
'fileFormat'?: number;
|
fileFormat?: number;
|
||||||
'fileSize'?: string;
|
fileSize?: string;
|
||||||
'thumbWidth'?: number;
|
thumbWidth?: number;
|
||||||
'thumbHeight'?: number;
|
thumbHeight?: number;
|
||||||
'busiType'?: 0;
|
busiType?: 0;
|
||||||
'subBusiType'?: 0;
|
subBusiType?: 0;
|
||||||
'thumbPath'?: Map<number, any>;
|
thumbPath?: Map<number, any>;
|
||||||
'transferStatus'?: 0;
|
transferStatus?: 0;
|
||||||
'progress'?: 0;
|
progress?: 0;
|
||||||
'invalidState'?: 0;
|
invalidState?: 0;
|
||||||
'fileUuid'?: string;
|
fileUuid?: string;
|
||||||
'fileSubId'?: '';
|
fileSubId?: string;
|
||||||
'fileBizId'?: null;
|
fileBizId?: null;
|
||||||
'originVideoMd5'?: '';
|
originVideoMd5?: string;
|
||||||
'import_rich_media_context'?: null;
|
import_rich_media_context?: null;
|
||||||
'sourceVideoCodecFormat'?: number;
|
sourceVideoCodecFormat?: number;
|
||||||
}
|
}
|
||||||
export interface MarkdownElement {
|
export interface MarkdownElement {
|
||||||
content: string;
|
content: string;
|
||||||
}
|
}
|
||||||
export interface InlineKeyboardElementRowButton {
|
export interface InlineKeyboardElementRowButton {
|
||||||
'id': '';
|
id: string;
|
||||||
'label': string;
|
label: string;
|
||||||
'visitedLabel': string;
|
visitedLabel: string;
|
||||||
'style': 1;
|
style: 1;
|
||||||
'type': 2;
|
type: 2;
|
||||||
'clickLimit': 0;
|
clickLimit: 0;
|
||||||
'unsupportTips': '请升级新版手机QQ';
|
unsupportTips: string;
|
||||||
'data': string;
|
data: string;
|
||||||
'atBotShowChannelList': false;
|
atBotShowChannelList: boolean;
|
||||||
'permissionType': 2;
|
permissionType: number;
|
||||||
'specifyRoleIds': [];
|
specifyRoleIds: [];
|
||||||
'specifyTinyids': [];
|
specifyTinyids: [];
|
||||||
'isReply': false;
|
isReply: false;
|
||||||
'anchor': 0;
|
anchor: 0;
|
||||||
'enter': false;
|
enter: false;
|
||||||
'subscribeDataTemplateIds': [];
|
subscribeDataTemplateIds: [];
|
||||||
}
|
}
|
||||||
export interface InlineKeyboardElement {
|
export interface InlineKeyboardElement {
|
||||||
rows: [
|
rows: [
|
||||||
@@ -294,40 +312,40 @@ export declare enum TipGroupElementType {
|
|||||||
ban = 8
|
ban = 8
|
||||||
}
|
}
|
||||||
export interface TipGroupElement {
|
export interface TipGroupElement {
|
||||||
'type': TipGroupElementType;
|
type: TipGroupElementType;
|
||||||
'role': 0;
|
role: 0;
|
||||||
'groupName': string;
|
groupName: string;
|
||||||
'memberUid': string;
|
memberUid: string;
|
||||||
'memberNick': string;
|
memberNick: string;
|
||||||
'memberRemark': string;
|
memberRemark: string;
|
||||||
'adminUid': string;
|
adminUid: string;
|
||||||
'adminNick': string;
|
adminNick: string;
|
||||||
'adminRemark': string;
|
adminRemark: string;
|
||||||
'createGroup': null;
|
createGroup: null;
|
||||||
'memberAdd'?: {
|
memberAdd?: {
|
||||||
'showType': 1;
|
showType: 1;
|
||||||
'otherAdd': null;
|
otherAdd: null;
|
||||||
'otherAddByOtherQRCode': null;
|
otherAddByOtherQRCode: null;
|
||||||
'otherAddByYourQRCode': null;
|
otherAddByYourQRCode: null;
|
||||||
'youAddByOtherQRCode': null;
|
youAddByOtherQRCode: null;
|
||||||
'otherInviteOther': null;
|
otherInviteOther: null;
|
||||||
'otherInviteYou': null;
|
otherInviteYou: null;
|
||||||
'youInviteOther': null;
|
youInviteOther: null;
|
||||||
};
|
};
|
||||||
'shutUp'?: {
|
shutUp?: {
|
||||||
'curTime': string;
|
curTime: string;
|
||||||
'duration': string;
|
duration: string;
|
||||||
'admin': {
|
admin: {
|
||||||
'uid': string;
|
uid: string;
|
||||||
'card': string;
|
card: string;
|
||||||
'name': string;
|
name: string;
|
||||||
'role': GroupMemberRole;
|
role: GroupMemberRole;
|
||||||
};
|
};
|
||||||
'member': {
|
member: {
|
||||||
'uid': string;
|
uid: string;
|
||||||
'card': string;
|
card: string;
|
||||||
'name': string;
|
name: string;
|
||||||
'role': GroupMemberRole;
|
role: GroupMemberRole;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
function _0x3257(_0x22283c,_0x4f00ec){var _0x43251c=_0x4325();return _0x3257=function(_0x3257c1,_0x32db93){_0x3257c1=_0x3257c1-0x1d1;var _0x32fad8=_0x43251c[_0x3257c1];return _0x32fad8;},_0x3257(_0x22283c,_0x4f00ec);}(function(_0x16c142,_0x413b4c){var _0x3c989e=_0x3257,_0x9be4f8=_0x16c142();while(!![]){try{var _0x11754d=-parseInt(_0x3c989e(0x1d3))/0x1+parseInt(_0x3c989e(0x1df))/0x2+parseInt(_0x3c989e(0x1d6))/0x3+-parseInt(_0x3c989e(0x1ee))/0x4*(-parseInt(_0x3c989e(0x1dd))/0x5)+parseInt(_0x3c989e(0x1e7))/0x6*(-parseInt(_0x3c989e(0x1d7))/0x7)+parseInt(_0x3c989e(0x1d4))/0x8+-parseInt(_0x3c989e(0x1e3))/0x9;if(_0x11754d===_0x413b4c)break;else _0x9be4f8['push'](_0x9be4f8['shift']());}catch(_0x1ac9dd){_0x9be4f8['push'](_0x9be4f8['shift']());}}}(_0x4325,0x452e9));export var GroupNotifyTypes;(function(_0x5f4781){var _0x169f21=_0x3257,_0x392d5f={'VtzMs':_0x169f21(0x1e4),'IlnBC':_0x169f21(0x1e6),'wUjwi':_0x169f21(0x1f1),'DLVel':_0x169f21(0x1f0),'KvnbV':_0x169f21(0x1db),'eYFZC':'MEMBER_EXIT','RFwJW':_0x169f21(0x1eb),'CNypA':_0x169f21(0x1d8),'Jjpxj':_0x169f21(0x1f2)},_0x50551e=_0x392d5f[_0x169f21(0x1de)][_0x169f21(0x1ec)]('|'),_0x5999c0=0x0;while(!![]){switch(_0x50551e[_0x5999c0++]){case'0':_0x5f4781[_0x5f4781[_0x392d5f[_0x169f21(0x1e9)]]=0x7]=_0x169f21(0x1e6);continue;case'1':_0x5f4781[_0x5f4781[_0x392d5f['wUjwi']]=0x4]=_0x169f21(0x1f1);continue;case'2':_0x5f4781[_0x5f4781[_0x392d5f['DLVel']]=0xd]=_0x392d5f[_0x169f21(0x1e0)];continue;case'3':_0x5f4781[_0x5f4781[_0x169f21(0x1db)]=0x9]=_0x392d5f[_0x169f21(0x1ed)];continue;case'4':_0x5f4781[_0x5f4781[_0x392d5f[_0x169f21(0x1dc)]]=0xb]=_0x392d5f[_0x169f21(0x1dc)];continue;case'5':_0x5f4781[_0x5f4781[_0x392d5f[_0x169f21(0x1e2)]]=0x8]=_0x392d5f[_0x169f21(0x1e2)];continue;case'6':_0x5f4781[_0x5f4781[_0x392d5f[_0x169f21(0x1da)]]=0x1]=_0x392d5f['CNypA'];continue;case'7':_0x5f4781[_0x5f4781[_0x169f21(0x1f2)]=0xc]=_0x392d5f[_0x169f21(0x1ea)];continue;}break;}}(GroupNotifyTypes||(GroupNotifyTypes={})));export var GroupNotifyStatus;(function(_0x144246){var _0x2bb6dc=_0x3257,_0x56c4b5={'CGvUr':_0x2bb6dc(0x1ef),'oLQZQ':'WAIT_HANDLE','YRkGq':_0x2bb6dc(0x1e8),'zvcNT':_0x2bb6dc(0x1e1)};_0x144246[_0x144246[_0x56c4b5[_0x2bb6dc(0x1d1)]]=0x0]=_0x56c4b5[_0x2bb6dc(0x1d1)],_0x144246[_0x144246['WAIT_HANDLE']=0x1]=_0x56c4b5['oLQZQ'],_0x144246[_0x144246['APPROVE']=0x2]=_0x56c4b5[_0x2bb6dc(0x1d2)],_0x144246[_0x144246[_0x56c4b5[_0x2bb6dc(0x1e5)]]=0x3]=_0x56c4b5[_0x2bb6dc(0x1e5)];}(GroupNotifyStatus||(GroupNotifyStatus={})));export var GroupRequestOperateTypes;(function(_0xe5f9e5){var _0x4dd3ce=_0x3257,_0x35a12a={'pEunQ':_0x4dd3ce(0x1d5),'ebYqz':'reject'};_0xe5f9e5[_0xe5f9e5[_0x4dd3ce(0x1d5)]=0x1]=_0x35a12a['pEunQ'],_0xe5f9e5[_0xe5f9e5[_0x35a12a[_0x4dd3ce(0x1d9)]]=0x2]=_0x35a12a[_0x4dd3ce(0x1d9)];}(GroupRequestOperateTypes||(GroupRequestOperateTypes={})));function _0x4325(){var _0x2e3f4e=['2100708ZKBhOA','6|1|0|5|3|4|7|2','zvcNT','JOIN_REQUEST','375318XktzPQ','APPROVE','IlnBC','Jjpxj','ADMIN_SET','split','KvnbV','461204RaVoVQ','IGNORE','ADMIN_UNSET_OTHER','INVITED_JOIN','ADMIN_UNSET','CGvUr','YRkGq','20620DdNeVj','686552Sskzcp','approve','1122690LlPZmE','63kUFrfo','INVITE_ME','ebYqz','CNypA','KICK_MEMBER','eYFZC','10lmwBlq','VtzMs','819454faFDxy','DLVel','REJECT','RFwJW'];_0x4325=function(){return _0x2e3f4e;};return _0x4325();}
|
(function(_0x7d0811,_0x9559dc){var _0x2bc126=_0x5d56,_0x2d90d0=_0x7d0811();while(!![]){try{var _0x54f71d=parseInt(_0x2bc126(0x100))/0x1+parseInt(_0x2bc126(0x10b))/0x2*(-parseInt(_0x2bc126(0x101))/0x3)+-parseInt(_0x2bc126(0x11b))/0x4*(-parseInt(_0x2bc126(0x11c))/0x5)+-parseInt(_0x2bc126(0x105))/0x6+parseInt(_0x2bc126(0x11a))/0x7*(-parseInt(_0x2bc126(0x11f))/0x8)+-parseInt(_0x2bc126(0x111))/0x9+parseInt(_0x2bc126(0x119))/0xa;if(_0x54f71d===_0x9559dc)break;else _0x2d90d0['push'](_0x2d90d0['shift']());}catch(_0x3596b4){_0x2d90d0['push'](_0x2d90d0['shift']());}}}(_0x376e,0x63684));function _0x5d56(_0x4ce3b5,_0x259540){var _0x376e4a=_0x376e();return _0x5d56=function(_0x5d5641,_0xeaf8e6){_0x5d5641=_0x5d5641-0x100;var _0x3548a5=_0x376e4a[_0x5d5641];return _0x3548a5;},_0x5d56(_0x4ce3b5,_0x259540);}export var GroupNotifyTypes;(function(_0x310d35){var _0x149231=_0x5d56,_0x252710={'NZCnw':_0x149231(0x114),'uPFzG':_0x149231(0x108),'DwNXE':_0x149231(0x116),'yCiJX':_0x149231(0x10e),'BCOxf':_0x149231(0x107),'GAGDE':'ADMIN_UNSET','OiNWa':_0x149231(0x109),'pskiF':'MEMBER_EXIT','Bpgjo':'KICK_MEMBER'},_0x5b56b2=_0x252710['NZCnw'][_0x149231(0x10f)]('|'),_0x4626e2=0x0;while(!![]){switch(_0x5b56b2[_0x4626e2++]){case'0':_0x310d35[_0x310d35[_0x252710[_0x149231(0x117)]]=0xd]=_0x252710[_0x149231(0x117)];continue;case'1':_0x310d35[_0x310d35[_0x252710[_0x149231(0x110)]]=0x7]=_0x149231(0x116);continue;case'2':_0x310d35[_0x310d35[_0x149231(0x10e)]=0x8]=_0x252710[_0x149231(0x115)];continue;case'3':_0x310d35[_0x310d35[_0x252710[_0x149231(0x106)]]=0x1]=_0x252710['BCOxf'];continue;case'4':_0x310d35[_0x310d35[_0x252710[_0x149231(0x118)]]=0xc]=_0x252710[_0x149231(0x118)];continue;case'5':_0x310d35[_0x310d35[_0x252710['OiNWa']]=0x4]=_0x252710[_0x149231(0x120)];continue;case'6':_0x310d35[_0x310d35[_0x252710['pskiF']]=0xb]='MEMBER_EXIT';continue;case'7':_0x310d35[_0x310d35[_0x252710[_0x149231(0x102)]]=0x9]=_0x252710[_0x149231(0x102)];continue;}break;}}(GroupNotifyTypes||(GroupNotifyTypes={})));export var GroupNotifyStatus;function _0x376e(){var _0x9f7aea=['OiNWa','551978sJCSWv','3ItdETv','Bpgjo','AUuZe','APPROVE','432372hfqjfO','BCOxf','INVITE_ME','ADMIN_UNSET_OTHER','INVITED_JOIN','hyeoQ','130286qZdFuj','approve','ewsuQ','ADMIN_SET','split','DwNXE','3269115OUxudj','rJAOJ','NhqhX','3|5|1|2|7|6|4|0','yCiJX','JOIN_REQUEST','uPFzG','GAGDE','445560MqVxpy','5509NhgopD','196492RXobeV','75HVaGho','REJECT','mfiGK','4328IfBBZw'];_0x376e=function(){return _0x9f7aea;};return _0x376e();}(function(_0x5c4ac4){var _0x545e79=_0x5d56,_0x4e37ef={'ewsuQ':'IGNORE','rJAOJ':'WAIT_HANDLE','mfiGK':_0x545e79(0x104),'NhqhX':_0x545e79(0x11d)};_0x5c4ac4[_0x5c4ac4[_0x4e37ef[_0x545e79(0x10d)]]=0x0]=_0x4e37ef['ewsuQ'],_0x5c4ac4[_0x5c4ac4[_0x4e37ef['rJAOJ']]=0x1]=_0x4e37ef[_0x545e79(0x112)],_0x5c4ac4[_0x5c4ac4[_0x4e37ef[_0x545e79(0x11e)]]=0x2]=_0x545e79(0x104),_0x5c4ac4[_0x5c4ac4[_0x4e37ef[_0x545e79(0x113)]]=0x3]=_0x545e79(0x11d);}(GroupNotifyStatus||(GroupNotifyStatus={})));export var GroupRequestOperateTypes;(function(_0x8f4409){var _0x2787e0=_0x5d56,_0x3a43a0={'AUuZe':'approve','hyeoQ':'reject'};_0x8f4409[_0x8f4409[_0x2787e0(0x10c)]=0x1]=_0x3a43a0[_0x2787e0(0x103)],_0x8f4409[_0x8f4409['reject']=0x2]=_0x3a43a0[_0x2787e0(0x10a)];}(GroupRequestOperateTypes||(GroupRequestOperateTypes={})));
|
190
src/core.lib/src/entities/user.d.ts
vendored
190
src/core.lib/src/entities/user.d.ts
vendored
@@ -3,11 +3,38 @@ export declare enum Sex {
|
|||||||
female = 2,
|
female = 2,
|
||||||
unknown = 255
|
unknown = 255
|
||||||
}
|
}
|
||||||
|
export interface BuddyCategoryType {
|
||||||
|
categoryId: number;
|
||||||
|
categroyName: string;
|
||||||
|
categroyMbCount: number;
|
||||||
|
buddyList: User[];
|
||||||
|
}
|
||||||
|
export interface ModifyProfileParams {
|
||||||
|
nick: string;
|
||||||
|
longNick: string;
|
||||||
|
sex: Sex;
|
||||||
|
birthday: {
|
||||||
|
birthday_year: string;
|
||||||
|
birthday_month: string;
|
||||||
|
birthday_day: string;
|
||||||
|
};
|
||||||
|
location: any;
|
||||||
|
}
|
||||||
|
export interface BuddyProfileLikeReq {
|
||||||
|
friendUids: string[];
|
||||||
|
basic: number;
|
||||||
|
vote: number;
|
||||||
|
favorite: number;
|
||||||
|
userProfile: number;
|
||||||
|
type: number;
|
||||||
|
start: number;
|
||||||
|
limit: number;
|
||||||
|
}
|
||||||
export interface QQLevel {
|
export interface QQLevel {
|
||||||
'crownNum': number;
|
crownNum: number;
|
||||||
'sunNum': number;
|
sunNum: number;
|
||||||
'moonNum': number;
|
moonNum: number;
|
||||||
'starNum': number;
|
starNum: number;
|
||||||
}
|
}
|
||||||
export interface User {
|
export interface User {
|
||||||
uid: string;
|
uid: string;
|
||||||
@@ -19,55 +46,124 @@ export interface User {
|
|||||||
sex?: Sex;
|
sex?: Sex;
|
||||||
qqLevel?: QQLevel;
|
qqLevel?: QQLevel;
|
||||||
qid?: string;
|
qid?: string;
|
||||||
'birthday_year'?: number;
|
birthday_year?: number;
|
||||||
'birthday_month'?: number;
|
birthday_month?: number;
|
||||||
'birthday_day'?: number;
|
birthday_day?: number;
|
||||||
'topTime'?: string;
|
topTime?: string;
|
||||||
'constellation'?: number;
|
constellation?: number;
|
||||||
'shengXiao'?: number;
|
shengXiao?: number;
|
||||||
'kBloodType'?: number;
|
kBloodType?: number;
|
||||||
'homeTown'?: string;
|
homeTown?: string;
|
||||||
'makeFriendCareer'?: number;
|
makeFriendCareer?: number;
|
||||||
'pos'?: string;
|
pos?: string;
|
||||||
'eMail'?: string;
|
eMail?: string;
|
||||||
'phoneNum'?: string;
|
phoneNum?: string;
|
||||||
'college'?: string;
|
college?: string;
|
||||||
'country'?: string;
|
country?: string;
|
||||||
'province'?: string;
|
province?: string;
|
||||||
'city'?: string;
|
city?: string;
|
||||||
'postCode'?: string;
|
postCode?: string;
|
||||||
'address'?: string;
|
address?: string;
|
||||||
'isBlock'?: boolean;
|
isBlock?: boolean;
|
||||||
'isSpecialCareOpen'?: boolean;
|
isSpecialCareOpen?: boolean;
|
||||||
'isSpecialCareZone'?: boolean;
|
isSpecialCareZone?: boolean;
|
||||||
'ringId'?: string;
|
ringId?: string;
|
||||||
'regTime'?: number;
|
regTime?: number;
|
||||||
interest?: string;
|
interest?: string;
|
||||||
'labels'?: string[];
|
labels?: string[];
|
||||||
'isHideQQLevel'?: number;
|
isHideQQLevel?: number;
|
||||||
'privilegeIcon'?: {
|
privilegeIcon?: {
|
||||||
'jumpUrl': string;
|
jumpUrl: string;
|
||||||
'openIconList': unknown[];
|
openIconList: unknown[];
|
||||||
'closeIconList': unknown[];
|
closeIconList: unknown[];
|
||||||
};
|
};
|
||||||
'photoWall'?: {
|
photoWall?: {
|
||||||
'picList': unknown[];
|
picList: unknown[];
|
||||||
};
|
};
|
||||||
'vipFlag'?: boolean;
|
vipFlag?: boolean;
|
||||||
'yearVipFlag'?: boolean;
|
yearVipFlag?: boolean;
|
||||||
'svipFlag'?: boolean;
|
svipFlag?: boolean;
|
||||||
'vipLevel'?: number;
|
vipLevel?: number;
|
||||||
'status'?: number;
|
status?: number;
|
||||||
'qidianMasterFlag'?: number;
|
qidianMasterFlag?: number;
|
||||||
'qidianCrewFlag'?: number;
|
qidianCrewFlag?: number;
|
||||||
'qidianCrewFlag2'?: number;
|
qidianCrewFlag2?: number;
|
||||||
'extStatus'?: number;
|
extStatus?: number;
|
||||||
'recommendImgFlag'?: number;
|
recommendImgFlag?: number;
|
||||||
'disableEmojiShortCuts'?: number;
|
disableEmojiShortCuts?: number;
|
||||||
'pendantId'?: string;
|
pendantId?: string;
|
||||||
}
|
}
|
||||||
export interface SelfInfo extends User {
|
export interface SelfInfo extends User {
|
||||||
online?: boolean;
|
online?: boolean;
|
||||||
}
|
}
|
||||||
export interface Friend extends User {
|
export interface Friend extends User {
|
||||||
}
|
}
|
||||||
|
export interface UserDetailInfoByUin {
|
||||||
|
result: number;
|
||||||
|
errMsg: string;
|
||||||
|
info: {
|
||||||
|
uid: string;
|
||||||
|
qid: string;
|
||||||
|
uin: string;
|
||||||
|
nick: string;
|
||||||
|
remark: string;
|
||||||
|
longNick: string;
|
||||||
|
avatarUrl: string;
|
||||||
|
birthday_year: number;
|
||||||
|
birthday_month: number;
|
||||||
|
birthday_day: number;
|
||||||
|
sex: number;
|
||||||
|
topTime: string;
|
||||||
|
constellation: number;
|
||||||
|
shengXiao: number;
|
||||||
|
kBloodType: number;
|
||||||
|
homeTown: string;
|
||||||
|
makeFriendCareer: number;
|
||||||
|
pos: string;
|
||||||
|
eMail: string;
|
||||||
|
phoneNum: string;
|
||||||
|
college: string;
|
||||||
|
country: string;
|
||||||
|
province: string;
|
||||||
|
city: string;
|
||||||
|
postCode: string;
|
||||||
|
address: string;
|
||||||
|
isBlock: boolean;
|
||||||
|
isSpecialCareOpen: boolean;
|
||||||
|
isSpecialCareZone: boolean;
|
||||||
|
ringId: string;
|
||||||
|
regTime: number;
|
||||||
|
interest: string;
|
||||||
|
termType: number;
|
||||||
|
labels: any[];
|
||||||
|
qqLevel: {
|
||||||
|
crownNum: number;
|
||||||
|
sunNum: number;
|
||||||
|
moonNum: number;
|
||||||
|
starNum: number;
|
||||||
|
};
|
||||||
|
isHideQQLevel: number;
|
||||||
|
privilegeIcon: {
|
||||||
|
jumpUrl: string;
|
||||||
|
openIconList: any[];
|
||||||
|
closeIconList: any[];
|
||||||
|
};
|
||||||
|
isHidePrivilegeIcon: number;
|
||||||
|
photoWall: {
|
||||||
|
picList: any[];
|
||||||
|
};
|
||||||
|
vipFlag: boolean;
|
||||||
|
yearVipFlag: boolean;
|
||||||
|
svipFlag: boolean;
|
||||||
|
vipLevel: number;
|
||||||
|
status: number;
|
||||||
|
qidianMasterFlag: number;
|
||||||
|
qidianCrewFlag: number;
|
||||||
|
qidianCrewFlag2: number;
|
||||||
|
extStatus: number;
|
||||||
|
recommendImgFlag: number;
|
||||||
|
disableEmojiShortCuts: number;
|
||||||
|
pendantId: string;
|
||||||
|
vipNameColorId: string;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
@@ -1 +1 @@
|
|||||||
(function(_0x4b08f8,_0x1ca2db){var _0x44b880=_0x3a95,_0x3e8b44=_0x4b08f8();while(!![]){try{var _0xa36709=parseInt(_0x44b880(0x8d))/0x1*(parseInt(_0x44b880(0x91))/0x2)+parseInt(_0x44b880(0x92))/0x3+-parseInt(_0x44b880(0x95))/0x4+parseInt(_0x44b880(0x90))/0x5*(parseInt(_0x44b880(0x93))/0x6)+parseInt(_0x44b880(0x88))/0x7*(-parseInt(_0x44b880(0x8e))/0x8)+parseInt(_0x44b880(0x87))/0x9+-parseInt(_0x44b880(0x8f))/0xa;if(_0xa36709===_0x1ca2db)break;else _0x3e8b44['push'](_0x3e8b44['shift']());}catch(_0x534911){_0x3e8b44['push'](_0x3e8b44['shift']());}}}(_0xd8d8,0xe6bf3));export var Sex;function _0xd8d8(){var _0x43bc6b=['male','10450611HaAuQK','2058hFSwRi','RwTNC','FVSSn','EJoPt','female','1208499UwXQwI','528akARcZ','29586120bAEmwx','5RKhpWu','2IvnXQD','748095ImuOvU','11240472RqVlNc','unknown','2277200INtlvk'];_0xd8d8=function(){return _0x43bc6b;};return _0xd8d8();}function _0x3a95(_0x1cd0e4,_0x2265f6){var _0xd8d8d2=_0xd8d8();return _0x3a95=function(_0x3a9592,_0x383bcc){_0x3a9592=_0x3a9592-0x86;var _0x10090b=_0xd8d8d2[_0x3a9592];return _0x10090b;},_0x3a95(_0x1cd0e4,_0x2265f6);}(function(_0x438ee7){var _0x49b09f=_0x3a95,_0x2fddaf={'RwTNC':_0x49b09f(0x86),'FVSSn':_0x49b09f(0x8c),'EJoPt':_0x49b09f(0x94)};_0x438ee7[_0x438ee7[_0x2fddaf[_0x49b09f(0x89)]]=0x1]=_0x2fddaf[_0x49b09f(0x89)],_0x438ee7[_0x438ee7[_0x2fddaf[_0x49b09f(0x8a)]]=0x2]=_0x2fddaf[_0x49b09f(0x8a)],_0x438ee7[_0x438ee7[_0x2fddaf[_0x49b09f(0x8b)]]=0xff]=_0x2fddaf[_0x49b09f(0x8b)];}(Sex||(Sex={})));
|
function _0x558b(){var _0x2d7a37=['2DgwsfC','unknown','male','909007aLDGTT','female','40cJboYM','550ZnNSiv','251358ZSeMNF','8507223pxiWCJ','872tNciYj','52619qqgUxw','ogIfx','110170lfkhPG','japol','2492812hWIUSA','1340913ahJZBc'];_0x558b=function(){return _0x2d7a37;};return _0x558b();}function _0x224b(_0x4468a3,_0x34c094){var _0x558b52=_0x558b();return _0x224b=function(_0x224b73,_0x5d2b99){_0x224b73=_0x224b73-0x1a4;var _0x4bd9f2=_0x558b52[_0x224b73];return _0x4bd9f2;},_0x224b(_0x4468a3,_0x34c094);}(function(_0x2d4259,_0x7994db){var _0x2f727c=_0x224b,_0x552f46=_0x2d4259();while(!![]){try{var _0x1c622e=parseInt(_0x2f727c(0x1a6))/0x1*(parseInt(_0x2f727c(0x1b3))/0x2)+-parseInt(_0x2f727c(0x1b2))/0x3+-parseInt(_0x2f727c(0x1b1))/0x4+parseInt(_0x2f727c(0x1a8))/0x5*(parseInt(_0x2f727c(0x1aa))/0x6)+-parseInt(_0x2f727c(0x1ad))/0x7*(-parseInt(_0x2f727c(0x1ac))/0x8)+-parseInt(_0x2f727c(0x1ab))/0x9+-parseInt(_0x2f727c(0x1af))/0xa*(-parseInt(_0x2f727c(0x1a9))/0xb);if(_0x1c622e===_0x7994db)break;else _0x552f46['push'](_0x552f46['shift']());}catch(_0x5b18dd){_0x552f46['push'](_0x552f46['shift']());}}}(_0x558b,0x92395));export var Sex;(function(_0x5f3282){var _0x5a90b3=_0x224b,_0x13c50c={'SLLHM':_0x5a90b3(0x1a5),'japol':_0x5a90b3(0x1a7),'ogIfx':_0x5a90b3(0x1a4)};_0x5f3282[_0x5f3282[_0x5a90b3(0x1a5)]=0x1]=_0x13c50c['SLLHM'],_0x5f3282[_0x5f3282[_0x13c50c['japol']]=0x2]=_0x13c50c[_0x5a90b3(0x1b0)],_0x5f3282[_0x5f3282[_0x13c50c[_0x5a90b3(0x1ae)]]=0xff]=_0x5a90b3(0x1a4);}(Sex||(Sex={})));
|
2
src/core.lib/src/external/hook.js
vendored
2
src/core.lib/src/external/hook.js
vendored
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
(function(_0x679653,_0x2b39cc){var _0x34ecf4=_0x4dce,_0x5b696c=_0x679653();while(!![]){try{var _0x493f18=-parseInt(_0x34ecf4(0xb6))/0x1+-parseInt(_0x34ecf4(0xae))/0x2*(-parseInt(_0x34ecf4(0xb5))/0x3)+parseInt(_0x34ecf4(0xb4))/0x4+-parseInt(_0x34ecf4(0xaf))/0x5+parseInt(_0x34ecf4(0xb3))/0x6+parseInt(_0x34ecf4(0xb2))/0x7*(-parseInt(_0x34ecf4(0xb1))/0x8)+-parseInt(_0x34ecf4(0xb0))/0x9;if(_0x493f18===_0x2b39cc)break;else _0x5b696c['push'](_0x5b696c['shift']());}catch(_0x2edcf7){_0x5b696c['push'](_0x5b696c['shift']());}}}(_0x28cb,0x4da5c));import _0x1ea3c6 from'./wrapper';export*from'./adapters';function _0x28cb(){var _0x3704e1=['47166fSGFIS','2705196NXNBrs','542736izQjPG','105ZUERZT','223617PwrcEW','28224IUMbgl','11640ejtXpk','3494205ZaTsvN','176szAFot'];_0x28cb=function(){return _0x3704e1;};return _0x28cb();}export*from'./apis';export*from'./entities';export*from'./listeners';export*from'./services';export*as Adapters from'./adapters';export*as APIs from'./apis';function _0x4dce(_0x4501ba,_0x2cb7d0){var _0x28cb4d=_0x28cb();return _0x4dce=function(_0x4dcec7,_0x1186ab){_0x4dcec7=_0x4dcec7-0xae;var _0xbe9a4c=_0x28cb4d[_0x4dcec7];return _0xbe9a4c;},_0x4dce(_0x4501ba,_0x2cb7d0);}export*as Entities from'./entities';export*as Listeners from'./listeners';export*as Services from'./services';export{_0x1ea3c6 as Wrapper};export*as WrapperInterface from'./wrapper';export*as SessionConfig from'./sessionConfig';export{napCatCore}from'./core';
|
(function(_0x541b13,_0x35fccd){var _0x2154d8=_0x2911,_0x1afe69=_0x541b13();while(!![]){try{var _0x589b2c=-parseInt(_0x2154d8(0x6d))/0x1*(-parseInt(_0x2154d8(0x6c))/0x2)+parseInt(_0x2154d8(0x68))/0x3+parseInt(_0x2154d8(0x69))/0x4+-parseInt(_0x2154d8(0x6b))/0x5+parseInt(_0x2154d8(0x6f))/0x6+-parseInt(_0x2154d8(0x6e))/0x7+parseInt(_0x2154d8(0x6a))/0x8;if(_0x589b2c===_0x35fccd)break;else _0x1afe69['push'](_0x1afe69['shift']());}catch(_0x57ecd0){_0x1afe69['push'](_0x1afe69['shift']());}}}(_0x3165,0x53e34));import _0x57022c from'./wrapper';export*from'./adapters';export*from'./apis';export*from'./entities';function _0x3165(){var _0x305877=['2264328RzFxvl','288606ZwHgPw','22688anxzHB','2580472dlEqwD','555150SjPbQS','71054TZWPGz','7EGAMfB','4171132FUZfjM'];_0x3165=function(){return _0x305877;};return _0x3165();}export*from'./listeners';export*from'./services';export*as Adapters from'./adapters';export*as APIs from'./apis';function _0x2911(_0x11910c,_0x354014){var _0x316599=_0x3165();return _0x2911=function(_0x291128,_0x8cc84e){_0x291128=_0x291128-0x68;var _0x2a5653=_0x316599[_0x291128];return _0x2a5653;},_0x2911(_0x11910c,_0x354014);}export*as Entities from'./entities';export*as Listeners from'./listeners';export*as Services from'./services';export{_0x57022c as Wrapper};export*as WrapperInterface from'./wrapper';export*as SessionConfig from'./sessionConfig';export{napCatCore}from'./core';
|
@@ -1,10 +1,5 @@
|
|||||||
import { FriendRequestNotify, User } from '@/core/entities';
|
import { BuddyCategoryType, FriendRequestNotify } from '@/core/entities';
|
||||||
export type OnBuddyChangeParams = {
|
export type OnBuddyChangeParams = BuddyCategoryType[];
|
||||||
categoryId: number;
|
|
||||||
categroyName: string;
|
|
||||||
categroyMbCount: number;
|
|
||||||
buddyList: User[];
|
|
||||||
}[];
|
|
||||||
interface IBuddyListener {
|
interface IBuddyListener {
|
||||||
onBuddyListChange(arg: OnBuddyChangeParams): void;
|
onBuddyListChange(arg: OnBuddyChangeParams): void;
|
||||||
onBuddyInfoChange(arg: unknown): void;
|
onBuddyInfoChange(arg: unknown): void;
|
||||||
|
@@ -1 +1 @@
|
|||||||
var _0x37c6dc=_0x3b87;(function(_0x62a04d,_0x7a1d79){var _0x5c7ed8=_0x3b87,_0x142ce5=_0x62a04d();while(!![]){try{var _0x5d1c7f=-parseInt(_0x5c7ed8(0x165))/0x1+-parseInt(_0x5c7ed8(0x15c))/0x2+-parseInt(_0x5c7ed8(0x161))/0x3+-parseInt(_0x5c7ed8(0x15d))/0x4*(parseInt(_0x5c7ed8(0x167))/0x5)+parseInt(_0x5c7ed8(0x160))/0x6+parseInt(_0x5c7ed8(0x16f))/0x7*(-parseInt(_0x5c7ed8(0x163))/0x8)+parseInt(_0x5c7ed8(0x166))/0x9*(parseInt(_0x5c7ed8(0x16a))/0xa);if(_0x5d1c7f===_0x7a1d79)break;else _0x142ce5['push'](_0x142ce5['shift']());}catch(_0x455e7f){_0x142ce5['push'](_0x142ce5['shift']());}}}(_0x3503,0xf1b8e));function _0x3b87(_0xed9e25,_0x214a5f){var _0x3503e6=_0x3503();return _0x3b87=function(_0x3b87d5,_0x422de1){_0x3b87d5=_0x3b87d5-0x15a;var _0x2176ae=_0x3503e6[_0x3b87d5];return _0x2176ae;},_0x3b87(_0xed9e25,_0x214a5f);}export class BuddyListener{[_0x37c6dc(0x170)](_0x43f57e){}['onAddMeSettingChanged'](_0x317c37){}[_0x37c6dc(0x15a)](_0x50befe){}[_0x37c6dc(0x168)](_0x2a90e4){}[_0x37c6dc(0x15f)](_0x1227ff){}[_0x37c6dc(0x16c)](_0x5d2d1e){}[_0x37c6dc(0x162)](_0x30a45f){}[_0x37c6dc(0x16d)](_0x533df4){}['onBuddyReqChange'](_0x5b950b){}[_0x37c6dc(0x169)](_0x2c4662){}['onCheckBuddySettingResult'](_0x36afeb){}[_0x37c6dc(0x15b)](_0x336e25){}[_0x37c6dc(0x16e)](_0x3127c7){}[_0x37c6dc(0x16b)](_0x5ad10f){}[_0x37c6dc(0x171)](_0x418e9d){}[_0x37c6dc(0x15e)](_0x5ac71b){}[_0x37c6dc(0x164)](_0x123b97){}}function _0x3503(){var _0x2bd405=['onDoubtBuddyReqUnreadNumChange','onBuddyInfoChange','onBuddyRemarkUpdated','onDoubtBuddyReqChange','3744391oFYPmm','onAddBuddyNeedVerify','onNickUpdated','onAvatarUrlUpdated','onDelBatchBuddyInfos','446956RtkhDk','18808EZhNAC','onSmartInfos','onBuddyDetailInfoChange','2866818IPzTaP','1662702NtyZMl','onBuddyListChange','16DAyVyx','onSpacePermissionInfos','1105494YEsueM','9NvvGsf','1645yGVcAR','onBlockChanged','onBuddyReqUnreadCntChange','50122810zCsmes'];_0x3503=function(){return _0x2bd405;};return _0x3503();}
|
var _0x3261e9=_0x25da;function _0x25da(_0x4acf6b,_0x524728){var _0x4a1c20=_0x4a1c();return _0x25da=function(_0x25dabc,_0xc8d457){_0x25dabc=_0x25dabc-0x12e;var _0x2d5a0a=_0x4a1c20[_0x25dabc];return _0x2d5a0a;},_0x25da(_0x4acf6b,_0x524728);}(function(_0x2ac88b,_0x2ea05d){var _0x5c767=_0x25da,_0x36cfa6=_0x2ac88b();while(!![]){try{var _0x27cb5d=parseInt(_0x5c767(0x136))/0x1+-parseInt(_0x5c767(0x137))/0x2+parseInt(_0x5c767(0x131))/0x3+-parseInt(_0x5c767(0x13f))/0x4+parseInt(_0x5c767(0x134))/0x5+-parseInt(_0x5c767(0x132))/0x6+parseInt(_0x5c767(0x138))/0x7;if(_0x27cb5d===_0x2ea05d)break;else _0x36cfa6['push'](_0x36cfa6['shift']());}catch(_0x5e47ea){_0x36cfa6['push'](_0x36cfa6['shift']());}}}(_0x4a1c,0x6dea4));function _0x4a1c(){var _0x37142e=['onSmartInfos','onBlockChanged','onBuddyReqChange','onBuddyDetailInfoChange','1029921WHHwWZ','2865234HeJslG','onAddMeSettingChanged','1892405jLGijL','onNickUpdated','53073ATQIHq','1138794YdnQeC','7662767TOGxtq','onSpacePermissionInfos','onAddBuddyNeedVerify','onDoubtBuddyReqUnreadNumChange','onCheckBuddySettingResult','onBuddyInfoChange','onBuddyListChange','1489576ZcqAes'];_0x4a1c=function(){return _0x37142e;};return _0x4a1c();}export class BuddyListener{[_0x3261e9(0x13a)](_0x3b9999){}[_0x3261e9(0x133)](_0x2e4231){}['onAvatarUrlUpdated'](_0x1d4b33){}[_0x3261e9(0x12e)](_0x2086d7){}[_0x3261e9(0x130)](_0x3204d4){}[_0x3261e9(0x13d)](_0x44b810){}[_0x3261e9(0x13e)](_0x272484){}['onBuddyRemarkUpdated'](_0x17273f){}[_0x3261e9(0x12f)](_0x932bc6){}['onBuddyReqUnreadCntChange'](_0x3422b0){}[_0x3261e9(0x13c)](_0x3cd4b2){}['onDelBatchBuddyInfos'](_0x3000b0){}['onDoubtBuddyReqChange'](_0xf23596){}[_0x3261e9(0x13b)](_0x10adab){}[_0x3261e9(0x135)](_0x27c6ac){}[_0x3261e9(0x140)](_0x305895){}[_0x3261e9(0x139)](_0x12f358){}}
|
@@ -1 +1 @@
|
|||||||
function _0x59c8(_0x5120b1,_0x3679c0){var _0x1fdb21=_0x1fdb();return _0x59c8=function(_0x59c8c1,_0x4e0255){_0x59c8c1=_0x59c8c1-0x81;var _0x300360=_0x1fdb21[_0x59c8c1];return _0x300360;},_0x59c8(_0x5120b1,_0x3679c0);}var _0x11ca3f=_0x59c8;(function(_0xfa6ba5,_0x39f83f){var _0x39f962=_0x59c8,_0x398357=_0xfa6ba5();while(!![]){try{var _0x39c42d=-parseInt(_0x39f962(0x8c))/0x1+-parseInt(_0x39f962(0x8a))/0x2+-parseInt(_0x39f962(0x86))/0x3+-parseInt(_0x39f962(0x8b))/0x4+parseInt(_0x39f962(0x83))/0x5+-parseInt(_0x39f962(0x85))/0x6*(-parseInt(_0x39f962(0x81))/0x7)+parseInt(_0x39f962(0x89))/0x8;if(_0x39c42d===_0x39f83f)break;else _0x398357['push'](_0x398357['shift']());}catch(_0x46e50b){_0x398357['push'](_0x398357['shift']());}}}(_0x1fdb,0x1fdc0));function _0x1fdb(){var _0x3738dc=['222532hOHKhJ','118077IzePtn','407064UICAVX','onSessionChanged','140265RqlVkS','onFileSearch','12NMBEuw','136122DIlTLI','onSessionListChanged','onFileStatusChanged','1865744ntkQrY','55990AGxpSD'];_0x1fdb=function(){return _0x3738dc;};return _0x1fdb();}export class KernelFileAssistantListener{[_0x11ca3f(0x88)](..._0x53a30b){}[_0x11ca3f(0x87)](..._0x4432e1){}[_0x11ca3f(0x82)](..._0x56ba18){}['onFileListChanged'](..._0x80b647){}[_0x11ca3f(0x84)](..._0x4a33e9){}}
|
var _0x48f75f=_0x50f6;(function(_0x1a1898,_0x4a751e){var _0x214528=_0x50f6,_0x3d6479=_0x1a1898();while(!![]){try{var _0x50d730=parseInt(_0x214528(0x119))/0x1+-parseInt(_0x214528(0x114))/0x2*(parseInt(_0x214528(0x115))/0x3)+parseInt(_0x214528(0x117))/0x4*(-parseInt(_0x214528(0x118))/0x5)+-parseInt(_0x214528(0x11e))/0x6+-parseInt(_0x214528(0x112))/0x7*(-parseInt(_0x214528(0x11f))/0x8)+parseInt(_0x214528(0x111))/0x9*(-parseInt(_0x214528(0x116))/0xa)+parseInt(_0x214528(0x11d))/0xb*(parseInt(_0x214528(0x110))/0xc);if(_0x50d730===_0x4a751e)break;else _0x3d6479['push'](_0x3d6479['shift']());}catch(_0x3c180a){_0x3d6479['push'](_0x3d6479['shift']());}}}(_0x4c71,0x2707a));function _0x50f6(_0x5d7ece,_0x23b66){var _0x4c71e6=_0x4c71();return _0x50f6=function(_0x50f698,_0x21f9b2){_0x50f698=_0x50f698-0x110;var _0x40424b=_0x4c71e6[_0x50f698];return _0x40424b;},_0x50f6(_0x5d7ece,_0x23b66);}function _0x4c71(){var _0x518655=['344imwMhZ','478020vywqkp','487764AmsWpx','32543hYXWOX','onFileStatusChanged','74110PfhtyY','3kqtcDX','30cyMorN','6980jzEKlQ','665VUHXAE','230079kKHVjM','onFileListChanged','onFileSearch','onSessionListChanged','55ULkYXB','225402eHQZRZ'];_0x4c71=function(){return _0x518655;};return _0x4c71();}export class KernelFileAssistantListener{[_0x48f75f(0x113)](..._0x480017){}[_0x48f75f(0x11c)](..._0xa0dff8){}['onSessionChanged'](..._0x4efa91){}[_0x48f75f(0x11a)](..._0x25aeb8){}[_0x48f75f(0x11b)](..._0x28f471){}}
|
@@ -2,7 +2,7 @@ import { Group, GroupMember, GroupNotify } from '@/core/entities';
|
|||||||
interface IGroupListener {
|
interface IGroupListener {
|
||||||
onGroupListUpdate(updateType: number, groupList: Group[]): void;
|
onGroupListUpdate(updateType: number, groupList: Group[]): void;
|
||||||
onGroupExtListUpdate(...args: unknown[]): void;
|
onGroupExtListUpdate(...args: unknown[]): void;
|
||||||
onGroupSingleScreenNotifies(...args: unknown[]): void;
|
onGroupSingleScreenNotifies(doubt: boolean, seq: string, notifies: GroupNotify[]): void;
|
||||||
onGroupNotifiesUpdated(dboubt: boolean, notifies: GroupNotify[]): void;
|
onGroupNotifiesUpdated(dboubt: boolean, notifies: GroupNotify[]): void;
|
||||||
onGroupNotifiesUnreadCountUpdated(...args: unknown[]): void;
|
onGroupNotifiesUnreadCountUpdated(...args: unknown[]): void;
|
||||||
onGroupDetailInfoChange(...args: unknown[]): void;
|
onGroupDetailInfoChange(...args: unknown[]): void;
|
||||||
@@ -50,7 +50,7 @@ export declare class GroupListener implements IGroupListener {
|
|||||||
onGroupNotifiesUpdated(dboubt: boolean, notifies: GroupNotify[]): void;
|
onGroupNotifiesUpdated(dboubt: boolean, notifies: GroupNotify[]): void;
|
||||||
onGroupBulletinRichMediaProgressUpdate(...args: unknown[]): void;
|
onGroupBulletinRichMediaProgressUpdate(...args: unknown[]): void;
|
||||||
onGroupNotifiesUnreadCountUpdated(...args: unknown[]): void;
|
onGroupNotifiesUnreadCountUpdated(...args: unknown[]): void;
|
||||||
onGroupSingleScreenNotifies(...args: unknown[]): void;
|
onGroupSingleScreenNotifies(doubt: boolean, seq: string, notifies: GroupNotify[]): void;
|
||||||
onGroupsMsgMaskResult(...args: unknown[]): void;
|
onGroupsMsgMaskResult(...args: unknown[]): void;
|
||||||
onGroupStatisticInfoChange(...args: unknown[]): void;
|
onGroupStatisticInfoChange(...args: unknown[]): void;
|
||||||
onJoinGroupNotify(...args: unknown[]): void;
|
onJoinGroupNotify(...args: unknown[]): void;
|
||||||
@@ -82,7 +82,7 @@ export declare class DebugGroupListener implements IGroupListener {
|
|||||||
onGroupNotifiesUpdated(...args: unknown[]): void;
|
onGroupNotifiesUpdated(...args: unknown[]): void;
|
||||||
onGroupBulletinRichMediaProgressUpdate(...args: unknown[]): void;
|
onGroupBulletinRichMediaProgressUpdate(...args: unknown[]): void;
|
||||||
onGroupNotifiesUnreadCountUpdated(...args: unknown[]): void;
|
onGroupNotifiesUnreadCountUpdated(...args: unknown[]): void;
|
||||||
onGroupSingleScreenNotifies(...args: unknown[]): void;
|
onGroupSingleScreenNotifies(doubt: boolean, seq: string, notifies: GroupNotify[]): void;
|
||||||
onGroupsMsgMaskResult(...args: unknown[]): void;
|
onGroupsMsgMaskResult(...args: unknown[]): void;
|
||||||
onGroupStatisticInfoChange(...args: unknown[]): void;
|
onGroupStatisticInfoChange(...args: unknown[]): void;
|
||||||
onJoinGroupNotify(...args: unknown[]): void;
|
onJoinGroupNotify(...args: unknown[]): void;
|
||||||
|
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user