mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-07-19 12:03:37 +00:00
Compare commits
484 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
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 | ||
![]() |
52c6927c44 | ||
![]() |
a16e0a21a2 | ||
![]() |
e796b21157 | ||
![]() |
1c6bc478b4 | ||
![]() |
98f39c6388 | ||
![]() |
570c83571b | ||
![]() |
c0c38d89e0 | ||
![]() |
b866cfc03c | ||
![]() |
28c2755b37 | ||
![]() |
57bfc5c73a | ||
![]() |
0f3f7d53a3 | ||
![]() |
529e50fd7f | ||
![]() |
2fa283f91d | ||
![]() |
029a9ade93 | ||
![]() |
f1ca8b15c8 | ||
![]() |
4d8edd5da9 | ||
![]() |
6c63990653 | ||
![]() |
5b521409c6 | ||
![]() |
3268fc1014 | ||
![]() |
19afb4941b | ||
![]() |
40e5111d41 | ||
![]() |
a3a40e1e74 | ||
![]() |
101caa6826 | ||
![]() |
875fed8d77 | ||
![]() |
69e28eb000 | ||
![]() |
e5d3a8360c | ||
![]() |
4545d9285b | ||
![]() |
6702024805 | ||
![]() |
78bad4842b | ||
![]() |
b9a913cfed | ||
![]() |
6f5a6f353f | ||
![]() |
790c4f589d | ||
![]() |
cd1bd3461f | ||
![]() |
0280dcd6a8 | ||
![]() |
fc337292bc | ||
![]() |
fb1daa0e21 | ||
![]() |
579b9dc0c2 | ||
![]() |
dedd0be352 | ||
![]() |
1c7d9c3513 | ||
![]() |
0c7dfe2af4 | ||
![]() |
8d1351a8a3 | ||
![]() |
e6e68a6036 | ||
![]() |
24658edc45 | ||
![]() |
09eaa3116a | ||
![]() |
e9bff466b5 | ||
![]() |
5d77f50160 | ||
![]() |
2ab91e363f | ||
![]() |
34d881426f | ||
![]() |
13ecaa0ad4 | ||
![]() |
ce6185b1f7 | ||
![]() |
2cfde6b75a | ||
![]() |
37d0354751 | ||
![]() |
0a0edcf203 | ||
![]() |
d6aad2ea28 | ||
![]() |
63084506ee | ||
![]() |
c5d313574f | ||
![]() |
caab998212 | ||
![]() |
aa037cc3d9 | ||
![]() |
642bffe374 | ||
![]() |
d682b154fc | ||
![]() |
d4a06d98cf | ||
![]() |
856b5e16b1 | ||
![]() |
a0aa208860 | ||
![]() |
037a11e04f | ||
![]() |
bd8a1d715f | ||
![]() |
54ab1dc091 | ||
![]() |
9471e63857 | ||
![]() |
fa4a403f38 | ||
![]() |
d608d65bf4 | ||
![]() |
c0f2df172a | ||
![]() |
788ef5d81c | ||
![]() |
1c6b5cffe1 | ||
![]() |
c04382b623 | ||
![]() |
0bbe51f8fd | ||
![]() |
ff7d7d15a0 | ||
![]() |
4b3d083d3a | ||
![]() |
a566dd390b | ||
![]() |
7d1442da04 | ||
![]() |
17fc982f55 | ||
![]() |
ba417e2274 | ||
![]() |
d345094b75 | ||
![]() |
6da477480d | ||
![]() |
e274088c06 | ||
![]() |
1bcaa73c5c | ||
![]() |
ca94e8f621 | ||
![]() |
1c4e198f59 | ||
![]() |
fdd13f9c66 | ||
![]() |
4333ab624e | ||
![]() |
9fe1eb3a42 | ||
![]() |
ad251a7682 | ||
![]() |
1fa740de2d | ||
![]() |
466b89064a | ||
![]() |
2748cb0ba3 | ||
![]() |
aef0d5bdde | ||
![]() |
c71e8f024a | ||
![]() |
9411f07321 | ||
![]() |
9b2a5c9bbf | ||
![]() |
2b275523a0 | ||
![]() |
31fe2f6da4 | ||
![]() |
f95db623a5 | ||
![]() |
a46313e483 | ||
![]() |
31c330826e | ||
![]() |
c4cf800142 | ||
![]() |
b64a2b0006 | ||
![]() |
a3702f2270 | ||
![]() |
d221b1d470 | ||
![]() |
0b22a6bc1d | ||
![]() |
07e8acd003 | ||
![]() |
9fce617c57 | ||
![]() |
8d5c736975 | ||
![]() |
4ccec05186 | ||
![]() |
a4f456f002 | ||
![]() |
fbdb941c27 | ||
![]() |
a41cd42e8d | ||
![]() |
77521e4627 | ||
![]() |
b6a1242bac | ||
![]() |
2f325cfe26 | ||
![]() |
193b0ad0f0 | ||
![]() |
ed476b7793 | ||
![]() |
720fd94b7f | ||
![]() |
ff87da105c | ||
![]() |
a875e65536 | ||
![]() |
0b2c6bb662 | ||
![]() |
e44e2fbbb7 | ||
![]() |
b3c93644fd | ||
![]() |
a56b7ff636 | ||
![]() |
c724236930 | ||
![]() |
4853320b2b | ||
![]() |
ba1acb6ac1 | ||
![]() |
f32a6320fc | ||
![]() |
9f914ce36a | ||
![]() |
b037644e5a | ||
![]() |
afd8c59f83 | ||
![]() |
8aa4af3e91 | ||
![]() |
630a8a2b97 | ||
![]() |
dc34c4d00c | ||
![]() |
fb42729dec | ||
![]() |
b06989216a | ||
![]() |
e5144f08cd | ||
![]() |
c4a60190e8 | ||
![]() |
efe9e4fa4c | ||
![]() |
45800b1559 | ||
![]() |
b0b2b8104f | ||
![]() |
8dbc012825 | ||
![]() |
a434176063 | ||
![]() |
a013f750c7 | ||
![]() |
aa1f49d02f | ||
![]() |
7125a26309 | ||
![]() |
329a35ebf0 | ||
![]() |
d30043f595 | ||
![]() |
745dfa1911 | ||
![]() |
76203f49a7 | ||
![]() |
870a915377 | ||
![]() |
c174fce227 | ||
![]() |
2b6e42e919 | ||
![]() |
df73e1e5a3 | ||
![]() |
3e902311d4 | ||
![]() |
64a0037265 | ||
![]() |
bcd4e38093 | ||
![]() |
181a77d627 | ||
![]() |
b353595ba9 | ||
![]() |
75e3bb4f17 | ||
![]() |
d2fa9192d4 | ||
![]() |
4bcadc2de4 | ||
![]() |
8ddff74260 | ||
![]() |
95940fdb64 | ||
![]() |
9cd5708948 | ||
![]() |
d361683d79 | ||
![]() |
9ad17a01f7 | ||
![]() |
22ca1d443c | ||
![]() |
2662e875ca | ||
![]() |
8ae0d07ec1 | ||
![]() |
76a9edb7f5 | ||
![]() |
0ccb464e5b | ||
![]() |
bef600efa2 | ||
![]() |
58a182cd33 | ||
![]() |
aa43334f41 | ||
![]() |
a2a4c97f6c | ||
![]() |
4217ba99fd | ||
![]() |
589725f5cc | ||
![]() |
3fea4602f8 | ||
![]() |
8ea6aae875 | ||
![]() |
2c70b2af68 | ||
![]() |
54a2cbcb42 | ||
![]() |
fdef821c60 | ||
![]() |
dfa798a35d | ||
![]() |
39b8eb6ff1 | ||
![]() |
6cf71f67a9 | ||
![]() |
f2e919725e | ||
![]() |
869599126e | ||
![]() |
3b1b200f6f | ||
![]() |
93c646e3e4 | ||
![]() |
3552f80a21 | ||
![]() |
66d3a63998 | ||
![]() |
6447825978 | ||
![]() |
18b7df9fca | ||
![]() |
c3781cab96 | ||
![]() |
776098dba6 | ||
![]() |
8d1b4f61e7 | ||
![]() |
c13e2bdb96 | ||
![]() |
4682254157 | ||
![]() |
d7ca6b9213 | ||
![]() |
4a76afbde8 | ||
![]() |
a68349c23a | ||
![]() |
920e005366 | ||
![]() |
659f339020 | ||
![]() |
3ee2d463af | ||
![]() |
686ddb5460 | ||
![]() |
e5d62488b7 | ||
![]() |
eb93dd5005 | ||
![]() |
6999d02d2d | ||
![]() |
790e2b1427 | ||
![]() |
a29c7cdfe4 | ||
![]() |
6b7cd692a6 | ||
![]() |
4d3925872a | ||
![]() |
2bd0f6934a | ||
![]() |
51783f17ed | ||
![]() |
ce3aef3526 | ||
![]() |
ee70afdfbb | ||
![]() |
d96c4a56a2 | ||
![]() |
9a39513dea | ||
![]() |
8f22d63315 | ||
![]() |
7f2a5bb95e | ||
![]() |
0118dbd5fb | ||
![]() |
09405de26c | ||
![]() |
efa5ee0e57 | ||
![]() |
80d558f37a | ||
![]() |
901adc3fc7 | ||
![]() |
01417be954 | ||
![]() |
43b780cbe6 | ||
![]() |
e83f36a12f | ||
![]() |
77e3fc4ab0 | ||
![]() |
eafd1adaba | ||
![]() |
6b53abb7c9 | ||
![]() |
f994c5d284 | ||
![]() |
6fda220107 | ||
![]() |
da290ed1c3 | ||
![]() |
7e9cd80a1c | ||
![]() |
379b7413d8 | ||
![]() |
9181a4df16 | ||
![]() |
df982afd51 | ||
![]() |
5c2c3b4317 | ||
![]() |
92d1309103 | ||
![]() |
c43ee3c1d6 | ||
![]() |
e0726e5283 | ||
![]() |
5f3775584b | ||
![]() |
77873d63c5 | ||
![]() |
9e6b09765e | ||
![]() |
1ad6ea4049 | ||
![]() |
7c41da1cb9 | ||
![]() |
adcf4bfc53 | ||
![]() |
7a6321a9c1 | ||
![]() |
d56b27a7b0 | ||
![]() |
ed7657ab5f | ||
![]() |
a414838416 | ||
![]() |
93646577dc | ||
![]() |
46db66038e | ||
![]() |
efc4e9ce56 | ||
![]() |
8d5eac7f80 | ||
![]() |
7b94e49b81 | ||
![]() |
c35fd4bdc8 | ||
![]() |
98590e2d90 | ||
![]() |
e6da0e5dd5 | ||
![]() |
cb2baf747d | ||
![]() |
a2f2eb03ce | ||
![]() |
5c6acbb780 | ||
![]() |
1be7031199 | ||
![]() |
ed6399bde9 | ||
![]() |
6709893781 | ||
![]() |
686a426cda | ||
![]() |
4f90bc7813 | ||
![]() |
e307b289ae | ||
![]() |
3baeff61a7 | ||
![]() |
93ab9d12ee | ||
![]() |
36e1317792 | ||
![]() |
fa3e90a021 | ||
![]() |
782a69cf13 | ||
![]() |
d495f351c0 | ||
![]() |
30bd3d2d52 | ||
![]() |
ff5a21cca5 | ||
![]() |
f8abb73c92 | ||
![]() |
e97f323d9a | ||
![]() |
3d27a4c05d | ||
![]() |
9dbc13dbe4 | ||
![]() |
c46a4c75b1 | ||
![]() |
0bded73f16 | ||
![]() |
1333733684 | ||
![]() |
003be934de | ||
![]() |
93ef20d358 | ||
![]() |
94e1a6f0ba | ||
![]() |
8661d09d57 | ||
![]() |
0e5e21dc4e | ||
![]() |
3b25c4987c | ||
![]() |
2212eb17aa | ||
![]() |
768bac1db8 | ||
![]() |
3aef75085f | ||
![]() |
ce8bef638a | ||
![]() |
f0a0c90304 | ||
![]() |
cd6c32b21d | ||
![]() |
b31876d2d1 | ||
![]() |
ebab8a190e | ||
![]() |
1b7ce8e7a5 | ||
![]() |
646bb6bd79 | ||
![]() |
5a84b97ca9 | ||
![]() |
6d41b5a4a1 | ||
![]() |
a8bce36f3b | ||
![]() |
ac2132f8ba | ||
![]() |
cab4b57abe | ||
![]() |
938fb30359 | ||
![]() |
62346d7d9d | ||
![]() |
cf1e5ca64b | ||
![]() |
7d2d683d96 | ||
![]() |
fe5042f1c3 | ||
![]() |
a1dd76aee0 | ||
![]() |
d1c91be167 | ||
![]() |
9748d99f34 | ||
![]() |
c90ffbeb62 | ||
![]() |
eb7fafeabf | ||
![]() |
3e50629462 | ||
![]() |
65281a4554 | ||
![]() |
454ec09d6a | ||
![]() |
60e3c6858d | ||
![]() |
f911f5b4fc | ||
![]() |
ad1694d291 | ||
![]() |
1130965f26 | ||
![]() |
fe1f28998b | ||
![]() |
45727fce05 | ||
![]() |
d5c23e5add | ||
![]() |
e3a8285f6c | ||
![]() |
a791221cf6 | ||
![]() |
b954d9b403 | ||
![]() |
5e7e24a271 | ||
![]() |
ffb1e598f6 | ||
![]() |
bc2da8a645 | ||
![]() |
6f2be3ed30 | ||
![]() |
033a7bffb3 | ||
![]() |
f2b2ea61a1 | ||
![]() |
6f0783acc4 | ||
![]() |
ce60aa3823 | ||
![]() |
8075e70606 | ||
![]() |
4402fc2d0a | ||
![]() |
3e3ecda551 | ||
![]() |
50beb8f346 | ||
![]() |
8e033e3e06 | ||
![]() |
dc029a318b | ||
![]() |
8e91bc2c8e | ||
![]() |
0ff5b4e90b | ||
![]() |
20dec19bfe | ||
![]() |
d261fbff26 | ||
![]() |
6594b33bcc | ||
![]() |
a1bb6cc1b1 | ||
![]() |
7ce195b68e | ||
![]() |
16d8d04aaa | ||
![]() |
59565f7d90 | ||
![]() |
43784a2495 | ||
![]() |
3811d7469e | ||
![]() |
c72b40a1e1 | ||
![]() |
f00933969d | ||
![]() |
759adc45e3 | ||
![]() |
27ecf78372 | ||
![]() |
c91b83a7ba | ||
![]() |
39373ee63a | ||
![]() |
2db64c69ae | ||
![]() |
a699b71c02 | ||
![]() |
6c07d22cda | ||
![]() |
a2ee900ed5 | ||
![]() |
e709f31b99 | ||
![]() |
35afb12756 | ||
![]() |
9bed9fe162 | ||
![]() |
4ff5553804 | ||
![]() |
32213be7a7 | ||
![]() |
84894a73e1 | ||
![]() |
b6ea185ce7 | ||
![]() |
814ac0f731 | ||
![]() |
a40bb29da3 | ||
![]() |
e9b90079c0 | ||
![]() |
dba383c27e | ||
![]() |
42059b5817 | ||
![]() |
f92a17c01b | ||
![]() |
d6552ce333 | ||
![]() |
0db89bde5a | ||
![]() |
56a12185d4 | ||
![]() |
c40170db5d | ||
![]() |
1df3e9c414 | ||
![]() |
b1570df8b9 | ||
![]() |
023fd1ce36 | ||
![]() |
a7fe74bc0c | ||
![]() |
26c9abd9da | ||
![]() |
a5e34645c5 | ||
![]() |
b2831c0a19 | ||
![]() |
648c1ea0f9 | ||
![]() |
9cd927e06a | ||
![]() |
4272413f55 | ||
![]() |
e1711b7af6 | ||
![]() |
f7d3f27d45 | ||
![]() |
3a7a47f82d | ||
![]() |
cc211706d5 | ||
![]() |
22f74be4cd | ||
![]() |
5a00d14f94 | ||
![]() |
ecb4e7bf9f | ||
![]() |
56e5b546e1 | ||
![]() |
272f5a2f4f | ||
![]() |
ddcbe78a01 | ||
![]() |
00b6c964e2 | ||
![]() |
d7d2b06ecc | ||
![]() |
fafc59360d | ||
![]() |
19e105785e | ||
![]() |
b87ac09e43 | ||
![]() |
af9092d7c7 | ||
![]() |
24a1ffd652 | ||
![]() |
662813cc58 | ||
![]() |
d890b78290 | ||
![]() |
58747d7d4a | ||
![]() |
0773a4f39c | ||
![]() |
66cc7f8a1f | ||
![]() |
01ab40bf4a | ||
![]() |
4c09147fd1 | ||
![]() |
f9f426d788 | ||
![]() |
ff8fa1bf31 | ||
![]() |
59f99e4f6a | ||
![]() |
7449ce9c3b | ||
![]() |
f6bc8f0a1f | ||
![]() |
4d10b8cdee | ||
![]() |
5a61c5de09 | ||
![]() |
f84d0db811 | ||
![]() |
36ce3b08fe | ||
![]() |
da8ea5b545 | ||
![]() |
fad3dbf4cd | ||
![]() |
034d12c347 | ||
![]() |
c94dbf1d9a | ||
![]() |
e516687a9e | ||
![]() |
4a2f77b0a6 | ||
![]() |
7b29ecba71 | ||
![]() |
11241b8e07 | ||
![]() |
52bbd1f20b | ||
![]() |
4044750515 | ||
![]() |
b670c546b9 | ||
![]() |
f37bbf93cb | ||
![]() |
87311ab41a | ||
![]() |
ecb4d1845c | ||
![]() |
35c232ab25 | ||
![]() |
df0be2e251 | ||
![]() |
871b3a102b | ||
![]() |
02299e3892 | ||
![]() |
6af4d6f5b8 | ||
![]() |
4fb5700367 | ||
![]() |
8579276381 | ||
![]() |
7ba60b22c5 | ||
![]() |
031932f41c | ||
![]() |
079d0a89b1 | ||
![]() |
c4fdce6d64 | ||
![]() |
5604c2b29f | ||
![]() |
74b5ab2b47 | ||
![]() |
c29cbfe123 | ||
![]() |
7edd5a7a8e | ||
![]() |
c1edc1b99b |
11
.github/workflows/build.yml
vendored
11
.github/workflows/build.yml
vendored
@@ -1,6 +1,11 @@
|
||||
name: "Build"
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
permissions: write-all
|
||||
|
||||
jobs:
|
||||
build-linux:
|
||||
@@ -9,7 +14,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target_platform: [linux,darwin]
|
||||
target_platform: [linux]
|
||||
target_arch: [x64, arm64]
|
||||
steps:
|
||||
- name: Clone Main Repository
|
||||
@@ -17,6 +22,7 @@ jobs:
|
||||
with:
|
||||
repository: 'NapNeko/NapCatQQ'
|
||||
submodules: true
|
||||
ref: main
|
||||
token: ${{ secrets.NAPCAT_BUILD }}
|
||||
- name: Use Node.js 20.X
|
||||
uses: actions/setup-node@v4
|
||||
@@ -48,6 +54,7 @@ jobs:
|
||||
with:
|
||||
repository: 'NapNeko/NapCatQQ'
|
||||
submodules: true
|
||||
ref: main
|
||||
token: ${{ secrets.NAPCAT_BUILD }}
|
||||
- name: Use Node.js 20.X
|
||||
uses: actions/setup-node@v4
|
||||
@@ -64,4 +71,4 @@ jobs:
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: NapCat.${{ matrix.target_platform }}.${{ matrix.target_arch }}
|
||||
path: dist
|
||||
path: dist
|
||||
|
26
.github/workflows/release.yml
vendored
26
.github/workflows/release.yml
vendored
@@ -14,6 +14,7 @@ jobs:
|
||||
- name: Clone Repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: main
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Extract version from tag
|
||||
@@ -30,11 +31,12 @@ jobs:
|
||||
node ./script/checkVersion.cjs
|
||||
sh ./checkVersion.sh
|
||||
build-linux:
|
||||
needs: [check-version]
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target_platform: [linux,darwin]
|
||||
target_platform: [linux]
|
||||
target_arch: [x64, arm64]
|
||||
steps:
|
||||
- name: Clone Main Repository
|
||||
@@ -42,6 +44,7 @@ jobs:
|
||||
with:
|
||||
repository: 'NapNeko/NapCatQQ'
|
||||
submodules: true
|
||||
ref: main
|
||||
token: ${{ secrets.NAPCAT_BUILD }}
|
||||
- name: Use Node.js 20.X
|
||||
uses: actions/setup-node@v4
|
||||
@@ -50,6 +53,8 @@ jobs:
|
||||
|
||||
- name: Build NuCat Linux
|
||||
run: |
|
||||
export NAPCAT_BUILDSYS=${{ matrix.target_platform }}
|
||||
export NAPCAT_BUILDARCH=${{ matrix.target_arch }}
|
||||
npm i --arch=${{ matrix.target_arch }} --platform=${{ matrix.target_platform }}
|
||||
npm run build:prod
|
||||
cd dist
|
||||
@@ -62,6 +67,7 @@ jobs:
|
||||
path: dist
|
||||
build-win32:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [check-version]
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
@@ -73,6 +79,7 @@ jobs:
|
||||
with:
|
||||
repository: 'NapNeko/NapCatQQ'
|
||||
submodules: true
|
||||
ref: main
|
||||
token: ${{ secrets.NAPCAT_BUILD }}
|
||||
|
||||
- name: Use Node.js 20.X
|
||||
@@ -82,6 +89,8 @@ jobs:
|
||||
|
||||
- name: Build NuCat Linux
|
||||
run: |
|
||||
export NAPCAT_BUILDSYS=${{ matrix.target_platform }}
|
||||
export NAPCAT_BUILDARCH=${{ matrix.target_arch }}
|
||||
npm i --arch=${{ matrix.target_arch }} --platform=${{ matrix.target_platform }}
|
||||
npm run build:prod
|
||||
cd dist
|
||||
@@ -107,16 +116,23 @@ jobs:
|
||||
base=$(basename "$dir")
|
||||
zip -r "${base}.zip" "$dir"
|
||||
done
|
||||
|
||||
- name: Extract version from tag
|
||||
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
|
||||
|
||||
- name: Clone Changes Log
|
||||
run: curl -o CHANGELOG.md https://fastly.jsdelivr.net/gh/NapNeko/NapCatQQ@main/CHANGELOG.md
|
||||
|
||||
- name: Create Release Draft and Upload Artifacts
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
name: NapCat V0.0.0
|
||||
token: ${{ secrets.NAPCAT_BUILD }}
|
||||
name: NapCat V${{ env.VERSION }}
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
body_path: CHANGELOG.md
|
||||
files: |
|
||||
NapCat.win32.x64.zip
|
||||
NapCat.linux.x64.zip
|
||||
NapCat.linux.arm64.zip
|
||||
NapCat.darwin.x64.zip
|
||||
NapCat.darwin.arm64.zip
|
||||
# NapCat.darwin.x64.zip
|
||||
# NapCat.darwin.arm64.zip
|
||||
draft: true
|
||||
|
6
.gitignore
vendored
6
.gitignore
vendored
@@ -1,11 +1,11 @@
|
||||
# Logs
|
||||
|
||||
# Develop
|
||||
node_modules/
|
||||
package-lock.json
|
||||
pnpm-lock.yaml
|
||||
out/
|
||||
dist/
|
||||
src/core.lib/common/
|
||||
test
|
||||
|
||||
# Editor
|
||||
.vscode/*
|
||||
@@ -14,4 +14,4 @@ src/core.lib/common/
|
||||
|
||||
# Build
|
||||
*.db
|
||||
checkVersion.sh
|
||||
checkVersion.sh
|
||||
|
13
CHANGELOG.md
Normal file
13
CHANGELOG.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# v1.3.2
|
||||
|
||||
QQ Version: Windows 9.9.9-23424 / Linux 3.2.7-23361
|
||||
|
||||
## 修复与优化
|
||||
* 重置Rkey获取机制,使用接口分发Rkey
|
||||
* 尝试修复启动时消息处理需要等待过长时间
|
||||
* 修复多图情况为同一张图片的问题
|
||||
|
||||
## 新增与调整
|
||||
* 新增扩展获取好友分类列表 Api /get_friends_with_category
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
156
README.md
156
README.md
@@ -4,162 +4,30 @@
|
||||
|
||||
## 项目介绍
|
||||
|
||||
NapCatQQ(瞌睡猫QQ,不准叫我NCQQ!),像睡着了一样在后台低占用运行的无头(没有界面)的NTQQ
|
||||
NapCatQQ 是基于 PC NTQQ 本体实现一套无头 Bot 框架。
|
||||
|
||||
目前测试在 Windows 上表现优秀,最低可达只占用内存 **20M**左右
|
||||
名字寓意 瞌睡猫QQ,像睡着了一样在后台低占用运行的无需GUI界面的NTQQ。
|
||||
|
||||
由于 Linux 上的 QQ 图形依赖较多,会导致内存占用小高,大约 **100+M**,目前正在研究如何优化
|
||||
## 如何使用
|
||||
|
||||
具体占用会因人而异,QQ 群、好友越多占用越高
|
||||
可前往 [Release](https://github.com/NapNeko/NapCatQQ/releases/) 页面下载最新版本
|
||||
|
||||
## 下载
|
||||
**首次使用** 请务必前往 [官方文档](https://napneko.github.io/) 查看使用文档与教程
|
||||
|
||||
前往 Release 页面下载最新版本
|
||||
|
||||
## 启动
|
||||
|
||||
NapCat 是基于 官方NTQQ 实现的Bot框架,因此先需要安装官方QQ,**注意同个账号不能同时登录原版 QQ 和 NapCatQQ**
|
||||
|
||||
*如果没有安装 QQ 请往后翻查看安装方法*
|
||||
|
||||
修改 `config/onebot11.json`内容,并重名为 `onebot11_<你的QQ号>.json`,如`onebot11_1234567.json`
|
||||
|
||||
json 配置内容参数解释:
|
||||
|
||||
```json5
|
||||
{
|
||||
// 是否启用http服务,如果启用,可以通过http接口发送消息
|
||||
"enableHttp": false,
|
||||
// http服务端口
|
||||
"httpPort": 3000,
|
||||
// 是否启用正向websocket服务
|
||||
"enableWs": false,
|
||||
// 正向websocket服务端口
|
||||
"wsPort": 3001,
|
||||
// 是否启用反向websocket服务
|
||||
"enableWsReverse": false,
|
||||
// 反向websocket对接的地址, 如["ws://127.0.0.1:8080/onebot/v11/ws"]
|
||||
"wsReverseUrls": [],
|
||||
// 是否启用http上报服务
|
||||
"enableHttpPost": false,
|
||||
// http上报地址, 如["http://127.0.0.1:8080/onebot/v11/http"]
|
||||
"httpPostUrls": [],
|
||||
// http上报密钥,可为空
|
||||
"httpSecret": "",
|
||||
// 消息上报格式,array为消息组,string为cq码字符串
|
||||
"messagePostFormat": "array",
|
||||
// 是否上报自己发送的消息
|
||||
"reportSelfMessage": false,
|
||||
// 是否开启调试模式,开启后上报消息会携带一个raw字段,为原始消息内容
|
||||
"debug": false,
|
||||
// 调用get_file接口时如果获取不到url则使用base64字段返回文件内容
|
||||
"enableLocalFile2Url": true,
|
||||
// ws心跳间隔,单位毫秒
|
||||
"heartInterval": 30000,
|
||||
// access_token,可以为空
|
||||
"token": ""
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
### Windows 启动
|
||||
|
||||
运行`powershell ./napcat.ps1`, 或者 `napcat.bat`,如果出现乱码,可以尝试运行`napcat-utf8.ps1` 或 `napcat-utf8.bat`
|
||||
|
||||
*如果出现 powershell 运行不了,以管理员身份打开 powershell,输入 `Set-ExecutionPolicy RemoteSigned`*
|
||||
|
||||
### Linux 启动
|
||||
|
||||
运行`napcat.sh`
|
||||
|
||||
## 使用无需扫码快速登录
|
||||
|
||||
前提是你已经成功登录过QQ,可以加参数` -q <你的QQ>` 进行登录,如`napcat.sh -q 1234567`
|
||||
|
||||
## 安装
|
||||
|
||||
### Linux安装
|
||||
|
||||
#### 安装 Linux QQ(22741),已经安装了的可以跳过
|
||||
|
||||
目前还在研究怎么精简安装,暂时只能安装官方QQ整体依赖
|
||||
|
||||
下载QQ
|
||||
|
||||
[deb x86版本](https://dldir1.qq.com/qqfile/qq/QQNT/Linux/QQ_3.2.7_240403_amd64_01.deb)
|
||||
[deb arm版本](https://dldir1.qq.com/qqfile/qq/QQNT/Linux/QQ_3.2.7_240403_arm64_01.deb)
|
||||
|
||||
[rpm x86版本](https://dldir1.qq.com/qqfile/qq/QQNT/Linux/QQ_3.2.7_240403_x86_64_01.rpm)
|
||||
[rpm arm版本](https://dldir1.qq.com/qqfile/qq/QQNT/Linux/QQ_3.2.7_240403_aarch64_01.rpm)
|
||||
|
||||
```bash
|
||||
sudo apt install ./qq.deb
|
||||
```
|
||||
|
||||
```bash
|
||||
安装QQ的依赖
|
||||
sudo apt install libgbm1 libasound2
|
||||
```
|
||||
|
||||
### Windows 安装
|
||||
|
||||
#### 安装Windows QQ(22741),已经安装了的可以跳过
|
||||
|
||||
[Windows版本QQ下载](https://dldir1.qq.com/qqfile/qq/QQNT/Windows/QQ_9.9.9_240403_x64_01.exe)
|
||||
|
||||
### 编译安装 NapCat
|
||||
|
||||
**如果你是直接下载编译好的版本,可以跳过这一步**
|
||||
|
||||
准备环境 [node18.18](https://nodejs.org/download/release/v18.18.2/)
|
||||
|
||||
```
|
||||
export NODE_ENV=production
|
||||
npm install
|
||||
```
|
||||
|
||||
## 常见问题
|
||||
|
||||
### 二维码无法扫描
|
||||
|
||||
NapCat 会自动保存二维码到目录,可以手动打开图片扫描
|
||||
|
||||
如果没有条件访问本地目录,可以将二维码解析的 url 复制到二维码生成网站上生成二维码,然后手机QQ扫描
|
||||
|
||||
### 语音、视频发送失败
|
||||
|
||||
需要配置 ffmpeg,将 ffmpeg 目录加入环境变量,如果仍未生效,可以修改 napcat 启动脚本加入 FFMPEG_PATH 变量指定到 ffmpeg
|
||||
程序的完整路径
|
||||
|
||||
如 Windows 上修改 napcat.ps1,在第一行加入
|
||||
|
||||
```powershell
|
||||
$env:FFMPEG_PATH="d:\ffmpeg\bin\ffmpeg.exe"
|
||||
```
|
||||
|
||||
### 出现 error code v2:-1 之类的提示
|
||||
|
||||
不用管,这是正常现象,是因为 QQ 本身的问题,不影响使用
|
||||
|
||||
## API 文档
|
||||
|
||||
参考 [LLOneBot](https://llonebot.github.io/zh-CN/develop/api) 的文档
|
||||
|
||||
<!--
|
||||
QQ群:545402644
|
||||
-->
|
||||
|
||||
## 声明
|
||||
## 项目声明
|
||||
|
||||
* 请不要在无关地方宣传NapCatQQ,本项目只是用于学习 node 相关知识,切勿用于违法用途
|
||||
|
||||
* NapCat 不会收集用户隐私信息,但是未来可能会为了更好的利于 NapCat 的优化会收集一些设备信息,如 cpu 架构,系统版本等
|
||||
|
||||
## 相关链接
|
||||
|
||||
[TG群](https://t.me/+nLZEnpne-pQ1OWFl)
|
||||
[Telegram Link](https://t.me/+nLZEnpne-pQ1OWFl)
|
||||
|
||||
## 鸣谢名单
|
||||
[OpenShamrock]()
|
||||
|
||||
[Lagrange]()
|
||||
[Lagrange](https://github.com/LagrangeDev/Lagrange.Core)
|
||||
|
||||
<!--
|
||||
QQ群:545402644
|
||||
-->
|
||||
|
12
package.json
12
package.json
@@ -2,14 +2,15 @@
|
||||
"name": "napcat",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"version": "1.0.2",
|
||||
"version": "1.3.2",
|
||||
"scripts": {
|
||||
"watch:dev": "vite --mode development",
|
||||
"watch:prod": "vite --mode production",
|
||||
"build:dev": "vite build --mode development",
|
||||
"build:prod": "vite build --mode production",
|
||||
"build": "npm run build:dev",
|
||||
"build:core": "cd ./src/core && vite build --mode production",
|
||||
"build:core": "cd ./src/core && npm run build && cd ../.. && node ./script/copy-core.cjs",
|
||||
"build:webui": "cd ./src/webui && vite build",
|
||||
"watch": "npm run watch:dev",
|
||||
"debug-win": "powershell dist/napcat.ps1",
|
||||
"lint": "eslint --fix src/**/*.{js,ts}",
|
||||
@@ -21,6 +22,7 @@
|
||||
"@rollup/plugin-commonjs": "^25.0.7",
|
||||
"@rollup/plugin-node-resolve": "^15.2.3",
|
||||
"@rollup/plugin-typescript": "^11.1.6",
|
||||
"@types/cors": "^2.8.17",
|
||||
"@types/express": "^4.17.21",
|
||||
"@types/figlet": "^1.5.8",
|
||||
"@types/fluent-ffmpeg": "^2.1.24",
|
||||
@@ -47,17 +49,17 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"commander": "^12.0.0",
|
||||
"cors": "^2.8.5",
|
||||
"express": "^5.0.0-beta.2",
|
||||
"fast-xml-parser": "^4.3.6",
|
||||
"file-type": "^19.0.0",
|
||||
"fluent-ffmpeg": "^2.1.2",
|
||||
"image-size": "^1.1.1",
|
||||
"log4js": "^6.9.1",
|
||||
"protobufjs": "^7.2.6",
|
||||
"qrcode-terminal": "^0.12.0",
|
||||
"silk-wasm": "^3.3.4",
|
||||
"sqlite3": "^5.1.7",
|
||||
"uuid": "^9.0.1",
|
||||
"ws": "^8.16.0",
|
||||
"yaml": "^2.4.1"
|
||||
"ws": "^8.16.0"
|
||||
}
|
||||
}
|
||||
|
@@ -6,10 +6,8 @@ let targetVersion = process.env.VERSION;
|
||||
console.log("[NapCat] [CheckVersion] currentVersion:", currentVersion, " targetVersion:", targetVersion);
|
||||
// fs.mkdirSync("./dist");
|
||||
if (currentVersion === targetVersion) {
|
||||
fs.appendFileSync("../checkVersion.sh", "#!/bin/bashe\necho \"CheckVersion Is Done\"")
|
||||
fs.writeFileSync("./checkVersion.sh", "#!/bin/bashe\necho \"CheckVersion Is Done\"")
|
||||
} else {
|
||||
let packageJson = JSON.parse(fs.readFileSync("./package.json"));
|
||||
packageJson.version = targetVersion;
|
||||
fs.writeFileSync("../package.json", JSON.stringify(packageJson));
|
||||
fs.appendFileSync("../checkVersion.sh", "#!/bin/bashe\ngit add .\n git commit -m \"chore:version change\"\n git push")
|
||||
let runscript = "sed -i 's/\"version\": \"" + currentVersion + "\"/\"version\": \"" + targetVersion + "\"/g' package.json";
|
||||
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")
|
||||
}
|
||||
|
32
script/copy-core.cjs
Normal file
32
script/copy-core.cjs
Normal file
@@ -0,0 +1,32 @@
|
||||
let fs = require('fs');
|
||||
let path = require('path');
|
||||
|
||||
const coreDistDir = path.join(path.resolve(__dirname, '../'), 'src/core/dist/core/src');
|
||||
const coreLibDir = path.join(path.resolve(__dirname, '../'), 'src/core.lib/src');
|
||||
|
||||
function copyDir(currentPath, outputDir) {
|
||||
fs.readdir(currentPath, { withFileTypes: true }, (err, entries) => {
|
||||
if (err?.errno === -4058) return;
|
||||
|
||||
entries.forEach(entry => {
|
||||
const localBasePath = path.join(currentPath, entry.name);
|
||||
const outputLocalBasePath = path.join(outputDir, entry.name);
|
||||
|
||||
if (entry.isDirectory()) {
|
||||
// 如果是目录,递归调用
|
||||
if (!fs.existsSync(outputLocalBasePath)) {
|
||||
fs.mkdirSync(outputLocalBasePath, { recursive: true });
|
||||
}
|
||||
copyDir(localBasePath, outputLocalBasePath);
|
||||
}
|
||||
else{
|
||||
// 如果是文件,直接复制
|
||||
fs.copyFile(localBasePath, outputLocalBasePath, (err) => {
|
||||
if (err) throw err;
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
copyDir(coreDistDir, coreLibDir);
|
@@ -1,85 +0,0 @@
|
||||
import {
|
||||
type Friend,
|
||||
type FriendRequest,
|
||||
type Group,
|
||||
type GroupMember, GroupNotify,
|
||||
type SelfInfo
|
||||
} from '@/core/qqnt/entities';
|
||||
import { isNumeric } from './utils/helper';
|
||||
import { log } from '@/common/utils/log';
|
||||
|
||||
export const selfInfo: SelfInfo = {
|
||||
uid: '',
|
||||
uin: '',
|
||||
nick: '',
|
||||
online: true
|
||||
};
|
||||
|
||||
// groupCode -> Group
|
||||
export const groups: Map<string, Group> = new Map<string, Group>();
|
||||
|
||||
// 群号 -> 群成员map(uid=>GroupMember)
|
||||
export const groupMembers: Map<string, Map<string, GroupMember>> = new Map<string, Map<string, GroupMember>>();
|
||||
|
||||
// uid -> Friend
|
||||
export const friends: Map<string, Friend> = new Map<string, Friend>();
|
||||
|
||||
export const friendRequests: Record<string, FriendRequest> = {}; // flag->FriendRequest
|
||||
export const groupNotifies: Record<string, GroupNotify> = {}; // flag->GroupNotify
|
||||
|
||||
export const napCatError = {
|
||||
ffmpegError: '',
|
||||
httpServerError: '',
|
||||
wsServerError: '',
|
||||
otherError: 'NapCat未能正常启动,请检查日志查看错误'
|
||||
};
|
||||
|
||||
export async function getFriend(uinOrUid: string): Promise<Friend | undefined> {
|
||||
uinOrUid = uinOrUid.toString();
|
||||
if (isNumeric(uinOrUid)) {
|
||||
const friendList = Array.from(friends.values());
|
||||
return friendList.find(friend => friend.uin === uinOrUid);
|
||||
} else {
|
||||
return friends.get(uinOrUid);
|
||||
}
|
||||
}
|
||||
|
||||
export async function getGroup(qq: string): Promise<Group | undefined> {
|
||||
const group = groups.get(qq.toString());
|
||||
return group;
|
||||
}
|
||||
|
||||
export async function getGroupMember(groupQQ: string | number, memberUinOrUid: string | number) {
|
||||
groupQQ = groupQQ.toString();
|
||||
memberUinOrUid = memberUinOrUid.toString();
|
||||
const members = groupMembers.get(groupQQ);
|
||||
if (!members) {
|
||||
return null;
|
||||
}
|
||||
// log('getGroupMember', members);
|
||||
if (isNumeric(memberUinOrUid)) {
|
||||
return Array.from(members.values()).find(member => member.uin === memberUinOrUid);
|
||||
} else {
|
||||
return members.get(memberUinOrUid);
|
||||
}
|
||||
}
|
||||
|
||||
export async function refreshGroupMembers(groupQQ: string) {
|
||||
// const group = groups.find(group => group.groupCode === groupQQ)
|
||||
// if (group) {
|
||||
// group.members = await NTQQGroupApi.getGroupMembers(groupQQ)
|
||||
// }
|
||||
}
|
||||
|
||||
export const uid2UinMap: Record<string, string> = {}; // 一串加密的字符串(uid) -> qq号
|
||||
|
||||
export function getUidByUin(uin: string) {
|
||||
for (const uid in uid2UinMap) {
|
||||
if (uid2UinMap[uid] === uin) {
|
||||
return uid;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const tempGroupCodeMap: Record<string, string> = {}; // peerUid => 群号
|
||||
|
@@ -1,17 +1,19 @@
|
||||
import express, { Express, Request, Response } from 'express';
|
||||
import cors from 'cors';
|
||||
import http from 'http';
|
||||
import { log } from '../utils/log';
|
||||
import { log, logDebug, logError } from '../utils/log';
|
||||
import { ob11Config } from '@/onebot11/config';
|
||||
|
||||
type RegisterHandler = (res: Response, payload: any) => Promise<any>
|
||||
|
||||
export abstract class HttpServerBase {
|
||||
name: string = 'LLOneBot';
|
||||
name: string = 'NapCatQQ';
|
||||
private readonly expressAPP: Express;
|
||||
private server: http.Server | null = null;
|
||||
|
||||
constructor() {
|
||||
this.expressAPP = express();
|
||||
this.expressAPP.use(cors());
|
||||
this.expressAPP.use(express.urlencoded({ extended: true, limit: '5000mb' }));
|
||||
this.expressAPP.use((req, res, next) => {
|
||||
// 兼容处理没有带content-type的请求
|
||||
@@ -21,7 +23,7 @@ export abstract class HttpServerBase {
|
||||
// 调用原始的express.json()处理器
|
||||
originalJson(req, res, (err) => {
|
||||
if (err) {
|
||||
log('Error parsing JSON:', err);
|
||||
logError('Error parsing JSON:', err);
|
||||
return res.status(400).send('Invalid JSON');
|
||||
}
|
||||
next();
|
||||
@@ -35,14 +37,14 @@ export abstract class HttpServerBase {
|
||||
const authHeader = req.get('authorization');
|
||||
if (authHeader) {
|
||||
clientToken = authHeader.split('Bearer ').pop() || '';
|
||||
log('receive http header token', clientToken);
|
||||
logDebug('receive http header token', clientToken);
|
||||
} else if (req.query.access_token) {
|
||||
if (Array.isArray(req.query.access_token)) {
|
||||
clientToken = req.query.access_token[0].toString();
|
||||
} else {
|
||||
clientToken = req.query.access_token.toString();
|
||||
}
|
||||
log('receive http url token', clientToken);
|
||||
logDebug('receive http url token', clientToken);
|
||||
}
|
||||
|
||||
if (serverToken && clientToken != serverToken) {
|
||||
@@ -51,14 +53,14 @@ export abstract class HttpServerBase {
|
||||
next();
|
||||
}
|
||||
|
||||
start(port: number) {
|
||||
start(port: number, host: string) {
|
||||
try {
|
||||
this.expressAPP.get('/', (req: Request, res: Response) => {
|
||||
res.send(`${this.name}已启动`);
|
||||
});
|
||||
this.listen(port);
|
||||
this.listen(port, host);
|
||||
} catch (e: any) {
|
||||
log('HTTP服务启动失败', e.toString());
|
||||
logError('HTTP服务启动失败', e.toString());
|
||||
// llonebotError.httpServerError = "HTTP服务启动失败, " + e.toString()
|
||||
}
|
||||
}
|
||||
@@ -71,9 +73,9 @@ export abstract class HttpServerBase {
|
||||
}
|
||||
}
|
||||
|
||||
restart(port: number) {
|
||||
restart(port: number, host: string) {
|
||||
this.stop();
|
||||
this.start(port);
|
||||
this.start(port, host);
|
||||
}
|
||||
|
||||
abstract handleFailed(res: Response, payload: any, err: any): void
|
||||
@@ -86,7 +88,7 @@ export abstract class HttpServerBase {
|
||||
// @ts-expect-error wait fix
|
||||
if (!this.expressAPP[method]) {
|
||||
const err = `${this.name} register router failed,${method} not exist`;
|
||||
log(err);
|
||||
logError(err);
|
||||
throw err;
|
||||
}
|
||||
// @ts-expect-error wait fix
|
||||
@@ -94,8 +96,10 @@ export abstract class HttpServerBase {
|
||||
let payload = req.body;
|
||||
if (method == 'get') {
|
||||
payload = req.query;
|
||||
} else if (req.query) {
|
||||
payload = { ...req.query, ...req.body };
|
||||
}
|
||||
log('收到http请求', url, payload);
|
||||
logDebug('收到http请求', url, payload);
|
||||
try {
|
||||
res.send(await handler(res, payload));
|
||||
} catch (e: any) {
|
||||
@@ -104,10 +108,15 @@ export abstract class HttpServerBase {
|
||||
});
|
||||
}
|
||||
|
||||
protected listen(port: number) {
|
||||
this.server = this.expressAPP.listen(port, '0.0.0.0', () => {
|
||||
const info = `${this.name} started 0.0.0.0:${port}`;
|
||||
log(info);
|
||||
});
|
||||
protected listen(port: number, host: string = '0.0.0.0') {
|
||||
host = host || '0.0.0.0';
|
||||
try {
|
||||
this.server = this.expressAPP.listen(port, host, () => {
|
||||
const info = `${this.name} started ${host}:${port}`;
|
||||
log(info);
|
||||
});
|
||||
}catch (e: any) {
|
||||
logError('HTTP服务启动失败, 请检查监听的ip地址和端口', e.stack.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -27,11 +27,16 @@ export class WebsocketServerBase {
|
||||
constructor() {
|
||||
}
|
||||
|
||||
start(port: number) {
|
||||
start(port: number, host: string = '') {
|
||||
try {
|
||||
this.ws = new WebSocketServer({ port });
|
||||
this.ws = new WebSocketServer({
|
||||
port ,
|
||||
host: '',
|
||||
maxPayload: 1024 * 1024 * 1024
|
||||
});
|
||||
log(`ws服务启动成功, ${host}:${port}`);
|
||||
} catch (e: any) {
|
||||
throw Error('ws服务启动失败, ' + e.toString());
|
||||
throw Error('ws服务启动失败, 请检查监听的ip和端口' + e.toString());
|
||||
}
|
||||
this.ws.on('connection', (wsClient, req) => {
|
||||
const url: string = req.url!.split('?').shift() || '/';
|
||||
|
35
src/common/utils/AsyncQueue.ts
Normal file
35
src/common/utils/AsyncQueue.ts
Normal file
@@ -0,0 +1,35 @@
|
||||
import { sleep } from '@/common/utils/helper';
|
||||
|
||||
type AsyncQueueTask = (() => void) | (()=>Promise<void>);
|
||||
|
||||
|
||||
export class AsyncQueue {
|
||||
private tasks: (AsyncQueueTask)[] = [];
|
||||
|
||||
public addTask(task: AsyncQueueTask) {
|
||||
this.tasks.push(task);
|
||||
// console.log('addTask', this.tasks.length);
|
||||
if (this.tasks.length === 1) {
|
||||
this.runQueue().then().catch(()=>{});
|
||||
}
|
||||
}
|
||||
|
||||
private async runQueue() {
|
||||
// console.log('runQueue', this.tasks.length);
|
||||
while (this.tasks.length > 0) {
|
||||
const task = this.tasks[0];
|
||||
// console.log('typeof task', typeof task);
|
||||
try {
|
||||
const taskRet = task();
|
||||
// console.log('type of taskRet', typeof taskRet, taskRet);
|
||||
if (taskRet instanceof Promise) {
|
||||
await taskRet;
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
}
|
||||
this.tasks.shift();
|
||||
await sleep(100);
|
||||
}
|
||||
}
|
||||
}
|
67
src/common/utils/ConfigBase.ts
Normal file
67
src/common/utils/ConfigBase.ts
Normal file
@@ -0,0 +1,67 @@
|
||||
import path from 'node:path';
|
||||
import fs from 'node:fs';
|
||||
import { log, logDebug, logError } from '@/common/utils/log';
|
||||
|
||||
const configDir = path.resolve(__dirname, 'config');
|
||||
fs.mkdirSync(configDir, { recursive: true });
|
||||
|
||||
|
||||
export class ConfigBase<T>{
|
||||
|
||||
constructor() {
|
||||
}
|
||||
|
||||
protected getKeys(): string[] | null {
|
||||
// 决定 key 在json配置文件中的顺序
|
||||
return null;
|
||||
}
|
||||
|
||||
getConfigDir(){
|
||||
const configDir = path.resolve(__dirname, 'config');
|
||||
fs.mkdirSync(configDir, { recursive: true });
|
||||
return configDir;
|
||||
}
|
||||
getConfigPath(): string {
|
||||
throw new Error('Method not implemented.');
|
||||
}
|
||||
|
||||
read() {
|
||||
const configPath = this.getConfigPath();
|
||||
if (!fs.existsSync(configPath)) {
|
||||
try{
|
||||
fs.writeFileSync(configPath, JSON.stringify(this, this.getKeys(), 2));
|
||||
log(`配置文件${configPath}已创建\n如果修改此文件后需要重启 NapCat 生效`);
|
||||
}
|
||||
catch (e: any) {
|
||||
logError(`创建配置文件 ${configPath} 时发生错误:`, e.message);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
try {
|
||||
const data = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
||||
logDebug(`配置文件${configPath}已加载`, data);
|
||||
Object.assign(this, data);
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-expect-error
|
||||
this.save(this); // 保存一次,让新版本的字段写入
|
||||
return this;
|
||||
} catch (e: any) {
|
||||
if (e instanceof SyntaxError) {
|
||||
logError(`配置文件 ${configPath} 格式错误,请检查配置文件:`, e.message);
|
||||
} else {
|
||||
logError(`读取配置文件 ${configPath} 时发生错误:`, e.message);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
save(config: T) {
|
||||
Object.assign(this, config);
|
||||
const configPath = this.getConfigPath();
|
||||
try {
|
||||
fs.writeFileSync(configPath, JSON.stringify(this, this.getKeys(), 2));
|
||||
} catch (e: any) {
|
||||
logError(`保存配置文件 ${configPath} 时发生错误:`, e.message);
|
||||
}
|
||||
}
|
||||
}
|
@@ -37,24 +37,36 @@ type QQVersionConfigInfo = {
|
||||
}
|
||||
|
||||
let _qqVersionConfigInfo: QQVersionConfigInfo = {
|
||||
'baseVersion': '9.9.9-22578',
|
||||
'curVersion': '9.9.9-22578',
|
||||
'baseVersion': '9.9.9-23361',
|
||||
'curVersion': '9.9.9-23361',
|
||||
'prevVersion': '',
|
||||
'onErrorVersions': [],
|
||||
'buildId': '22578'
|
||||
'buildId': '23361'
|
||||
};
|
||||
|
||||
if (fs.existsSync(configVersionInfoPath)) {
|
||||
_qqVersionConfigInfo = JSON.parse(fs.readFileSync(configVersionInfoPath).toString());
|
||||
try {
|
||||
const _ =JSON.parse(fs.readFileSync(configVersionInfoPath).toString());
|
||||
_qqVersionConfigInfo = Object.assign(_qqVersionConfigInfo, _);
|
||||
} catch (e) {
|
||||
console.error('Load QQ version config info failed, Use default version', e);
|
||||
}
|
||||
}
|
||||
|
||||
export const qqVersionConfigInfo: QQVersionConfigInfo = _qqVersionConfigInfo;
|
||||
|
||||
export const qqPkgInfo: QQPkgInfo = require(pkgInfoPath);
|
||||
// platform_type: 3,
|
||||
// app_type: 4,
|
||||
// app_version: '9.9.9-23159',
|
||||
// qua: 'V1_WIN_NQ_9.9.9_23159_GW_B',
|
||||
// appid: '537213764',
|
||||
// platVer: '10.0.26100',
|
||||
// clientVer: '9.9.9-23159',
|
||||
|
||||
let _appid: string = '537213335'; // 默认为 Windows 平台的 appid
|
||||
let _appid: string = '537213803'; // 默认为 Windows 平台的 appid
|
||||
if (systemPlatform === 'linux') {
|
||||
_appid = '537213710';
|
||||
_appid = '537213827';
|
||||
}
|
||||
// todo: mac 平台的 appid
|
||||
export const appid = _appid;
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import fs from 'fs';
|
||||
import { encode, getDuration, getWavFileInfo, isWav } from 'silk-wasm';
|
||||
import fsPromise from 'fs/promises';
|
||||
import { log } from './log';
|
||||
import { log, logError } from './log';
|
||||
import path from 'node:path';
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
import { spawn } from 'node:child_process';
|
||||
@@ -129,7 +129,7 @@ export async function encodeSilk(filePath: string) {
|
||||
};
|
||||
}
|
||||
} catch (error: any) {
|
||||
log('convert silk failed', error.stack);
|
||||
logError('convert silk failed', error.stack);
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
19
src/common/utils/cpmodule.ts
Normal file
19
src/common/utils/cpmodule.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
import * as os from 'os';
|
||||
import path from 'node:path';
|
||||
import fs from 'fs';
|
||||
|
||||
export function getModuleWithArchName(moduleName: string) {
|
||||
const systemPlatform = os.platform();
|
||||
const cpuArch = os.arch();
|
||||
return `${moduleName}-${systemPlatform}-${cpuArch}.node`;
|
||||
}
|
||||
|
||||
export function cpModule(moduleName: string) {
|
||||
const currentDir = path.resolve(__dirname);
|
||||
const fileName = `./${getModuleWithArchName(moduleName)}`;
|
||||
try {
|
||||
fs.copyFileSync(path.join(currentDir, fileName), path.join(currentDir, `${moduleName}.node`));
|
||||
} catch (e) {
|
||||
|
||||
}
|
||||
}
|
@@ -1,323 +0,0 @@
|
||||
import { ElementType, FileElement, PicElement, PttElement, RawMessage, VideoElement } from '@/core/qqnt/entities';
|
||||
|
||||
import sqlite3 from 'sqlite3';
|
||||
import { log } from '@/common/utils/log';
|
||||
|
||||
type DBMsg = {
|
||||
id: number,
|
||||
longId: string,
|
||||
seq: number,
|
||||
peerUid: string,
|
||||
msg: string
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
createConnection(dbPath: string) {
|
||||
if (this.db) {
|
||||
return;
|
||||
}
|
||||
this.db = new sqlite3.Database(dbPath, sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, (err) => {
|
||||
if (err) {
|
||||
log('Could not connect to database', err);
|
||||
return;
|
||||
}
|
||||
this.createTable();
|
||||
});
|
||||
}
|
||||
|
||||
protected createTable() {
|
||||
throw new Error('Method not implemented.');
|
||||
}
|
||||
|
||||
close() {
|
||||
this.db?.close();
|
||||
}
|
||||
}
|
||||
|
||||
class DBUtil extends DBUtilBase {
|
||||
private msgCache: Map<string, RawMessage> = new Map<string, RawMessage>();
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
const interval = 1000 * 60 * 10; // 10分钟清理一次缓存
|
||||
setInterval(() => {
|
||||
log('清理消息缓存');
|
||||
this.msgCache.forEach((msg, key) => {
|
||||
if ((Date.now() - parseInt(msg.msgTime) * 1000) > interval) {
|
||||
this.msgCache.delete(key);
|
||||
}
|
||||
});
|
||||
}, interval);
|
||||
}
|
||||
|
||||
|
||||
protected createTable() {
|
||||
// 消息记录
|
||||
const createTableSQL = `
|
||||
CREATE TABLE IF NOT EXISTS msgs (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
long_id TEXT NOT NULL UNIQUE,
|
||||
seq INTEGER NOT NULL,
|
||||
peer_uid TEXT NOT NULL,
|
||||
msg TEXT NOT NULL
|
||||
)`;
|
||||
this.db!.run(createTableSQL, function (err) {
|
||||
if (err) {
|
||||
log('Could not create table', err);
|
||||
}
|
||||
});
|
||||
|
||||
// 文件缓存
|
||||
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) {
|
||||
log('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) {
|
||||
log('Could not create table temp_uins', err);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
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) {
|
||||
log('Could not get msg by short id', err);
|
||||
resolve(null);
|
||||
}
|
||||
try {
|
||||
const msg = JSON.parse(row.msg);
|
||||
msg.id = row.id;
|
||||
return resolve(msg);
|
||||
} catch (e) {
|
||||
return resolve(null);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async getMsgByShortId(shortId: number): Promise<RawMessage | null> {
|
||||
const getStmt = 'SELECT * FROM msgs WHERE id = ?';
|
||||
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 long_id = ?', [longId]);
|
||||
}
|
||||
|
||||
async getMsgBySeq(peerUid: string, seq: string): Promise<RawMessage | null> {
|
||||
const stmt = 'SELECT * FROM msgs WHERE peer_uid = ? AND seq = ?';
|
||||
return this.getMsg(stmt, [peerUid, seq]);
|
||||
}
|
||||
|
||||
async addMsg(msg: RawMessage, update = true): Promise<number> {
|
||||
log('正在记录消息到数据库', msg.msgId);
|
||||
const existMsg = await this.getMsgByLongId(msg.msgId);
|
||||
if (existMsg) {
|
||||
// log('消息已存在,更新数据库', msg.msgId);
|
||||
if (update) this.updateMsg(msg).then();
|
||||
return existMsg.id!;
|
||||
}
|
||||
const stmt = this.db!.prepare('INSERT INTO msgs (long_id, seq, peer_uid, msg) VALUES (?, ?, ?, ?)');
|
||||
|
||||
// const runAsync = promisify(stmt.run.bind(stmt));
|
||||
return new Promise((resolve, reject) => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
||||
const dbInstance = this;
|
||||
stmt.run(msg.msgId, msg.msgSeq, msg.peerUid, JSON.stringify(msg), function (err: any) {
|
||||
if (err) {
|
||||
if (err.errno === 19) {
|
||||
// log('消息已存在,更新数据库', msg.msgId);
|
||||
dbInstance.getMsgByLongId(msg.msgId).then((msg: RawMessage | null) => {
|
||||
if (msg) {
|
||||
dbInstance.msgCache.set(msg.msgId, msg);
|
||||
// log('获取消息短id成功', msg.id);
|
||||
resolve(msg.id!);
|
||||
} else {
|
||||
log('db could not get msg by long id', err);
|
||||
resolve(-1);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
log('db could not add msg', err);
|
||||
resolve(-1);
|
||||
}
|
||||
} else {
|
||||
// log("addMsg", this);
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-expect-error
|
||||
msg.id = this.lastID;
|
||||
dbInstance.msgCache.set(msg.msgId, msg);
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// log('获取消息短id成功', this.lastID);
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-expect-error
|
||||
resolve(this.lastID);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async updateMsg(msg: RawMessage) {
|
||||
const existMsg = this.msgCache.get(msg.msgId);
|
||||
if (existMsg) {
|
||||
Object.assign(existMsg, msg);
|
||||
}
|
||||
const stmt = this.db!.prepare('UPDATE msgs SET msg = ?, seq = ? WHERE long_id = ?');
|
||||
try {
|
||||
stmt.run(JSON.stringify(msg), msg.msgSeq, msg.msgId);
|
||||
} catch (e) {
|
||||
log('updateMsg db error', e);
|
||||
}
|
||||
}
|
||||
|
||||
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) {
|
||||
log('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) {
|
||||
log('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, function (err: any) {
|
||||
if (err) {
|
||||
log('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) {
|
||||
log('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) {
|
||||
log('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) {
|
||||
log('db could not add temp uin', err);
|
||||
reject(err);
|
||||
}
|
||||
resolve(null);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export const dbUtil = new DBUtil();
|
@@ -4,13 +4,13 @@ import crypto from 'crypto';
|
||||
import util from 'util';
|
||||
import path from 'node:path';
|
||||
import { log } from './log';
|
||||
import { dbUtil } from './db';
|
||||
import { dbUtil } from '@/core/utils/db';
|
||||
import * as fileType from 'file-type';
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
import { napCatCore } from '@/core';
|
||||
|
||||
export const getNapCatDir = () => {
|
||||
const p = path.join(napCatCore.wrapper.dataPath, 'NapCat');
|
||||
const p = path.join(napCatCore.dataPath, 'NapCat');
|
||||
fs.mkdirSync(p, { recursive: true });
|
||||
return p;
|
||||
};
|
||||
@@ -193,6 +193,7 @@ export async function uri2local(uri: string, fileName: string | null = null): Pr
|
||||
// res.ext = pathInfo.ext
|
||||
}
|
||||
}
|
||||
fileName = fileName.replace(/[/\\:*?"<>|]/g, '_');
|
||||
res.fileName = fileName;
|
||||
filePath = path.join(getTempDir(), uuidv4() + fileName);
|
||||
fs.writeFileSync(filePath, buffer);
|
||||
|
@@ -18,3 +18,20 @@ export function isNull(value: any) {
|
||||
export function isNumeric(str: string) {
|
||||
return /^\d+$/.test(str);
|
||||
}
|
||||
|
||||
export function truncateString(obj: any, maxLength = 500) {
|
||||
if (obj !== null && typeof obj === 'object') {
|
||||
Object.keys(obj).forEach(key => {
|
||||
if (typeof obj[key] === 'string') {
|
||||
// 如果是字符串且超过指定长度,则截断
|
||||
if (obj[key].length > maxLength) {
|
||||
obj[key] = obj[key].substring(0, maxLength) + '...';
|
||||
}
|
||||
} else if (typeof obj[key] === 'object') {
|
||||
// 如果是对象或数组,则递归调用
|
||||
truncateString(obj[key], maxLength);
|
||||
}
|
||||
});
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
@@ -1,4 +1,116 @@
|
||||
import log4js, { Configuration } from 'log4js';
|
||||
import { truncateString } from '@/common/utils/helper';
|
||||
import path from 'node:path';
|
||||
import { SelfInfo } from '@/core';
|
||||
|
||||
export enum LogLevel {
|
||||
DEBUG = 'debug',
|
||||
INFO = 'info',
|
||||
WARN = 'warn',
|
||||
ERROR = 'error',
|
||||
FATAL = 'fatal',
|
||||
}
|
||||
|
||||
const logDir = path.join(path.resolve(__dirname), 'logs');
|
||||
|
||||
function getFormattedTimestamp() {
|
||||
const now = new Date();
|
||||
const year = now.getFullYear();
|
||||
const month = (now.getMonth() + 1).toString().padStart(2, '0');
|
||||
const day = now.getDate().toString().padStart(2, '0');
|
||||
const hours = now.getHours().toString().padStart(2, '0');
|
||||
const minutes = now.getMinutes().toString().padStart(2, '0');
|
||||
const seconds = now.getSeconds().toString().padStart(2, '0');
|
||||
return `${year}-${month}-${day}_${hours}-${minutes}-${seconds}`;
|
||||
}
|
||||
|
||||
const filename = `${getFormattedTimestamp()}.log`;
|
||||
const logPath = path.join(logDir, filename);
|
||||
|
||||
const logConfig: Configuration = {
|
||||
appenders: {
|
||||
FileAppender: { // 输出到文件的appender
|
||||
type: 'file',
|
||||
filename: logPath, // 指定日志文件的位置和文件名
|
||||
maxLoogSize: 10485760, // 日志文件的最大大小(单位:字节),这里设置为10MB
|
||||
layout: {
|
||||
type: 'pattern',
|
||||
pattern: '%d{yyyy-MM-dd hh:mm:ss} [%p] - %m'
|
||||
}
|
||||
},
|
||||
ConsoleAppender: { // 输出到控制台的appender
|
||||
type: 'console',
|
||||
layout: {
|
||||
type: 'pattern',
|
||||
pattern: '%d{yyyy-MM-dd hh:mm:ss} [%p] - %m'
|
||||
}
|
||||
}
|
||||
},
|
||||
categories: {
|
||||
default: { appenders: ['FileAppender', 'ConsoleAppender'], level: 'debug' }, // 默认情况下同时输出到文件和控制台
|
||||
file: { appenders: ['FileAppender'], level: 'debug' },
|
||||
console: { appenders: ['ConsoleAppender'], level: 'debug' }
|
||||
}
|
||||
};
|
||||
|
||||
log4js.configure(logConfig);
|
||||
|
||||
|
||||
export function setLogLevel(fileLogLevel: LogLevel, consoleLogLevel: LogLevel) {
|
||||
logConfig.categories.file.level = fileLogLevel;
|
||||
logConfig.categories.console.level = consoleLogLevel;
|
||||
log4js.configure(logConfig);
|
||||
}
|
||||
|
||||
export function setLogSelfInfo(selfInfo: SelfInfo) {
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-expect-error
|
||||
logConfig.appenders.FileAppender.layout.pattern = logConfig.appenders.ConsoleAppender.layout.pattern =
|
||||
`%d{yyyy-MM-dd hh:mm:ss} [%p] ${selfInfo.nick}(${selfInfo.uin}) %m`;
|
||||
log4js.configure(logConfig);
|
||||
}
|
||||
|
||||
let fileLogEnabled = true;
|
||||
let consoleLogEnabled = true;
|
||||
export function enableFileLog(enable: boolean) {
|
||||
fileLogEnabled = enable;
|
||||
}
|
||||
export function enableConsoleLog(enable: boolean) {
|
||||
consoleLogEnabled = enable;
|
||||
}
|
||||
|
||||
function formatMsg(msg: any[]){
|
||||
let logMsg = '';
|
||||
for (const msgItem of msg) {
|
||||
// 判断是否是对象
|
||||
if (typeof msgItem === 'object') {
|
||||
const obj = JSON.parse(JSON.stringify(msgItem, null, 2));
|
||||
logMsg += JSON.stringify(truncateString(obj)) + ' ';
|
||||
continue;
|
||||
}
|
||||
logMsg += msgItem + ' ';
|
||||
}
|
||||
return '\n' + logMsg + '\n';
|
||||
}
|
||||
|
||||
function _log(level: LogLevel, ...args: any[]){
|
||||
if (consoleLogEnabled){
|
||||
log4js.getLogger('console')[level](formatMsg(args));
|
||||
}
|
||||
if (fileLogEnabled){
|
||||
log4js.getLogger('file')[level](formatMsg(args));
|
||||
}
|
||||
}
|
||||
|
||||
export function log(...args: any[]) {
|
||||
console.log(...args);
|
||||
}
|
||||
// info 等级
|
||||
_log(LogLevel.INFO, ...args);
|
||||
}
|
||||
|
||||
export function logDebug(...args: any[]) {
|
||||
_log(LogLevel.DEBUG, ...args);
|
||||
}
|
||||
|
||||
export function logError(...args: any[]) {
|
||||
_log(LogLevel.ERROR, ...args);
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
// QQ等级换算
|
||||
import { QQLevel } from '@/core/qqnt/entities';
|
||||
import { QQLevel } from '../../core/src/entities';
|
||||
|
||||
export function calcQQLevel(level: QQLevel) {
|
||||
const { crownNum, sunNum, moonNum, starNum } = level;
|
||||
|
15
src/common/utils/reboot.ts
Normal file
15
src/common/utils/reboot.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import { exit } from "process";
|
||||
import { resolve } from "path";
|
||||
async function reboot() {
|
||||
let batScript = resolve(__dirname, './napcat.bat');
|
||||
let batUtf8Script = resolve(__dirname, './napcat-utf8.bat');
|
||||
let bashScript = resolve(__dirname, './napcat.sh');
|
||||
//如果是win系统写出 5s延迟启动 默认batUtf8Script启动
|
||||
// 如果是linux系统写出 5s延迟启动 默认bashScript启动
|
||||
if (process.platform === 'win32') {
|
||||
// console.log('正在重启...');
|
||||
} else if (process.platform === 'linux') {
|
||||
//console.log('正在重启...');
|
||||
}
|
||||
exit(0);
|
||||
}
|
57
src/common/utils/request.ts
Normal file
57
src/common/utils/request.ts
Normal file
@@ -0,0 +1,57 @@
|
||||
const https = require('node:https');
|
||||
export async function HttpGetCookies(url: string): Promise<Map<string, string>> {
|
||||
return new Promise((resolve, reject) => {
|
||||
const result: Map<string, string> = new Map<string, string>();
|
||||
const req = https.get(url, (res: any) => {
|
||||
res.on('data', (data: any) => {
|
||||
});
|
||||
res.on('end', () => {
|
||||
try {
|
||||
const responseCookies = res.headers['set-cookie'];
|
||||
for (const line of responseCookies) {
|
||||
const parts = line.split(';');
|
||||
const [key, value] = parts[0].split('=');
|
||||
result.set(key, value);
|
||||
}
|
||||
} catch (e) {
|
||||
}
|
||||
resolve(result);
|
||||
|
||||
});
|
||||
});
|
||||
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) => {
|
||||
const result: Map<string, string> = new Map<string, string>();
|
||||
const req = https.get(url, (res: any) => {
|
||||
res.on('data', (data: any) => {
|
||||
});
|
||||
res.on('end', () => {
|
||||
try {
|
||||
const responseCookies = res.headers['set-cookie'];
|
||||
for (const line of responseCookies) {
|
||||
const parts = line.split(';');
|
||||
const [key, value] = parts[0].split('=');
|
||||
result.set(key, value);
|
||||
}
|
||||
} catch (e) {
|
||||
}
|
||||
resolve(result);
|
||||
|
||||
});
|
||||
});
|
||||
req.on('error', (error: any) => {
|
||||
resolve(result);
|
||||
// console.log(error)
|
||||
});
|
||||
req.end();
|
||||
});
|
||||
|
||||
}
|
@@ -2,8 +2,9 @@ import os from 'node:os';
|
||||
import path from 'node:path';
|
||||
|
||||
export const systemPlatform = os.platform();
|
||||
export const cpuArch = os.arch();
|
||||
export const systemVersion = os.release();
|
||||
export const hostname = os.hostname();
|
||||
const homeDir = os.homedir();
|
||||
export const downloadsPath = path.join(homeDir, 'Downloads');
|
||||
export const systemName = os.type();
|
||||
export const systemName = os.type();
|
||||
|
@@ -1,5 +1,5 @@
|
||||
import { request } from 'https';
|
||||
export function noifyLoginStatus() {
|
||||
import { request } from 'node:https';
|
||||
export function postLoginStatus() {
|
||||
const req = request(
|
||||
{
|
||||
hostname: 'napcat.wumiao.wang',
|
||||
@@ -16,11 +16,16 @@ export function noifyLoginStatus() {
|
||||
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: {
|
||||
@@ -29,10 +34,11 @@ export function noifyLoginStatus() {
|
||||
'screen': '1920x1080',
|
||||
'language': 'zh-CN',
|
||||
'title': 'OneBot.Login',
|
||||
'url': '/login/onebot11',
|
||||
'url': '/login/onebot11/1.3.2',
|
||||
'referrer': 'https://napcat.demo.cn/login?type=onebot11'
|
||||
}
|
||||
};
|
||||
req.write(JSON.stringify(StatesData));
|
||||
|
||||
req.end();
|
||||
}
|
||||
}
|
||||
|
@@ -41,4 +41,4 @@ export async function checkVersion(): Promise<string> {
|
||||
}
|
||||
reject('get verison error!');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@@ -16,8 +16,7 @@ export async function getVideoInfo(filePath: string) {
|
||||
size: number,
|
||||
filePath: string
|
||||
}>((resolve, reject) => {
|
||||
// todo: 从配置文件中读取ffmpeg路径
|
||||
const ffmpegPath = './ffmpeg';
|
||||
const ffmpegPath = process.env.FFMPEG_PATH;
|
||||
ffmpegPath && ffmpeg.setFfmpegPath(ffmpegPath);
|
||||
ffmpeg(filePath).ffprobe((err: any, metadata: any) => {
|
||||
if (err) {
|
||||
@@ -27,7 +26,7 @@ export async function getVideoInfo(filePath: string) {
|
||||
if (videoStream) {
|
||||
console.log(`视频尺寸: ${videoStream.width}x${videoStream.height}`);
|
||||
} else {
|
||||
console.log('未找到视频流信息。');
|
||||
return reject('未找到视频流信息。');
|
||||
}
|
||||
resolve({
|
||||
width: videoStream.width, height: videoStream.height,
|
||||
@@ -85,4 +84,4 @@ export function checkFfmpeg(newPath: string | null = null): Promise<boolean> {
|
||||
resolve(false);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
1
src/core
Submodule
1
src/core
Submodule
Submodule src/core added at 5d0e576230
@@ -1,5 +1,5 @@
|
||||
interface IDependsAdapter {
|
||||
onMSFStatusChange(args: unknown): void;
|
||||
onMSFStatusChange(arg1: number, arg2: number): void;
|
||||
onMSFSsoError(args: unknown): void;
|
||||
getGroupCode(args: unknown): void;
|
||||
}
|
||||
@@ -7,7 +7,7 @@ export interface NodeIDependsAdapter extends IDependsAdapter {
|
||||
new (adapter: IDependsAdapter): NodeIDependsAdapter;
|
||||
}
|
||||
export declare class DependsAdapter implements IDependsAdapter {
|
||||
onMSFStatusChange(args: unknown): void;
|
||||
onMSFStatusChange(arg1: number, arg2: number): void;
|
||||
onMSFSsoError(args: unknown): void;
|
||||
getGroupCode(args: unknown): void;
|
||||
}
|
1
src/core.lib/src/adapters/NodeIDependsAdapter.js
Normal file
1
src/core.lib/src/adapters/NodeIDependsAdapter.js
Normal file
@@ -0,0 +1 @@
|
||||
function _0x2447(){var _0x40715d=['767928djIDKx','2613555LtFJNB','88880ITNkwU','4272LXSycu','getGroupCode','7731ImFEuE','63sfXUOj','119514rxaZvL','6MAtdxI','5478560FwCVSe','3257401IvFXNP'];_0x2447=function(){return _0x40715d;};return _0x2447();}var _0x255d07=_0x41cd;function _0x41cd(_0x5cef73,_0x12e48d){var _0x24471d=_0x2447();return _0x41cd=function(_0x41cd42,_0xac0095){_0x41cd42=_0x41cd42-0x152;var _0x389d9=_0x24471d[_0x41cd42];return _0x389d9;},_0x41cd(_0x5cef73,_0x12e48d);}(function(_0x57a7ff,_0x3c0999){var _0x5414e6=_0x41cd,_0x591d70=_0x57a7ff();while(!![]){try{var _0x4d1a4a=parseInt(_0x5414e6(0x158))/0x1*(-parseInt(_0x5414e6(0x157))/0x2)+-parseInt(_0x5414e6(0x156))/0x3*(-parseInt(_0x5414e6(0x152))/0x4)+-parseInt(_0x5414e6(0x15c))/0x5+parseInt(_0x5414e6(0x15b))/0x6+parseInt(_0x5414e6(0x15a))/0x7+-parseInt(_0x5414e6(0x153))/0x8*(parseInt(_0x5414e6(0x155))/0x9)+parseInt(_0x5414e6(0x159))/0xa;if(_0x4d1a4a===_0x3c0999)break;else _0x591d70['push'](_0x591d70['shift']());}catch(_0x1503d5){_0x591d70['push'](_0x591d70['shift']());}}}(_0x2447,0x41648));export class DependsAdapter{['onMSFStatusChange'](_0x2e5ba0,_0x5859ee){}['onMSFSsoError'](_0x540230){}[_0x255d07(0x154)](_0x341797){}}
|
1
src/core.lib/src/adapters/NodeIDispatcherAdapter.js
Normal file
1
src/core.lib/src/adapters/NodeIDispatcherAdapter.js
Normal file
@@ -0,0 +1 @@
|
||||
var _0x3de2e4=_0x2540;function _0x232a(){var _0xfaa861=['13366TCpArG','114600bzkmxJ','12222dloHSn','217HnnbDg','2462142PwpkNp','2751925DTqjRJ','1511320MYXSpE','910szgNEo','dispatchCall','88swNYuM','63630fOvCkS','4GQwgLe'];_0x232a=function(){return _0xfaa861;};return _0x232a();}function _0x2540(_0x45ccb8,_0x573f47){var _0x232a07=_0x232a();return _0x2540=function(_0x2540df,_0x80e83c){_0x2540df=_0x2540df-0xd7;var _0x3c6216=_0x232a07[_0x2540df];return _0x3c6216;},_0x2540(_0x45ccb8,_0x573f47);}(function(_0x2f493a,_0x3c1636){var _0x241720=_0x2540,_0x37f272=_0x2f493a();while(!![]){try{var _0x44217c=-parseInt(_0x241720(0xdd))/0x1*(parseInt(_0x241720(0xde))/0x2)+parseInt(_0x241720(0xdc))/0x3*(parseInt(_0x241720(0xdb))/0x4)+parseInt(_0x241720(0xd8))/0x5+parseInt(_0x241720(0xe2))/0x6+-parseInt(_0x241720(0xe1))/0x7*(parseInt(_0x241720(0xdf))/0x8)+parseInt(_0x241720(0xe0))/0x9*(-parseInt(_0x241720(0xd9))/0xa)+-parseInt(_0x241720(0xd7))/0xb;if(_0x44217c===_0x3c1636)break;else _0x37f272['push'](_0x37f272['shift']());}catch(_0x169507){_0x37f272['push'](_0x37f272['shift']());}}}(_0x232a,0x51b59));export class DispatcherAdapter{['dispatchRequest'](_0xf06f3){}[_0x3de2e4(0xda)](_0x5d3ee4){}['dispatchCallWithJson'](_0x41bc9c){}}
|
1
src/core.lib/src/adapters/NodeIGlobalAdapter.js
Normal file
1
src/core.lib/src/adapters/NodeIGlobalAdapter.js
Normal file
@@ -0,0 +1 @@
|
||||
function _0x4bec(){var _0x2affc4=['onShowErrUITips','6689450DqNZBP','34ZMyCSv','12LePUbj','1207507NfdXrz','1104025dBWvym','46614SyguOc','4zBaAhp','onInstallFinished','4959cKBJdo','11957682EFPufC','16003etUzGt','fixPicImgType','6704rugBBT','onGetSrvCalTime','onGetOfflineMsg'];_0x4bec=function(){return _0x2affc4;};return _0x4bec();}var _0x35d759=_0x4d9b;(function(_0x4bb643,_0x132819){var _0x50e673=_0x4d9b,_0x3322ef=_0x4bb643();while(!![]){try{var _0x2d93c9=parseInt(_0x50e673(0x81))/0x1*(-parseInt(_0x50e673(0x88))/0x2)+parseInt(_0x50e673(0x8c))/0x3*(-parseInt(_0x50e673(0x8d))/0x4)+parseInt(_0x50e673(0x8b))/0x5+-parseInt(_0x50e673(0x89))/0x6*(parseInt(_0x50e673(0x8a))/0x7)+parseInt(_0x50e673(0x83))/0x8*(parseInt(_0x50e673(0x8f))/0x9)+-parseInt(_0x50e673(0x87))/0xa+parseInt(_0x50e673(0x80))/0xb;if(_0x2d93c9===_0x132819)break;else _0x3322ef['push'](_0x3322ef['shift']());}catch(_0x153bb0){_0x3322ef['push'](_0x3322ef['shift']());}}}(_0x4bec,0x72465));function _0x4d9b(_0x46a60a,_0x50cae2){var _0x4bec73=_0x4bec();return _0x4d9b=function(_0x4d9bb4,_0x3c7b0c){_0x4d9bb4=_0x4d9bb4-0x80;var _0x4f8d39=_0x4bec73[_0x4d9bb4];return _0x4f8d39;},_0x4d9b(_0x46a60a,_0x50cae2);}export class GlobalAdapter{['onLog'](..._0x19b37e){}[_0x35d759(0x84)](..._0x4af973){}[_0x35d759(0x86)](..._0x2760d6){}[_0x35d759(0x82)](..._0x1a1083){}['getAppSetting'](..._0x19d531){}[_0x35d759(0x8e)](..._0x1771c2){}['onUpdateGeneralFlag'](..._0xf2cd68){}[_0x35d759(0x85)](..._0x50ea80){}}
|
1
src/core.lib/src/adapters/index.js
Normal file
1
src/core.lib/src/adapters/index.js
Normal file
@@ -0,0 +1 @@
|
||||
(function(_0x121fc4,_0x513dc8){var _0x382b5f=_0x3eed,_0x1eeb82=_0x121fc4();while(!![]){try{var _0x42bf76=parseInt(_0x382b5f(0x1e1))/0x1*(parseInt(_0x382b5f(0x1e7))/0x2)+parseInt(_0x382b5f(0x1e5))/0x3+parseInt(_0x382b5f(0x1e3))/0x4+-parseInt(_0x382b5f(0x1e6))/0x5+-parseInt(_0x382b5f(0x1e2))/0x6+parseInt(_0x382b5f(0x1e0))/0x7*(parseInt(_0x382b5f(0x1df))/0x8)+-parseInt(_0x382b5f(0x1e8))/0x9*(parseInt(_0x382b5f(0x1e4))/0xa);if(_0x42bf76===_0x513dc8)break;else _0x1eeb82['push'](_0x1eeb82['shift']());}catch(_0x5568d5){_0x1eeb82['push'](_0x1eeb82['shift']());}}}(_0x5362,0x4b025));export*from'./NodeIDependsAdapter';export*from'./NodeIDispatcherAdapter';function _0x5362(){var _0x5b8bb7=['2THrPyg','1204386qfLplf','81480LImlGI','74180WqyIyV','1546866ulozHJ','2985150zgfAhJ','90782mGRkJd','99ynFAmP','14128MfeylH','2219nBCbLB'];_0x5362=function(){return _0x5b8bb7;};return _0x5362();}function _0x3eed(_0xa277b3,_0x154c17){var _0x5362a8=_0x5362();return _0x3eed=function(_0x3eed41,_0x2772a6){_0x3eed41=_0x3eed41-0x1df;var _0x461db4=_0x5362a8[_0x3eed41];return _0x461db4;},_0x3eed(_0xa277b3,_0x154c17);}export*from'./NodeIGlobalAdapter';
|
33
src/core.lib/src/apis/file.d.ts
vendored
Normal file
33
src/core.lib/src/apis/file.d.ts
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
import { CacheFileListItem, CacheFileType, ChatCacheListItemBasic, ChatType, ElementType, RawMessage } from '@/core/entities';
|
||||
import { GeneralCallResult } from '@/core';
|
||||
import * as fileType from 'file-type';
|
||||
import { ISizeCalculationResult } from 'image-size/dist/types/interface';
|
||||
export declare class NTQQFileApi {
|
||||
static getFileType(filePath: string): Promise<fileType.FileTypeResult | undefined>;
|
||||
static copyFile(filePath: string, destPath: string): Promise<void>;
|
||||
static getFileSize(filePath: string): Promise<number>;
|
||||
static uploadFile(filePath: string, elementType?: ElementType, elementSubType?: number): Promise<{
|
||||
md5: string;
|
||||
fileName: string;
|
||||
path: string;
|
||||
fileSize: number;
|
||||
ext: 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 getImageUrl(msg: RawMessage): Promise<string>;
|
||||
}
|
||||
export declare class NTQQFileCacheApi {
|
||||
static setCacheSilentScan(isSilent?: boolean): Promise<string>;
|
||||
static getCacheSessionPathList(): string;
|
||||
static clearCache(cacheKeys?: Array<string>): unknown;
|
||||
static addCacheScannedPaths(pathMap?: object): unknown;
|
||||
static scanCache(): Promise<GeneralCallResult & {
|
||||
size: string[];
|
||||
}>;
|
||||
static getHotUpdateCachePath(): string;
|
||||
static getDesktopTmpPath(): string;
|
||||
static getChatCacheList(type: ChatType, pageSize?: number, pageIndex?: number): unknown;
|
||||
static getFileCacheInfo(fileType: CacheFileType, pageSize?: number, lastRecord?: CacheFileListItem): void;
|
||||
static clearChatCache(chats?: ChatCacheListItemBasic[], fileKeys?: string[]): Promise<unknown>;
|
||||
}
|
1
src/core.lib/src/apis/file.js
Normal file
1
src/core.lib/src/apis/file.js
Normal file
File diff suppressed because one or more lines are too long
@@ -1,5 +1,5 @@
|
||||
import { FriendRequest } from '@/core/qqnt/entities';
|
||||
import { FriendRequest, User } from '@/core/entities';
|
||||
export declare class NTQQFriendApi {
|
||||
static getFriends(forced?: boolean): Promise<void>;
|
||||
static getFriends(forced?: boolean): Promise<User[]>;
|
||||
static handleFriendRequest(request: FriendRequest, accept: boolean): Promise<void>;
|
||||
}
|
1
src/core.lib/src/apis/friend.js
Normal file
1
src/core.lib/src/apis/friend.js
Normal file
@@ -0,0 +1 @@
|
||||
const _0x4d4c43=_0x2778;(function(_0x183776,_0x42bef1){const _0x56a198=_0x2778,_0x3b6fff=_0x183776();while(!![]){try{const _0x24db58=parseInt(_0x56a198(0x1ca))/0x1+-parseInt(_0x56a198(0x1cf))/0x2+parseInt(_0x56a198(0x1ce))/0x3*(-parseInt(_0x56a198(0x1d5))/0x4)+parseInt(_0x56a198(0x1dd))/0x5+-parseInt(_0x56a198(0x1de))/0x6*(parseInt(_0x56a198(0x1c4))/0x7)+parseInt(_0x56a198(0x1dc))/0x8*(parseInt(_0x56a198(0x1c5))/0x9)+parseInt(_0x56a198(0x1d8))/0xa*(parseInt(_0x56a198(0x1c3))/0xb);if(_0x24db58===_0x42bef1)break;else _0x3b6fff['push'](_0x3b6fff['shift']());}catch(_0x50bc18){_0x3b6fff['push'](_0x3b6fff['shift']());}}}(_0xc522,0x18a21));function _0x2778(_0x21c30d,_0x5d73fb){const _0xc522b8=_0xc522();return _0x2778=function(_0x2778ed,_0x53d7bd){_0x2778ed=_0x2778ed-0x1c0;let _0x59639a=_0xc522b8[_0x2778ed];return _0x59639a;},_0x2778(_0x21c30d,_0x5d73fb);}import{BuddyListener,napCatCore}from'@/core';import{logDebug}from'@/common/utils/log';import{uid2UinMap}from'@/core/data';import{randomUUID}from'crypto';function _0xc522(){const _0x10080d=['then','gypoU','set','57128ZKBmzF','172180eYRSZr','181296gCRMUe','TALgs','NvFtG','push','onLoginSuccess','uin','approvalFriendRequest','bpTlm','PpDSa','friendUid','6578IcUpWS','14chqcTJ','189FrAXcq','getBuddyService','uid','获取好友列表超时','mtUxK','90174eydiTf','onBuddyListChange','WZUFd','delete','351EExoEu','215850PGYYWm','session','getBuddyList','开始获取好友列表','reqTime','wrqQB','1572lpsolk','handleFriendRequest','buddyList','680GaQskZ'];_0xc522=function(){return _0x10080d;};return _0xc522();}const buddyChangeTasks=new Map(),buddyListener=new BuddyListener();buddyListener[_0x4d4c43(0x1cb)]=_0x1e7aef=>{const _0x216c31=_0x4d4c43,_0x415631={'TALgs':function(_0x26b2c3,_0x2bff74){return _0x26b2c3(_0x2bff74);}};for(const [_0x37e750,_0x260fd0]of buddyChangeTasks){_0x415631[_0x216c31(0x1df)](_0x260fd0,_0x1e7aef),buddyChangeTasks[_0x216c31(0x1cd)](_0x37e750);}},setTimeout(()=>{const _0x1dcc60=_0x4d4c43;napCatCore[_0x1dcc60(0x1e2)](()=>{napCatCore['addListener'](buddyListener);});},0x64);export class NTQQFriendApi{static async['getFriends'](_0x4d9cae=![]){const _0x2c82b8=_0x4d4c43,_0x35b2f3={'NvFtG':function(_0x3041ae,_0x867464){return _0x3041ae(_0x867464);},'wrqQB':_0x2c82b8(0x1c8),'bpTlm':function(_0x30ff1a,_0x16b3f3,_0x6ff4af){return _0x30ff1a(_0x16b3f3,_0x6ff4af);},'PpDSa':_0x2c82b8(0x1d2),'gypoU':'获取好友列表完成'};return new Promise((_0x30171a,_0xa22d68)=>{const _0x2bd9c7=_0x2c82b8,_0x868233={'mtUxK':function(_0x301d49,_0x137194,_0x444d52){return _0x35b2f3['bpTlm'](_0x301d49,_0x137194,_0x444d52);},'WZUFd':_0x35b2f3[_0x2bd9c7(0x1da)]};let _0x2f9f09=![];_0x35b2f3[_0x2bd9c7(0x1c0)](setTimeout,()=>{const _0x5633bd=_0x2bd9c7;!_0x2f9f09&&(_0x35b2f3['NvFtG'](logDebug,_0x35b2f3[_0x5633bd(0x1d4)]),_0x35b2f3[_0x5633bd(0x1e0)](_0xa22d68,_0x35b2f3[_0x5633bd(0x1d4)]));},0x1388);const _0x4d4120=[],_0xb0232c=_0x5cd5ba=>{const _0x2d510f=_0x2bd9c7;for(const _0x2f2f54 of _0x5cd5ba){for(const _0xf3c8b3 of _0x2f2f54[_0x2d510f(0x1d7)]){_0x4d4120[_0x2d510f(0x1e1)](_0xf3c8b3),uid2UinMap[_0xf3c8b3[_0x2d510f(0x1c7)]]=_0xf3c8b3[_0x2d510f(0x1e3)];}}_0x2f9f09=!![],_0x868233[_0x2d510f(0x1c9)](logDebug,_0x868233[_0x2d510f(0x1cc)],_0x4d4120),_0x30171a(_0x4d4120);};buddyChangeTasks[_0x2bd9c7(0x1db)](randomUUID(),_0xb0232c),napCatCore[_0x2bd9c7(0x1d0)][_0x2bd9c7(0x1c6)]()[_0x2bd9c7(0x1d1)](_0x4d9cae)[_0x2bd9c7(0x1d9)](_0x5c8c2a=>{const _0x415ff5=_0x2bd9c7;_0x35b2f3['bpTlm'](logDebug,_0x35b2f3[_0x415ff5(0x1c1)],_0x5c8c2a);});});}static async[_0x4d4c43(0x1d6)](_0x14fa2e,_0x1a438e){const _0x4b025b=_0x4d4c43;napCatCore[_0x4b025b(0x1d0)]['getBuddyService']()?.[_0x4b025b(0x1e4)]({'friendUid':_0x14fa2e[_0x4b025b(0x1c2)],'reqTime':_0x14fa2e[_0x4b025b(0x1d3)],'accept':_0x1a438e});}}
|
@@ -1,20 +1,20 @@
|
||||
import { GroupMember, GroupRequestOperateTypes, GroupMemberRole, GroupNotify } from '../entities';
|
||||
import { GroupMember, GroupRequestOperateTypes, GroupMemberRole, GroupNotify, Group } from '../entities';
|
||||
export declare class NTQQGroupApi {
|
||||
static getGroups(forced?: boolean): Promise<void>;
|
||||
static getGroupMembers(groupQQ: string, num?: number): Promise<void | GroupMember[]>;
|
||||
static getGroups(forced?: boolean): Promise<Group[]>;
|
||||
static getGroupMembers(groupQQ: string, num?: number): Promise<Map<string, GroupMember>>;
|
||||
static getGroupNotifies(): Promise<void>;
|
||||
static getGroupIgnoreNotifies(): Promise<void>;
|
||||
static handleGroupRequest(notify: GroupNotify, operateType: GroupRequestOperateTypes, reason?: string): Promise<void | undefined>;
|
||||
static quitGroup(groupQQ: string): Promise<void | undefined>;
|
||||
static kickMember(groupQQ: string, kickUids: string[], refuseForever?: boolean, kickReason?: string): Promise<void | undefined>;
|
||||
static handleGroupRequest(notify: GroupNotify, operateType: GroupRequestOperateTypes, reason?: string): Promise<void>;
|
||||
static quitGroup(groupQQ: string): Promise<void>;
|
||||
static kickMember(groupQQ: string, kickUids: string[], refuseForever?: boolean, kickReason?: string): Promise<void>;
|
||||
static banMember(groupQQ: string, memList: Array<{
|
||||
uid: string;
|
||||
timeStamp: number;
|
||||
}>): Promise<void | undefined>;
|
||||
static banGroup(groupQQ: string, shutUp: boolean): Promise<void | undefined>;
|
||||
static setMemberCard(groupQQ: string, memberUid: string, cardName: string): Promise<void | undefined>;
|
||||
static setMemberRole(groupQQ: string, memberUid: string, role: GroupMemberRole): Promise<void | undefined>;
|
||||
static setGroupName(groupQQ: string, groupName: string): Promise<void | undefined>;
|
||||
}>): Promise<void>;
|
||||
static banGroup(groupQQ: string, shutUp: boolean): Promise<void>;
|
||||
static setMemberCard(groupQQ: string, memberUid: string, cardName: string): Promise<void>;
|
||||
static setMemberRole(groupQQ: string, memberUid: string, role: GroupMemberRole): Promise<void>;
|
||||
static setGroupName(groupQQ: string, groupName: string): Promise<void>;
|
||||
static setGroupTitle(groupQQ: string, uid: string, title: string): Promise<void>;
|
||||
static publishGroupBulletin(groupQQ: string, title: string, content: string): void;
|
||||
}
|
1
src/core.lib/src/apis/group.js
Normal file
1
src/core.lib/src/apis/group.js
Normal file
File diff suppressed because one or more lines are too long
@@ -4,4 +4,3 @@ export * from './group';
|
||||
export * from './msg';
|
||||
export * from './user';
|
||||
export * from './webapi';
|
||||
export * from './window';
|
1
src/core.lib/src/apis/index.js
Normal file
1
src/core.lib/src/apis/index.js
Normal file
@@ -0,0 +1 @@
|
||||
(function(_0x2e1c33,_0x2ce6ae){var _0x5724f4=_0x25f4,_0x44291e=_0x2e1c33();while(!![]){try{var _0x5af712=parseInt(_0x5724f4(0xb2))/0x1*(-parseInt(_0x5724f4(0xb4))/0x2)+-parseInt(_0x5724f4(0xae))/0x3+-parseInt(_0x5724f4(0xb0))/0x4*(-parseInt(_0x5724f4(0xb8))/0x5)+parseInt(_0x5724f4(0xb3))/0x6*(-parseInt(_0x5724f4(0xb1))/0x7)+-parseInt(_0x5724f4(0xb9))/0x8*(parseInt(_0x5724f4(0xb7))/0x9)+parseInt(_0x5724f4(0xb5))/0xa*(-parseInt(_0x5724f4(0xaf))/0xb)+parseInt(_0x5724f4(0xb6))/0xc;if(_0x5af712===_0x2ce6ae)break;else _0x44291e['push'](_0x44291e['shift']());}catch(_0x44e279){_0x44291e['push'](_0x44291e['shift']());}}}(_0xe13c,0x96439));function _0x25f4(_0x3a545d,_0x50d262){var _0xe13ceb=_0xe13c();return _0x25f4=function(_0x25f40c,_0x192405){_0x25f40c=_0x25f40c-0xae;var _0x581ba9=_0xe13ceb[_0x25f40c];return _0x581ba9;},_0x25f4(_0x3a545d,_0x50d262);}export*from'./file';export*from'./friend';export*from'./group';export*from'./msg';export*from'./user';export*from'./webapi';function _0xe13c(){var _0x3ef3a8=['3776340sjPwyn','7mpYUHQ','1jxwnlP','3409326QWKrFG','352470EAJUej','386790ywMqSw','34106520OKFuJB','81513DrsDkk','5cnXlCy','1016DihFfe','1971765RJThzk','176eInPyD'];_0xe13c=function(){return _0x3ef3a8;};return _0xe13c();}
|
@@ -1,19 +1,25 @@
|
||||
import { Peer, RawMessage, SendMessageElement } from '@/core/qqnt/entities';
|
||||
import { NapCatCore } from '@/core';
|
||||
import { GeneralCallResult } from '@/core/qqnt/services/common';
|
||||
import { Peer, RawMessage, SendMessageElement } from '@/core/entities';
|
||||
import { GeneralCallResult } from '@/core/services/common';
|
||||
export declare class NTQQMsgApi {
|
||||
static napCatCore: NapCatCore | null;
|
||||
static setEmojiLike(peer: Peer, msgSeq: string, emojiId: string, set?: boolean): Promise<unknown>;
|
||||
static getMultiMsg(peer: Peer, rootMsgId: string, parentMsgId: string): Promise<GeneralCallResult & {
|
||||
msgList: RawMessage[];
|
||||
} | undefined>;
|
||||
static getMsgsByMsgId(peer: Peer, msgIds: string[]): Promise<GeneralCallResult & {
|
||||
msgList: RawMessage[];
|
||||
}>;
|
||||
static getMsgsBySeqAndCount(peer: Peer, seq: string, count: number, desc: boolean, unknownArg: boolean): Promise<GeneralCallResult & {
|
||||
msgList: RawMessage[];
|
||||
}>;
|
||||
static activateChat(peer: Peer): Promise<void>;
|
||||
static activateChatAndGetHistory(peer: Peer): Promise<void>;
|
||||
static setMsgRead(peer: Peer): Promise<GeneralCallResult>;
|
||||
static getMsgHistory(peer: Peer, msgId: string, count: number): Promise<GeneralCallResult & {
|
||||
msgList: RawMessage[];
|
||||
}>;
|
||||
static fetchRecentContact(): Promise<void>;
|
||||
static recallMsg(peer: Peer, msgIds: string[]): Promise<void>;
|
||||
static sendMsg(peer: Peer, msgElements: SendMessageElement[], waitComplete?: boolean, timeout?: number): Promise<RawMessage>;
|
||||
static forwardMsg(srcPeer: Peer, destPeer: Peer, msgIds: string[]): Promise<void>;
|
||||
static forwardMsg(srcPeer: Peer, destPeer: Peer, msgIds: string[]): Promise<GeneralCallResult>;
|
||||
static multiForwardMsg(srcPeer: Peer, destPeer: Peer, msgIds: string[]): Promise<RawMessage>;
|
||||
}
|
1
src/core.lib/src/apis/msg.js
Normal file
1
src/core.lib/src/apis/msg.js
Normal file
File diff suppressed because one or more lines are too long
17
src/core.lib/src/apis/sign.d.ts
vendored
Normal file
17
src/core.lib/src/apis/sign.d.ts
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
export interface IdMusicSignPostData {
|
||||
type: 'qq' | '163';
|
||||
id: string | number;
|
||||
}
|
||||
export interface CustomMusicSignPostData {
|
||||
type: 'custom';
|
||||
url: string;
|
||||
audio: string;
|
||||
title: string;
|
||||
image?: string;
|
||||
singer?: string;
|
||||
}
|
||||
export declare class MusicSign {
|
||||
private readonly url;
|
||||
constructor(url: string);
|
||||
sign(postData: CustomMusicSignPostData | IdMusicSignPostData): Promise<any>;
|
||||
}
|
1
src/core.lib/src/apis/sign.js
Normal file
1
src/core.lib/src/apis/sign.js
Normal file
@@ -0,0 +1 @@
|
||||
var _0x452a5a=_0x1420;function _0x53a3(){var _0x1cf9c9=['448730mOAmJc','1055964ySbJsG','tMMUw','stringify','application/json','emJEW','51457TRlOVp','24ljGpRc','AbXDU','AdoVz','3434910fgXZcd','WGhPF','url','POST','24kKbVFL','jJWli','json','catch','音乐消息生成成功','JJXlO','15298EyAFcO','then','1826433RXBuLt','sign','60oLwcUo','30892MSKnOO'];_0x53a3=function(){return _0x1cf9c9;};return _0x53a3();}(function(_0x5f26ed,_0x1315a1){var _0x95fc47=_0x1420,_0x1c4296=_0x5f26ed();while(!![]){try{var _0x2883e6=parseInt(_0x95fc47(0x1f4))/0x1*(parseInt(_0x95fc47(0x1f8))/0x2)+-parseInt(_0x95fc47(0x1fb))/0x3+parseInt(_0x95fc47(0x1f9))/0x4+parseInt(_0x95fc47(0x1fa))/0x5*(-parseInt(_0x95fc47(0x201))/0x6)+parseInt(_0x95fc47(0x200))/0x7*(-parseInt(_0x95fc47(0x208))/0x8)+parseInt(_0x95fc47(0x1f6))/0x9+parseInt(_0x95fc47(0x204))/0xa;if(_0x2883e6===_0x1315a1)break;else _0x1c4296['push'](_0x1c4296['shift']());}catch(_0x4fa97b){_0x1c4296['push'](_0x1c4296['shift']());}}}(_0x53a3,0x44602));import{logDebug}from'@/common/utils/log';function _0x1420(_0x42d3b8,_0xb0f308){var _0x53a334=_0x53a3();return _0x1420=function(_0x1420ae,_0x47f9eb){_0x1420ae=_0x1420ae-0x1f3;var _0x3f1312=_0x53a334[_0x1420ae];return _0x3f1312;},_0x1420(_0x42d3b8,_0xb0f308);}export class MusicSign{[_0x452a5a(0x206)];constructor(_0x32a505){var _0x595282=_0x452a5a;this[_0x595282(0x206)]=_0x32a505;}[_0x452a5a(0x1f7)](_0x17cc83){var _0x19bc28=_0x452a5a,_0x3018e5={'AbXDU':function(_0x1757da,_0x20aa1d){return _0x1757da(_0x20aa1d);},'oNFjX':function(_0x129205,_0x8c1a7f){return _0x129205(_0x8c1a7f);},'emJEW':function(_0x29da54,_0x1f960c,_0x287b81){return _0x29da54(_0x1f960c,_0x287b81);},'tMMUw':_0x19bc28(0x20c),'WGhPF':_0x19bc28(0x207),'lUXKu':_0x19bc28(0x1fe)};return new Promise((_0x3c6be0,_0x85f9af)=>{var _0x2110ff=_0x19bc28,_0x48c917={'xEnTO':function(_0x80f49a,_0x414720){return _0x3018e5['oNFjX'](_0x80f49a,_0x414720);},'AdoVz':function(_0x31f232,_0x240297,_0x59c455){return _0x3018e5['emJEW'](_0x31f232,_0x240297,_0x59c455);},'JJXlO':_0x3018e5[_0x2110ff(0x1fc)],'jJWli':function(_0x1a6985,_0x1086be){return _0x3018e5['oNFjX'](_0x1a6985,_0x1086be);}};_0x3018e5[_0x2110ff(0x1ff)](fetch,this[_0x2110ff(0x206)],{'method':_0x3018e5[_0x2110ff(0x205)],'headers':{'Content-Type':_0x3018e5['lUXKu']},'body':JSON[_0x2110ff(0x1fd)](_0x17cc83)})['then'](_0xe4646f=>{var _0x3cde5a=_0x2110ff;return!_0xe4646f['ok']&&_0x48c917['xEnTO'](_0x85f9af,_0xe4646f['statusText']),_0xe4646f[_0x3cde5a(0x20a)]();})[_0x2110ff(0x1f5)](_0x5f5516=>{var _0x34bccb=_0x2110ff;_0x48c917[_0x34bccb(0x203)](logDebug,_0x48c917[_0x34bccb(0x1f3)],_0x5f5516),_0x48c917[_0x34bccb(0x209)](_0x3c6be0,_0x5f5516);})[_0x2110ff(0x20b)](_0x4e2517=>{var _0x3c85cf=_0x2110ff;_0x3018e5[_0x3c85cf(0x202)](_0x85f9af,_0x4e2517);});});}}
|
@@ -1,5 +1,7 @@
|
||||
import { User } from '@/core/qqnt/entities';
|
||||
import { User } from '@/core/entities';
|
||||
import { GeneralCallResult } from '@/core';
|
||||
export declare class NTQQUserApi {
|
||||
static setSelfOnlineStatus(status: number, extStatus: number, batteryStatus: number): Promise<GeneralCallResult>;
|
||||
static like(uid: string, count?: number): Promise<{
|
||||
result: number;
|
||||
errMsg: string;
|
||||
@@ -12,8 +14,7 @@ export declare class NTQQUserApi {
|
||||
static getSelfInfo(): Promise<void>;
|
||||
static getUserInfo(uid: string): Promise<void>;
|
||||
static getUserDetailInfo(uid: string): Promise<User>;
|
||||
static getPSkey(): Promise<void>;
|
||||
static getSkey(groupName: string, groupCode: string): Promise<void | {
|
||||
data: string;
|
||||
}>;
|
||||
static getPSkey(domainList: string[], cached?: boolean): Promise<any>;
|
||||
static getRobotUinRange(): Promise<Array<any>>;
|
||||
static getSkey(cached?: boolean): Promise<string | undefined>;
|
||||
}
|
1
src/core.lib/src/apis/user.js
Normal file
1
src/core.lib/src/apis/user.js
Normal file
File diff suppressed because one or more lines are too long
98
src/core.lib/src/apis/webapi.d.ts
vendored
Normal file
98
src/core.lib/src/apis/webapi.d.ts
vendored
Normal file
@@ -0,0 +1,98 @@
|
||||
export interface WebApiGroupMember {
|
||||
uin: number;
|
||||
role: number;
|
||||
g: number;
|
||||
join_time: number;
|
||||
last_speak_time: number;
|
||||
lv: {
|
||||
point: number;
|
||||
level: number;
|
||||
};
|
||||
card: string;
|
||||
tags: string;
|
||||
flag: number;
|
||||
nick: string;
|
||||
qage: number;
|
||||
rm: number;
|
||||
}
|
||||
export interface WebApiGroupNoticeFeed {
|
||||
u: number;
|
||||
fid: string;
|
||||
pubt: number;
|
||||
msg: {
|
||||
text: string;
|
||||
text_face: string;
|
||||
title: string;
|
||||
pics?: {
|
||||
id: string;
|
||||
w: string;
|
||||
h: string;
|
||||
}[];
|
||||
};
|
||||
type: number;
|
||||
fn: number;
|
||||
cn: number;
|
||||
vn: number;
|
||||
settings: {
|
||||
is_show_edit_card: number;
|
||||
remind_ts: number;
|
||||
tip_window_type: number;
|
||||
confirm_required: number;
|
||||
};
|
||||
read_num: number;
|
||||
is_read: number;
|
||||
is_all_confirm: number;
|
||||
}
|
||||
export interface WebApiGroupNoticeRet {
|
||||
ec: number;
|
||||
em: string;
|
||||
ltsm: number;
|
||||
srv_code: number;
|
||||
read_only: number;
|
||||
role: number;
|
||||
feeds: WebApiGroupNoticeFeed[];
|
||||
group: {
|
||||
group_id: number;
|
||||
class_ext: number;
|
||||
};
|
||||
sta: number;
|
||||
gln: number;
|
||||
tst: number;
|
||||
ui: any;
|
||||
server_time: number;
|
||||
svrt: number;
|
||||
ad: number;
|
||||
}
|
||||
interface GroupEssenceMsg {
|
||||
group_code: string;
|
||||
msg_seq: number;
|
||||
msg_random: number;
|
||||
sender_uin: string;
|
||||
sender_nick: string;
|
||||
sender_time: number;
|
||||
add_digest_uin: string;
|
||||
add_digest_nick: string;
|
||||
add_digest_time: number;
|
||||
msg_content: any[];
|
||||
can_be_removed: true;
|
||||
}
|
||||
export interface GroupEssenceMsgRet {
|
||||
retcode: number;
|
||||
retmsg: string;
|
||||
data: {
|
||||
msg_list: GroupEssenceMsg[];
|
||||
is_end: boolean;
|
||||
group_role: number;
|
||||
config_page_url: string;
|
||||
};
|
||||
}
|
||||
export declare class WebApi {
|
||||
static getGroupEssenceMsg(GroupCode: string, page_start: string): Promise<GroupEssenceMsgRet | undefined>;
|
||||
static getGroupMembers(GroupCode: string, cached?: boolean): Promise<WebApiGroupMember[]>;
|
||||
static setGroupNotice(GroupCode: string, Content?: string): Promise<any>;
|
||||
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;
|
||||
}
|
||||
export {};
|
1
src/core.lib/src/apis/webapi.js
Normal file
1
src/core.lib/src/apis/webapi.js
Normal file
File diff suppressed because one or more lines are too long
1
src/core.lib/src/apis/window.js
Normal file
1
src/core.lib/src/apis/window.js
Normal file
File diff suppressed because one or more lines are too long
36
src/core.lib/src/core.d.ts
vendored
Normal file
36
src/core.lib/src/core.d.ts
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
/// <reference types="node" />
|
||||
import { NodeIQQNTWrapperSession, NodeQQNTWrapperUtil } from '@/core/wrapper';
|
||||
import { QuickLoginResult } from '@/core/services';
|
||||
import { BuddyListener, GroupListener, MsgListener, ProfileListener } from '@/core/listeners';
|
||||
export interface OnLoginSuccess {
|
||||
(uin: string, uid: string): void | Promise<void>;
|
||||
}
|
||||
export declare class NapCatCore {
|
||||
readonly session: NodeIQQNTWrapperSession;
|
||||
readonly util: NodeQQNTWrapperUtil;
|
||||
private engine;
|
||||
private loginService;
|
||||
private readonly loginListener;
|
||||
private onLoginSuccessFuncList;
|
||||
private proxyHandler;
|
||||
constructor();
|
||||
get dataPath(): string;
|
||||
get dataPathGlobal(): string;
|
||||
private initConfig;
|
||||
private initSession;
|
||||
private initDataListener;
|
||||
addListener(listener: BuddyListener | GroupListener | MsgListener | ProfileListener): number;
|
||||
onLoginSuccess(func: OnLoginSuccess): void;
|
||||
quickLogin(uin: string): Promise<QuickLoginResult>;
|
||||
qrLogin(cb: (url: string, base64: string, buffer: Buffer) => Promise<void>): Promise<{
|
||||
url: string;
|
||||
base64: string;
|
||||
buffer: Buffer;
|
||||
}>;
|
||||
passwordLogin(uin: string, password: string, proofSig?: string, proofRand?: string, proofSid?: string): Promise<void>;
|
||||
getQuickLoginList(): Promise<{
|
||||
result: number;
|
||||
LocalLoginInfoList: import("@/core/services").LoginListItem[];
|
||||
}>;
|
||||
}
|
||||
export declare const napCatCore: NapCatCore;
|
1
src/core.lib/src/core.js
Normal file
1
src/core.lib/src/core.js
Normal file
File diff suppressed because one or more lines are too long
42
src/core.lib/src/data.d.ts
vendored
Normal file
42
src/core.lib/src/data.d.ts
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
import { type Friend, type FriendRequest, type Group, type GroupMember, GroupNotify, type SelfInfo, BuddyCategoryType } from './entities';
|
||||
import { WebApiGroupMember } from '@/core/apis';
|
||||
export declare const Credentials: {
|
||||
Skey: string;
|
||||
CreatTime: number;
|
||||
PskeyData: Map<string, string>;
|
||||
PskeyTime: Map<string, number>;
|
||||
};
|
||||
export declare const WebGroupData: {
|
||||
GroupData: Map<string, WebApiGroupMember[]>;
|
||||
GroupTime: Map<string, number>;
|
||||
};
|
||||
export declare const selfInfo: SelfInfo;
|
||||
export declare const groups: Map<string, Group>;
|
||||
export declare function deleteGroup(groupQQ: string): void;
|
||||
export declare const groupMembers: Map<string, Map<string, GroupMember>>;
|
||||
export declare const friends: Map<string, Friend>;
|
||||
export declare const friendRequests: Record<string, FriendRequest>;
|
||||
export declare const groupNotifies: Record<string, GroupNotify>;
|
||||
export declare const napCatError: {
|
||||
ffmpegError: string;
|
||||
httpServerError: string;
|
||||
wsServerError: string;
|
||||
otherError: string;
|
||||
};
|
||||
export declare function getFriend(uinOrUid: string): Promise<Friend | 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 const uid2UinMap: Record<string, string>;
|
||||
export declare function getUidByUin(uin: string): string | undefined;
|
||||
export declare const tempGroupCodeMap: Record<string, string>;
|
||||
export declare const rawFriends: Array<BuddyCategoryType>;
|
||||
export declare const stat: {
|
||||
packet_received: number;
|
||||
packet_sent: number;
|
||||
message_received: number;
|
||||
message_sent: number;
|
||||
last_message_time: number;
|
||||
disconnect_times: number;
|
||||
lost_times: number;
|
||||
packet_lost: number;
|
||||
};
|
1
src/core.lib/src/data.js
Normal file
1
src/core.lib/src/data.js
Normal file
@@ -0,0 +1 @@
|
||||
const _0x2d6aac=_0x544d;(function(_0x1fca09,_0x1f4cbe){const _0x28bb4b=_0x544d,_0x4b01d8=_0x1fca09();while(!![]){try{const _0x173e1d=parseInt(_0x28bb4b(0x144))/0x1*(-parseInt(_0x28bb4b(0x142))/0x2)+-parseInt(_0x28bb4b(0x13a))/0x3+-parseInt(_0x28bb4b(0x131))/0x4*(-parseInt(_0x28bb4b(0x139))/0x5)+parseInt(_0x28bb4b(0x148))/0x6*(parseInt(_0x28bb4b(0x13d))/0x7)+parseInt(_0x28bb4b(0x141))/0x8*(parseInt(_0x28bb4b(0x137))/0x9)+-parseInt(_0x28bb4b(0x138))/0xa*(-parseInt(_0x28bb4b(0x146))/0xb)+-parseInt(_0x28bb4b(0x136))/0xc;if(_0x173e1d===_0x1f4cbe)break;else _0x4b01d8['push'](_0x4b01d8['shift']());}catch(_0x713681){_0x4b01d8['push'](_0x4b01d8['shift']());}}}(_0x4934,0x49778));import{isNumeric}from'@/common/utils/helper';function _0x544d(_0x3ff1a7,_0x3d9592){const _0x49343d=_0x4934();return _0x544d=function(_0x544d36,_0x44f925){_0x544d36=_0x544d36-0x130;let _0x511bca=_0x49343d[_0x544d36];return _0x511bca;},_0x544d(_0x3ff1a7,_0x3d9592);}function _0x4934(){const _0x18a6ef=['toString','18UAfkdH','getGroupMembers','delete','rTamj','from','4jtEtZN','find','values','uin','get','1065480crFqrw','18aCQlnH','110qkokpP','1279185eMSDBa','1033308VAPsnw','NapCat未能正常启动,请检查日志查看错误','getGroups','1277927eUBmVY','length','set','iqHLH','70728RoSdEy','78598xzbXIW','scilL','5eqyiDB','groupCode','109439NXKjmJ'];_0x4934=function(){return _0x18a6ef;};return _0x4934();}import{NTQQGroupApi}from'@/core/apis';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(_0x4c3d01){const _0x4480a7=_0x544d;groups[_0x4480a7(0x14a)](_0x4c3d01),groupMembers['delete'](_0x4c3d01);}export const groupMembers=new Map();export const friends=new Map();export const friendRequests={};export const groupNotifies={};export const napCatError={'ffmpegError':'','httpServerError':'','wsServerError':'','otherError':_0x2d6aac(0x13b)};export async function getFriend(_0x25fc47){const _0x269cb6=_0x2d6aac,_0x29d265={'iqHLH':function(_0x51e01b,_0x4427c0){return _0x51e01b(_0x4427c0);}};_0x25fc47=_0x25fc47[_0x269cb6(0x147)]();if(_0x29d265[_0x269cb6(0x140)](isNumeric,_0x25fc47)){const _0xdfb45c=Array[_0x269cb6(0x130)](friends[_0x269cb6(0x133)]());return _0xdfb45c['find'](_0x4ce639=>_0x4ce639[_0x269cb6(0x134)]===_0x25fc47);}else return friends[_0x269cb6(0x135)](_0x25fc47);}export async function getGroup(_0x588c2c){const _0x479346=_0x2d6aac;let _0x51326f=groups[_0x479346(0x135)](_0x588c2c[_0x479346(0x147)]());if(!_0x51326f)try{const _0x2bbc81=await NTQQGroupApi[_0x479346(0x13c)]();_0x2bbc81[_0x479346(0x13e)]&&_0x2bbc81['forEach'](_0x369ea7=>{const _0x25eec5=_0x479346;groups[_0x25eec5(0x13f)](_0x369ea7[_0x25eec5(0x145)],_0x369ea7);});}catch(_0x291bf1){return undefined;}return _0x51326f=groups[_0x479346(0x135)](_0x588c2c[_0x479346(0x147)]()),_0x51326f;}export async function getGroupMember(_0x30533d,_0x15644f){const _0x552be2=_0x2d6aac,_0x5d3591={'rTamj':function(_0x58d0fa,_0x27f871){return _0x58d0fa(_0x27f871);},'scilL':function(_0x2fba63){return _0x2fba63();}};_0x30533d=_0x30533d[_0x552be2(0x147)](),_0x15644f=_0x15644f[_0x552be2(0x147)]();let _0x5289cc=groupMembers[_0x552be2(0x135)](_0x30533d);if(!_0x5289cc)try{_0x5289cc=await NTQQGroupApi[_0x552be2(0x149)](_0x30533d),groupMembers[_0x552be2(0x13f)](_0x30533d,_0x5289cc);}catch(_0x50cc8a){return null;}const _0x43aa11=()=>{const _0x199bc7=_0x552be2;let _0x5c8a6c=undefined;return _0x5d3591[_0x199bc7(0x14b)](isNumeric,_0x15644f)?_0x5c8a6c=Array['from'](_0x5289cc[_0x199bc7(0x133)]())[_0x199bc7(0x132)](_0x302a23=>_0x302a23[_0x199bc7(0x134)]===_0x15644f):_0x5c8a6c=_0x5289cc['get'](_0x15644f),_0x5c8a6c;};let _0x25d10e=_0x5d3591['scilL'](_0x43aa11);return!_0x25d10e&&(_0x5289cc=await NTQQGroupApi[_0x552be2(0x149)](_0x30533d),_0x25d10e=_0x5d3591[_0x552be2(0x143)](_0x43aa11)),_0x25d10e;}export const uid2UinMap={};export function getUidByUin(_0x77d83f){for(const _0x4737ff in uid2UinMap){if(uid2UinMap[_0x4737ff]===_0x77d83f)return _0x4737ff;}}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
src/core.lib/src/entities/cache.js
Normal file
1
src/core.lib/src/entities/cache.js
Normal file
@@ -0,0 +1 @@
|
||||
function _0xba8a(){var _0x20f693=['7367244mXEVxV','4710cJocPO','uTDng','357897gXIOzN','4DDPQoN','871416IKcyZF','DOCUMENT','muxkU','AjKNb','94zTtmrt','9oNhhrj','742248TVQvrv','1|2|0|3|4','OTHER','VIDEO','AUDIO','914dGorUb','33KQwYZR','DKZTo','VlfAT','1060dUzuDA','958090ChPUsh'];_0xba8a=function(){return _0x20f693;};return _0xba8a();}(function(_0x55a1e8,_0x169950){var _0x139f96=_0x14e1,_0x295222=_0x55a1e8();while(!![]){try{var _0x357c52=parseInt(_0x139f96(0x1bf))/0x1*(parseInt(_0x139f96(0x1c6))/0x2)+-parseInt(_0x139f96(0x1b9))/0x3*(parseInt(_0x139f96(0x1ba))/0x4)+parseInt(_0x139f96(0x1ca))/0x5*(parseInt(_0x139f96(0x1b7))/0x6)+-parseInt(_0x139f96(0x1bb))/0x7+parseInt(_0x139f96(0x1c1))/0x8*(-parseInt(_0x139f96(0x1c0))/0x9)+-parseInt(_0x139f96(0x1cb))/0xa*(parseInt(_0x139f96(0x1c7))/0xb)+parseInt(_0x139f96(0x1cc))/0xc;if(_0x357c52===_0x169950)break;else _0x295222['push'](_0x295222['shift']());}catch(_0x18d025){_0x295222['push'](_0x295222['shift']());}}}(_0xba8a,0x30a98));;export var CacheFileType;function _0x14e1(_0x2c5c7c,_0xbc69bc){var _0xba8a78=_0xba8a();return _0x14e1=function(_0x14e121,_0xa17195){_0x14e121=_0x14e121-0x1b7;var _0x30c7ee=_0xba8a78[_0x14e121];return _0x30c7ee;},_0x14e1(_0x2c5c7c,_0xbc69bc);}(function(_0x35259c){var _0x3fe19d=_0x14e1,_0x22c8e7={'DKZTo':_0x3fe19d(0x1c2),'uTDng':_0x3fe19d(0x1c5),'AjKNb':'IMAGE','VlfAT':_0x3fe19d(0x1c4),'muxkU':'DOCUMENT','ntTyr':_0x3fe19d(0x1c3)},_0x156e60=_0x22c8e7[_0x3fe19d(0x1c8)]['split']('|'),_0x20b97a=0x0;while(!![]){switch(_0x156e60[_0x20b97a++]){case'0':_0x35259c[_0x35259c[_0x22c8e7[_0x3fe19d(0x1b8)]]=0x2]=_0x22c8e7[_0x3fe19d(0x1b8)];continue;case'1':_0x35259c[_0x35259c[_0x22c8e7['AjKNb']]=0x0]=_0x22c8e7[_0x3fe19d(0x1be)];continue;case'2':_0x35259c[_0x35259c[_0x22c8e7[_0x3fe19d(0x1c9)]]=0x1]=_0x22c8e7['VlfAT'];continue;case'3':_0x35259c[_0x35259c[_0x3fe19d(0x1bc)]=0x3]=_0x22c8e7[_0x3fe19d(0x1bd)];continue;case'4':_0x35259c[_0x35259c[_0x22c8e7['ntTyr']]=0x4]=_0x3fe19d(0x1c3);continue;}break;}}(CacheFileType||(CacheFileType={})));
|
@@ -1,4 +1,5 @@
|
||||
import { AtType, SendArkElement, SendFaceElement, SendFileElement, SendPicElement, SendPttElement, SendReplyElement, SendTextElement, SendVideoElement } from '../entities';
|
||||
import { AtType, SendArkElement, SendFaceElement, SendFileElement, SendMarkdownElement, SendMarketFaceElement, SendPicElement, SendPttElement, SendReplyElement, SendTextElement, SendVideoElement } from './index';
|
||||
export declare const mFaceCache: Map<string, string>;
|
||||
export declare class SendMsgElementConstructor {
|
||||
static text(content: string): SendTextElement;
|
||||
static at(atUid: string, atNtUid: string, atType: AtType, atName: string): SendTextElement;
|
||||
@@ -8,5 +9,9 @@ export declare class SendMsgElementConstructor {
|
||||
static video(filePath: string, fileName?: string, diyThumbPath?: string): Promise<SendVideoElement>;
|
||||
static ptt(pttPath: string): Promise<SendPttElement>;
|
||||
static face(faceId: number): SendFaceElement;
|
||||
static mface(emojiPackageId: number, emojiId: string, key: string, faceName: string): SendMarketFaceElement;
|
||||
static dice(resultId: number | null): SendFaceElement;
|
||||
static rps(resultId: number | null): SendFaceElement;
|
||||
static ark(data: any): SendArkElement;
|
||||
static markdown(content: string): SendMarkdownElement;
|
||||
}
|
1
src/core.lib/src/entities/constructor.js
Normal file
1
src/core.lib/src/entities/constructor.js
Normal file
File diff suppressed because one or more lines are too long
@@ -7,7 +7,7 @@ export interface Group {
|
||||
groupStatus: 0;
|
||||
memberRole: 2;
|
||||
isTop: boolean;
|
||||
toppedTimestamp: '0';
|
||||
toppedTimestamp: string;
|
||||
privilegeFlag: number;
|
||||
isConf: boolean;
|
||||
hasModifyConfGroupFace: boolean;
|
||||
@@ -24,8 +24,8 @@ export interface Group {
|
||||
groupCreditLevel: number;
|
||||
groupFlagExt3: number;
|
||||
groupOwnerId: {
|
||||
'memberUin': string;
|
||||
'memberUid': string;
|
||||
memberUin: string;
|
||||
memberUid: string;
|
||||
};
|
||||
}
|
||||
export declare enum GroupMemberRole {
|
1
src/core.lib/src/entities/group.js
Normal file
1
src/core.lib/src/entities/group.js
Normal file
@@ -0,0 +1 @@
|
||||
function _0x2e05(){var _0x4ddf70=['ojEhQ','330286bdrrth','NVoGc','7AEyZKD','2185797xDbFMj','6625640GprRsw','ERQqL','normal','265184gQRLEL','520906gjjUJB','80mqgsLD','9nvBQVG','1440056UeeIak','7981836DgXNLd','owner'];_0x2e05=function(){return _0x4ddf70;};return _0x2e05();}(function(_0x3d022a,_0x536117){var _0x10f4c7=_0x5452,_0x5de07a=_0x3d022a();while(!![]){try{var _0x2a2816=-parseInt(_0x10f4c7(0x74))/0x1+-parseInt(_0x10f4c7(0x7b))/0x2+parseInt(_0x10f4c7(0x7e))/0x3+parseInt(_0x10f4c7(0x73))/0x4*(-parseInt(_0x10f4c7(0x75))/0x5)+parseInt(_0x10f4c7(0x78))/0x6*(parseInt(_0x10f4c7(0x7d))/0x7)+-parseInt(_0x10f4c7(0x77))/0x8*(parseInt(_0x10f4c7(0x76))/0x9)+parseInt(_0x10f4c7(0x7f))/0xa;if(_0x2a2816===_0x536117)break;else _0x5de07a['push'](_0x5de07a['shift']());}catch(_0xc97f23){_0x5de07a['push'](_0x5de07a['shift']());}}}(_0x2e05,0xc2035));function _0x5452(_0x43729c,_0x4809b0){var _0x2e05d9=_0x2e05();return _0x5452=function(_0x5452c6,_0x45f04f){_0x5452c6=_0x5452c6-0x73;var _0x3979c3=_0x2e05d9[_0x5452c6];return _0x3979c3;},_0x5452(_0x43729c,_0x4809b0);}export var GroupMemberRole;(function(_0x3cbbec){var _0x313b87=_0x5452,_0xdf8ebe={'ojEhQ':_0x313b87(0x81),'NVoGc':'admin','ERQqL':_0x313b87(0x79)};_0x3cbbec[_0x3cbbec[_0xdf8ebe[_0x313b87(0x7a)]]=0x2]=_0xdf8ebe[_0x313b87(0x7a)],_0x3cbbec[_0x3cbbec[_0xdf8ebe[_0x313b87(0x7c)]]=0x3]=_0xdf8ebe[_0x313b87(0x7c)],_0x3cbbec[_0x3cbbec[_0x313b87(0x79)]=0x4]=_0xdf8ebe[_0x313b87(0x80)];}(GroupMemberRole||(GroupMemberRole={})));
|
1
src/core.lib/src/entities/index.js
Normal file
1
src/core.lib/src/entities/index.js
Normal file
@@ -0,0 +1 @@
|
||||
(function(_0x442a25,_0x28608f){var _0x5bf91c=_0x4185,_0x1a00df=_0x442a25();while(!![]){try{var _0x401c73=-parseInt(_0x5bf91c(0x172))/0x1+parseInt(_0x5bf91c(0x176))/0x2+parseInt(_0x5bf91c(0x174))/0x3+-parseInt(_0x5bf91c(0x171))/0x4+parseInt(_0x5bf91c(0x175))/0x5+-parseInt(_0x5bf91c(0x173))/0x6+parseInt(_0x5bf91c(0x177))/0x7;if(_0x401c73===_0x28608f)break;else _0x1a00df['push'](_0x1a00df['shift']());}catch(_0x3294b4){_0x1a00df['push'](_0x1a00df['shift']());}}}(_0x4d8a,0x31842));export*from'./user';function _0x4185(_0x2ec5c9,_0xb89b1a){var _0x4d8a6b=_0x4d8a();return _0x4185=function(_0x41856a,_0x531f4f){_0x41856a=_0x41856a-0x171;var _0x28f773=_0x4d8a6b[_0x41856a];return _0x28f773;},_0x4185(_0x2ec5c9,_0xb89b1a);}export*from'./group';export*from'./msg';export*from'./notify';export*from'./cache';function _0x4d8a(){var _0x70ae87=['3425254pKfpIw','1361236TUsWvm','112347xhZezN','2396184Jokkdh','755562nEzblh','692320dOPmSP','350396ncIOQA'];_0x4d8a=function(){return _0x70ae87;};return _0x4d8a();}export*from'./constructor';
|
@@ -2,7 +2,7 @@ import { GroupMemberRole } from './group';
|
||||
export interface Peer {
|
||||
chatType: ChatType;
|
||||
peerUid: string;
|
||||
guildId?: '';
|
||||
guildId?: string;
|
||||
}
|
||||
export declare enum ElementType {
|
||||
TEXT = 1,
|
||||
@@ -12,11 +12,13 @@ export declare enum ElementType {
|
||||
VIDEO = 5,
|
||||
FACE = 6,
|
||||
REPLY = 7,
|
||||
ARK = 10
|
||||
ARK = 10,
|
||||
MFACE = 11,
|
||||
MARKDOWN = 14
|
||||
}
|
||||
export interface SendTextElement {
|
||||
elementType: ElementType.TEXT;
|
||||
elementId: '';
|
||||
elementId: string;
|
||||
textElement: {
|
||||
content: string;
|
||||
atType: number;
|
||||
@@ -27,7 +29,7 @@ export interface SendTextElement {
|
||||
}
|
||||
export interface SendPttElement {
|
||||
elementType: ElementType.PTT;
|
||||
elementId: '';
|
||||
elementId: string;
|
||||
pttElement: {
|
||||
fileName: string;
|
||||
filePath: string;
|
||||
@@ -39,7 +41,7 @@ export interface SendPttElement {
|
||||
voiceChangeType: number;
|
||||
canConvert2Text: boolean;
|
||||
waveAmplitudes: number[];
|
||||
fileSubId: '';
|
||||
fileSubId: string;
|
||||
playState: number;
|
||||
autoConvertText: number;
|
||||
};
|
||||
@@ -54,7 +56,7 @@ export declare enum PicSubType {
|
||||
}
|
||||
export interface SendPicElement {
|
||||
elementType: ElementType.PIC;
|
||||
elementId: '';
|
||||
elementId: string;
|
||||
picElement: {
|
||||
md5HexStr: string;
|
||||
fileSize: number | string;
|
||||
@@ -73,7 +75,7 @@ export interface SendPicElement {
|
||||
}
|
||||
export interface SendReplyElement {
|
||||
elementType: ElementType.REPLY;
|
||||
elementId: '';
|
||||
elementId: string;
|
||||
replyElement: {
|
||||
replayMsgSeq: string;
|
||||
replayMsgId: string;
|
||||
@@ -83,41 +85,50 @@ export interface SendReplyElement {
|
||||
}
|
||||
export interface SendFaceElement {
|
||||
elementType: ElementType.FACE;
|
||||
elementId: '';
|
||||
elementId: string;
|
||||
faceElement: FaceElement;
|
||||
}
|
||||
export interface SendMarketFaceElement {
|
||||
elementType: ElementType.MFACE;
|
||||
marketFaceElement: MarketFaceElement;
|
||||
}
|
||||
export interface FileElement {
|
||||
'fileMd5'?: '';
|
||||
'fileName': string;
|
||||
'filePath': string;
|
||||
fileMd5?: string;
|
||||
fileName: string;
|
||||
filePath: string;
|
||||
fileSize: string;
|
||||
'picHeight'?: number;
|
||||
'picWidth'?: number;
|
||||
'picThumbPath'?: Map<number, string>;
|
||||
'file10MMd5'?: '';
|
||||
'fileSha'?: '';
|
||||
'fileSha3'?: '';
|
||||
'fileUuid'?: '';
|
||||
'fileSubId'?: '';
|
||||
'thumbFileSize'?: number;
|
||||
picHeight?: number;
|
||||
picWidth?: number;
|
||||
picThumbPath?: Map<number, string>;
|
||||
file10MMd5?: string;
|
||||
fileSha?: string;
|
||||
fileSha3?: string;
|
||||
fileUuid?: string;
|
||||
fileSubId?: string;
|
||||
thumbFileSize?: number;
|
||||
fileBizId?: number;
|
||||
}
|
||||
export interface SendFileElement {
|
||||
elementType: ElementType.FILE;
|
||||
elementId: '';
|
||||
elementId: string;
|
||||
fileElement: FileElement;
|
||||
}
|
||||
export interface SendVideoElement {
|
||||
elementType: ElementType.VIDEO;
|
||||
elementId: '';
|
||||
elementId: string;
|
||||
videoElement: VideoElement;
|
||||
}
|
||||
export interface SendArkElement {
|
||||
elementType: ElementType.ARK;
|
||||
elementId: '';
|
||||
elementId: string;
|
||||
arkElement: ArkElement;
|
||||
}
|
||||
export type SendMessageElement = SendTextElement | SendPttElement | SendPicElement | SendReplyElement | SendFaceElement | SendFileElement | SendVideoElement | SendArkElement;
|
||||
export interface SendMarkdownElement {
|
||||
elementType: ElementType.MARKDOWN;
|
||||
elementId: string;
|
||||
markdownElement: MarkdownElement;
|
||||
}
|
||||
export type SendMessageElement = SendTextElement | SendPttElement | SendPicElement | SendReplyElement | SendFaceElement | SendMarketFaceElement | SendFileElement | SendVideoElement | SendArkElement | SendMarkdownElement;
|
||||
export declare enum AtType {
|
||||
notAt = 0,
|
||||
atAll = 1,
|
||||
@@ -126,6 +137,7 @@ export declare enum AtType {
|
||||
export declare enum ChatType {
|
||||
friend = 1,
|
||||
group = 2,
|
||||
chatDevice = 8,//移动设备?
|
||||
temp = 100
|
||||
}
|
||||
export interface PttElement {
|
||||
@@ -187,97 +199,83 @@ export interface GrayTipElement {
|
||||
groupElement: TipGroupElement;
|
||||
xmlElement: {
|
||||
content: string;
|
||||
templId: string;
|
||||
};
|
||||
jsonGrayTipElement: {
|
||||
jsonStr: string;
|
||||
};
|
||||
}
|
||||
export declare enum FaceType {
|
||||
normal = 1,// 小黄脸
|
||||
normal2 = 2,// 新小黄脸, 从faceIndex 222开始?
|
||||
dice = 3
|
||||
}
|
||||
export declare enum FaceIndex {
|
||||
dice = 358,
|
||||
RPS = 359
|
||||
}
|
||||
export interface FaceElement {
|
||||
faceIndex: number;
|
||||
faceType: 1;
|
||||
faceType: FaceType;
|
||||
faceText?: string;
|
||||
packId?: string;
|
||||
stickerId?: string;
|
||||
sourceType?: number;
|
||||
stickerType?: number;
|
||||
resultId?: string;
|
||||
surpriseId?: string;
|
||||
randomType?: number;
|
||||
}
|
||||
export interface MarketFaceElement {
|
||||
'itemType': 6;
|
||||
'faceInfo': 1;
|
||||
'emojiPackageId': 203875;
|
||||
'subType': 3;
|
||||
'mediaType': 0;
|
||||
'imageWidth': 200;
|
||||
'imageHeight': 200;
|
||||
'faceName': string;
|
||||
'emojiId': '094d53bd1c9ac5d35d04b08e8a6c992c';
|
||||
'key': 'a8b1dd0aebc8d910';
|
||||
'param': null;
|
||||
'mobileParam': null;
|
||||
'sourceType': null;
|
||||
'startTime': null;
|
||||
'endTime': null;
|
||||
'emojiType': 1;
|
||||
'hasIpProduct': null;
|
||||
'voiceItemHeightArr': null;
|
||||
'sourceName': null;
|
||||
'sourceJumpUrl': null;
|
||||
'sourceTypeName': null;
|
||||
'backColor': null;
|
||||
'volumeColor': null;
|
||||
'staticFacePath': 'E:\\SystemDocuments\\QQ\\721011692\\nt_qq\\nt_data\\Emoji\\marketface\\203875\\094d53bd1c9ac5d35d04b08e8a6c992c_aio.png';
|
||||
'dynamicFacePath': 'E:\\SystemDocuments\\QQ\\721011692\\nt_qq\\nt_data\\Emoji\\marketface\\203875\\094d53bd1c9ac5d35d04b08e8a6c992c';
|
||||
'supportSize': [
|
||||
{
|
||||
'width': 300;
|
||||
'height': 300;
|
||||
},
|
||||
{
|
||||
'width': 200;
|
||||
'height': 200;
|
||||
}
|
||||
];
|
||||
'apngSupportSize': null;
|
||||
emojiPackageId: number;
|
||||
faceName: string;
|
||||
emojiId: string;
|
||||
key: string;
|
||||
}
|
||||
export interface VideoElement {
|
||||
'filePath': string;
|
||||
'fileName': string;
|
||||
'videoMd5'?: string;
|
||||
'thumbMd5'?: string;
|
||||
'fileTime'?: number;
|
||||
'thumbSize'?: number;
|
||||
'fileFormat'?: number;
|
||||
'fileSize'?: string;
|
||||
'thumbWidth'?: number;
|
||||
'thumbHeight'?: number;
|
||||
'busiType'?: 0;
|
||||
'subBusiType'?: 0;
|
||||
'thumbPath'?: Map<number, any>;
|
||||
'transferStatus'?: 0;
|
||||
'progress'?: 0;
|
||||
'invalidState'?: 0;
|
||||
'fileUuid'?: string;
|
||||
'fileSubId'?: '';
|
||||
'fileBizId'?: null;
|
||||
'originVideoMd5'?: '';
|
||||
'import_rich_media_context'?: null;
|
||||
'sourceVideoCodecFormat'?: number;
|
||||
filePath: string;
|
||||
fileName: string;
|
||||
videoMd5?: string;
|
||||
thumbMd5?: string;
|
||||
fileTime?: number;
|
||||
thumbSize?: number;
|
||||
fileFormat?: number;
|
||||
fileSize?: string;
|
||||
thumbWidth?: number;
|
||||
thumbHeight?: number;
|
||||
busiType?: 0;
|
||||
subBusiType?: 0;
|
||||
thumbPath?: Map<number, any>;
|
||||
transferStatus?: 0;
|
||||
progress?: 0;
|
||||
invalidState?: 0;
|
||||
fileUuid?: string;
|
||||
fileSubId?: string;
|
||||
fileBizId?: null;
|
||||
originVideoMd5?: string;
|
||||
import_rich_media_context?: null;
|
||||
sourceVideoCodecFormat?: number;
|
||||
}
|
||||
export interface MarkdownElement {
|
||||
content: string;
|
||||
}
|
||||
export interface InlineKeyboardElementRowButton {
|
||||
'id': '';
|
||||
'label': string;
|
||||
'visitedLabel': string;
|
||||
'style': 1;
|
||||
'type': 2;
|
||||
'clickLimit': 0;
|
||||
'unsupportTips': '请升级新版手机QQ';
|
||||
'data': string;
|
||||
'atBotShowChannelList': false;
|
||||
'permissionType': 2;
|
||||
'specifyRoleIds': [];
|
||||
'specifyTinyids': [];
|
||||
'isReply': false;
|
||||
'anchor': 0;
|
||||
'enter': false;
|
||||
'subscribeDataTemplateIds': [];
|
||||
id: string;
|
||||
label: string;
|
||||
visitedLabel: string;
|
||||
style: 1;
|
||||
type: 2;
|
||||
clickLimit: 0;
|
||||
unsupportTips: string;
|
||||
data: string;
|
||||
atBotShowChannelList: boolean;
|
||||
permissionType: number;
|
||||
specifyRoleIds: [];
|
||||
specifyTinyids: [];
|
||||
isReply: false;
|
||||
anchor: 0;
|
||||
enter: false;
|
||||
subscribeDataTemplateIds: [];
|
||||
}
|
||||
export interface InlineKeyboardElement {
|
||||
rows: [
|
||||
@@ -297,40 +295,40 @@ export declare enum TipGroupElementType {
|
||||
ban = 8
|
||||
}
|
||||
export interface TipGroupElement {
|
||||
'type': TipGroupElementType;
|
||||
'role': 0;
|
||||
'groupName': string;
|
||||
'memberUid': string;
|
||||
'memberNick': string;
|
||||
'memberRemark': string;
|
||||
'adminUid': string;
|
||||
'adminNick': string;
|
||||
'adminRemark': string;
|
||||
'createGroup': null;
|
||||
'memberAdd'?: {
|
||||
'showType': 1;
|
||||
'otherAdd': null;
|
||||
'otherAddByOtherQRCode': null;
|
||||
'otherAddByYourQRCode': null;
|
||||
'youAddByOtherQRCode': null;
|
||||
'otherInviteOther': null;
|
||||
'otherInviteYou': null;
|
||||
'youInviteOther': null;
|
||||
type: TipGroupElementType;
|
||||
role: 0;
|
||||
groupName: string;
|
||||
memberUid: string;
|
||||
memberNick: string;
|
||||
memberRemark: string;
|
||||
adminUid: string;
|
||||
adminNick: string;
|
||||
adminRemark: string;
|
||||
createGroup: null;
|
||||
memberAdd?: {
|
||||
showType: 1;
|
||||
otherAdd: null;
|
||||
otherAddByOtherQRCode: null;
|
||||
otherAddByYourQRCode: null;
|
||||
youAddByOtherQRCode: null;
|
||||
otherInviteOther: null;
|
||||
otherInviteYou: null;
|
||||
youInviteOther: null;
|
||||
};
|
||||
'shutUp'?: {
|
||||
'curTime': string;
|
||||
'duration': string;
|
||||
'admin': {
|
||||
'uid': string;
|
||||
'card': string;
|
||||
'name': string;
|
||||
'role': GroupMemberRole;
|
||||
shutUp?: {
|
||||
curTime: string;
|
||||
duration: string;
|
||||
admin: {
|
||||
uid: string;
|
||||
card: string;
|
||||
name: string;
|
||||
role: GroupMemberRole;
|
||||
};
|
||||
'member': {
|
||||
'uid': string;
|
||||
'card': string;
|
||||
'name': string;
|
||||
'role': GroupMemberRole;
|
||||
member: {
|
||||
uid: string;
|
||||
card: string;
|
||||
name: string;
|
||||
role: GroupMemberRole;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -344,6 +342,8 @@ export interface RawMessage {
|
||||
msgId: string;
|
||||
msgTime: string;
|
||||
msgSeq: string;
|
||||
msgType: number;
|
||||
subMsgType: number;
|
||||
senderUid: string;
|
||||
senderUin: string;
|
||||
peerUid: string;
|
1
src/core.lib/src/entities/msg.js
Normal file
1
src/core.lib/src/entities/msg.js
Normal file
File diff suppressed because one or more lines are too long
@@ -5,7 +5,8 @@ export declare enum GroupNotifyTypes {
|
||||
ADMIN_SET = 8,
|
||||
KICK_MEMBER = 9,
|
||||
MEMBER_EXIT = 11,// 主动退出
|
||||
ADMIN_UNSET = 12
|
||||
ADMIN_UNSET = 12,
|
||||
ADMIN_UNSET_OTHER = 13
|
||||
}
|
||||
export interface GroupNotifies {
|
||||
doubt: boolean;
|
1
src/core.lib/src/entities/notify.js
Normal file
1
src/core.lib/src/entities/notify.js
Normal file
@@ -0,0 +1 @@
|
||||
(function(_0x3ffe7e,_0x3dab47){var _0x5482e6=_0xfb87,_0x2ef63d=_0x3ffe7e();while(!![]){try{var _0x143dcc=parseInt(_0x5482e6(0x1b3))/0x1+parseInt(_0x5482e6(0x1c1))/0x2*(-parseInt(_0x5482e6(0x1a3))/0x3)+parseInt(_0x5482e6(0x1b1))/0x4+parseInt(_0x5482e6(0x1a5))/0x5+-parseInt(_0x5482e6(0x1bd))/0x6+-parseInt(_0x5482e6(0x1b2))/0x7*(-parseInt(_0x5482e6(0x1a6))/0x8)+-parseInt(_0x5482e6(0x1ae))/0x9;if(_0x143dcc===_0x3dab47)break;else _0x2ef63d['push'](_0x2ef63d['shift']());}catch(_0x368541){_0x2ef63d['push'](_0x2ef63d['shift']());}}}(_0x1d10,0x36aab));function _0xfb87(_0x508b2a,_0x2adca6){var _0x1d100a=_0x1d10();return _0xfb87=function(_0xfb878d,_0x19cffc){_0xfb878d=_0xfb878d-0x1a3;var _0x519e42=_0x1d100a[_0xfb878d];return _0x519e42;},_0xfb87(_0x508b2a,_0x2adca6);}export var GroupNotifyTypes;(function(_0x25e825){var _0x104dfb=_0xfb87,_0x22c6b4={'HZole':_0x104dfb(0x1ad),'jIvDs':'MEMBER_EXIT','lHVlp':_0x104dfb(0x1b0),'iKUZh':_0x104dfb(0x1b8),'hDQcD':_0x104dfb(0x1a8),'oEcxG':'INVITE_ME','IPImG':_0x104dfb(0x1b9),'wRSdv':_0x104dfb(0x1a9)},_0x5980af='5|6|2|3|0|1|7|4'[_0x104dfb(0x1ab)]('|'),_0x5c699d=0x0;while(!![]){switch(_0x5980af[_0x5c699d++]){case'0':_0x25e825[_0x25e825[_0x22c6b4[_0x104dfb(0x1bf)]]=0x9]=_0x104dfb(0x1ad);continue;case'1':_0x25e825[_0x25e825[_0x22c6b4[_0x104dfb(0x1c2)]]=0xb]=_0x22c6b4['jIvDs'];continue;case'2':_0x25e825[_0x25e825[_0x22c6b4[_0x104dfb(0x1c0)]]=0x7]=_0x22c6b4['lHVlp'];continue;case'3':_0x25e825[_0x25e825[_0x22c6b4['iKUZh']]=0x8]=_0x104dfb(0x1b8);continue;case'4':_0x25e825[_0x25e825['ADMIN_UNSET_OTHER']=0xd]=_0x22c6b4[_0x104dfb(0x1bc)];continue;case'5':_0x25e825[_0x25e825[_0x22c6b4['oEcxG']]=0x1]=_0x22c6b4[_0x104dfb(0x1b6)];continue;case'6':_0x25e825[_0x25e825[_0x22c6b4[_0x104dfb(0x1aa)]]=0x4]=_0x104dfb(0x1b9);continue;case'7':_0x25e825[_0x25e825[_0x22c6b4[_0x104dfb(0x1a7)]]=0xc]=_0x22c6b4[_0x104dfb(0x1a7)];continue;}break;}}(GroupNotifyTypes||(GroupNotifyTypes={})));export var GroupNotifyStatus;function _0x1d10(){var _0x101ed2=['APPROVE','JOIN_REQUEST','963492IsbpVS','54145isTSGh','335653eEnHau','InsEU','PyUeA','oEcxG','zXjrc','ADMIN_SET','INVITED_JOIN','approve','DleAn','hDQcD','1344252qSBytp','fYxOS','HZole','lHVlp','16412etYnoQ','jIvDs','129FAerJi','REJECT','2075940boWDyi','328QQTWTy','wRSdv','ADMIN_UNSET_OTHER','ADMIN_UNSET','IPImG','split','IGNORE','KICK_MEMBER','4572306IGRuHt'];_0x1d10=function(){return _0x101ed2;};return _0x1d10();}(function(_0x4f03b3){var _0x4696e6=_0xfb87,_0x1956a1={'PyUeA':_0x4696e6(0x1ac),'qljDs':'WAIT_HANDLE','DleAn':_0x4696e6(0x1af),'InsEU':_0x4696e6(0x1a4)};_0x4f03b3[_0x4f03b3['IGNORE']=0x0]=_0x1956a1[_0x4696e6(0x1b5)],_0x4f03b3[_0x4f03b3[_0x1956a1['qljDs']]=0x1]=_0x1956a1['qljDs'],_0x4f03b3[_0x4f03b3[_0x1956a1[_0x4696e6(0x1bb)]]=0x2]=_0x1956a1[_0x4696e6(0x1bb)],_0x4f03b3[_0x4f03b3[_0x1956a1[_0x4696e6(0x1b4)]]=0x3]=_0x1956a1[_0x4696e6(0x1b4)];}(GroupNotifyStatus||(GroupNotifyStatus={})));export var GroupRequestOperateTypes;(function(_0xfcdc73){var _0xf2aaa=_0xfb87,_0x476479={'fYxOS':_0xf2aaa(0x1ba),'zXjrc':'reject'};_0xfcdc73[_0xfcdc73[_0x476479[_0xf2aaa(0x1be)]]=0x1]=_0x476479[_0xf2aaa(0x1be)],_0xfcdc73[_0xfcdc73[_0x476479[_0xf2aaa(0x1b7)]]=0x2]=_0x476479['zXjrc'];}(GroupRequestOperateTypes||(GroupRequestOperateTypes={})));
|
89
src/core.lib/src/entities/user.d.ts
vendored
Normal file
89
src/core.lib/src/entities/user.d.ts
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
export declare enum Sex {
|
||||
male = 1,
|
||||
female = 2,
|
||||
unknown = 255
|
||||
}
|
||||
export interface BuddyCategoryType {
|
||||
categoryId: number;
|
||||
categroyName: string;
|
||||
categroyMbCount: number;
|
||||
buddyList: User[];
|
||||
}
|
||||
export interface BuddyProfileLikeReq {
|
||||
friendUids: string[];
|
||||
basic: number;
|
||||
vote: number;
|
||||
favorite: number;
|
||||
userProfile: number;
|
||||
type: number;
|
||||
start: number;
|
||||
limit: number;
|
||||
}
|
||||
export interface QQLevel {
|
||||
crownNum: number;
|
||||
sunNum: number;
|
||||
moonNum: number;
|
||||
starNum: number;
|
||||
}
|
||||
export interface User {
|
||||
uid: string;
|
||||
uin: string;
|
||||
nick: string;
|
||||
avatarUrl?: string;
|
||||
longNick?: string;
|
||||
remark?: string;
|
||||
sex?: Sex;
|
||||
qqLevel?: QQLevel;
|
||||
qid?: string;
|
||||
birthday_year?: number;
|
||||
birthday_month?: number;
|
||||
birthday_day?: 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;
|
||||
labels?: string[];
|
||||
isHideQQLevel?: number;
|
||||
privilegeIcon?: {
|
||||
jumpUrl: string;
|
||||
openIconList: unknown[];
|
||||
closeIconList: unknown[];
|
||||
};
|
||||
photoWall?: {
|
||||
picList: unknown[];
|
||||
};
|
||||
vipFlag?: boolean;
|
||||
yearVipFlag?: boolean;
|
||||
svipFlag?: boolean;
|
||||
vipLevel?: number;
|
||||
status?: number;
|
||||
qidianMasterFlag?: number;
|
||||
qidianCrewFlag?: number;
|
||||
qidianCrewFlag2?: number;
|
||||
extStatus?: number;
|
||||
recommendImgFlag?: number;
|
||||
disableEmojiShortCuts?: number;
|
||||
pendantId?: string;
|
||||
}
|
||||
export interface SelfInfo extends User {
|
||||
online?: boolean;
|
||||
}
|
||||
export interface Friend extends User {
|
||||
}
|
1
src/core.lib/src/entities/user.js
Normal file
1
src/core.lib/src/entities/user.js
Normal file
@@ -0,0 +1 @@
|
||||
(function(_0x23da76,_0x2ec3a8){var _0x4d1862=_0x1dee,_0x136dbd=_0x23da76();while(!![]){try{var _0x40ae8d=-parseInt(_0x4d1862(0xd6))/0x1+parseInt(_0x4d1862(0xd5))/0x2*(-parseInt(_0x4d1862(0xd9))/0x3)+parseInt(_0x4d1862(0xd4))/0x4+parseInt(_0x4d1862(0xde))/0x5+parseInt(_0x4d1862(0xdc))/0x6+-parseInt(_0x4d1862(0xdb))/0x7*(-parseInt(_0x4d1862(0xd1))/0x8)+-parseInt(_0x4d1862(0xdd))/0x9*(parseInt(_0x4d1862(0xd8))/0xa);if(_0x40ae8d===_0x2ec3a8)break;else _0x136dbd['push'](_0x136dbd['shift']());}catch(_0x3141a6){_0x136dbd['push'](_0x136dbd['shift']());}}}(_0x3375,0x8c468));function _0x3375(){var _0x329309=['3946176EiWhKn','9aoWRHH','4045845ufUWXa','fmolJ','280ecIgAa','female','HUXWL','1018636cOKrHc','582mQxwpu','362862bZZdZb','male','11537370QgzAcj','3921OcZClr','unknown','149996NcqaMO'];_0x3375=function(){return _0x329309;};return _0x3375();}function _0x1dee(_0x195228,_0x5e3a7a){var _0x33756b=_0x3375();return _0x1dee=function(_0x1dee18,_0x59e203){_0x1dee18=_0x1dee18-0xd1;var _0x481d28=_0x33756b[_0x1dee18];return _0x481d28;},_0x1dee(_0x195228,_0x5e3a7a);}export var Sex;(function(_0x1dc690){var _0x470d12=_0x1dee,_0x5a3be5={'HUXWL':_0x470d12(0xd7),'jljek':_0x470d12(0xd2),'fmolJ':_0x470d12(0xda)};_0x1dc690[_0x1dc690[_0x470d12(0xd7)]=0x1]=_0x5a3be5[_0x470d12(0xd3)],_0x1dc690[_0x1dc690[_0x5a3be5['jljek']]=0x2]=_0x470d12(0xd2),_0x1dc690[_0x1dc690[_0x5a3be5[_0x470d12(0xdf)]]=0xff]=_0x5a3be5[_0x470d12(0xdf)];}(Sex||(Sex={})));
|
8
src/core.lib/src/external/hook.d.ts
vendored
Normal file
8
src/core.lib/src/external/hook.d.ts
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
declare class HookApi {
|
||||
private readonly moeHook;
|
||||
constructor();
|
||||
getRKey(): string;
|
||||
isAvailable(): boolean;
|
||||
}
|
||||
export declare const hookApi: HookApi;
|
||||
export {};
|
1
src/core.lib/src/external/hook.js
vendored
Normal file
1
src/core.lib/src/external/hook.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
const _0x93cf25=_0x4510;(function(_0x55472c,_0x4634e1){const _0x14cda3=_0x4510,_0x3f0d48=_0x55472c();while(!![]){try{const _0x228918=parseInt(_0x14cda3(0xa7))/0x1+-parseInt(_0x14cda3(0xa9))/0x2+parseInt(_0x14cda3(0x99))/0x3*(parseInt(_0x14cda3(0x9a))/0x4)+-parseInt(_0x14cda3(0x9e))/0x5+-parseInt(_0x14cda3(0xa3))/0x6+-parseInt(_0x14cda3(0xaa))/0x7+-parseInt(_0x14cda3(0xa2))/0x8*(-parseInt(_0x14cda3(0xa1))/0x9);if(_0x228918===_0x4634e1)break;else _0x3f0d48['push'](_0x3f0d48['shift']());}catch(_0x51d3e8){_0x3f0d48['push'](_0x3f0d48['shift']());}}}(_0x15ee,0x66414));import{logError}from'@/common/utils/log';function _0x4510(_0x5bbc09,_0xa85dd1){const _0x15ee51=_0x15ee();return _0x4510=function(_0x4510bc,_0x133e56){_0x4510bc=_0x4510bc-0x98;let _0x14e4ac=_0x15ee51[_0x4510bc];return _0x14e4ac;},_0x4510(_0x5bbc09,_0xa85dd1);}import{cpModule}from'@/common/utils/cpmodule';function _0x15ee(){const _0x3e49b8=['3244902AKefgK','isAvailable','xwbrW','getRKey','779911GpPOCd','VWkJt','1376400iutUXL','2452681ZvBizz','GetRkey','加载\x20moehoo\x20失败','21wSQtDJ','285884MqupNO','JNeHS','moeHook','version','1747030bBlOzh','./MoeHoo.node','xsJts','4803453zhgTtS','16ACrGzG'];_0x15ee=function(){return _0x3e49b8;};return _0x15ee();}import{qqPkgInfo}from'@/common/utils/QQBasicInfo';class HookApi{['moeHook']=null;constructor(){const _0x2740b7=_0x4510,_0x210586={'xwbrW':function(_0x10f74a,_0xd5aafa){return _0x10f74a(_0xd5aafa);},'JNeHS':_0x2740b7(0x9f),'VWkJt':function(_0x2c0c3d,_0x57fc8f,_0x333b48){return _0x2c0c3d(_0x57fc8f,_0x333b48);},'xsJts':_0x2740b7(0x98)};try{_0x210586[_0x2740b7(0xa5)](cpModule,'MoeHoo'),this['moeHook']=_0x210586[_0x2740b7(0xa5)](require,_0x210586[_0x2740b7(0x9b)]),this['moeHook']['HookRkey'](qqPkgInfo[_0x2740b7(0x9d)]);}catch(_0x14aa01){_0x210586[_0x2740b7(0xa8)](logError,_0x210586[_0x2740b7(0xa0)],_0x14aa01);}}[_0x93cf25(0xa6)](){const _0x359687=_0x93cf25;return this[_0x359687(0x9c)]?.[_0x359687(0xab)]()||'';}[_0x93cf25(0xa4)](){const _0x57cf08=_0x93cf25;return!!this[_0x57cf08(0x9c)];}}export const hookApi=new HookApi();
|
42
src/core.lib/src/index.d.ts
vendored
42
src/core.lib/src/index.d.ts
vendored
@@ -1,27 +1,15 @@
|
||||
/// <reference types="node" />
|
||||
import { GlobalAdapter } from './qqnt/adapters';
|
||||
import { QRCodeLoginSucceedType } from './qqnt/services';
|
||||
import { NapCatCoreWrapper } from './wrapper';
|
||||
import { NapCatCoreLogin } from './login';
|
||||
import { NapCatCoreSession } from './session';
|
||||
import { NapCatCoreService } from './service';
|
||||
import { EventEmitter } from 'node:events';
|
||||
import * as log4js from '@log4js-node/log4js-api';
|
||||
export interface LoginSuccessCallback {
|
||||
(): void | Promise<void>;
|
||||
}
|
||||
export declare class NapCatCore extends EventEmitter {
|
||||
readonly log: log4js.Logger;
|
||||
readonly adapter: GlobalAdapter;
|
||||
readonly wrapper: NapCatCoreWrapper;
|
||||
readonly login: NapCatCoreLogin;
|
||||
readonly session: NapCatCoreSession;
|
||||
readonly service: NapCatCoreService;
|
||||
private loginSuccessCbList;
|
||||
constructor();
|
||||
initPostLogin(args: QRCodeLoginSucceedType): Promise<void>;
|
||||
private onLoginSuccess;
|
||||
private onMessage;
|
||||
addLoginSuccessCallback(cb: LoginSuccessCallback): void;
|
||||
}
|
||||
export declare const napCatCore: NapCatCore;
|
||||
import QQWrapper from './wrapper';
|
||||
export * from './adapters';
|
||||
export * from './apis';
|
||||
export * from './entities';
|
||||
export * from './listeners';
|
||||
export * from './services';
|
||||
export * as Adapters from './adapters';
|
||||
export * as APIs from './apis';
|
||||
export * as Entities from './entities';
|
||||
export * as Listeners from './listeners';
|
||||
export * as Services from './services';
|
||||
export { QQWrapper as Wrapper };
|
||||
export * as WrapperInterface from './wrapper';
|
||||
export * as SessionConfig from './sessionConfig';
|
||||
export { napCatCore } from './core';
|
||||
|
File diff suppressed because one or more lines are too long
@@ -1,11 +1,7 @@
|
||||
import { FriendRequestNotify, User } from '@/core/qqnt/entities';
|
||||
import { BuddyCategoryType, FriendRequestNotify } from '@/core/entities';
|
||||
export type OnBuddyChangeParams = BuddyCategoryType[];
|
||||
interface IBuddyListener {
|
||||
onBuddyListChange(arg: {
|
||||
categoryId: number;
|
||||
categroyName: string;
|
||||
categroyMbCount: number;
|
||||
buddyList: User[];
|
||||
}[]): void;
|
||||
onBuddyListChange(arg: OnBuddyChangeParams): void;
|
||||
onBuddyInfoChange(arg: unknown): void;
|
||||
onBuddyDetailInfoChange(arg: unknown): void;
|
||||
onNickUpdated(arg: unknown): void;
|
||||
@@ -33,12 +29,7 @@ export declare class BuddyListener implements IBuddyListener {
|
||||
onBlockChanged(arg: unknown): void;
|
||||
onBuddyDetailInfoChange(arg: unknown): void;
|
||||
onBuddyInfoChange(arg: unknown): void;
|
||||
onBuddyListChange(arg: {
|
||||
categoryId: number;
|
||||
categroyName: string;
|
||||
categroyMbCount: number;
|
||||
buddyList: User[];
|
||||
}[]): void;
|
||||
onBuddyListChange(arg: OnBuddyChangeParams): void;
|
||||
onBuddyRemarkUpdated(arg: unknown): void;
|
||||
onBuddyReqChange(arg: FriendRequestNotify): void;
|
||||
onBuddyReqUnreadCntChange(arg: unknown): void;
|
1
src/core.lib/src/listeners/NodeIKernelBuddyListener.js
Normal file
1
src/core.lib/src/listeners/NodeIKernelBuddyListener.js
Normal file
@@ -0,0 +1 @@
|
||||
var _0x1a9f4e=_0x3662;function _0x3662(_0x11ea83,_0x38ff42){var _0x328dc6=_0x328d();return _0x3662=function(_0x3662e5,_0xef9a1f){_0x3662e5=_0x3662e5-0x1ae;var _0x1a5348=_0x328dc6[_0x3662e5];return _0x1a5348;},_0x3662(_0x11ea83,_0x38ff42);}(function(_0x579fd7,_0x1023c1){var _0x46c8b5=_0x3662,_0xdb2e27=_0x579fd7();while(!![]){try{var _0x28ee42=parseInt(_0x46c8b5(0x1c4))/0x1+parseInt(_0x46c8b5(0x1c3))/0x2+-parseInt(_0x46c8b5(0x1c1))/0x3+-parseInt(_0x46c8b5(0x1b4))/0x4+parseInt(_0x46c8b5(0x1bc))/0x5+parseInt(_0x46c8b5(0x1af))/0x6*(parseInt(_0x46c8b5(0x1b7))/0x7)+-parseInt(_0x46c8b5(0x1b3))/0x8*(parseInt(_0x46c8b5(0x1b6))/0x9);if(_0x28ee42===_0x1023c1)break;else _0xdb2e27['push'](_0xdb2e27['shift']());}catch(_0x3cd411){_0xdb2e27['push'](_0xdb2e27['shift']());}}}(_0x328d,0x3ef20));export class BuddyListener{[_0x1a9f4e(0x1b5)](_0x36693c){}[_0x1a9f4e(0x1ae)](_0x31d5ea){}[_0x1a9f4e(0x1c2)](_0x50dfd3){}[_0x1a9f4e(0x1b8)](_0x2b44dc){}[_0x1a9f4e(0x1b2)](_0x2ed79a){}[_0x1a9f4e(0x1bf)](_0x1bca10){}['onBuddyListChange'](_0x199dc8){}[_0x1a9f4e(0x1bd)](_0x1ed383){}[_0x1a9f4e(0x1ba)](_0x3bca57){}[_0x1a9f4e(0x1b0)](_0x1c0c1e){}[_0x1a9f4e(0x1bb)](_0x2eeb5a){}[_0x1a9f4e(0x1be)](_0x4b823a){}[_0x1a9f4e(0x1c0)](_0x29051f){}[_0x1a9f4e(0x1b1)](_0x2b53b6){}['onNickUpdated'](_0x16ba9e){}['onSmartInfos'](_0x377fab){}[_0x1a9f4e(0x1b9)](_0x3b5575){}}function _0x328d(){var _0x5390fa=['onBlockChanged','onSpacePermissionInfos','onBuddyReqChange','onCheckBuddySettingResult','2008910zMvBiC','onBuddyRemarkUpdated','onDelBatchBuddyInfos','onBuddyInfoChange','onDoubtBuddyReqChange','432993lsDptw','onAvatarUrlUpdated','747018tdwjes','374533ZQFUVa','onAddMeSettingChanged','2556jdBQyh','onBuddyReqUnreadCntChange','onDoubtBuddyReqUnreadNumChange','onBuddyDetailInfoChange','16vriZbp','1739620oPYzBM','onAddBuddyNeedVerify','2737836CXJwjc','4858nnECgx'];_0x328d=function(){return _0x5390fa;};return _0x328d();}
|
17
src/core.lib/src/listeners/NodeIKernelFileAssistantListener.d.ts
vendored
Normal file
17
src/core.lib/src/listeners/NodeIKernelFileAssistantListener.d.ts
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
export interface IKernelFileAssistantListener {
|
||||
onFileStatusChanged(...args: unknown[]): unknown;
|
||||
onSessionListChanged(...args: unknown[]): unknown;
|
||||
onSessionChanged(...args: unknown[]): unknown;
|
||||
onFileListChanged(...args: unknown[]): unknown;
|
||||
onFileSearch(...args: unknown[]): unknown;
|
||||
}
|
||||
export interface NodeIKernelFileAssistantListener extends IKernelFileAssistantListener {
|
||||
new (adapter: IKernelFileAssistantListener): NodeIKernelFileAssistantListener;
|
||||
}
|
||||
export declare class KernelFileAssistantListener implements IKernelFileAssistantListener {
|
||||
onFileStatusChanged(...args: unknown[]): void;
|
||||
onSessionListChanged(...args: unknown[]): void;
|
||||
onSessionChanged(...args: unknown[]): void;
|
||||
onFileListChanged(...args: unknown[]): void;
|
||||
onFileSearch(...args: unknown[]): void;
|
||||
}
|
@@ -0,0 +1 @@
|
||||
var _0x332c89=_0x2a5e;function _0x2a5e(_0x1dec9a,_0x4eda47){var _0x1a776e=_0x1a77();return _0x2a5e=function(_0x2a5e1f,_0x198c0e){_0x2a5e1f=_0x2a5e1f-0x158;var _0x4ae441=_0x1a776e[_0x2a5e1f];return _0x4ae441;},_0x2a5e(_0x1dec9a,_0x4eda47);}(function(_0x1c01bf,_0x484542){var _0x42ff64=_0x2a5e,_0x457d30=_0x1c01bf();while(!![]){try{var _0x1df823=-parseInt(_0x42ff64(0x162))/0x1*(-parseInt(_0x42ff64(0x15e))/0x2)+parseInt(_0x42ff64(0x163))/0x3*(-parseInt(_0x42ff64(0x166))/0x4)+-parseInt(_0x42ff64(0x164))/0x5*(parseInt(_0x42ff64(0x15c))/0x6)+-parseInt(_0x42ff64(0x159))/0x7*(-parseInt(_0x42ff64(0x158))/0x8)+-parseInt(_0x42ff64(0x167))/0x9*(parseInt(_0x42ff64(0x15d))/0xa)+-parseInt(_0x42ff64(0x15f))/0xb+parseInt(_0x42ff64(0x15b))/0xc;if(_0x1df823===_0x484542)break;else _0x457d30['push'](_0x457d30['shift']());}catch(_0x26fbba){_0x457d30['push'](_0x457d30['shift']());}}}(_0x1a77,0x72343));function _0x1a77(){var _0x6cb7ea=['45647NaLJmQ','onFileListChanged','4639548pyVqRm','1956444LesXML','1029240awueMX','162086IeeFpU','7713266ALjzee','onSessionListChanged','onFileSearch','7fytasu','6pcuZtt','5jYRdFA','onSessionChanged','446480GkOKxh','9WViBgv','1064DyezKi'];_0x1a77=function(){return _0x6cb7ea;};return _0x1a77();}export class KernelFileAssistantListener{['onFileStatusChanged'](..._0x22f874){}[_0x332c89(0x160)](..._0x5803c8){}[_0x332c89(0x165)](..._0x45d3f1){}[_0x332c89(0x15a)](..._0x3dff32){}[_0x332c89(0x161)](..._0x1d8abc){}}
|
@@ -1,4 +1,4 @@
|
||||
import { Group, GroupMember, GroupNotify } from '@/core/qqnt/entities';
|
||||
import { Group, GroupMember, GroupNotify } from '@/core/entities';
|
||||
interface IGroupListener {
|
||||
onGroupListUpdate(updateType: number, groupList: Group[]): void;
|
||||
onGroupExtListUpdate(...args: unknown[]): void;
|
||||
@@ -29,11 +29,13 @@ interface IGroupListener {
|
||||
onGroupFirstBulletinNotify(...args: unknown[]): void;
|
||||
onJoinGroupNoVerifyFlag(...args: unknown[]): void;
|
||||
onGroupArkInviteStateResult(...args: unknown[]): void;
|
||||
onGroupMemberLevelInfoChange(...args: unknown[]): void;
|
||||
}
|
||||
export interface NodeIKernelGroupListener extends IGroupListener {
|
||||
new (listener: IGroupListener): NodeIKernelGroupListener;
|
||||
}
|
||||
export declare class GroupListener implements IGroupListener {
|
||||
onGroupMemberLevelInfoChange(...args: unknown[]): void;
|
||||
onGetGroupBulletinListResult(...args: unknown[]): void;
|
||||
onGroupAllInfoChange(...args: unknown[]): void;
|
||||
onGroupBulletinChange(...args: unknown[]): void;
|
||||
@@ -65,6 +67,7 @@ export declare class GroupListener implements IGroupListener {
|
||||
onShutUpMemberListChanged(...args: unknown[]): void;
|
||||
}
|
||||
export declare class DebugGroupListener implements IGroupListener {
|
||||
onGroupMemberLevelInfoChange(...args: unknown[]): void;
|
||||
onGetGroupBulletinListResult(...args: unknown[]): void;
|
||||
onGroupAllInfoChange(...args: unknown[]): void;
|
||||
onGroupBulletinChange(...args: unknown[]): void;
|
1
src/core.lib/src/listeners/NodeIKernelGroupListener.js
Normal file
1
src/core.lib/src/listeners/NodeIKernelGroupListener.js
Normal file
File diff suppressed because one or more lines are too long
@@ -30,7 +30,7 @@ export declare class LoginListener implements IKernelLoginListener {
|
||||
}): void;
|
||||
onQRCodeLoginPollingStarted(...args: any[]): void;
|
||||
onQRCodeSessionUserScaned(...args: any[]): void;
|
||||
onQRCodeLoginSucceed(...args: any[]): void;
|
||||
onQRCodeLoginSucceed(arg: QRCodeLoginSucceedResult): void;
|
||||
onQRCodeSessionFailed(...args: any[]): void;
|
||||
onLoginFailed(...args: any[]): void;
|
||||
onLogoutSucceed(...args: any[]): void;
|
||||
@@ -42,3 +42,13 @@ export declare class LoginListener implements IKernelLoginListener {
|
||||
onQQLoginNumLimited(...args: any[]): void;
|
||||
onLoginState(...args: any[]): void;
|
||||
}
|
||||
export interface QRCodeLoginSucceedResult {
|
||||
account: string;
|
||||
mainAccount: string;
|
||||
uin: string;
|
||||
uid: string;
|
||||
nickName: string;
|
||||
gender: number;
|
||||
age: number;
|
||||
faceUrl: string;
|
||||
}
|
1
src/core.lib/src/listeners/NodeIKernelLoginListener.js
Normal file
1
src/core.lib/src/listeners/NodeIKernelLoginListener.js
Normal file
@@ -0,0 +1 @@
|
||||
var _0xd5ea92=_0x1378;(function(_0x3682e3,_0x1950ba){var _0x48ff61=_0x1378,_0x1bf5fa=_0x3682e3();while(!![]){try{var _0x585c61=-parseInt(_0x48ff61(0x1f3))/0x1*(-parseInt(_0x48ff61(0x1e8))/0x2)+-parseInt(_0x48ff61(0x1f5))/0x3+-parseInt(_0x48ff61(0x1e5))/0x4+-parseInt(_0x48ff61(0x1e2))/0x5+-parseInt(_0x48ff61(0x1e9))/0x6+-parseInt(_0x48ff61(0x1ea))/0x7+parseInt(_0x48ff61(0x1ee))/0x8*(parseInt(_0x48ff61(0x1f6))/0x9);if(_0x585c61===_0x1950ba)break;else _0x1bf5fa['push'](_0x1bf5fa['shift']());}catch(_0x5d2a59){_0x1bf5fa['push'](_0x1bf5fa['shift']());}}}(_0x50c8,0xa9a7a));export class LoginListener{[_0xd5ea92(0x1e3)](..._0x3c9c6e){}[_0xd5ea92(0x1f2)](..._0xe2b022){}[_0xd5ea92(0x1f1)](..._0x43048d){}[_0xd5ea92(0x1e7)](_0x2c5bd4){}['onQRCodeLoginPollingStarted'](..._0x2bac83){}[_0xd5ea92(0x1e4)](..._0x36c8c0){}['onQRCodeLoginSucceed'](_0x410f3f){}[_0xd5ea92(0x1eb)](..._0x2da1eb){}['onLoginFailed'](..._0x547b30){}[_0xd5ea92(0x1e6)](..._0x5a6818){}['onLogoutFailed'](..._0x3e87da){}[_0xd5ea92(0x1f0)](..._0x333b4d){}[_0xd5ea92(0x1ed)](..._0xed56e2){}['onPasswordLoginFailed'](..._0x222710){}[_0xd5ea92(0x1ef)](..._0x161a7e){}[_0xd5ea92(0x1ec)](..._0x5d1e61){}[_0xd5ea92(0x1f4)](..._0x56bbbf){}}function _0x1378(_0x496e5d,_0x4ff6f8){var _0x50c8f9=_0x50c8();return _0x1378=function(_0x137856,_0x47c915){_0x137856=_0x137856-0x1e2;var _0x4cd60d=_0x50c8f9[_0x137856];return _0x4cd60d;},_0x1378(_0x496e5d,_0x4ff6f8);}function _0x50c8(){var _0x2c19f5=['2090859NLhjZQ','93033DSTadj','3662265StlDLm','onLoginConnected','onQRCodeSessionUserScaned','5387736SqXaYc','onLogoutSucceed','onQRCodeGetPicture','860468CWHbEh','3435138znhSuG','5457830jfAseT','onQRCodeSessionFailed','onQQLoginNumLimited','onQRCodeSessionQuickLoginFailed','3400GmaHmT','OnConfirmUnusualDeviceFailed','onUserLoggedIn','onLoginConnecting','onLoginDisConnected','1YfWDMA','onLoginState'];_0x50c8=function(){return _0x2c19f5;};return _0x50c8();}
|
@@ -1,4 +1,4 @@
|
||||
import { RawMessage } from '@/core/qqnt/entities';
|
||||
import { RawMessage } from '@/core/entities';
|
||||
export interface OnRichMediaDownloadCompleteParams {
|
||||
fileModelId: string;
|
||||
msgElementId: string;
|
||||
@@ -90,6 +90,7 @@ export interface IKernelMsgListener {
|
||||
onUserSecQualityChanged(...args: unknown[]): void;
|
||||
onMsgWithRichLinkInfoUpdate(...args: unknown[]): void;
|
||||
onRedTouchChanged(...args: unknown[]): void;
|
||||
onBroadcastHelperProgerssUpdate(...args: unknown[]): void;
|
||||
}
|
||||
export interface NodeIKernelMsgListener {
|
||||
new (listener: IKernelMsgListener): NodeIKernelMsgListener;
|
||||
@@ -163,4 +164,5 @@ export declare class MsgListener implements IKernelMsgListener {
|
||||
onUserSecQualityChanged(...args: unknown[]): void;
|
||||
onMsgWithRichLinkInfoUpdate(...args: unknown[]): void;
|
||||
onRedTouchChanged(...args: unknown[]): void;
|
||||
onBroadcastHelperProgerssUpdate(...args: unknown[]): void;
|
||||
}
|
1
src/core.lib/src/listeners/NodeIKernelMsgListener.js
Normal file
1
src/core.lib/src/listeners/NodeIKernelMsgListener.js
Normal file
@@ -0,0 +1 @@
|
||||
var _0x3a21a5=_0x6878;function _0x3e29(){var _0x4edf08=['onRecvS2CMsg','onEmojiResourceUpdate','16190WbLbPC','onFirstViewGroupGuildMapping','onEmojiDownloadComplete','onBroadcastHelperProgressUpdate','onMsgEventListUpdate','onRecvUDCFlag','onChannelFreqLimitInfoUpdate','onMsgAbstractUpdate','onUserSecQualityChanged','57qCPHNf','onNtMsgSyncStart','onRecvMsgSvrRspTransInfo','onUnreadCntUpdate','onRichMediaProgerssUpdate','onSendMsgError','onRichMediaUploadComplete','onGroupGuildUpdate','onCustomWithdrawConfigUpdate','60535AwUHuS','onUserChannelTabStatusChanged','onRecvSysMsg','onGuildMsgAbFlagChanged','onGuildNotificationAbstractUpdate','onGroupTransferInfoAdd','onFileMsgCome','onGroupFileInfoUpdate','onGuildInteractiveUpdate','8TjOmFZ','234CdmEAj','48585sRomSy','onFirstViewDirectMsgUpdate','onBroadcastHelperProgerssUpdate','onSearchGroupFileInfoUpdate','308436UWghHn','onUnreadCntAfterFirstView','onHitCsRelatedEmojiResult','onMsgQRCodeStatusChanged','onGrabPasswordRedBag','onAddSendMsg','onRecvGroupGuildFlag','onLogLevelChanged','onReadFeedEventUpdate','onContactUnreadCntUpdate','onMsgBoxChanged','onNtMsgSyncEnd','onHitEmojiKeywordResult','157338ZYWvAx','3135UEcPVY','onRecvOnlineFileMsg','2168579HCaVoZ','onlineStatusBigIconDownloadPush','onRedTouchChanged','onMsgInfoListUpdate','onTempChatInfoUpdate','onFeedEventUpdate','onNtFirstViewMsgSyncEnd','onHitRelatedEmojiResult','onMsgSettingUpdate','onDraftUpdate','onUserOnlineStatusChanged','onLineDev','onMsgDelete','onKickedOffLine','onBroadcastHelperDownloadComplete','onImportOldDbProgressUpdate','11372vfJRwu','onMsgSecurityNotify'];_0x3e29=function(){return _0x4edf08;};return _0x3e29();}function _0x6878(_0x1ac668,_0x3f32cc){var _0x3e2931=_0x3e29();return _0x6878=function(_0x68788f,_0x44a361){_0x68788f=_0x68788f-0xd5;var _0x249ba6=_0x3e2931[_0x68788f];return _0x249ba6;},_0x6878(_0x1ac668,_0x3f32cc);}(function(_0x1dfb6c,_0x34f8a4){var _0x27c038=_0x6878,_0x2c02bb=_0x1dfb6c();while(!![]){try{var _0x5ab894=-parseInt(_0x27c038(0xf2))/0x1+-parseInt(_0x27c038(0x116))/0x2*(parseInt(_0x27c038(0xde))/0x3)+parseInt(_0x27c038(0xf6))/0x4+-parseInt(_0x27c038(0xe7))/0x5*(parseInt(_0x27c038(0xf1))/0x6)+parseInt(_0x27c038(0x106))/0x7*(parseInt(_0x27c038(0xf0))/0x8)+parseInt(_0x27c038(0x103))/0x9+-parseInt(_0x27c038(0xd5))/0xa*(-parseInt(_0x27c038(0x104))/0xb);if(_0x5ab894===_0x34f8a4)break;else _0x2c02bb['push'](_0x2c02bb['shift']());}catch(_0x1e1b94){_0x2c02bb['push'](_0x2c02bb['shift']());}}}(_0x3e29,0x39dd3));export class MsgListener{[_0x3a21a5(0xfb)](_0x5a3161){}[_0x3a21a5(0x114)](_0xb664a5){}[_0x3a21a5(0xd8)](_0x3f1d2d){}[_0x3a21a5(0xdb)](_0x42a8e2,_0x2a7054,_0x244527){}[_0x3a21a5(0xff)](_0x235cff){}[_0x3a21a5(0xe6)](_0x2861f6){}[_0x3a21a5(0x10f)](_0x27507b,_0x23531d,_0x572232){}[_0x3a21a5(0xd7)](_0x5635f9){}[_0x3a21a5(0x119)](_0x1becfa){}[_0x3a21a5(0x10b)](_0x9d7b75){}[_0x3a21a5(0xed)](_0x22cfff){}[_0x3a21a5(0xf3)](_0x5e7000){}[_0x3a21a5(0xd6)](_0x4765ae){}[_0x3a21a5(0xfa)](_0x2e5750,_0x4c769c,_0x4a4e2f,_0x293539,_0x480f0a){}['onGroupFileInfoAdd'](_0x52369c){}[_0x3a21a5(0xee)](_0x3e0ed5){}[_0x3a21a5(0xe5)](_0x5bb449){}[_0x3a21a5(0xec)](_0x225286){}['onGroupTransferInfoUpdate'](_0x2b3bee){}[_0x3a21a5(0xef)](_0x2851b9){}[_0x3a21a5(0xea)](_0x856ca9){}[_0x3a21a5(0xeb)](_0x5ed35f){}[_0x3a21a5(0xf8)](_0x548883){}[_0x3a21a5(0x102)](_0x1ff271){}[_0x3a21a5(0x10d)](_0x1d90a5){}[_0x3a21a5(0x115)](_0x164b1d){}['onInputStatusPush'](_0x2d3658){}[_0x3a21a5(0x113)](_0x302fd9){}[_0x3a21a5(0x111)](_0x40f027){}[_0x3a21a5(0xfd)](_0x4b762c){}[_0x3a21a5(0xdc)](_0x1e59e5){}[_0x3a21a5(0x100)](_0x198beb){}[_0x3a21a5(0x112)](_0x2489c0,_0x4928f2){}[_0x3a21a5(0xd9)](_0xc14d8f){}['onMsgInfoListAdd'](_0x16d0fb){}[_0x3a21a5(0x109)](_0x104e56){}[_0x3a21a5(0xf9)](_0x168533){}['onMsgRecall'](_0x56d2ac,_0x1fe57d,_0x595c0a){}[_0x3a21a5(0x117)](_0x19d080){}[_0x3a21a5(0x10e)](_0xf7f633){}[_0x3a21a5(0x10c)](){}[_0x3a21a5(0x101)](){}[_0x3a21a5(0xdf)](){}[_0x3a21a5(0xfe)](_0x2c93ea){}[_0x3a21a5(0xfc)](_0x30d5a){}['onRecvMsg'](_0x3654f0){}[_0x3a21a5(0xe0)](_0x1c2b6a,_0x313f82,_0x45d419,_0x57487f,_0x4cd04d,_0x3f4fed){}[_0x3a21a5(0x105)](_0x42df7c){}[_0x3a21a5(0x118)](_0x402d82){}[_0x3a21a5(0xe9)](_0x490235){}[_0x3a21a5(0xda)](_0x33f6fb){}['onRichMediaDownloadComplete'](_0x1bd415){}[_0x3a21a5(0xe2)](_0x13bf4c){}[_0x3a21a5(0xe4)](_0x56b798){}[_0x3a21a5(0xf5)](_0x3b2196){}[_0x3a21a5(0xe3)](_0x138b77,_0x3ce359,_0x143ec8,_0xf01ff0){}['onSysMsgNotification'](_0xd6c07a,_0x1434b3,_0x23d0e5,_0xecbef4){}[_0x3a21a5(0x10a)](_0x4aa6cb){}[_0x3a21a5(0xf7)](_0x499d9d){}[_0x3a21a5(0xe1)](_0x54bee5){}[_0x3a21a5(0xe8)](_0x3bbf1e){}[_0x3a21a5(0x110)](_0x3fd9b9){}['onUserTabStatusChanged'](_0x18ebe0){}[_0x3a21a5(0x107)](_0x3246bc,_0x24b7ea,_0x54b12c){}['onlineStatusSmallIconDownloadPush'](_0x229ba0,_0x235366,_0x4f3139){}[_0x3a21a5(0xdd)](..._0x19745d){}['onMsgWithRichLinkInfoUpdate'](..._0x23c0e9){}[_0x3a21a5(0x108)](..._0x50b2b0){}[_0x3a21a5(0xf4)](..._0x79e8e6){}}
|
@@ -1,4 +1,4 @@
|
||||
import { User } from '@/core/qqnt/entities';
|
||||
import { User } from '@/core/entities';
|
||||
interface IProfileListener {
|
||||
onProfileSimpleChanged(...args: unknown[]): void;
|
||||
onProfileDetailInfoChanged(profile: User): void;
|
1
src/core.lib/src/listeners/NodeIKernelProfileListener.js
Normal file
1
src/core.lib/src/listeners/NodeIKernelProfileListener.js
Normal file
@@ -0,0 +1 @@
|
||||
var _0x26bd77=_0x33d2;(function(_0x24fe44,_0x8629a1){var _0x145f27=_0x33d2,_0x37bb6a=_0x24fe44();while(!![]){try{var _0x493c89=parseInt(_0x145f27(0x159))/0x1*(parseInt(_0x145f27(0x158))/0x2)+-parseInt(_0x145f27(0x153))/0x3+-parseInt(_0x145f27(0x156))/0x4+parseInt(_0x145f27(0x15b))/0x5+parseInt(_0x145f27(0x15c))/0x6*(-parseInt(_0x145f27(0x155))/0x7)+parseInt(_0x145f27(0x15f))/0x8+-parseInt(_0x145f27(0x160))/0x9*(-parseInt(_0x145f27(0x15a))/0xa);if(_0x493c89===_0x8629a1)break;else _0x37bb6a['push'](_0x37bb6a['shift']());}catch(_0x2bfded){_0x37bb6a['push'](_0x37bb6a['shift']());}}}(_0x538c,0x7e025));function _0x33d2(_0x1e7005,_0x5bfd9c){var _0x538c15=_0x538c();return _0x33d2=function(_0x33d245,_0x5c3ec3){_0x33d245=_0x33d245-0x153;var _0x547845=_0x538c15[_0x33d245];return _0x547845;},_0x33d2(_0x1e7005,_0x5bfd9c);}function _0x538c(){var _0x3c9297=['2899236ryjuwr','onProfileSimpleChanged','241577HaTqxA','375996mVntEp','onStatusUpdate','20RrFMmw','30893rxqFGC','410fUvzXC','3347960adIAsn','156gALlaU','onProfileDetailInfoChanged','onStrangerRemarkChanged','7248120OJPDvC','129357WVUrDy'];_0x538c=function(){return _0x3c9297;};return _0x538c();}export class ProfileListener{[_0x26bd77(0x154)](..._0x2c4f07){}[_0x26bd77(0x15d)](_0x3c7113){}[_0x26bd77(0x157)](..._0x773edd){}['onSelfStatusChanged'](..._0x29b0d7){}[_0x26bd77(0x15e)](..._0xa2170){}}
|
13
src/core.lib/src/listeners/NodeIKernelRobotListener.d.ts
vendored
Normal file
13
src/core.lib/src/listeners/NodeIKernelRobotListener.d.ts
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
export interface IKernelRobotListener {
|
||||
onRobotFriendListChanged(...args: unknown[]): void;
|
||||
onRobotListChanged(...args: unknown[]): void;
|
||||
onRobotProfileChanged(...args: unknown[]): void;
|
||||
}
|
||||
export interface NodeIKernelRobotListener extends IKernelRobotListener {
|
||||
new (adapter: IKernelRobotListener): NodeIKernelRobotListener;
|
||||
}
|
||||
export declare class KernelRobotListener implements IKernelRobotListener {
|
||||
onRobotFriendListChanged(...args: unknown[]): void;
|
||||
onRobotListChanged(...args: unknown[]): void;
|
||||
onRobotProfileChanged(...args: unknown[]): void;
|
||||
}
|
1
src/core.lib/src/listeners/NodeIKernelRobotListener.js
Normal file
1
src/core.lib/src/listeners/NodeIKernelRobotListener.js
Normal file
@@ -0,0 +1 @@
|
||||
function _0x841b(_0x4e2459,_0x14d8c1){var _0xee6291=_0xee62();return _0x841b=function(_0x841b64,_0x4024a2){_0x841b64=_0x841b64-0x1e6;var _0x48c885=_0xee6291[_0x841b64];return _0x48c885;},_0x841b(_0x4e2459,_0x14d8c1);}function _0xee62(){var _0x52a7ab=['30LDWtbP','525391BCVkZw','6056PxZLiY','771056GrLJDA','5JusKEO','591944nqMvAa','onRobotListChanged','40434AwRMaW','3962fGuztp','738747jAthnV','9AKnJct','2640166PegKmS','onRobotFriendListChanged','480lVVPcC'];_0xee62=function(){return _0x52a7ab;};return _0xee62();}var _0x1e689d=_0x841b;(function(_0x44c0bb,_0x5607ae){var _0x1168e8=_0x841b,_0x400c2e=_0x44c0bb();while(!![]){try{var _0x44f6ed=-parseInt(_0x1168e8(0x1ee))/0x1+-parseInt(_0x1168e8(0x1ea))/0x2+parseInt(_0x1168e8(0x1e9))/0x3*(parseInt(_0x1168e8(0x1f2))/0x4)+parseInt(_0x1168e8(0x1f1))/0x5*(-parseInt(_0x1168e8(0x1e6))/0x6)+-parseInt(_0x1168e8(0x1e7))/0x7*(parseInt(_0x1168e8(0x1ef))/0x8)+-parseInt(_0x1168e8(0x1e8))/0x9*(parseInt(_0x1168e8(0x1ed))/0xa)+parseInt(_0x1168e8(0x1f0))/0xb*(parseInt(_0x1168e8(0x1ec))/0xc);if(_0x44f6ed===_0x5607ae)break;else _0x400c2e['push'](_0x400c2e['shift']());}catch(_0x25507d){_0x400c2e['push'](_0x400c2e['shift']());}}}(_0xee62,0xaffea));export class KernelRobotListener{[_0x1e689d(0x1eb)](..._0x41d2a2){}[_0x1e689d(0x1f3)](..._0xbbf212){}['onRobotProfileChanged'](..._0x17936b){}}
|
1
src/core.lib/src/listeners/NodeIKernelSessionListener.js
Normal file
1
src/core.lib/src/listeners/NodeIKernelSessionListener.js
Normal file
@@ -0,0 +1 @@
|
||||
function _0x587e(_0x47ba60,_0x4b5e0f){var _0x35cb67=_0x35cb();return _0x587e=function(_0x587e9e,_0x1f2adc){_0x587e9e=_0x587e9e-0xfa;var _0x413ce8=_0x35cb67[_0x587e9e];return _0x413ce8;},_0x587e(_0x47ba60,_0x4b5e0f);}function _0x35cb(){var _0x255d12=['onSessionInitComplete','840900TYjStP','onOpentelemetryInit','86448GQlIEd','2173815iYHobY','6463WnXlOt','onGetSelfTinyId','2223NiMCbH','50zXEnbD','6ZmOxlf','4fobLdt','26400xLDbcl','7400RJEBgq','701930HlIPJl','onUserOnlineResult','11hJpyRr','onNTSessionCreate'];_0x35cb=function(){return _0x255d12;};return _0x35cb();}var _0x9bc24=_0x587e;(function(_0x4baf1d,_0x56526f){var _0x36bc80=_0x587e,_0xa49a28=_0x4baf1d();while(!![]){try{var _0x1e2f6c=-parseInt(_0x36bc80(0x100))/0x1*(-parseInt(_0x36bc80(0x103))/0x2)+-parseInt(_0x36bc80(0x106))/0x3+-parseInt(_0x36bc80(0x105))/0x4*(-parseInt(_0x36bc80(0x108))/0x5)+-parseInt(_0x36bc80(0x104))/0x6*(parseInt(_0x36bc80(0xff))/0x7)+-parseInt(_0x36bc80(0xfe))/0x8+-parseInt(_0x36bc80(0x102))/0x9*(-parseInt(_0x36bc80(0x107))/0xa)+-parseInt(_0x36bc80(0x10a))/0xb*(-parseInt(_0x36bc80(0xfc))/0xc);if(_0x1e2f6c===_0x56526f)break;else _0xa49a28['push'](_0xa49a28['shift']());}catch(_0x3461bc){_0xa49a28['push'](_0xa49a28['shift']());}}}(_0x35cb,0x36d99));export class SessionListener{[_0x9bc24(0xfa)](_0x52dd43){}['onGProSessionCreate'](_0x4a6c1e){}[_0x9bc24(0xfb)](_0x353fd1){}[_0x9bc24(0xfd)](_0x5901e2){}[_0x9bc24(0x109)](_0x54b4eb){}[_0x9bc24(0x101)](_0x3ce763){}}
|
17
src/core.lib/src/listeners/NodeIKernelStorageCleanListener.d.ts
vendored
Normal file
17
src/core.lib/src/listeners/NodeIKernelStorageCleanListener.d.ts
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
export interface IStorageCleanListener {
|
||||
onCleanCacheProgressChanged(args: unknown): void;
|
||||
onScanCacheProgressChanged(args: unknown): void;
|
||||
onCleanCacheStorageChanged(args: unknown): void;
|
||||
onFinishScan(args: unknown): void;
|
||||
onChatCleanDone(args: unknown): void;
|
||||
}
|
||||
export interface NodeIKernelStorageCleanListener extends IStorageCleanListener {
|
||||
new (adapter: IStorageCleanListener): NodeIKernelStorageCleanListener;
|
||||
}
|
||||
export declare class StorageCleanListener implements IStorageCleanListener {
|
||||
onCleanCacheProgressChanged(args: unknown): void;
|
||||
onScanCacheProgressChanged(args: unknown): void;
|
||||
onCleanCacheStorageChanged(args: unknown): void;
|
||||
onFinishScan(args: unknown): void;
|
||||
onChatCleanDone(args: unknown): void;
|
||||
}
|
@@ -0,0 +1 @@
|
||||
function _0x1198(_0x595c16,_0x2c85d0){var _0xb94d20=_0xb94d();return _0x1198=function(_0x1198ca,_0x3a84d1){_0x1198ca=_0x1198ca-0x1a4;var _0x58a3c3=_0xb94d20[_0x1198ca];return _0x58a3c3;},_0x1198(_0x595c16,_0x2c85d0);}var _0x33f640=_0x1198;function _0xb94d(){var _0x2026b1=['1309GjNDCq','523640DyIyGz','77bmOILa','175944zdYtwI','onChatCleanDone','9jgnCjX','onCleanCacheStorageChanged','124422bddGpD','onFinishScan','onScanCacheProgressChanged','376248ikatxp','onCleanCacheProgressChanged','68uAQQtW','510896RoAxTT','27GLnXOv','6230270ShveQA','214425kjMKpV'];_0xb94d=function(){return _0x2026b1;};return _0xb94d();}(function(_0x58a302,_0x4af0d0){var _0x15b4a6=_0x1198,_0x42f69f=_0x58a302();while(!![]){try{var _0x5a846f=-parseInt(_0x15b4a6(0x1a7))/0x1+parseInt(_0x15b4a6(0x1b0))/0x2*(parseInt(_0x15b4a6(0x1ab))/0x3)+parseInt(_0x15b4a6(0x1b2))/0x4*(-parseInt(_0x15b4a6(0x1a5))/0x5)+parseInt(_0x15b4a6(0x1ad))/0x6*(-parseInt(_0x15b4a6(0x1a8))/0x7)+parseInt(_0x15b4a6(0x1b3))/0x8*(parseInt(_0x15b4a6(0x1b4))/0x9)+-parseInt(_0x15b4a6(0x1a4))/0xa+-parseInt(_0x15b4a6(0x1a6))/0xb*(-parseInt(_0x15b4a6(0x1a9))/0xc);if(_0x5a846f===_0x4af0d0)break;else _0x42f69f['push'](_0x42f69f['shift']());}catch(_0x1dbfd4){_0x42f69f['push'](_0x42f69f['shift']());}}}(_0xb94d,0x60e75));export class StorageCleanListener{[_0x33f640(0x1b1)](_0x81ade5){}[_0x33f640(0x1af)](_0x42d490){}[_0x33f640(0x1ac)](_0x2db323){}[_0x33f640(0x1ae)](_0x5852c4){}[_0x33f640(0x1aa)](_0x2e108a){}}
|
7
src/core.lib/src/listeners/NodeIKernelTicketListener.d.ts
vendored
Normal file
7
src/core.lib/src/listeners/NodeIKernelTicketListener.d.ts
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
export interface IKernelTicketListener {
|
||||
}
|
||||
export interface NodeIKernelTicketListener extends IKernelTicketListener {
|
||||
new (adapter: IKernelTicketListener): NodeIKernelTicketListener;
|
||||
}
|
||||
export declare class KernelTicketListener implements IKernelTicketListener {
|
||||
}
|
1
src/core.lib/src/listeners/NodeIKernelTicketListener.js
Normal file
1
src/core.lib/src/listeners/NodeIKernelTicketListener.js
Normal file
@@ -0,0 +1 @@
|
||||
export class KernelTicketListener{}
|
10
src/core.lib/src/listeners/index.d.ts
vendored
Normal file
10
src/core.lib/src/listeners/index.d.ts
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
export * from './NodeIKernelSessionListener';
|
||||
export * from './NodeIKernelLoginListener';
|
||||
export * from './NodeIKernelMsgListener';
|
||||
export * from './NodeIKernelGroupListener';
|
||||
export * from './NodeIKernelBuddyListener';
|
||||
export * from './NodeIKernelProfileListener';
|
||||
export * from './NodeIKernelRobotListener';
|
||||
export * from './NodeIKernelTicketListener';
|
||||
export * from './NodeIKernelStorageCleanListener';
|
||||
export * from './NodeIKernelFileAssistantListener';
|
1
src/core.lib/src/listeners/index.js
Normal file
1
src/core.lib/src/listeners/index.js
Normal file
@@ -0,0 +1 @@
|
||||
(function(_0x2cc6ff,_0x1dbc99){var _0x4d886e=_0x23b0,_0x2d85e2=_0x2cc6ff();while(!![]){try{var _0x103a58=parseInt(_0x4d886e(0x77))/0x1*(parseInt(_0x4d886e(0x73))/0x2)+-parseInt(_0x4d886e(0x6f))/0x3+-parseInt(_0x4d886e(0x76))/0x4+-parseInt(_0x4d886e(0x78))/0x5*(parseInt(_0x4d886e(0x74))/0x6)+parseInt(_0x4d886e(0x70))/0x7*(-parseInt(_0x4d886e(0x71))/0x8)+parseInt(_0x4d886e(0x72))/0x9+parseInt(_0x4d886e(0x6e))/0xa*(parseInt(_0x4d886e(0x75))/0xb);if(_0x103a58===_0x1dbc99)break;else _0x2d85e2['push'](_0x2d85e2['shift']());}catch(_0x56f32a){_0x2d85e2['push'](_0x2d85e2['shift']());}}}(_0x44d5,0xa7ab5));export*from'./NodeIKernelSessionListener';export*from'./NodeIKernelLoginListener';function _0x23b0(_0x2d692d,_0x4c5202){var _0x44d51f=_0x44d5();return _0x23b0=function(_0x23b01e,_0xfeaa24){_0x23b01e=_0x23b01e-0x6e;var _0x433272=_0x44d51f[_0x23b01e];return _0x433272;},_0x23b0(_0x2d692d,_0x4c5202);}export*from'./NodeIKernelMsgListener';export*from'./NodeIKernelGroupListener';export*from'./NodeIKernelBuddyListener';export*from'./NodeIKernelProfileListener';export*from'./NodeIKernelRobotListener';function _0x44d5(){var _0x33d489=['6862005TECjMZ','2327142YykVKC','42162gznyAe','100925zXBTKf','12356aZONru','1XJhXoi','950gqEoUr','1950eeShLa','3037461flAqfn','553jATzvv','68624QLDhAH'];_0x44d5=function(){return _0x33d489;};return _0x44d5();}export*from'./NodeIKernelTicketListener';export*from'./NodeIKernelStorageCleanListener';export*from'./NodeIKernelFileAssistantListener';
|
48
src/core.lib/src/login.d.ts
vendored
48
src/core.lib/src/login.d.ts
vendored
@@ -1,48 +0,0 @@
|
||||
import { LoginListener } from './qqnt/listeners';
|
||||
import { LoginInitConfig, NodeIKernelLoginService } from './qqnt/services';
|
||||
import { NapCatCore } from '.';
|
||||
/**
|
||||
* NapCat 登录相关核心类
|
||||
*
|
||||
* **【注意】**:只有在调用 `init` 方法后才会被真正初始化!
|
||||
*/
|
||||
export declare class NapCatCoreLogin {
|
||||
readonly core: NapCatCore;
|
||||
readonly service: NodeIKernelLoginService;
|
||||
readonly listener: LoginListener;
|
||||
constructor(core: NapCatCore);
|
||||
/**
|
||||
* 初始化 `NodeIKernelLoginService`
|
||||
* @param {LoginInitConfig} config `NodeIKernelLoginService` 初始化配置
|
||||
* @returns {void}
|
||||
*/
|
||||
init(config: LoginInitConfig): void;
|
||||
/**
|
||||
* 初始化监听器,用于向父级 `NapCatCore` 发送事件
|
||||
*/
|
||||
private initListener;
|
||||
/**
|
||||
* 获取在此客户端上登录过的账号列表
|
||||
* @returns {Promise<{ result: number, LocalLoginInfoList: LoginListItem[] }>}
|
||||
*/
|
||||
private getLoginList;
|
||||
/**
|
||||
* 使用二维码方式登录账号,获取到的二维码链接可通过 `system.login.qrcode` 事件获取。
|
||||
*/
|
||||
qrcode(): Promise<void>;
|
||||
/**
|
||||
* 使用快速登录方式登录账号,欲登录的账号必须在此客户端上登录过
|
||||
* @param {string} uin 欲登录账户的 Uin
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
quick(uin: string): Promise<void>;
|
||||
/**
|
||||
* 使用账号密码方式登录,需要滑块验证会发送 `system.login.slider` 事件,登录错误会发送 `system.login.error` 事件。
|
||||
* @param {string} uin 登录账号
|
||||
* @param {string} password 登录密码
|
||||
* @param {string} [proofSig] 验证码返回的 ticket
|
||||
* @param {string} [proofRand] 验证码返回的随机字符串值
|
||||
* @param {string} [proofSid] 验证码的 sid
|
||||
*/
|
||||
password(uin: string, password: string, proofSig?: string, proofRand?: string, proofSid?: string): Promise<void>;
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user