mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-07-19 12:03:37 +00:00
Compare commits
476 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
7f8933b0de | ||
![]() |
81608ff025 | ||
![]() |
db63675b8e | ||
![]() |
f74a83bc46 | ||
![]() |
bc1deba3e4 | ||
![]() |
d6113a8f0a | ||
![]() |
2062cd48ea | ||
![]() |
1c965ef515 | ||
![]() |
58291b7156 | ||
![]() |
afd1648d80 | ||
![]() |
21814ffa9a | ||
![]() |
9d3522da54 | ||
![]() |
e07a76755e | ||
![]() |
ba46bcdeae | ||
![]() |
8d7e44314c | ||
![]() |
35a67498c7 | ||
![]() |
90dd934f95 | ||
![]() |
4087045542 | ||
![]() |
d11cef5907 | ||
![]() |
76c91d226c | ||
![]() |
c2b4dd2afd | ||
![]() |
25b39cb39a | ||
![]() |
35dcb7b88b | ||
![]() |
e5f7e7c26e | ||
![]() |
c5c11fd6a6 | ||
![]() |
8134083419 | ||
![]() |
a87e624198 | ||
![]() |
e4c62d20b4 | ||
![]() |
fa195d9e55 | ||
![]() |
5ef5773d23 | ||
![]() |
6eea52afdf | ||
![]() |
80e64af30f | ||
![]() |
563b6ddc36 | ||
![]() |
c051ab9dc4 | ||
![]() |
87737a8bdb | ||
![]() |
94273d80b0 | ||
![]() |
a08ec2a4bd | ||
![]() |
d246c556f4 | ||
![]() |
65aa365e38 | ||
![]() |
eeeae449b4 | ||
![]() |
17c10a7ba2 | ||
![]() |
69f4383678 | ||
![]() |
07852a7295 | ||
![]() |
20b7e9b6b5 | ||
![]() |
75f43ccea4 | ||
![]() |
59e5785e93 | ||
![]() |
b38f52dba9 | ||
![]() |
2a6b17a48e | ||
![]() |
a6c056a894 | ||
![]() |
5c3442a71f | ||
![]() |
390253242f | ||
![]() |
9ab80fe1ac | ||
![]() |
91fdd09e7a | ||
![]() |
db5bd5c8a4 | ||
![]() |
ef94c2fe7c | ||
![]() |
72a25ed8e1 | ||
![]() |
eb065e218f | ||
![]() |
33426736fc | ||
![]() |
896658d5ce | ||
![]() |
b14135ed72 | ||
![]() |
a1baf2e32d | ||
![]() |
f9aa2d3bce | ||
![]() |
c95d0e0696 | ||
![]() |
ad4b84d446 | ||
![]() |
3e27d5fcb0 | ||
![]() |
48a100f49a | ||
![]() |
698649f981 | ||
![]() |
780078c3aa | ||
![]() |
4c25e4ddee | ||
![]() |
c0a5ac2ac5 | ||
![]() |
0435409870 | ||
![]() |
c521269409 | ||
![]() |
1e252b7e4c | ||
![]() |
d72b1edc48 | ||
![]() |
f7307e8e01 | ||
![]() |
127905f04b | ||
![]() |
261c6dabd5 | ||
![]() |
cae84bbf02 | ||
![]() |
cdb2bc52fa | ||
![]() |
cd2972eee0 | ||
![]() |
4036aa8d0e | ||
![]() |
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 |
9
.github/workflows/build.yml
vendored
9
.github/workflows/build.yml
vendored
@@ -1,5 +1,6 @@
|
|||||||
name: "Build"
|
name: "Build"
|
||||||
on:
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
@@ -13,7 +14,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
target_platform: [linux,darwin]
|
target_platform: [linux]
|
||||||
target_arch: [x64, arm64]
|
target_arch: [x64, arm64]
|
||||||
steps:
|
steps:
|
||||||
- name: Clone Main Repository
|
- name: Clone Main Repository
|
||||||
@@ -21,7 +22,8 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
repository: 'NapNeko/NapCatQQ'
|
repository: 'NapNeko/NapCatQQ'
|
||||||
submodules: true
|
submodules: true
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
ref: main
|
||||||
|
token: ${{ secrets.NAPCAT_BUILD }}
|
||||||
- name: Use Node.js 20.X
|
- name: Use Node.js 20.X
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
@@ -52,7 +54,8 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
repository: 'NapNeko/NapCatQQ'
|
repository: 'NapNeko/NapCatQQ'
|
||||||
submodules: true
|
submodules: true
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
ref: main
|
||||||
|
token: ${{ secrets.NAPCAT_BUILD }}
|
||||||
- name: Use Node.js 20.X
|
- name: Use Node.js 20.X
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
|
12
.github/workflows/release.yml
vendored
12
.github/workflows/release.yml
vendored
@@ -36,7 +36,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
target_platform: [linux,darwin]
|
target_platform: [linux]
|
||||||
target_arch: [x64, arm64]
|
target_arch: [x64, arm64]
|
||||||
steps:
|
steps:
|
||||||
- name: Clone Main Repository
|
- name: Clone Main Repository
|
||||||
@@ -53,6 +53,8 @@ jobs:
|
|||||||
|
|
||||||
- name: Build NuCat Linux
|
- name: Build NuCat Linux
|
||||||
run: |
|
run: |
|
||||||
|
export NAPCAT_BUILDSYS=${{ matrix.target_platform }}
|
||||||
|
export NAPCAT_BUILDARCH=${{ matrix.target_arch }}
|
||||||
npm i --arch=${{ matrix.target_arch }} --platform=${{ matrix.target_platform }}
|
npm i --arch=${{ matrix.target_arch }} --platform=${{ matrix.target_platform }}
|
||||||
npm run build:prod
|
npm run build:prod
|
||||||
cd dist
|
cd dist
|
||||||
@@ -87,6 +89,8 @@ jobs:
|
|||||||
|
|
||||||
- name: Build NuCat Linux
|
- name: Build NuCat Linux
|
||||||
run: |
|
run: |
|
||||||
|
export NAPCAT_BUILDSYS=${{ matrix.target_platform }}
|
||||||
|
export NAPCAT_BUILDARCH=${{ matrix.target_arch }}
|
||||||
npm i --arch=${{ matrix.target_arch }} --platform=${{ matrix.target_platform }}
|
npm i --arch=${{ matrix.target_arch }} --platform=${{ matrix.target_platform }}
|
||||||
npm run build:prod
|
npm run build:prod
|
||||||
cd dist
|
cd dist
|
||||||
@@ -115,12 +119,16 @@ jobs:
|
|||||||
|
|
||||||
- name: Extract version from tag
|
- name: Extract version from tag
|
||||||
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
|
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
|
- name: Create Release Draft and Upload Artifacts
|
||||||
uses: softprops/action-gh-release@v1
|
uses: softprops/action-gh-release@v1
|
||||||
with:
|
with:
|
||||||
name: NapCat V${{ env.VERSION }}
|
name: NapCat V${{ env.VERSION }}
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
body_path: CHANGELOG.md
|
||||||
files: |
|
files: |
|
||||||
NapCat.win32.x64.zip
|
NapCat.win32.x64.zip
|
||||||
NapCat.linux.x64.zip
|
NapCat.linux.x64.zip
|
||||||
|
6
.gitignore
vendored
6
.gitignore
vendored
@@ -1,11 +1,11 @@
|
|||||||
# Logs
|
|
||||||
|
|
||||||
# Develop
|
# Develop
|
||||||
node_modules/
|
node_modules/
|
||||||
package-lock.json
|
package-lock.json
|
||||||
|
pnpm-lock.yaml
|
||||||
out/
|
out/
|
||||||
dist/
|
dist/
|
||||||
src/core.lib/common/
|
src/core.lib/common/
|
||||||
|
test
|
||||||
|
|
||||||
# Editor
|
# Editor
|
||||||
.vscode/*
|
.vscode/*
|
||||||
@@ -14,4 +14,4 @@ src/core.lib/common/
|
|||||||
|
|
||||||
# Build
|
# Build
|
||||||
*.db
|
*.db
|
||||||
checkVersion.sh
|
checkVersion.sh
|
||||||
|
17
CHANGELOG.md
Normal file
17
CHANGELOG.md
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# v1.3.5
|
||||||
|
|
||||||
|
QQ Version: Windows 9.9.9-23424 / Linux 3.2.7-23361
|
||||||
|
|
||||||
|
## 修复与优化
|
||||||
|
* 尝试修复多开崩溃问题
|
||||||
|
* 修复群列表更新问题
|
||||||
|
* 修复兼容性问题支持Win7
|
||||||
|
* 修复下载 http 资源缺少UA
|
||||||
|
* 优化少量消息合并转发速度
|
||||||
|
* 修复加载群通知时出现 getUserDetailInfo timeout 导致程序崩溃
|
||||||
|
|
||||||
|
## 新增与调整
|
||||||
|
* 新增设置群公告 Api: /_send_group_notice
|
||||||
|
* 新增重启实现 包括重启快速登录/普通重启 副作用: 原进程 无法清理
|
||||||
|
|
||||||
|
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
162
README.md
162
README.md
@@ -4,168 +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/) 页面下载最新版本
|
||||||
|
|
||||||
目前只支持 onebot11 协议
|
**首次使用** 请务必前往 [官方文档](https://napneko.github.io/) 查看使用文档与教程
|
||||||
|
|
||||||
## 下载
|
|
||||||
|
|
||||||
前往 Release 页面下载最新版本
|
## 项目声明
|
||||||
|
|
||||||
## 启动
|
|
||||||
|
|
||||||
NapCat 是基于 官方NTQQ 实现的Bot框架,因此先需要安装官方QQ,**注意同个账号不能同时登录原版 QQ 和 NapCatQQ**
|
|
||||||
|
|
||||||
*如果没有安装 QQ 请往后翻查看安装方法*
|
|
||||||
|
|
||||||
修改 `config/onebot11.json`内容,并重名为 `onebot11_<你的QQ号>.json`,如`onebot11_1234567.json`
|
|
||||||
|
|
||||||
json 配置内容参数解释:
|
|
||||||
|
|
||||||
```json5
|
|
||||||
{
|
|
||||||
// 是否启用http服务, true为启动,false为禁用,如果启用,可以通过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心跳
|
|
||||||
"enableHttpHeart": false,
|
|
||||||
// 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`
|
|
||||||
|
|
||||||
或使用[NapCatDocker](https://github.com/NapNeko/NapCat-Docker)
|
|
||||||
|
|
||||||
## 使用无需扫码快速登录
|
|
||||||
|
|
||||||
前提是你已经成功登录过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 相关知识,切勿用于违法用途
|
* 请不要在无关地方宣传NapCatQQ,本项目只是用于学习 node 相关知识,切勿用于违法用途
|
||||||
|
|
||||||
* NapCat 不会收集用户隐私信息,但是未来可能会为了更好的利于 NapCat 的优化会收集一些设备信息,如 cpu 架构,系统版本等
|
* NapCat 不会收集用户隐私信息,但是未来可能会为了更好的利于 NapCat 的优化会收集一些设备信息,如 cpu 架构,系统版本等
|
||||||
|
|
||||||
## 相关链接
|
## 相关链接
|
||||||
|
[Telegram Link](https://t.me/+nLZEnpne-pQ1OWFl)
|
||||||
[TG群](https://t.me/+nLZEnpne-pQ1OWFl)
|
|
||||||
|
|
||||||
## 鸣谢名单
|
## 鸣谢名单
|
||||||
[OpenShamrock]()
|
|
||||||
|
|
||||||
[Lagrange]()
|
[Lagrange](https://github.com/LagrangeDev/Lagrange.Core)
|
||||||
|
|
||||||
|
<!--
|
||||||
|
QQ群:545402644
|
||||||
|
-->
|
||||||
|
10
package.json
10
package.json
@@ -2,14 +2,15 @@
|
|||||||
"name": "napcat",
|
"name": "napcat",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "1.1.0",
|
"version": "1.3.2",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"watch:dev": "vite --mode development",
|
"watch:dev": "vite --mode development",
|
||||||
"watch:prod": "vite --mode production",
|
"watch:prod": "vite --mode production",
|
||||||
"build:dev": "vite build --mode development",
|
"build:dev": "vite build --mode development",
|
||||||
"build:prod": "vite build --mode production",
|
"build:prod": "vite build --mode production",
|
||||||
"build": "npm run build:dev",
|
"build": "npm run build:dev",
|
||||||
"build:core": "cd ./src/core && 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",
|
"watch": "npm run watch:dev",
|
||||||
"debug-win": "powershell dist/napcat.ps1",
|
"debug-win": "powershell dist/napcat.ps1",
|
||||||
"lint": "eslint --fix src/**/*.{js,ts}",
|
"lint": "eslint --fix src/**/*.{js,ts}",
|
||||||
@@ -50,16 +51,15 @@
|
|||||||
"commander": "^12.0.0",
|
"commander": "^12.0.0",
|
||||||
"cors": "^2.8.5",
|
"cors": "^2.8.5",
|
||||||
"express": "^5.0.0-beta.2",
|
"express": "^5.0.0-beta.2",
|
||||||
|
"fast-xml-parser": "^4.3.6",
|
||||||
"file-type": "^19.0.0",
|
"file-type": "^19.0.0",
|
||||||
"fluent-ffmpeg": "^2.1.2",
|
"fluent-ffmpeg": "^2.1.2",
|
||||||
"image-size": "^1.1.1",
|
"image-size": "^1.1.1",
|
||||||
"log4js": "^6.9.1",
|
"log4js": "^6.9.1",
|
||||||
"protobufjs": "^7.2.6",
|
|
||||||
"qrcode-terminal": "^0.12.0",
|
"qrcode-terminal": "^0.12.0",
|
||||||
"silk-wasm": "^3.3.4",
|
"silk-wasm": "^3.3.4",
|
||||||
"sqlite3": "^5.1.7",
|
"sqlite3": "^5.1.7",
|
||||||
"uuid": "^9.0.1",
|
"uuid": "^9.0.1",
|
||||||
"ws": "^8.16.0",
|
"ws": "^8.16.0"
|
||||||
"yaml": "^2.4.1"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -9,5 +9,5 @@ if (currentVersion === targetVersion) {
|
|||||||
fs.writeFileSync("./checkVersion.sh", "#!/bin/bashe\necho \"CheckVersion Is Done\"")
|
fs.writeFileSync("./checkVersion.sh", "#!/bin/bashe\necho \"CheckVersion Is Done\"")
|
||||||
} else {
|
} else {
|
||||||
let runscript = "sed -i 's/\"version\": \"" + currentVersion + "\"/\"version\": \"" + targetVersion + "\"/g' package.json";
|
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.nanaeo.cn\"\n git config --global user.name \"Version\"\n" + runscript + "\ngit add .\n git commit -m \"chore:version change\"\n git push -u origin main")
|
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,90 +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>();
|
|
||||||
|
|
||||||
export function deleteGroup(groupQQ: string) {
|
|
||||||
groups.delete(groupQQ);
|
|
||||||
groupMembers.delete(groupQQ);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 群号 -> 群成员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,13 +1,13 @@
|
|||||||
import express, { Express, Request, Response } from 'express';
|
import express, { Express, Request, Response } from 'express';
|
||||||
import cors from 'cors';
|
import cors from 'cors';
|
||||||
import http from 'http';
|
import http from 'http';
|
||||||
import { log } from '../utils/log';
|
import { log, logDebug, logError } from '../utils/log';
|
||||||
import { ob11Config } from '@/onebot11/config';
|
import { ob11Config } from '@/onebot11/config';
|
||||||
|
|
||||||
type RegisterHandler = (res: Response, payload: any) => Promise<any>
|
type RegisterHandler = (res: Response, payload: any) => Promise<any>
|
||||||
|
|
||||||
export abstract class HttpServerBase {
|
export abstract class HttpServerBase {
|
||||||
name: string = 'LLOneBot';
|
name: string = 'NapCatQQ';
|
||||||
private readonly expressAPP: Express;
|
private readonly expressAPP: Express;
|
||||||
private server: http.Server | null = null;
|
private server: http.Server | null = null;
|
||||||
|
|
||||||
@@ -23,7 +23,7 @@ export abstract class HttpServerBase {
|
|||||||
// 调用原始的express.json()处理器
|
// 调用原始的express.json()处理器
|
||||||
originalJson(req, res, (err) => {
|
originalJson(req, res, (err) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
log('Error parsing JSON:', err);
|
logError('Error parsing JSON:', err);
|
||||||
return res.status(400).send('Invalid JSON');
|
return res.status(400).send('Invalid JSON');
|
||||||
}
|
}
|
||||||
next();
|
next();
|
||||||
@@ -37,14 +37,14 @@ export abstract class HttpServerBase {
|
|||||||
const authHeader = req.get('authorization');
|
const authHeader = req.get('authorization');
|
||||||
if (authHeader) {
|
if (authHeader) {
|
||||||
clientToken = authHeader.split('Bearer ').pop() || '';
|
clientToken = authHeader.split('Bearer ').pop() || '';
|
||||||
log('receive http header token', clientToken);
|
logDebug('receive http header token', clientToken);
|
||||||
} else if (req.query.access_token) {
|
} else if (req.query.access_token) {
|
||||||
if (Array.isArray(req.query.access_token)) {
|
if (Array.isArray(req.query.access_token)) {
|
||||||
clientToken = req.query.access_token[0].toString();
|
clientToken = req.query.access_token[0].toString();
|
||||||
} else {
|
} else {
|
||||||
clientToken = req.query.access_token.toString();
|
clientToken = req.query.access_token.toString();
|
||||||
}
|
}
|
||||||
log('receive http url token', clientToken);
|
logDebug('receive http url token', clientToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (serverToken && clientToken != serverToken) {
|
if (serverToken && clientToken != serverToken) {
|
||||||
@@ -53,29 +53,29 @@ export abstract class HttpServerBase {
|
|||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
|
|
||||||
start(port: number) {
|
start(port: number, host: string) {
|
||||||
try {
|
try {
|
||||||
this.expressAPP.get('/', (req: Request, res: Response) => {
|
this.expressAPP.get('/', (req: Request, res: Response) => {
|
||||||
res.send(`${this.name}已启动`);
|
res.send(`${this.name}已启动`);
|
||||||
});
|
});
|
||||||
this.listen(port);
|
this.listen(port, host);
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
log('HTTP服务启动失败', e.toString());
|
logError('HTTP服务启动失败', e.toString());
|
||||||
// llonebotError.httpServerError = "HTTP服务启动失败, " + e.toString()
|
// httpServerError = "HTTP服务启动失败, " + e.toString()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stop() {
|
stop() {
|
||||||
// llonebotError.httpServerError = ""
|
// httpServerError = ""
|
||||||
if (this.server) {
|
if (this.server) {
|
||||||
this.server.close();
|
this.server.close();
|
||||||
this.server = null;
|
this.server = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
restart(port: number) {
|
restart(port: number, host: string) {
|
||||||
this.stop();
|
this.stop();
|
||||||
this.start(port);
|
this.start(port, host);
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract handleFailed(res: Response, payload: any, err: any): void
|
abstract handleFailed(res: Response, payload: any, err: any): void
|
||||||
@@ -88,7 +88,7 @@ export abstract class HttpServerBase {
|
|||||||
// @ts-expect-error wait fix
|
// @ts-expect-error wait fix
|
||||||
if (!this.expressAPP[method]) {
|
if (!this.expressAPP[method]) {
|
||||||
const err = `${this.name} register router failed,${method} not exist`;
|
const err = `${this.name} register router failed,${method} not exist`;
|
||||||
log(err);
|
logError(err);
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
// @ts-expect-error wait fix
|
// @ts-expect-error wait fix
|
||||||
@@ -99,7 +99,7 @@ export abstract class HttpServerBase {
|
|||||||
} else if (req.query) {
|
} else if (req.query) {
|
||||||
payload = { ...req.query, ...req.body };
|
payload = { ...req.query, ...req.body };
|
||||||
}
|
}
|
||||||
log('收到http请求', url, payload);
|
logDebug('收到http请求', url, payload);
|
||||||
try {
|
try {
|
||||||
res.send(await handler(res, payload));
|
res.send(await handler(res, payload));
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
@@ -108,10 +108,15 @@ export abstract class HttpServerBase {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
protected listen(port: number) {
|
protected listen(port: number, host: string = '0.0.0.0') {
|
||||||
this.server = this.expressAPP.listen(port, '0.0.0.0', () => {
|
host = host || '0.0.0.0';
|
||||||
const info = `${this.name} started 0.0.0.0:${port}`;
|
try {
|
||||||
log(info);
|
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,14 +27,16 @@ export class WebsocketServerBase {
|
|||||||
constructor() {
|
constructor() {
|
||||||
}
|
}
|
||||||
|
|
||||||
start(port: number) {
|
start(port: number, host: string = '') {
|
||||||
try {
|
try {
|
||||||
this.ws = new WebSocketServer({
|
this.ws = new WebSocketServer({
|
||||||
port ,
|
port ,
|
||||||
|
host: '',
|
||||||
maxPayload: 1024 * 1024 * 1024
|
maxPayload: 1024 * 1024 * 1024
|
||||||
});
|
});
|
||||||
|
log(`ws服务启动成功, ${host}:${port}`);
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
throw Error('ws服务启动失败, ' + e.toString());
|
throw Error('ws服务启动失败, 请检查监听的ip和端口' + e.toString());
|
||||||
}
|
}
|
||||||
this.ws.on('connection', (wsClient, req) => {
|
this.ws.on('connection', (wsClient, req) => {
|
||||||
const url: string = req.url!.split('?').shift() || '/';
|
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 = {
|
let _qqVersionConfigInfo: QQVersionConfigInfo = {
|
||||||
'baseVersion': '9.9.9-22578',
|
'baseVersion': '9.9.9-23361',
|
||||||
'curVersion': '9.9.9-22578',
|
'curVersion': '9.9.9-23361',
|
||||||
'prevVersion': '',
|
'prevVersion': '',
|
||||||
'onErrorVersions': [],
|
'onErrorVersions': [],
|
||||||
'buildId': '22578'
|
'buildId': '23361'
|
||||||
};
|
};
|
||||||
|
|
||||||
if (fs.existsSync(configVersionInfoPath)) {
|
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 qqVersionConfigInfo: QQVersionConfigInfo = _qqVersionConfigInfo;
|
||||||
|
|
||||||
export const qqPkgInfo: QQPkgInfo = require(pkgInfoPath);
|
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') {
|
if (systemPlatform === 'linux') {
|
||||||
_appid = '537213710';
|
_appid = '537213827';
|
||||||
}
|
}
|
||||||
// todo: mac 平台的 appid
|
// todo: mac 平台的 appid
|
||||||
export const appid = _appid;
|
export const appid = _appid;
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import { encode, getDuration, getWavFileInfo, isWav } from 'silk-wasm';
|
import { encode, getDuration, getWavFileInfo, isWav } from 'silk-wasm';
|
||||||
import fsPromise from 'fs/promises';
|
import fsPromise from 'fs/promises';
|
||||||
import { log } from './log';
|
import { log, logError } from './log';
|
||||||
import path from 'node:path';
|
import path from 'node:path';
|
||||||
import { v4 as uuidv4 } from 'uuid';
|
import { v4 as uuidv4 } from 'uuid';
|
||||||
import { spawn } from 'node:child_process';
|
import { spawn } from 'node:child_process';
|
||||||
@@ -129,7 +129,7 @@ export async function encodeSilk(filePath: string) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
log('convert silk failed', error.stack);
|
logError('convert silk failed', error.stack);
|
||||||
return {};
|
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 util from 'util';
|
||||||
import path from 'node:path';
|
import path from 'node:path';
|
||||||
import { log } from './log';
|
import { log } from './log';
|
||||||
import { dbUtil } from './db';
|
import { dbUtil } from '@/core/utils/db';
|
||||||
import * as fileType from 'file-type';
|
import * as fileType from 'file-type';
|
||||||
import { v4 as uuidv4 } from 'uuid';
|
import { v4 as uuidv4 } from 'uuid';
|
||||||
import { napCatCore } from '@/core';
|
import { napCatCore } from '@/core';
|
||||||
|
|
||||||
export const getNapCatDir = () => {
|
export const getNapCatDir = () => {
|
||||||
const p = path.join(napCatCore.wrapper.dataPath, 'NapCat');
|
const p = path.join(napCatCore.dataPath, 'NapCat');
|
||||||
fs.mkdirSync(p, { recursive: true });
|
fs.mkdirSync(p, { recursive: true });
|
||||||
return p;
|
return p;
|
||||||
};
|
};
|
||||||
@@ -125,7 +125,7 @@ export async function httpDownload(options: string | HttpDownloadOptions): Promi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const fetchRes = await fetch(url, headers);
|
const fetchRes = await fetch(url, { headers });
|
||||||
if (!fetchRes.ok) throw new Error(`下载文件失败: ${fetchRes.statusText}`);
|
if (!fetchRes.ok) throw new Error(`下载文件失败: ${fetchRes.statusText}`);
|
||||||
|
|
||||||
const blob = await fetchRes.blob();
|
const blob = await fetchRes.blob();
|
||||||
@@ -193,6 +193,7 @@ export async function uri2local(uri: string, fileName: string | null = null): Pr
|
|||||||
// res.ext = pathInfo.ext
|
// res.ext = pathInfo.ext
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fileName = fileName.replace(/[/\\:*?"<>|]/g, '_');
|
||||||
res.fileName = fileName;
|
res.fileName = fileName;
|
||||||
filePath = path.join(getTempDir(), uuidv4() + fileName);
|
filePath = path.join(getTempDir(), uuidv4() + fileName);
|
||||||
fs.writeFileSync(filePath, buffer);
|
fs.writeFileSync(filePath, buffer);
|
||||||
|
@@ -18,3 +18,20 @@ export function isNull(value: any) {
|
|||||||
export function isNumeric(str: string) {
|
export function isNumeric(str: string) {
|
||||||
return /^\d+$/.test(str);
|
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,117 @@
|
|||||||
|
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');
|
||||||
|
const milliseconds = now.getMilliseconds().toString().padStart(3, '0');
|
||||||
|
return `${year}-${month}-${day}_${hours}-${minutes}-${seconds}.${milliseconds}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
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[]) {
|
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等级换算
|
// QQ等级换算
|
||||||
import { QQLevel } from '@/core/qqnt/entities';
|
import { QQLevel } from '@/core/entities';
|
||||||
|
|
||||||
export function calcQQLevel(level: QQLevel) {
|
export function calcQQLevel(level: QQLevel) {
|
||||||
const { crownNum, sunNum, moonNum, starNum } = level;
|
const { crownNum, sunNum, moonNum, starNum } = level;
|
||||||
|
30
src/common/utils/reboot.ts
Normal file
30
src/common/utils/reboot.ts
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
import { exit } from "process";
|
||||||
|
import { resolve } from "path";
|
||||||
|
import { spawn } from "node:child_process";
|
||||||
|
import { sleep } from "./helper";
|
||||||
|
|
||||||
|
export async function rebootWithQuickLogin(uin: string) {
|
||||||
|
let batScript = resolve(__dirname, './napcat.bat');
|
||||||
|
let batUtf8Script = resolve(__dirname, './napcat-utf8.bat');
|
||||||
|
let bashScript = resolve(__dirname, './napcat.sh');
|
||||||
|
if (process.platform === 'win32') {
|
||||||
|
let subProcess = spawn(`start ${batUtf8Script} -q ${uin}`, { detached: true, windowsHide: false, env: process.env, shell: true, stdio: 'ignore'});
|
||||||
|
subProcess.unref();
|
||||||
|
} else if (process.platform === 'linux') {
|
||||||
|
let subProcess = spawn(`${bashScript} -q ${uin}`, { detached: true, windowsHide: false, env: process.env, shell: true, stdio: 'ignore' });
|
||||||
|
subProcess.unref();
|
||||||
|
}
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
export async function rebootWithNormolLogin() {
|
||||||
|
let batScript = resolve(__dirname, './napcat.bat');
|
||||||
|
let batUtf8Script = resolve(__dirname, './napcat-utf8.bat');
|
||||||
|
let bashScript = resolve(__dirname, './napcat.sh');
|
||||||
|
if (process.platform === 'win32') {
|
||||||
|
spawn(`start ${batUtf8Script}`, { detached: true, windowsHide: false, env: process.env, shell: true });
|
||||||
|
} else if (process.platform === 'linux') {
|
||||||
|
spawn(`${bashScript}`, { detached: true, windowsHide: false, env: process.env, shell: true });
|
||||||
|
}
|
||||||
|
await sleep(500);
|
||||||
|
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();
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
@@ -1,9 +1,17 @@
|
|||||||
import os from 'node:os';
|
import os from 'node:os';
|
||||||
import path from 'node:path';
|
import path from 'node:path';
|
||||||
|
|
||||||
|
// 缓解Win7设备兼容性问题
|
||||||
|
let osName: string;
|
||||||
|
try {
|
||||||
|
osName = os.hostname();
|
||||||
|
} catch (e) {
|
||||||
|
osName = 'NapCat'; // + crypto.randomUUID().substring(0, 4);
|
||||||
|
}
|
||||||
export const systemPlatform = os.platform();
|
export const systemPlatform = os.platform();
|
||||||
|
export const cpuArch = os.arch();
|
||||||
export const systemVersion = os.release();
|
export const systemVersion = os.release();
|
||||||
export const hostname = os.hostname();
|
export const hostname = osName;
|
||||||
const homeDir = os.homedir();
|
const homeDir = os.homedir();
|
||||||
export const downloadsPath = path.join(homeDir, 'Downloads');
|
export const downloadsPath = path.join(homeDir, 'Downloads');
|
||||||
export const systemName = os.type();
|
export const systemName = os.type();
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { request } from 'https';
|
import { request } from 'node:https';
|
||||||
export function postLoginStatus() {
|
export function postLoginStatus() {
|
||||||
const req = request(
|
const req = request(
|
||||||
{
|
{
|
||||||
@@ -34,7 +34,7 @@ export function postLoginStatus() {
|
|||||||
'screen': '1920x1080',
|
'screen': '1920x1080',
|
||||||
'language': 'zh-CN',
|
'language': 'zh-CN',
|
||||||
'title': 'OneBot.Login',
|
'title': 'OneBot.Login',
|
||||||
'url': '/login/onebot11',
|
'url': '/login/onebot11/1.3.2',
|
||||||
'referrer': 'https://napcat.demo.cn/login?type=onebot11'
|
'referrer': 'https://napcat.demo.cn/login?type=onebot11'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@@ -16,8 +16,7 @@ export async function getVideoInfo(filePath: string) {
|
|||||||
size: number,
|
size: number,
|
||||||
filePath: string
|
filePath: string
|
||||||
}>((resolve, reject) => {
|
}>((resolve, reject) => {
|
||||||
// todo: 从配置文件中读取ffmpeg路径
|
const ffmpegPath = process.env.FFMPEG_PATH;
|
||||||
const ffmpegPath = './ffmpeg';
|
|
||||||
ffmpegPath && ffmpeg.setFfmpegPath(ffmpegPath);
|
ffmpegPath && ffmpeg.setFfmpegPath(ffmpegPath);
|
||||||
ffmpeg(filePath).ffprobe((err: any, metadata: any) => {
|
ffmpeg(filePath).ffprobe((err: any, metadata: any) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
@@ -27,7 +26,7 @@ export async function getVideoInfo(filePath: string) {
|
|||||||
if (videoStream) {
|
if (videoStream) {
|
||||||
console.log(`视频尺寸: ${videoStream.width}x${videoStream.height}`);
|
console.log(`视频尺寸: ${videoStream.width}x${videoStream.height}`);
|
||||||
} else {
|
} else {
|
||||||
console.log('未找到视频流信息。');
|
return reject('未找到视频流信息。');
|
||||||
}
|
}
|
||||||
resolve({
|
resolve({
|
||||||
width: videoStream.width, height: videoStream.height,
|
width: videoStream.width, height: videoStream.height,
|
||||||
@@ -85,4 +84,4 @@ export function checkFfmpeg(newPath: string | null = null): Promise<boolean> {
|
|||||||
resolve(false);
|
resolve(false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
2
src/core
2
src/core
Submodule src/core updated: 5aecf12000...ca47eb4754
@@ -1,5 +1,5 @@
|
|||||||
interface IDependsAdapter {
|
interface IDependsAdapter {
|
||||||
onMSFStatusChange(args: unknown): void;
|
onMSFStatusChange(arg1: number, arg2: number): void;
|
||||||
onMSFSsoError(args: unknown): void;
|
onMSFSsoError(args: unknown): void;
|
||||||
getGroupCode(args: unknown): void;
|
getGroupCode(args: unknown): void;
|
||||||
}
|
}
|
||||||
@@ -7,7 +7,7 @@ export interface NodeIDependsAdapter extends IDependsAdapter {
|
|||||||
new (adapter: IDependsAdapter): NodeIDependsAdapter;
|
new (adapter: IDependsAdapter): NodeIDependsAdapter;
|
||||||
}
|
}
|
||||||
export declare class DependsAdapter implements IDependsAdapter {
|
export declare class DependsAdapter implements IDependsAdapter {
|
||||||
onMSFStatusChange(args: unknown): void;
|
onMSFStatusChange(arg1: number, arg2: number): void;
|
||||||
onMSFSsoError(args: unknown): void;
|
onMSFSsoError(args: unknown): void;
|
||||||
getGroupCode(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 @@
|
|||||||
|
var _0x4a2dd5=_0x12f4;function _0x12f4(_0x4f7dce,_0x480131){var _0x547d83=_0x547d();return _0x12f4=function(_0x12f42f,_0x334fdd){_0x12f42f=_0x12f42f-0x1cb;var _0x3310f6=_0x547d83[_0x12f42f];return _0x3310f6;},_0x12f4(_0x4f7dce,_0x480131);}(function(_0x9627ef,_0x2bdc4c){var _0x3f5c0b=_0x12f4,_0x5bc9a4=_0x9627ef();while(!![]){try{var _0x556f14=parseInt(_0x3f5c0b(0x1d4))/0x1*(-parseInt(_0x3f5c0b(0x1d3))/0x2)+parseInt(_0x3f5c0b(0x1d2))/0x3*(parseInt(_0x3f5c0b(0x1d7))/0x4)+-parseInt(_0x3f5c0b(0x1cc))/0x5*(-parseInt(_0x3f5c0b(0x1d1))/0x6)+parseInt(_0x3f5c0b(0x1d0))/0x7+-parseInt(_0x3f5c0b(0x1d5))/0x8*(parseInt(_0x3f5c0b(0x1cd))/0x9)+-parseInt(_0x3f5c0b(0x1d9))/0xa*(-parseInt(_0x3f5c0b(0x1ce))/0xb)+-parseInt(_0x3f5c0b(0x1d8))/0xc;if(_0x556f14===_0x2bdc4c)break;else _0x5bc9a4['push'](_0x5bc9a4['shift']());}catch(_0x559019){_0x5bc9a4['push'](_0x5bc9a4['shift']());}}}(_0x547d,0x4b59c));export class DependsAdapter{[_0x4a2dd5(0x1d6)](_0x2e3fe8,_0x39c8a2){}[_0x4a2dd5(0x1cf)](_0x34d16e){}[_0x4a2dd5(0x1cb)](_0x104a00){}}function _0x547d(){var _0x4e70b8=['15198348kbkZdd','4618720hiFSGe','getGroupCode','10RIIEqo','963hJDrHe','11cuwaTr','onMSFSsoError','1973643mhShYL','1295832JrGnte','67674WuMgex','20992AJscdr','16mTDfYR','3120SgHmrF','onMSFStatusChange','108mHyias'];_0x547d=function(){return _0x4e70b8;};return _0x547d();}
|
1
src/core.lib/src/adapters/NodeIDispatcherAdapter.js
Normal file
1
src/core.lib/src/adapters/NodeIDispatcherAdapter.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
var _0x407b46=_0x1833;(function(_0x516f63,_0x1b3b0a){var _0x381bfc=_0x1833,_0x409fe0=_0x516f63();while(!![]){try{var _0x2be90d=-parseInt(_0x381bfc(0x100))/0x1+parseInt(_0x381bfc(0x10a))/0x2+parseInt(_0x381bfc(0x101))/0x3+-parseInt(_0x381bfc(0x109))/0x4*(parseInt(_0x381bfc(0x107))/0x5)+-parseInt(_0x381bfc(0x10b))/0x6*(-parseInt(_0x381bfc(0x106))/0x7)+-parseInt(_0x381bfc(0x102))/0x8*(-parseInt(_0x381bfc(0x104))/0x9)+parseInt(_0x381bfc(0x108))/0xa;if(_0x2be90d===_0x1b3b0a)break;else _0x409fe0['push'](_0x409fe0['shift']());}catch(_0x183fce){_0x409fe0['push'](_0x409fe0['shift']());}}}(_0x178b,0xc80ab));function _0x1833(_0x5c0970,_0xcbb3e5){var _0x178b71=_0x178b();return _0x1833=function(_0x1833c5,_0x16a140){_0x1833c5=_0x1833c5-0x100;var _0x5532ca=_0x178b71[_0x1833c5];return _0x5532ca;},_0x1833(_0x5c0970,_0xcbb3e5);}function _0x178b(){var _0x41b0ba=['2419212dHjiqm','10220fMGzmm','5351982NsIIKA','616177BJJVgt','3230223FFvyuy','16ugrmhE','dispatchRequest','420291ULsxBx','dispatchCall','7NlPUBY','10csQijM','5779080KhWrhV'];_0x178b=function(){return _0x41b0ba;};return _0x178b();}export class DispatcherAdapter{[_0x407b46(0x103)](_0x4c3547){}[_0x407b46(0x105)](_0x3b0236){}['dispatchCallWithJson'](_0x52049a){}}
|
1
src/core.lib/src/adapters/NodeIGlobalAdapter.js
Normal file
1
src/core.lib/src/adapters/NodeIGlobalAdapter.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
var _0xfcd9c0=_0x55ff;(function(_0x4fa3a3,_0x26d853){var _0x246b07=_0x55ff,_0x1637cf=_0x4fa3a3();while(!![]){try{var _0x2c5d32=-parseInt(_0x246b07(0xd1))/0x1*(parseInt(_0x246b07(0xc4))/0x2)+parseInt(_0x246b07(0xc6))/0x3*(parseInt(_0x246b07(0xd0))/0x4)+-parseInt(_0x246b07(0xce))/0x5*(-parseInt(_0x246b07(0xcb))/0x6)+-parseInt(_0x246b07(0xd2))/0x7*(-parseInt(_0x246b07(0xd3))/0x8)+-parseInt(_0x246b07(0xcf))/0x9+parseInt(_0x246b07(0xc9))/0xa+parseInt(_0x246b07(0xcd))/0xb*(-parseInt(_0x246b07(0xc5))/0xc);if(_0x2c5d32===_0x26d853)break;else _0x1637cf['push'](_0x1637cf['shift']());}catch(_0x23e1d2){_0x1637cf['push'](_0x1637cf['shift']());}}}(_0x2d86,0xab51c));function _0x2d86(){var _0xfb555e=['onInstallFinished','76350KYwdri','getAppSetting','3747271gJKCYE','365ScOdzT','3235986YqSKlS','4703528ovkWAy','11wVzoHr','5782bYsaKI','4432UYllEK','onGetOfflineMsg','onShowErrUITips','137686eYpvEa','48LqOcgW','3EsWAlU','onLog','onGetSrvCalTime','6187840yCjsae'];_0x2d86=function(){return _0xfb555e;};return _0x2d86();}function _0x55ff(_0x21415e,_0x43e0b1){var _0x2d8653=_0x2d86();return _0x55ff=function(_0x55ff6e,_0x376a11){_0x55ff6e=_0x55ff6e-0xc4;var _0x4f9ca5=_0x2d8653[_0x55ff6e];return _0x4f9ca5;},_0x55ff(_0x21415e,_0x43e0b1);}export class GlobalAdapter{[_0xfcd9c0(0xc7)](..._0x36c923){}[_0xfcd9c0(0xc8)](..._0xcf3bb8){}[_0xfcd9c0(0xd5)](..._0x36f13f){}['fixPicImgType'](..._0xfbf752){}[_0xfcd9c0(0xcc)](..._0x1b9ed1){}[_0xfcd9c0(0xca)](..._0x3b5364){}['onUpdateGeneralFlag'](..._0x3a52ef){}[_0xfcd9c0(0xd4)](..._0x3634cf){}}
|
1
src/core.lib/src/adapters/index.js
Normal file
1
src/core.lib/src/adapters/index.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
function _0x8bc2(){var _0x53c92a=['3186430WGLUJl','18VlHADW','771252uuZVeE','15389100uoHgNn','2902053QrIwPp','4089380CmuSYG','21424QKMQuj','8vJYlYG','2800602WzZXQp'];_0x8bc2=function(){return _0x53c92a;};return _0x8bc2();}(function(_0x131c04,_0x20ec2c){var _0x2d59c5=_0x2e3b,_0x37fcfd=_0x131c04();while(!![]){try{var _0xc05e61=parseInt(_0x2d59c5(0x179))/0x1*(parseInt(_0x2d59c5(0x174))/0x2)+parseInt(_0x2d59c5(0x175))/0x3+-parseInt(_0x2d59c5(0x178))/0x4+-parseInt(_0x2d59c5(0x17c))/0x5+parseInt(_0x2d59c5(0x17b))/0x6+-parseInt(_0x2d59c5(0x177))/0x7*(parseInt(_0x2d59c5(0x17a))/0x8)+parseInt(_0x2d59c5(0x176))/0x9;if(_0xc05e61===_0x20ec2c)break;else _0x37fcfd['push'](_0x37fcfd['shift']());}catch(_0x1ccbe8){_0x37fcfd['push'](_0x37fcfd['shift']());}}}(_0x8bc2,0x86da5));export*from'./NodeIDependsAdapter';function _0x2e3b(_0x20303a,_0x1c8b13){var _0x8bc2b0=_0x8bc2();return _0x2e3b=function(_0x2e3b91,_0x4a970d){_0x2e3b91=_0x2e3b91-0x174;var _0x44181a=_0x8bc2b0[_0x2e3b91];return _0x44181a;},_0x2e3b(_0x20303a,_0x1c8b13);}export*from'./NodeIDispatcherAdapter';export*from'./NodeIGlobalAdapter';
|
37
src/core.lib/src/apis/file.d.ts
vendored
Normal file
37
src/core.lib/src/apis/file.d.ts
vendored
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
import { CacheFileListItem, CacheFileType, ChatCacheListItemBasic, ChatType, ElementType } 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(element: {
|
||||||
|
originImageUrl: any;
|
||||||
|
md5HexStr?: any;
|
||||||
|
fileUuid: any;
|
||||||
|
}, isPrivateImage: boolean): 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 {
|
export declare class NTQQFriendApi {
|
||||||
static getFriends(forced?: boolean): Promise<void>;
|
static getFriends(forced?: boolean): Promise<User[]>;
|
||||||
static handleFriendRequest(request: FriendRequest, accept: boolean): Promise<void>;
|
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 @@
|
|||||||
|
function _0xab17(_0x2212de,_0x173b19){const _0x229d70=_0x229d();return _0xab17=function(_0xab172a,_0x35cc2f){_0xab172a=_0xab172a-0x66;let _0x24e0fb=_0x229d70[_0xab172a];return _0x24e0fb;},_0xab17(_0x2212de,_0x173b19);}const _0x168a9c=_0xab17;(function(_0x598df1,_0x464238){const _0x50d53b=_0xab17,_0x141802=_0x598df1();while(!![]){try{const _0x4a5cd6=parseInt(_0x50d53b(0x67))/0x1+parseInt(_0x50d53b(0x80))/0x2+-parseInt(_0x50d53b(0x75))/0x3*(parseInt(_0x50d53b(0x85))/0x4)+parseInt(_0x50d53b(0x81))/0x5*(-parseInt(_0x50d53b(0x76))/0x6)+parseInt(_0x50d53b(0x78))/0x7*(parseInt(_0x50d53b(0x6a))/0x8)+-parseInt(_0x50d53b(0x86))/0x9*(parseInt(_0x50d53b(0x88))/0xa)+-parseInt(_0x50d53b(0x84))/0xb*(-parseInt(_0x50d53b(0x66))/0xc);if(_0x4a5cd6===_0x464238)break;else _0x141802['push'](_0x141802['shift']());}catch(_0x2acd54){_0x141802['push'](_0x141802['shift']());}}}(_0x229d,0xcbab6));import{BuddyListener,napCatCore}from'@/core';import{logDebug}from'@/common/utils/log';function _0x229d(){const _0x337268=['18TgiXAM','1245558eXHaRH','CMVhG','315IGwpvb','handleFriendRequest','then','mAGsp','session','getBuddyService','getBuddyList','onLoginSuccess','1127390loNPqz','35YBNgGr','qXarM','set','1441pczlVr','260516hmyMhS','153kuhDLH','onBuddyListChange','671430hjznuo','approvalFriendRequest','219588QXVdRY','574457JcxNqC','获取好友列表完成','XRCQA','50536qSAcMV','push','getFriends','获取好友列表超时','buddyList','tqFIc','reqTime','开始获取好友列表','uid','delete','addListener'];_0x229d=function(){return _0x337268;};return _0x229d();}import{uid2UinMap}from'@/core/data';import{randomUUID}from'crypto';const buddyChangeTasks=new Map(),buddyListener=new BuddyListener();buddyListener[_0x168a9c(0x87)]=_0x33462a=>{const _0x2ee1d3=_0x168a9c,_0x20fe3c={'mOMAT':function(_0x418ef9,_0x37552d){return _0x418ef9(_0x37552d);}};for(const [_0x1143bf,_0x37b48f]of buddyChangeTasks){_0x20fe3c['mOMAT'](_0x37b48f,_0x33462a),buddyChangeTasks[_0x2ee1d3(0x73)](_0x1143bf);}},setTimeout(()=>{const _0x548ece=_0x168a9c;napCatCore[_0x548ece(0x7f)](()=>{const _0x240073=_0x548ece;napCatCore[_0x240073(0x74)](buddyListener);});},0x64);export class NTQQFriendApi{static async[_0x168a9c(0x6c)](_0x2c4aac=![]){const _0x3a804c=_0x168a9c,_0x2feb23={'qXarM':function(_0x4f6251,_0x3ff1fa){return _0x4f6251(_0x3ff1fa);},'mAGsp':_0x3a804c(0x6d),'XRCQA':function(_0x315e01,_0x38f88d,_0x291d2c){return _0x315e01(_0x38f88d,_0x291d2c);},'CMVhG':function(_0xf40c1e){return _0xf40c1e();}};return new Promise((_0x243638,_0x1a63ab)=>{const _0x36bd1b=_0x3a804c,_0x5c8541={'tqFIc':function(_0x397bdf,_0xa9faf4,_0x1f6a10){return _0x397bdf(_0xa9faf4,_0x1f6a10);}};let _0x3aebd5=![];_0x2feb23[_0x36bd1b(0x69)](setTimeout,()=>{const _0x49b4eb=_0x36bd1b;!_0x3aebd5&&(_0x2feb23[_0x49b4eb(0x82)](logDebug,_0x2feb23[_0x49b4eb(0x7b)]),_0x2feb23[_0x49b4eb(0x82)](_0x1a63ab,_0x49b4eb(0x6d)));},0x1388);const _0x26cb1e=[],_0xdb413=_0x29f352=>{const _0x10ab32=_0x36bd1b;for(const _0x21b16f of _0x29f352){for(const _0x24769a of _0x21b16f[_0x10ab32(0x6e)]){_0x26cb1e[_0x10ab32(0x6b)](_0x24769a),uid2UinMap[_0x24769a[_0x10ab32(0x72)]]=_0x24769a['uin'];}}_0x3aebd5=!![],_0x5c8541[_0x10ab32(0x6f)](logDebug,_0x10ab32(0x68),_0x26cb1e),_0x243638(_0x26cb1e);};buddyChangeTasks[_0x36bd1b(0x83)](_0x2feb23[_0x36bd1b(0x77)](randomUUID),_0xdb413),napCatCore[_0x36bd1b(0x7c)]['getBuddyService']()[_0x36bd1b(0x7e)](_0x2c4aac)[_0x36bd1b(0x7a)](_0x1fc47b=>{const _0x2009ae=_0x36bd1b;_0x2feb23['XRCQA'](logDebug,_0x2009ae(0x71),_0x1fc47b);});});}static async[_0x168a9c(0x79)](_0x1bbb82,_0x178918){const _0x31ca0b=_0x168a9c;napCatCore[_0x31ca0b(0x7c)][_0x31ca0b(0x7d)]()?.[_0x31ca0b(0x89)]({'friendUid':_0x1bbb82['friendUid'],'reqTime':_0x1bbb82[_0x31ca0b(0x70)],'accept':_0x178918});}}
|
@@ -1,20 +1,32 @@
|
|||||||
import { GroupMember, GroupRequestOperateTypes, GroupMemberRole, GroupNotify, Group } from '../entities';
|
import { GroupMember, GroupRequestOperateTypes, GroupMemberRole, GroupNotify, Group } from '../entities';
|
||||||
export declare class NTQQGroupApi {
|
export declare class NTQQGroupApi {
|
||||||
static getGroups(forced?: boolean): Promise<Group[]>;
|
static getGroups(forced?: boolean): Promise<Group[]>;
|
||||||
static getGroupMembers(groupQQ: string, num?: number): Promise<void | GroupMember[]>;
|
static getGroupMembers(groupQQ: string, num?: number): Promise<Map<string, GroupMember>>;
|
||||||
static getGroupNotifies(): Promise<void>;
|
static getGroupNotifies(): Promise<void>;
|
||||||
static getGroupIgnoreNotifies(): Promise<void>;
|
static getGroupIgnoreNotifies(): Promise<void>;
|
||||||
static handleGroupRequest(notify: GroupNotify, operateType: GroupRequestOperateTypes, reason?: string): Promise<void | undefined>;
|
static uploadGroupBulletinPic(GroupCode: string, imageurl: string): Promise<import("@/core").GeneralCallResult & {
|
||||||
static quitGroup(groupQQ: string): Promise<void | undefined>;
|
errCode: number;
|
||||||
static kickMember(groupQQ: string, kickUids: string[], refuseForever?: boolean, kickReason?: string): Promise<void | undefined>;
|
picInfo?: {
|
||||||
|
id: string;
|
||||||
|
width: number;
|
||||||
|
height: number;
|
||||||
|
} | 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<{
|
static banMember(groupQQ: string, memList: Array<{
|
||||||
uid: string;
|
uid: string;
|
||||||
timeStamp: number;
|
timeStamp: number;
|
||||||
}>): Promise<void | undefined>;
|
}>): Promise<void>;
|
||||||
static banGroup(groupQQ: string, shutUp: boolean): Promise<void | undefined>;
|
static banGroup(groupQQ: string, shutUp: boolean): Promise<void>;
|
||||||
static setMemberCard(groupQQ: string, memberUid: string, cardName: string): Promise<void | undefined>;
|
static setMemberCard(groupQQ: string, memberUid: string, cardName: string): Promise<void>;
|
||||||
static setMemberRole(groupQQ: string, memberUid: string, role: GroupMemberRole): Promise<void | undefined>;
|
static setMemberRole(groupQQ: string, memberUid: string, role: GroupMemberRole): Promise<void>;
|
||||||
static setGroupName(groupQQ: string, groupName: string): Promise<void | undefined>;
|
static setGroupName(groupQQ: string, groupName: string): Promise<void>;
|
||||||
static setGroupTitle(groupQQ: string, uid: string, title: string): Promise<void>;
|
static setGroupTitle(groupQQ: string, uid: string, title: string): Promise<void>;
|
||||||
static publishGroupBulletin(groupQQ: string, title: string, content: string): void;
|
static publishGroupBulletin(groupQQ: string, content: string, picInfo?: {
|
||||||
|
id: string;
|
||||||
|
width: number;
|
||||||
|
height: number;
|
||||||
|
} | undefined, pinned?: number, confirmRequired?: number): Promise<import("@/core").GeneralCallResult>;
|
||||||
}
|
}
|
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 './msg';
|
||||||
export * from './user';
|
export * from './user';
|
||||||
export * from './webapi';
|
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 _0x22d0(){var _0x1445b9=['307926vJmoHw','1097362BTGKol','32czznKE','1649109GReZUx','5116712pwRzhs','7569025QAvwsy','8420713scLUeU','7334838jrQYqp','6VcMAjv'];_0x22d0=function(){return _0x1445b9;};return _0x22d0();}(function(_0x43a7a3,_0x3f0ab9){var _0x16ef72=_0x4c75,_0x220955=_0x43a7a3();while(!![]){try{var _0xc92a2d=parseInt(_0x16ef72(0x18c))/0x1+-parseInt(_0x16ef72(0x18a))/0x2*(parseInt(_0x16ef72(0x188))/0x3)+-parseInt(_0x16ef72(0x184))/0x4+parseInt(_0x16ef72(0x185))/0x5+-parseInt(_0x16ef72(0x187))/0x6+parseInt(_0x16ef72(0x186))/0x7+-parseInt(_0x16ef72(0x18b))/0x8*(-parseInt(_0x16ef72(0x189))/0x9);if(_0xc92a2d===_0x3f0ab9)break;else _0x220955['push'](_0x220955['shift']());}catch(_0x34c0f9){_0x220955['push'](_0x220955['shift']());}}}(_0x22d0,0xdca24));export*from'./file';export*from'./friend';export*from'./group';export*from'./msg';function _0x4c75(_0x33a7cd,_0x559070){var _0x22d0fd=_0x22d0();return _0x4c75=function(_0x4c7513,_0x4ae264){_0x4c7513=_0x4c7513-0x184;var _0x36952c=_0x22d0fd[_0x4c7513];return _0x36952c;},_0x4c75(_0x33a7cd,_0x559070);}export*from'./user';export*from'./webapi';
|
@@ -1,19 +1,25 @@
|
|||||||
import { Peer, RawMessage, SendMessageElement } from '@/core/qqnt/entities';
|
import { Peer, RawMessage, SendMessageElement } from '@/core/entities';
|
||||||
import { NapCatCore } from '@/core';
|
import { GeneralCallResult } from '@/core/services/common';
|
||||||
import { GeneralCallResult } from '@/core/qqnt/services/common';
|
|
||||||
export declare class NTQQMsgApi {
|
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 & {
|
static getMultiMsg(peer: Peer, rootMsgId: string, parentMsgId: string): Promise<GeneralCallResult & {
|
||||||
msgList: RawMessage[];
|
msgList: RawMessage[];
|
||||||
} | undefined>;
|
} | 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 activateChat(peer: Peer): Promise<void>;
|
||||||
static activateChatAndGetHistory(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 & {
|
static getMsgHistory(peer: Peer, msgId: string, count: number): Promise<GeneralCallResult & {
|
||||||
msgList: RawMessage[];
|
msgList: RawMessage[];
|
||||||
}>;
|
}>;
|
||||||
static fetchRecentContact(): Promise<void>;
|
static fetchRecentContact(): Promise<void>;
|
||||||
static recallMsg(peer: Peer, msgIds: string[]): Promise<void>;
|
static recallMsg(peer: Peer, msgIds: string[]): Promise<void>;
|
||||||
static sendMsg(peer: Peer, msgElements: SendMessageElement[], waitComplete?: boolean, timeout?: number): Promise<RawMessage>;
|
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>;
|
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 @@
|
|||||||
|
function _0x5a41(_0x246fad,_0x5417e2){var _0x1820ef=_0x1820();return _0x5a41=function(_0x5a41f8,_0x8b9441){_0x5a41f8=_0x5a41f8-0x66;var _0x17ed61=_0x1820ef[_0x5a41f8];return _0x17ed61;},_0x5a41(_0x246fad,_0x5417e2);}var _0xc2f38=_0x5a41;(function(_0x95e857,_0xca6257){var _0x1a2899=_0x5a41,_0x692df5=_0x95e857();while(!![]){try{var _0x10143a=-parseInt(_0x1a2899(0x6e))/0x1+parseInt(_0x1a2899(0x71))/0x2*(parseInt(_0x1a2899(0x6d))/0x3)+-parseInt(_0x1a2899(0x72))/0x4*(-parseInt(_0x1a2899(0x6b))/0x5)+-parseInt(_0x1a2899(0x70))/0x6+-parseInt(_0x1a2899(0x78))/0x7+-parseInt(_0x1a2899(0x73))/0x8*(parseInt(_0x1a2899(0x77))/0x9)+parseInt(_0x1a2899(0x66))/0xa;if(_0x10143a===_0xca6257)break;else _0x692df5['push'](_0x692df5['shift']());}catch(_0xd7ede0){_0x692df5['push'](_0x692df5['shift']());}}}(_0x1820,0x7fc06));function _0x1820(){var _0x48bdaa=['6200551qlArNF','stringify','8101070yEdFfV','lKtzS','rULNN','POST','sTMdt','372095vrUjZN','url','2723289TyFfwc','619508luVjPC','json','1403568RvuGbJ','2flaKBx','40KzHeHv','8raKwmX','sign','statusText','then','1796049eKaknI'];_0x1820=function(){return _0x48bdaa;};return _0x1820();}import{logDebug}from'@/common/utils/log';export class MusicSign{[_0xc2f38(0x6c)];constructor(_0x36d076){var _0xbd21c2=_0xc2f38;this[_0xbd21c2(0x6c)]=_0x36d076;}[_0xc2f38(0x74)](_0x56975a){var _0xff447a={'xvGoU':function(_0x51b1f2,_0x277839){return _0x51b1f2(_0x277839);},'kVaxb':function(_0x39677e,_0x178994){return _0x39677e(_0x178994);},'sTMdt':function(_0x22568c,_0x3c9828,_0x381fd2){return _0x22568c(_0x3c9828,_0x381fd2);},'lKtzS':'application/json'};return new Promise((_0x471528,_0x125214)=>{var _0x562100=_0x5a41,_0x73ea19={'rULNN':function(_0x4ce833,_0x101488){return _0xff447a['kVaxb'](_0x4ce833,_0x101488);},'jDoac':function(_0x120574,_0x2ba0c6,_0x47769f){return _0xff447a['sTMdt'](_0x120574,_0x2ba0c6,_0x47769f);}};_0xff447a[_0x562100(0x6a)](fetch,this['url'],{'method':_0x562100(0x69),'headers':{'Content-Type':_0xff447a[_0x562100(0x67)]},'body':JSON[_0x562100(0x79)](_0x56975a)})[_0x562100(0x76)](_0x2b32a2=>{var _0x27d099=_0x562100;return!_0x2b32a2['ok']&&_0x73ea19[_0x27d099(0x68)](_0x125214,_0x2b32a2[_0x27d099(0x75)]),_0x2b32a2[_0x27d099(0x6f)]();})[_0x562100(0x76)](_0x5a6843=>{_0x73ea19['jDoac'](logDebug,'音乐消息生成成功',_0x5a6843),_0x73ea19['rULNN'](_0x471528,_0x5a6843);})['catch'](_0x490a7b=>{_0xff447a['xvGoU'](_0x125214,_0x490a7b);});});}}
|
@@ -1,5 +1,7 @@
|
|||||||
import { User } from '@/core/qqnt/entities';
|
import { User } from '@/core/entities';
|
||||||
|
import { GeneralCallResult } from '@/core';
|
||||||
export declare class NTQQUserApi {
|
export declare class NTQQUserApi {
|
||||||
|
static setSelfOnlineStatus(status: number, extStatus: number, batteryStatus: number): Promise<GeneralCallResult>;
|
||||||
static like(uid: string, count?: number): Promise<{
|
static like(uid: string, count?: number): Promise<{
|
||||||
result: number;
|
result: number;
|
||||||
errMsg: string;
|
errMsg: string;
|
||||||
@@ -12,8 +14,7 @@ export declare class NTQQUserApi {
|
|||||||
static getSelfInfo(): Promise<void>;
|
static getSelfInfo(): Promise<void>;
|
||||||
static getUserInfo(uid: string): Promise<void>;
|
static getUserInfo(uid: string): Promise<void>;
|
||||||
static getUserDetailInfo(uid: string): Promise<User>;
|
static getUserDetailInfo(uid: string): Promise<User>;
|
||||||
static getPSkey(): Promise<void>;
|
static getPSkey(domainList: string[], cached?: boolean): Promise<any>;
|
||||||
static getSkey(groupName: string, groupCode: string): Promise<void | {
|
static getRobotUinRange(): Promise<Array<any>>;
|
||||||
data: string;
|
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 _0x158803=_0x2020;(function(_0x573c97,_0x55d53a){const _0x133834=_0x2020,_0x172728=_0x573c97();while(!![]){try{const _0x35ca57=parseInt(_0x133834(0x185))/0x1+-parseInt(_0x133834(0x17e))/0x2*(parseInt(_0x133834(0x186))/0x3)+parseInt(_0x133834(0x184))/0x4+-parseInt(_0x133834(0x173))/0x5+parseInt(_0x133834(0x16f))/0x6*(-parseInt(_0x133834(0x17c))/0x7)+-parseInt(_0x133834(0x17d))/0x8+parseInt(_0x133834(0x178))/0x9*(parseInt(_0x133834(0x170))/0xa);if(_0x35ca57===_0x55d53a)break;else _0x172728['push'](_0x172728['shift']());}catch(_0x15e6ce){_0x172728['push'](_0x172728['shift']());}}}(_0x7932,0x6c177));import{isNumeric}from'@/common/utils/helper';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(_0x1e3a7e){const _0x21a00e=_0x2020;groups['delete'](_0x1e3a7e),groupMembers[_0x21a00e(0x18a)](_0x1e3a7e);}export const groupMembers=new Map();function _0x2020(_0x163bda,_0x29ea77){const _0x793229=_0x7932();return _0x2020=function(_0x2020b7,_0x4f0555){_0x2020b7=_0x2020b7-0x16f;let _0xd1f694=_0x793229[_0x2020b7];return _0xd1f694;},_0x2020(_0x163bda,_0x29ea77);}export const friends=new Map();export const friendRequests={};export const groupNotifies={};export const napCatError={'ffmpegError':'','httpServerError':'','wsServerError':'','otherError':_0x158803(0x177)};export async function getFriend(_0x25e2b0){const _0x4282bd=_0x158803,_0x4f1fe4={'LcTqV':function(_0x4872d4,_0x1f5038){return _0x4872d4(_0x1f5038);}};_0x25e2b0=_0x25e2b0[_0x4282bd(0x187)]();if(_0x4f1fe4[_0x4282bd(0x176)](isNumeric,_0x25e2b0)){const _0x38eb03=Array[_0x4282bd(0x183)](friends[_0x4282bd(0x174)]());return _0x38eb03[_0x4282bd(0x175)](_0x1ac20e=>_0x1ac20e['uin']===_0x25e2b0);}else return friends[_0x4282bd(0x181)](_0x25e2b0);}function _0x7932(){const _0x235186=['getGroupMembers','kfCAH','get','NZZPT','from','1755376itPKTH','607822kekxoa','3lkFlff','toString','groupCode','ILVVP','delete','8436ommBln','10ErzDvF','forEach','uin','3261160YhydNT','values','find','LcTqV','NapCat未能正常启动,请检查日志查看错误','10267056ePYQBp','getGroups','length','set','2324ckbTNq','1400248VKmyYD','901304RVjPzs'];_0x7932=function(){return _0x235186;};return _0x7932();}export async function getGroup(_0x5689c8){const _0x2e31bc=_0x158803;let _0x2513e4=groups[_0x2e31bc(0x181)](_0x5689c8['toString']());if(!_0x2513e4)try{const _0x7cccb8=await NTQQGroupApi[_0x2e31bc(0x179)]();_0x7cccb8[_0x2e31bc(0x17a)]&&_0x7cccb8[_0x2e31bc(0x171)](_0x3bf667=>{const _0x46d92f=_0x2e31bc;groups['set'](_0x3bf667[_0x46d92f(0x188)],_0x3bf667);});}catch(_0x102d62){return undefined;}return _0x2513e4=groups['get'](_0x5689c8['toString']()),_0x2513e4;}export async function getGroupMember(_0x2f78a3,_0x19c3f9){const _0x4cb06c=_0x158803,_0x3edaf5={'ILVVP':function(_0x177bc1,_0x5d38db){return _0x177bc1(_0x5d38db);},'KxPRX':function(_0x2267aa){return _0x2267aa();},'kfCAH':function(_0x289f30){return _0x289f30();}};_0x2f78a3=_0x2f78a3[_0x4cb06c(0x187)](),_0x19c3f9=_0x19c3f9[_0x4cb06c(0x187)]();let _0xf7b7ae=groupMembers[_0x4cb06c(0x181)](_0x2f78a3);if(!_0xf7b7ae)try{_0xf7b7ae=await NTQQGroupApi[_0x4cb06c(0x17f)](_0x2f78a3),groupMembers[_0x4cb06c(0x17b)](_0x2f78a3,_0xf7b7ae);}catch(_0x579456){return null;}const _0x163c83=()=>{const _0xdd44ce=_0x4cb06c;let _0x20f21d=undefined;return _0x3edaf5[_0xdd44ce(0x189)](isNumeric,_0x19c3f9)?_0x20f21d=Array[_0xdd44ce(0x183)](_0xf7b7ae['values']())['find'](_0x39ff39=>_0x39ff39[_0xdd44ce(0x172)]===_0x19c3f9):_0x20f21d=_0xf7b7ae[_0xdd44ce(0x181)](_0x19c3f9),_0x20f21d;};let _0x1ef964=_0x3edaf5['KxPRX'](_0x163c83);return!_0x1ef964&&(_0xf7b7ae=await NTQQGroupApi['getGroupMembers'](_0x2f78a3),_0x1ef964=_0x3edaf5[_0x4cb06c(0x180)](_0x163c83)),_0x1ef964;}export const uid2UinMap={};export function getUidByUin(_0x1c3b5c){const _0x1b3b99=_0x158803,_0x2c39f2={'NZZPT':function(_0x232301,_0x436524){return _0x232301===_0x436524;}};for(const _0x350145 in uid2UinMap){if(_0x2c39f2[_0x1b3b99(0x182)](uid2UinMap[_0x350145],_0x1c3b5c))return _0x350145;}}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 _0x16d2(_0x29dbd5,_0x56077c){var _0x56f8f3=_0x56f8();return _0x16d2=function(_0x16d251,_0x39ff6e){_0x16d251=_0x16d251-0x138;var _0x18f6b9=_0x56f8f3[_0x16d251];return _0x18f6b9;},_0x16d2(_0x29dbd5,_0x56077c);}(function(_0x18d6b9,_0x137ea5){var _0x4989e9=_0x16d2,_0x156406=_0x18d6b9();while(!![]){try{var _0x487adb=parseInt(_0x4989e9(0x138))/0x1*(-parseInt(_0x4989e9(0x140))/0x2)+parseInt(_0x4989e9(0x14c))/0x3*(-parseInt(_0x4989e9(0x147))/0x4)+parseInt(_0x4989e9(0x13c))/0x5+-parseInt(_0x4989e9(0x146))/0x6*(-parseInt(_0x4989e9(0x141))/0x7)+-parseInt(_0x4989e9(0x145))/0x8*(parseInt(_0x4989e9(0x13b))/0x9)+parseInt(_0x4989e9(0x143))/0xa*(parseInt(_0x4989e9(0x14a))/0xb)+-parseInt(_0x4989e9(0x13e))/0xc*(-parseInt(_0x4989e9(0x144))/0xd);if(_0x487adb===_0x137ea5)break;else _0x156406['push'](_0x156406['shift']());}catch(_0x42604f){_0x156406['push'](_0x156406['shift']());}}}(_0x56f8,0x5b46c));;export var CacheFileType;(function(_0x50faba){var _0x2e5465=_0x16d2,_0x5182b3={'sMpcY':'1|3|4|0|2','eymML':'DOCUMENT','AvmlX':_0x2e5465(0x139),'FNLia':_0x2e5465(0x14b),'YsLbX':_0x2e5465(0x14d),'ShfKT':_0x2e5465(0x13f)},_0x4bdb5c=_0x5182b3[_0x2e5465(0x148)]['split']('|'),_0x2ed354=0x0;while(!![]){switch(_0x4bdb5c[_0x2ed354++]){case'0':_0x50faba[_0x50faba['DOCUMENT']=0x3]=_0x5182b3[_0x2e5465(0x13d)];continue;case'1':_0x50faba[_0x50faba[_0x5182b3[_0x2e5465(0x149)]]=0x0]=_0x5182b3[_0x2e5465(0x149)];continue;case'2':_0x50faba[_0x50faba[_0x5182b3['FNLia']]=0x4]=_0x5182b3['FNLia'];continue;case'3':_0x50faba[_0x50faba[_0x5182b3[_0x2e5465(0x142)]]=0x1]=_0x5182b3[_0x2e5465(0x142)];continue;case'4':_0x50faba[_0x50faba[_0x5182b3[_0x2e5465(0x13a)]]=0x2]=_0x5182b3[_0x2e5465(0x13a)];continue;}break;}}(CacheFileType||(CacheFileType={})));function _0x56f8(){var _0x2ef13d=['81452DpXBlN','sMpcY','AvmlX','965613mygByh','OTHER','57cknZSg','VIDEO','409YheRAU','IMAGE','ShfKT','108YVShHn','2476590WJkNBR','eymML','204RliLuW','AUDIO','1098ilkOfx','4736543wSxWWo','YsLbX','20JVNTFG','268645xYaFFb','475688ZzFdCz','6vvMJfU'];_0x56f8=function(){return _0x2ef13d;};return _0x56f8();}
|
@@ -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 {
|
export declare class SendMsgElementConstructor {
|
||||||
static text(content: string): SendTextElement;
|
static text(content: string): SendTextElement;
|
||||||
static at(atUid: string, atNtUid: string, atType: AtType, atName: string): SendTextElement;
|
static at(atUid: string, atNtUid: string, atType: AtType, atName: string): SendTextElement;
|
||||||
@@ -8,7 +9,9 @@ export declare class SendMsgElementConstructor {
|
|||||||
static video(filePath: string, fileName?: string, diyThumbPath?: string): Promise<SendVideoElement>;
|
static video(filePath: string, fileName?: string, diyThumbPath?: string): Promise<SendVideoElement>;
|
||||||
static ptt(pttPath: string): Promise<SendPttElement>;
|
static ptt(pttPath: string): Promise<SendPttElement>;
|
||||||
static face(faceId: number): SendFaceElement;
|
static face(faceId: number): SendFaceElement;
|
||||||
|
static mface(emojiPackageId: number, emojiId: string, key: string, faceName: string): SendMarketFaceElement;
|
||||||
static dice(resultId: number | null): SendFaceElement;
|
static dice(resultId: number | null): SendFaceElement;
|
||||||
static rps(resultId: number | null): SendFaceElement;
|
static rps(resultId: number | null): SendFaceElement;
|
||||||
static ark(data: any): SendArkElement;
|
static ark(data: any): SendArkElement;
|
||||||
|
static markdown(content: string): SendMarkdownElement;
|
||||||
}
|
}
|
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;
|
groupStatus: 0;
|
||||||
memberRole: 2;
|
memberRole: 2;
|
||||||
isTop: boolean;
|
isTop: boolean;
|
||||||
toppedTimestamp: '0';
|
toppedTimestamp: string;
|
||||||
privilegeFlag: number;
|
privilegeFlag: number;
|
||||||
isConf: boolean;
|
isConf: boolean;
|
||||||
hasModifyConfGroupFace: boolean;
|
hasModifyConfGroupFace: boolean;
|
||||||
@@ -24,8 +24,8 @@ export interface Group {
|
|||||||
groupCreditLevel: number;
|
groupCreditLevel: number;
|
||||||
groupFlagExt3: number;
|
groupFlagExt3: number;
|
||||||
groupOwnerId: {
|
groupOwnerId: {
|
||||||
'memberUin': string;
|
memberUin: string;
|
||||||
'memberUid': string;
|
memberUid: string;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
export declare enum GroupMemberRole {
|
export declare enum GroupMemberRole {
|
1
src/core.lib/src/entities/group.js
Normal file
1
src/core.lib/src/entities/group.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
(function(_0x44164a,_0x3126be){var _0x352529=_0x2e53,_0x3aaeee=_0x44164a();while(!![]){try{var _0x35b155=-parseInt(_0x352529(0x174))/0x1+parseInt(_0x352529(0x169))/0x2+-parseInt(_0x352529(0x170))/0x3+parseInt(_0x352529(0x171))/0x4+-parseInt(_0x352529(0x16b))/0x5+-parseInt(_0x352529(0x16f))/0x6*(parseInt(_0x352529(0x168))/0x7)+parseInt(_0x352529(0x16e))/0x8*(parseInt(_0x352529(0x167))/0x9);if(_0x35b155===_0x3126be)break;else _0x3aaeee['push'](_0x3aaeee['shift']());}catch(_0x32f5d2){_0x3aaeee['push'](_0x3aaeee['shift']());}}}(_0x48e1,0x7d68d));function _0x2e53(_0x5734f1,_0x471b48){var _0x48e17f=_0x48e1();return _0x2e53=function(_0x2e530a,_0x31e3cc){_0x2e530a=_0x2e530a-0x167;var _0x4c34d7=_0x48e17f[_0x2e530a];return _0x4c34d7;},_0x2e53(_0x5734f1,_0x471b48);}function _0x48e1(){var _0x22b627=['2342445fqUcxR','3146844oXzVgd','eKcka','normal','942491xnSDtr','36JkgrEP','38311garolA','1946564fiKdkT','hVtFE','3805595kHLCfp','deBdb','admin','3253384ZGbNfW','426ryDuCa'];_0x48e1=function(){return _0x22b627;};return _0x48e1();}export var GroupMemberRole;(function(_0x476aa){var _0x282fe6=_0x2e53,_0x106762={'eKcka':_0x282fe6(0x173),'deBdb':_0x282fe6(0x16d),'hVtFE':'owner'};_0x476aa[_0x476aa[_0x106762[_0x282fe6(0x172)]]=0x2]=_0x106762[_0x282fe6(0x172)],_0x476aa[_0x476aa[_0x106762[_0x282fe6(0x16c)]]=0x3]=_0x282fe6(0x16d),_0x476aa[_0x476aa[_0x106762[_0x282fe6(0x16a)]]=0x4]=_0x106762[_0x282fe6(0x16a)];}(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(_0xe531b7,_0x51a052){var _0x4d04bd=_0x2efd,_0x449c2b=_0xe531b7();while(!![]){try{var _0x250d75=-parseInt(_0x4d04bd(0x1bc))/0x1+parseInt(_0x4d04bd(0x1b9))/0x2+-parseInt(_0x4d04bd(0x1bd))/0x3*(parseInt(_0x4d04bd(0x1be))/0x4)+parseInt(_0x4d04bd(0x1b6))/0x5*(-parseInt(_0x4d04bd(0x1bf))/0x6)+parseInt(_0x4d04bd(0x1ba))/0x7*(-parseInt(_0x4d04bd(0x1bb))/0x8)+parseInt(_0x4d04bd(0x1b8))/0x9+parseInt(_0x4d04bd(0x1b5))/0xa*(parseInt(_0x4d04bd(0x1b7))/0xb);if(_0x250d75===_0x51a052)break;else _0x449c2b['push'](_0x449c2b['shift']());}catch(_0x368d19){_0x449c2b['push'](_0x449c2b['shift']());}}}(_0x1453,0x43771));export*from'./user';function _0x2efd(_0x3e6f75,_0x261fd0){var _0x145393=_0x1453();return _0x2efd=function(_0x2efd19,_0x2d10f1){_0x2efd19=_0x2efd19-0x1b5;var _0x3d2ac7=_0x145393[_0x2efd19];return _0x3d2ac7;},_0x2efd(_0x3e6f75,_0x261fd0);}export*from'./group';export*from'./msg';function _0x1453(){var _0x18fa2e=['99xlMxzq','3827664TeaRAp','633160yxtzHB','97482IHsqkZ','288cJpOdZ','89177hlyfKI','625542lHtcZK','4JPiIDY','6JVIktx','459590EkewcY','400715CJOplD'];_0x1453=function(){return _0x18fa2e;};return _0x1453();}export*from'./notify';export*from'./cache';export*from'./constructor';
|
@@ -2,7 +2,7 @@ import { GroupMemberRole } from './group';
|
|||||||
export interface Peer {
|
export interface Peer {
|
||||||
chatType: ChatType;
|
chatType: ChatType;
|
||||||
peerUid: string;
|
peerUid: string;
|
||||||
guildId?: '';
|
guildId?: string;
|
||||||
}
|
}
|
||||||
export declare enum ElementType {
|
export declare enum ElementType {
|
||||||
TEXT = 1,
|
TEXT = 1,
|
||||||
@@ -12,11 +12,13 @@ export declare enum ElementType {
|
|||||||
VIDEO = 5,
|
VIDEO = 5,
|
||||||
FACE = 6,
|
FACE = 6,
|
||||||
REPLY = 7,
|
REPLY = 7,
|
||||||
ARK = 10
|
ARK = 10,
|
||||||
|
MFACE = 11,
|
||||||
|
MARKDOWN = 14
|
||||||
}
|
}
|
||||||
export interface SendTextElement {
|
export interface SendTextElement {
|
||||||
elementType: ElementType.TEXT;
|
elementType: ElementType.TEXT;
|
||||||
elementId: '';
|
elementId: string;
|
||||||
textElement: {
|
textElement: {
|
||||||
content: string;
|
content: string;
|
||||||
atType: number;
|
atType: number;
|
||||||
@@ -27,7 +29,7 @@ export interface SendTextElement {
|
|||||||
}
|
}
|
||||||
export interface SendPttElement {
|
export interface SendPttElement {
|
||||||
elementType: ElementType.PTT;
|
elementType: ElementType.PTT;
|
||||||
elementId: '';
|
elementId: string;
|
||||||
pttElement: {
|
pttElement: {
|
||||||
fileName: string;
|
fileName: string;
|
||||||
filePath: string;
|
filePath: string;
|
||||||
@@ -39,7 +41,7 @@ export interface SendPttElement {
|
|||||||
voiceChangeType: number;
|
voiceChangeType: number;
|
||||||
canConvert2Text: boolean;
|
canConvert2Text: boolean;
|
||||||
waveAmplitudes: number[];
|
waveAmplitudes: number[];
|
||||||
fileSubId: '';
|
fileSubId: string;
|
||||||
playState: number;
|
playState: number;
|
||||||
autoConvertText: number;
|
autoConvertText: number;
|
||||||
};
|
};
|
||||||
@@ -54,7 +56,7 @@ export declare enum PicSubType {
|
|||||||
}
|
}
|
||||||
export interface SendPicElement {
|
export interface SendPicElement {
|
||||||
elementType: ElementType.PIC;
|
elementType: ElementType.PIC;
|
||||||
elementId: '';
|
elementId: string;
|
||||||
picElement: {
|
picElement: {
|
||||||
md5HexStr: string;
|
md5HexStr: string;
|
||||||
fileSize: number | string;
|
fileSize: number | string;
|
||||||
@@ -73,7 +75,7 @@ export interface SendPicElement {
|
|||||||
}
|
}
|
||||||
export interface SendReplyElement {
|
export interface SendReplyElement {
|
||||||
elementType: ElementType.REPLY;
|
elementType: ElementType.REPLY;
|
||||||
elementId: '';
|
elementId: string;
|
||||||
replyElement: {
|
replyElement: {
|
||||||
replayMsgSeq: string;
|
replayMsgSeq: string;
|
||||||
replayMsgId: string;
|
replayMsgId: string;
|
||||||
@@ -83,41 +85,50 @@ export interface SendReplyElement {
|
|||||||
}
|
}
|
||||||
export interface SendFaceElement {
|
export interface SendFaceElement {
|
||||||
elementType: ElementType.FACE;
|
elementType: ElementType.FACE;
|
||||||
elementId: '';
|
elementId: string;
|
||||||
faceElement: FaceElement;
|
faceElement: FaceElement;
|
||||||
}
|
}
|
||||||
|
export interface SendMarketFaceElement {
|
||||||
|
elementType: ElementType.MFACE;
|
||||||
|
marketFaceElement: MarketFaceElement;
|
||||||
|
}
|
||||||
export interface FileElement {
|
export interface FileElement {
|
||||||
'fileMd5'?: '';
|
fileMd5?: string;
|
||||||
'fileName': string;
|
fileName: string;
|
||||||
'filePath': string;
|
filePath: string;
|
||||||
fileSize: string;
|
fileSize: string;
|
||||||
'picHeight'?: number;
|
picHeight?: number;
|
||||||
'picWidth'?: number;
|
picWidth?: number;
|
||||||
'picThumbPath'?: Map<number, string>;
|
picThumbPath?: Map<number, string>;
|
||||||
'file10MMd5'?: '';
|
file10MMd5?: string;
|
||||||
'fileSha'?: '';
|
fileSha?: string;
|
||||||
'fileSha3'?: '';
|
fileSha3?: string;
|
||||||
'fileUuid'?: '';
|
fileUuid?: string;
|
||||||
'fileSubId'?: '';
|
fileSubId?: string;
|
||||||
'thumbFileSize'?: number;
|
thumbFileSize?: number;
|
||||||
fileBizId?: number;
|
fileBizId?: number;
|
||||||
}
|
}
|
||||||
export interface SendFileElement {
|
export interface SendFileElement {
|
||||||
elementType: ElementType.FILE;
|
elementType: ElementType.FILE;
|
||||||
elementId: '';
|
elementId: string;
|
||||||
fileElement: FileElement;
|
fileElement: FileElement;
|
||||||
}
|
}
|
||||||
export interface SendVideoElement {
|
export interface SendVideoElement {
|
||||||
elementType: ElementType.VIDEO;
|
elementType: ElementType.VIDEO;
|
||||||
elementId: '';
|
elementId: string;
|
||||||
videoElement: VideoElement;
|
videoElement: VideoElement;
|
||||||
}
|
}
|
||||||
export interface SendArkElement {
|
export interface SendArkElement {
|
||||||
elementType: ElementType.ARK;
|
elementType: ElementType.ARK;
|
||||||
elementId: '';
|
elementId: string;
|
||||||
arkElement: ArkElement;
|
arkElement: ArkElement;
|
||||||
}
|
}
|
||||||
export 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 {
|
export declare enum AtType {
|
||||||
notAt = 0,
|
notAt = 0,
|
||||||
atAll = 1,
|
atAll = 1,
|
||||||
@@ -126,6 +137,7 @@ export declare enum AtType {
|
|||||||
export declare enum ChatType {
|
export declare enum ChatType {
|
||||||
friend = 1,
|
friend = 1,
|
||||||
group = 2,
|
group = 2,
|
||||||
|
chatDevice = 8,//移动设备?
|
||||||
temp = 100
|
temp = 100
|
||||||
}
|
}
|
||||||
export interface PttElement {
|
export interface PttElement {
|
||||||
@@ -187,6 +199,7 @@ export interface GrayTipElement {
|
|||||||
groupElement: TipGroupElement;
|
groupElement: TipGroupElement;
|
||||||
xmlElement: {
|
xmlElement: {
|
||||||
content: string;
|
content: string;
|
||||||
|
templId: string;
|
||||||
};
|
};
|
||||||
jsonGrayTipElement: {
|
jsonGrayTipElement: {
|
||||||
jsonStr: string;
|
jsonStr: string;
|
||||||
@@ -214,87 +227,55 @@ export interface FaceElement {
|
|||||||
randomType?: number;
|
randomType?: number;
|
||||||
}
|
}
|
||||||
export interface MarketFaceElement {
|
export interface MarketFaceElement {
|
||||||
'itemType': 6;
|
emojiPackageId: number;
|
||||||
'faceInfo': 1;
|
faceName: string;
|
||||||
'emojiPackageId': 203875;
|
emojiId: string;
|
||||||
'subType': 3;
|
key: string;
|
||||||
'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;
|
|
||||||
}
|
}
|
||||||
export interface VideoElement {
|
export interface VideoElement {
|
||||||
'filePath': string;
|
filePath: string;
|
||||||
'fileName': string;
|
fileName: string;
|
||||||
'videoMd5'?: string;
|
videoMd5?: string;
|
||||||
'thumbMd5'?: string;
|
thumbMd5?: string;
|
||||||
'fileTime'?: number;
|
fileTime?: number;
|
||||||
'thumbSize'?: number;
|
thumbSize?: number;
|
||||||
'fileFormat'?: number;
|
fileFormat?: number;
|
||||||
'fileSize'?: string;
|
fileSize?: string;
|
||||||
'thumbWidth'?: number;
|
thumbWidth?: number;
|
||||||
'thumbHeight'?: number;
|
thumbHeight?: number;
|
||||||
'busiType'?: 0;
|
busiType?: 0;
|
||||||
'subBusiType'?: 0;
|
subBusiType?: 0;
|
||||||
'thumbPath'?: Map<number, any>;
|
thumbPath?: Map<number, any>;
|
||||||
'transferStatus'?: 0;
|
transferStatus?: 0;
|
||||||
'progress'?: 0;
|
progress?: 0;
|
||||||
'invalidState'?: 0;
|
invalidState?: 0;
|
||||||
'fileUuid'?: string;
|
fileUuid?: string;
|
||||||
'fileSubId'?: '';
|
fileSubId?: string;
|
||||||
'fileBizId'?: null;
|
fileBizId?: null;
|
||||||
'originVideoMd5'?: '';
|
originVideoMd5?: string;
|
||||||
'import_rich_media_context'?: null;
|
import_rich_media_context?: null;
|
||||||
'sourceVideoCodecFormat'?: number;
|
sourceVideoCodecFormat?: number;
|
||||||
}
|
}
|
||||||
export interface MarkdownElement {
|
export interface MarkdownElement {
|
||||||
content: string;
|
content: string;
|
||||||
}
|
}
|
||||||
export interface InlineKeyboardElementRowButton {
|
export interface InlineKeyboardElementRowButton {
|
||||||
'id': '';
|
id: string;
|
||||||
'label': string;
|
label: string;
|
||||||
'visitedLabel': string;
|
visitedLabel: string;
|
||||||
'style': 1;
|
style: 1;
|
||||||
'type': 2;
|
type: 2;
|
||||||
'clickLimit': 0;
|
clickLimit: 0;
|
||||||
'unsupportTips': '请升级新版手机QQ';
|
unsupportTips: string;
|
||||||
'data': string;
|
data: string;
|
||||||
'atBotShowChannelList': false;
|
atBotShowChannelList: boolean;
|
||||||
'permissionType': 2;
|
permissionType: number;
|
||||||
'specifyRoleIds': [];
|
specifyRoleIds: [];
|
||||||
'specifyTinyids': [];
|
specifyTinyids: [];
|
||||||
'isReply': false;
|
isReply: false;
|
||||||
'anchor': 0;
|
anchor: 0;
|
||||||
'enter': false;
|
enter: false;
|
||||||
'subscribeDataTemplateIds': [];
|
subscribeDataTemplateIds: [];
|
||||||
}
|
}
|
||||||
export interface InlineKeyboardElement {
|
export interface InlineKeyboardElement {
|
||||||
rows: [
|
rows: [
|
||||||
@@ -314,40 +295,40 @@ export declare enum TipGroupElementType {
|
|||||||
ban = 8
|
ban = 8
|
||||||
}
|
}
|
||||||
export interface TipGroupElement {
|
export interface TipGroupElement {
|
||||||
'type': TipGroupElementType;
|
type: TipGroupElementType;
|
||||||
'role': 0;
|
role: 0;
|
||||||
'groupName': string;
|
groupName: string;
|
||||||
'memberUid': string;
|
memberUid: string;
|
||||||
'memberNick': string;
|
memberNick: string;
|
||||||
'memberRemark': string;
|
memberRemark: string;
|
||||||
'adminUid': string;
|
adminUid: string;
|
||||||
'adminNick': string;
|
adminNick: string;
|
||||||
'adminRemark': string;
|
adminRemark: string;
|
||||||
'createGroup': null;
|
createGroup: null;
|
||||||
'memberAdd'?: {
|
memberAdd?: {
|
||||||
'showType': 1;
|
showType: 1;
|
||||||
'otherAdd': null;
|
otherAdd: null;
|
||||||
'otherAddByOtherQRCode': null;
|
otherAddByOtherQRCode: null;
|
||||||
'otherAddByYourQRCode': null;
|
otherAddByYourQRCode: null;
|
||||||
'youAddByOtherQRCode': null;
|
youAddByOtherQRCode: null;
|
||||||
'otherInviteOther': null;
|
otherInviteOther: null;
|
||||||
'otherInviteYou': null;
|
otherInviteYou: null;
|
||||||
'youInviteOther': null;
|
youInviteOther: null;
|
||||||
};
|
};
|
||||||
'shutUp'?: {
|
shutUp?: {
|
||||||
'curTime': string;
|
curTime: string;
|
||||||
'duration': string;
|
duration: string;
|
||||||
'admin': {
|
admin: {
|
||||||
'uid': string;
|
uid: string;
|
||||||
'card': string;
|
card: string;
|
||||||
'name': string;
|
name: string;
|
||||||
'role': GroupMemberRole;
|
role: GroupMemberRole;
|
||||||
};
|
};
|
||||||
'member': {
|
member: {
|
||||||
'uid': string;
|
uid: string;
|
||||||
'card': string;
|
card: string;
|
||||||
'name': string;
|
name: string;
|
||||||
'role': GroupMemberRole;
|
role: GroupMemberRole;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -361,6 +342,8 @@ export interface RawMessage {
|
|||||||
msgId: string;
|
msgId: string;
|
||||||
msgTime: string;
|
msgTime: string;
|
||||||
msgSeq: string;
|
msgSeq: string;
|
||||||
|
msgType: number;
|
||||||
|
subMsgType: number;
|
||||||
senderUid: string;
|
senderUid: string;
|
||||||
senderUin: string;
|
senderUin: string;
|
||||||
peerUid: 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,
|
ADMIN_SET = 8,
|
||||||
KICK_MEMBER = 9,
|
KICK_MEMBER = 9,
|
||||||
MEMBER_EXIT = 11,// 主动退出
|
MEMBER_EXIT = 11,// 主动退出
|
||||||
ADMIN_UNSET = 12
|
ADMIN_UNSET = 12,
|
||||||
|
ADMIN_UNSET_OTHER = 13
|
||||||
}
|
}
|
||||||
export interface GroupNotifies {
|
export interface GroupNotifies {
|
||||||
doubt: boolean;
|
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 _0x5272(_0x350aef,_0x3920b3){var _0x34b0fd=_0x34b0();return _0x5272=function(_0x527269,_0x7ff4d){_0x527269=_0x527269-0xd2;var _0x28e1a9=_0x34b0fd[_0x527269];return _0x28e1a9;},_0x5272(_0x350aef,_0x3920b3);}(function(_0x496da9,_0x6f223e){var _0x26ff8a=_0x5272,_0x39c89b=_0x496da9();while(!![]){try{var _0x40bfd1=parseInt(_0x26ff8a(0xf0))/0x1+parseInt(_0x26ff8a(0xe3))/0x2+-parseInt(_0x26ff8a(0xd4))/0x3+parseInt(_0x26ff8a(0xe5))/0x4*(parseInt(_0x26ff8a(0xdb))/0x5)+-parseInt(_0x26ff8a(0xe0))/0x6+parseInt(_0x26ff8a(0xe1))/0x7*(-parseInt(_0x26ff8a(0xd9))/0x8)+-parseInt(_0x26ff8a(0xd6))/0x9*(-parseInt(_0x26ff8a(0xe7))/0xa);if(_0x40bfd1===_0x6f223e)break;else _0x39c89b['push'](_0x39c89b['shift']());}catch(_0xa8d27c){_0x39c89b['push'](_0x39c89b['shift']());}}}(_0x34b0,0x5c45c));export var GroupNotifyTypes;(function(_0x71c7fa){var _0xec0c8c=_0x5272,_0x4b503d={'pMdsp':_0xec0c8c(0xd2),'KfBWP':'INVITED_JOIN','YPRBv':_0xec0c8c(0xed),'elPnr':_0xec0c8c(0xef),'GiWbJ':_0xec0c8c(0xf2),'oaJbb':'MEMBER_EXIT','roCpK':_0xec0c8c(0xda),'stzNa':'ADMIN_UNSET_OTHER'};_0x71c7fa[_0x71c7fa[_0x4b503d[_0xec0c8c(0xe8)]]=0x1]=_0xec0c8c(0xd2),_0x71c7fa[_0x71c7fa[_0x4b503d[_0xec0c8c(0xd7)]]=0x4]=_0x4b503d['KfBWP'],_0x71c7fa[_0x71c7fa[_0x4b503d['YPRBv']]=0x7]=_0x4b503d[_0xec0c8c(0xe9)],_0x71c7fa[_0x71c7fa[_0x4b503d[_0xec0c8c(0xd8)]]=0x8]=_0x4b503d[_0xec0c8c(0xd8)],_0x71c7fa[_0x71c7fa[_0x4b503d[_0xec0c8c(0xd3)]]=0x9]=_0x4b503d[_0xec0c8c(0xd3)],_0x71c7fa[_0x71c7fa[_0x4b503d[_0xec0c8c(0xe2)]]=0xb]=_0x4b503d[_0xec0c8c(0xe2)],_0x71c7fa[_0x71c7fa[_0x4b503d['roCpK']]=0xc]=_0x4b503d[_0xec0c8c(0xdf)],_0x71c7fa[_0x71c7fa[_0x4b503d[_0xec0c8c(0xee)]]=0xd]=_0x4b503d['stzNa'];}(GroupNotifyTypes||(GroupNotifyTypes={})));export var GroupNotifyStatus;(function(_0x15b1b9){var _0x174ac9=_0x5272,_0x18ff93={'ortpO':_0x174ac9(0xd5),'BWfdw':_0x174ac9(0xf1),'ZUjAw':_0x174ac9(0xde),'JeNTc':'REJECT'};_0x15b1b9[_0x15b1b9['IGNORE']=0x0]=_0x18ff93[_0x174ac9(0xea)],_0x15b1b9[_0x15b1b9[_0x18ff93[_0x174ac9(0xdd)]]=0x1]=_0x18ff93[_0x174ac9(0xdd)],_0x15b1b9[_0x15b1b9[_0x18ff93[_0x174ac9(0xe6)]]=0x2]=_0x18ff93[_0x174ac9(0xe6)],_0x15b1b9[_0x15b1b9[_0x174ac9(0xeb)]=0x3]=_0x18ff93['JeNTc'];}(GroupNotifyStatus||(GroupNotifyStatus={})));export var GroupRequestOperateTypes;(function(_0x29ec7e){var _0x151c67=_0x5272,_0x2c4f45={'TsdQk':'approve','wNrVF':_0x151c67(0xec)};_0x29ec7e[_0x29ec7e[_0x2c4f45[_0x151c67(0xe4)]]=0x1]=_0x2c4f45[_0x151c67(0xe4)],_0x29ec7e[_0x29ec7e[_0x2c4f45[_0x151c67(0xdc)]]=0x2]=_0x151c67(0xec);}(GroupRequestOperateTypes||(GroupRequestOperateTypes={})));function _0x34b0(){var _0x4c55c5=['70UtDMMi','pMdsp','YPRBv','ortpO','REJECT','reject','JOIN_REQUEST','stzNa','ADMIN_SET','737185AqXtFr','WAIT_HANDLE','KICK_MEMBER','INVITE_ME','GiWbJ','579345iYIUhp','IGNORE','717075ySNMYn','KfBWP','elPnr','3003992IrdDBc','ADMIN_UNSET','29615YEwIkQ','wNrVF','BWfdw','APPROVE','roCpK','3155958bLumJc','14tCHYMF','oaJbb','407374lCvNai','TsdQk','236ooSnNu','ZUjAw'];_0x34b0=function(){return _0x4c55c5;};return _0x34b0();}
|
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(_0x3280a,_0x31ff92){var _0x134a05=_0x4e1e,_0x2bb004=_0x3280a();while(!![]){try{var _0x4dad6b=-parseInt(_0x134a05(0xb5))/0x1+-parseInt(_0x134a05(0xaf))/0x2*(parseInt(_0x134a05(0xb3))/0x3)+-parseInt(_0x134a05(0xb7))/0x4*(-parseInt(_0x134a05(0xb4))/0x5)+-parseInt(_0x134a05(0xb1))/0x6*(parseInt(_0x134a05(0xb6))/0x7)+parseInt(_0x134a05(0xbb))/0x8+-parseInt(_0x134a05(0xb0))/0x9+-parseInt(_0x134a05(0xba))/0xa*(-parseInt(_0x134a05(0xbc))/0xb);if(_0x4dad6b===_0x31ff92)break;else _0x2bb004['push'](_0x2bb004['shift']());}catch(_0x2778f5){_0x2bb004['push'](_0x2bb004['shift']());}}}(_0x4304,0x62c6e));function _0x4e1e(_0x91c316,_0xf4d96){var _0x430490=_0x4304();return _0x4e1e=function(_0x4e1e5d,_0x3faaaa){_0x4e1e5d=_0x4e1e5d-0xaf;var _0x5cf116=_0x430490[_0x4e1e5d];return _0x5cf116;},_0x4e1e(_0x91c316,_0xf4d96);}function _0x4304(){var _0x350a8d=['male','18CipHad','125aMNjeo','66413NvXFfL','14PSeYPD','105100BCWNiC','MkibG','UtMHF','10134270DaVRtl','6280848utMQVo','11lPNmHf','MnbWd','228166QAMZlT','5726079GnNBZL','1991028easFoz'];_0x4304=function(){return _0x350a8d;};return _0x4304();}export var Sex;(function(_0x440107){var _0x296e4a=_0x4e1e,_0x4d5d49={'MkibG':_0x296e4a(0xb2),'MnbWd':'female','UtMHF':'unknown'};_0x440107[_0x440107[_0x4d5d49['MkibG']]=0x1]=_0x4d5d49[_0x296e4a(0xb8)],_0x440107[_0x440107[_0x4d5d49[_0x296e4a(0xbd)]]=0x2]=_0x4d5d49['MnbWd'],_0x440107[_0x440107[_0x4d5d49[_0x296e4a(0xb9)]]=0xff]=_0x4d5d49[_0x296e4a(0xb9)];}(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 _0x3a05cc=_0x27d4;(function(_0x31fea6,_0x47861a){const _0x32383f=_0x27d4,_0x37ef87=_0x31fea6();while(!![]){try{const _0x54011b=-parseInt(_0x32383f(0x13d))/0x1*(parseInt(_0x32383f(0x136))/0x2)+parseInt(_0x32383f(0x147))/0x3*(parseInt(_0x32383f(0x139))/0x4)+-parseInt(_0x32383f(0x143))/0x5*(-parseInt(_0x32383f(0x13c))/0x6)+parseInt(_0x32383f(0x146))/0x7*(-parseInt(_0x32383f(0x142))/0x8)+parseInt(_0x32383f(0x137))/0x9+-parseInt(_0x32383f(0x13f))/0xa+parseInt(_0x32383f(0x13b))/0xb;if(_0x54011b===_0x47861a)break;else _0x37ef87['push'](_0x37ef87['shift']());}catch(_0x11baeb){_0x37ef87['push'](_0x37ef87['shift']());}}}(_0x5a33,0x89a5e));function _0x27d4(_0x3f525a,_0x11f5de){const _0x5a33a0=_0x5a33();return _0x27d4=function(_0x27d4b8,_0x18b0f3){_0x27d4b8=_0x27d4b8-0x135;let _0x951670=_0x5a33a0[_0x27d4b8];return _0x951670;},_0x27d4(_0x3f525a,_0x11f5de);}import{logError}from'@/common/utils/log';import{cpModule}from'@/common/utils/cpmodule';import{qqPkgInfo}from'@/common/utils/QQBasicInfo';function _0x5a33(){const _0x3f519a=['HWSXd','5657060mvrljl','moeHook','RcJyT','137608xtgWUz','2115635ScNrKF','version','GetRkey','217oSGugk','3imFOJj','isAvailable','qsSHB','HookRkey','MoeHoo','344506AZrnht','8950887AgcdAn','加载\x20moehoo\x20失败','2082804wQWgOd','getRKey','757658yUEFZM','6ZqhHxd','2eXrUGl'];_0x5a33=function(){return _0x3f519a;};return _0x5a33();}class HookApi{[_0x3a05cc(0x140)]=null;constructor(){const _0x556fd6=_0x3a05cc,_0x2124ee={'HWSXd':function(_0xd52f27,_0x53e328){return _0xd52f27(_0x53e328);},'qsSHB':_0x556fd6(0x135),'MmmGm':'./MoeHoo.node','RcJyT':function(_0xdb6f6a,_0x326c00,_0x2f1085){return _0xdb6f6a(_0x326c00,_0x2f1085);}};try{_0x2124ee['HWSXd'](cpModule,_0x2124ee[_0x556fd6(0x149)]),this['moeHook']=_0x2124ee[_0x556fd6(0x13e)](require,_0x2124ee['MmmGm']),this['moeHook'][_0x556fd6(0x14a)](qqPkgInfo[_0x556fd6(0x144)]);}catch(_0x26bb38){_0x2124ee[_0x556fd6(0x141)](logError,_0x556fd6(0x138),_0x26bb38);}}[_0x3a05cc(0x13a)](){const _0x458fb9=_0x3a05cc;return this[_0x458fb9(0x140)]?.[_0x458fb9(0x145)]()||'';}[_0x3a05cc(0x148)](){const _0x307b44=_0x3a05cc;return!!this[_0x307b44(0x140)];}}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 QQWrapper from './wrapper';
|
||||||
import { GlobalAdapter } from './qqnt/adapters';
|
export * from './adapters';
|
||||||
import { QRCodeLoginSucceedType } from './qqnt/services';
|
export * from './apis';
|
||||||
import { NapCatCoreWrapper } from './wrapper';
|
export * from './entities';
|
||||||
import { NapCatCoreLogin } from './login';
|
export * from './listeners';
|
||||||
import { NapCatCoreSession } from './session';
|
export * from './services';
|
||||||
import { NapCatCoreService } from './service';
|
export * as Adapters from './adapters';
|
||||||
import { EventEmitter } from 'node:events';
|
export * as APIs from './apis';
|
||||||
import * as log4js from '@log4js-node/log4js-api';
|
export * as Entities from './entities';
|
||||||
export interface LoginSuccessCallback {
|
export * as Listeners from './listeners';
|
||||||
(): void | Promise<void>;
|
export * as Services from './services';
|
||||||
}
|
export { QQWrapper as Wrapper };
|
||||||
export declare class NapCatCore extends EventEmitter {
|
export * as WrapperInterface from './wrapper';
|
||||||
readonly log: log4js.Logger;
|
export * as SessionConfig from './sessionConfig';
|
||||||
readonly adapter: GlobalAdapter;
|
export { napCatCore } from './core';
|
||||||
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;
|
|
||||||
|
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 {
|
interface IBuddyListener {
|
||||||
onBuddyListChange(arg: {
|
onBuddyListChange(arg: OnBuddyChangeParams): void;
|
||||||
categoryId: number;
|
|
||||||
categroyName: string;
|
|
||||||
categroyMbCount: number;
|
|
||||||
buddyList: User[];
|
|
||||||
}[]): void;
|
|
||||||
onBuddyInfoChange(arg: unknown): void;
|
onBuddyInfoChange(arg: unknown): void;
|
||||||
onBuddyDetailInfoChange(arg: unknown): void;
|
onBuddyDetailInfoChange(arg: unknown): void;
|
||||||
onNickUpdated(arg: unknown): void;
|
onNickUpdated(arg: unknown): void;
|
||||||
@@ -33,12 +29,7 @@ export declare class BuddyListener implements IBuddyListener {
|
|||||||
onBlockChanged(arg: unknown): void;
|
onBlockChanged(arg: unknown): void;
|
||||||
onBuddyDetailInfoChange(arg: unknown): void;
|
onBuddyDetailInfoChange(arg: unknown): void;
|
||||||
onBuddyInfoChange(arg: unknown): void;
|
onBuddyInfoChange(arg: unknown): void;
|
||||||
onBuddyListChange(arg: {
|
onBuddyListChange(arg: OnBuddyChangeParams): void;
|
||||||
categoryId: number;
|
|
||||||
categroyName: string;
|
|
||||||
categroyMbCount: number;
|
|
||||||
buddyList: User[];
|
|
||||||
}[]): void;
|
|
||||||
onBuddyRemarkUpdated(arg: unknown): void;
|
onBuddyRemarkUpdated(arg: unknown): void;
|
||||||
onBuddyReqChange(arg: FriendRequestNotify): void;
|
onBuddyReqChange(arg: FriendRequestNotify): void;
|
||||||
onBuddyReqUnreadCntChange(arg: unknown): 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 _0x505646=_0x3d52;(function(_0x140272,_0x2fce8d){var _0x119dea=_0x3d52,_0x4b0f1a=_0x140272();while(!![]){try{var _0x52a294=parseInt(_0x119dea(0x12e))/0x1*(parseInt(_0x119dea(0x12a))/0x2)+parseInt(_0x119dea(0x11c))/0x3*(parseInt(_0x119dea(0x11b))/0x4)+parseInt(_0x119dea(0x118))/0x5*(-parseInt(_0x119dea(0x12d))/0x6)+-parseInt(_0x119dea(0x129))/0x7*(parseInt(_0x119dea(0x121))/0x8)+parseInt(_0x119dea(0x122))/0x9*(parseInt(_0x119dea(0x11a))/0xa)+-parseInt(_0x119dea(0x126))/0xb*(parseInt(_0x119dea(0x116))/0xc)+parseInt(_0x119dea(0x11f))/0xd;if(_0x52a294===_0x2fce8d)break;else _0x4b0f1a['push'](_0x4b0f1a['shift']());}catch(_0x26a136){_0x4b0f1a['push'](_0x4b0f1a['shift']());}}}(_0x2d1a,0x7ba96));function _0x3d52(_0x1744c1,_0x81411b){var _0x2d1a44=_0x2d1a();return _0x3d52=function(_0x3d5260,_0x2ea068){_0x3d5260=_0x3d5260-0x115;var _0x65cb5=_0x2d1a44[_0x3d5260];return _0x65cb5;},_0x3d52(_0x1744c1,_0x81411b);}function _0x2d1a(){var _0x22a92e=['9FJDSlf','onAddBuddyNeedVerify','onBuddyReqChange','onNickUpdated','44gICzft','onDoubtBuddyReqUnreadNumChange','onCheckBuddySettingResult','69146RvTFjC','2HRvfLF','onSpacePermissionInfos','onBuddyDetailInfoChange','114HrPAOh','187067WOAQqR','onDelBatchBuddyInfos','54624VnWncI','onDoubtBuddyReqChange','174350ypjBKL','onAvatarUrlUpdated','1455800kuQZlQ','124940oIeRYk','69ZYYthk','onBlockChanged','onSmartInfos','5751486mxIikq','onBuddyInfoChange','248hXlxeU'];_0x2d1a=function(){return _0x22a92e;};return _0x2d1a();}export class BuddyListener{[_0x505646(0x123)](_0x3f377c){}['onAddMeSettingChanged'](_0x58db3f){}[_0x505646(0x119)](_0x557640){}[_0x505646(0x11d)](_0x187eec){}[_0x505646(0x12c)](_0x916d29){}[_0x505646(0x120)](_0x4effad){}['onBuddyListChange'](_0x2afd00){}['onBuddyRemarkUpdated'](_0x5e1996){}[_0x505646(0x124)](_0x1c60fa){}['onBuddyReqUnreadCntChange'](_0x5316ee){}[_0x505646(0x128)](_0xba21b4){}[_0x505646(0x115)](_0x3d63ac){}[_0x505646(0x117)](_0x3dc115){}[_0x505646(0x127)](_0x1a83fe){}[_0x505646(0x125)](_0x4d966c){}[_0x505646(0x11e)](_0x3aaef9){}[_0x505646(0x12b)](_0x5ca3d2){}}
|
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 @@
|
|||||||
|
function _0x242f(_0x78fa10,_0x418086){var _0x16caf3=_0x16ca();return _0x242f=function(_0x242fb7,_0x971733){_0x242fb7=_0x242fb7-0xeb;var _0x5db70b=_0x16caf3[_0x242fb7];return _0x5db70b;},_0x242f(_0x78fa10,_0x418086);}var _0x1c47ce=_0x242f;(function(_0x2c6f6b,_0x595586){var _0x1cace0=_0x242f,_0x399f3a=_0x2c6f6b();while(!![]){try{var _0x5d6257=-parseInt(_0x1cace0(0xec))/0x1+-parseInt(_0x1cace0(0xf2))/0x2+parseInt(_0x1cace0(0xf0))/0x3+parseInt(_0x1cace0(0xeb))/0x4+parseInt(_0x1cace0(0xf3))/0x5+-parseInt(_0x1cace0(0xf1))/0x6*(parseInt(_0x1cace0(0xf6))/0x7)+parseInt(_0x1cace0(0xf7))/0x8;if(_0x5d6257===_0x595586)break;else _0x399f3a['push'](_0x399f3a['shift']());}catch(_0x231534){_0x399f3a['push'](_0x399f3a['shift']());}}}(_0x16ca,0x748b8));function _0x16ca(){var _0x47d952=['7728992YgAvHq','1963716cfZQVU','645598sdAHTY','onFileSearch','onSessionListChanged','onSessionChanged','539487tHCMaX','12ryyaaI','385774wrMSKy','1493625AeRPMd','onFileStatusChanged','onFileListChanged','2169139HPkAKH'];_0x16ca=function(){return _0x47d952;};return _0x16ca();}export class KernelFileAssistantListener{[_0x1c47ce(0xf4)](..._0x3ff262){}[_0x1c47ce(0xee)](..._0x2d9f34){}[_0x1c47ce(0xef)](..._0x1e0913){}[_0x1c47ce(0xf5)](..._0x1900d2){}[_0x1c47ce(0xed)](..._0x7b9684){}}
|
@@ -1,4 +1,4 @@
|
|||||||
import { Group, GroupMember, GroupNotify } from '@/core/qqnt/entities';
|
import { Group, GroupMember, GroupNotify } from '@/core/entities';
|
||||||
interface IGroupListener {
|
interface IGroupListener {
|
||||||
onGroupListUpdate(updateType: number, groupList: Group[]): void;
|
onGroupListUpdate(updateType: number, groupList: Group[]): void;
|
||||||
onGroupExtListUpdate(...args: unknown[]): void;
|
onGroupExtListUpdate(...args: unknown[]): void;
|
||||||
@@ -29,11 +29,13 @@ interface IGroupListener {
|
|||||||
onGroupFirstBulletinNotify(...args: unknown[]): void;
|
onGroupFirstBulletinNotify(...args: unknown[]): void;
|
||||||
onJoinGroupNoVerifyFlag(...args: unknown[]): void;
|
onJoinGroupNoVerifyFlag(...args: unknown[]): void;
|
||||||
onGroupArkInviteStateResult(...args: unknown[]): void;
|
onGroupArkInviteStateResult(...args: unknown[]): void;
|
||||||
|
onGroupMemberLevelInfoChange(...args: unknown[]): void;
|
||||||
}
|
}
|
||||||
export interface NodeIKernelGroupListener extends IGroupListener {
|
export interface NodeIKernelGroupListener extends IGroupListener {
|
||||||
new (listener: IGroupListener): NodeIKernelGroupListener;
|
new (listener: IGroupListener): NodeIKernelGroupListener;
|
||||||
}
|
}
|
||||||
export declare class GroupListener implements IGroupListener {
|
export declare class GroupListener implements IGroupListener {
|
||||||
|
onGroupMemberLevelInfoChange(...args: unknown[]): void;
|
||||||
onGetGroupBulletinListResult(...args: unknown[]): void;
|
onGetGroupBulletinListResult(...args: unknown[]): void;
|
||||||
onGroupAllInfoChange(...args: unknown[]): void;
|
onGroupAllInfoChange(...args: unknown[]): void;
|
||||||
onGroupBulletinChange(...args: unknown[]): void;
|
onGroupBulletinChange(...args: unknown[]): void;
|
||||||
@@ -65,6 +67,7 @@ export declare class GroupListener implements IGroupListener {
|
|||||||
onShutUpMemberListChanged(...args: unknown[]): void;
|
onShutUpMemberListChanged(...args: unknown[]): void;
|
||||||
}
|
}
|
||||||
export declare class DebugGroupListener implements IGroupListener {
|
export declare class DebugGroupListener implements IGroupListener {
|
||||||
|
onGroupMemberLevelInfoChange(...args: unknown[]): void;
|
||||||
onGetGroupBulletinListResult(...args: unknown[]): void;
|
onGetGroupBulletinListResult(...args: unknown[]): void;
|
||||||
onGroupAllInfoChange(...args: unknown[]): void;
|
onGroupAllInfoChange(...args: unknown[]): void;
|
||||||
onGroupBulletinChange(...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;
|
}): void;
|
||||||
onQRCodeLoginPollingStarted(...args: any[]): void;
|
onQRCodeLoginPollingStarted(...args: any[]): void;
|
||||||
onQRCodeSessionUserScaned(...args: any[]): void;
|
onQRCodeSessionUserScaned(...args: any[]): void;
|
||||||
onQRCodeLoginSucceed(...args: any[]): void;
|
onQRCodeLoginSucceed(arg: QRCodeLoginSucceedResult): void;
|
||||||
onQRCodeSessionFailed(...args: any[]): void;
|
onQRCodeSessionFailed(...args: any[]): void;
|
||||||
onLoginFailed(...args: any[]): void;
|
onLoginFailed(...args: any[]): void;
|
||||||
onLogoutSucceed(...args: any[]): void;
|
onLogoutSucceed(...args: any[]): void;
|
||||||
@@ -42,3 +42,13 @@ export declare class LoginListener implements IKernelLoginListener {
|
|||||||
onQQLoginNumLimited(...args: any[]): void;
|
onQQLoginNumLimited(...args: any[]): void;
|
||||||
onLoginState(...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 @@
|
|||||||
|
function _0x2f62(_0x400ced,_0x53f347){var _0x1b90ce=_0x1b90();return _0x2f62=function(_0x2f6246,_0x40961b){_0x2f6246=_0x2f6246-0x15d;var _0x3c2fc7=_0x1b90ce[_0x2f6246];return _0x3c2fc7;},_0x2f62(_0x400ced,_0x53f347);}var _0x472096=_0x2f62;function _0x1b90(){var _0x36a1ee=['2166170xewyJs','860065XAWyeY','onLogoutFailed','onQRCodeSessionFailed','onUserLoggedIn','260604vISAzA','onLoginConnecting','89455wtaiPU','onLoginState','4UEnQTq','onLoginDisConnected','48YIVLuj','onPasswordLoginFailed','onLoginConnected','110hAIuIh','12738lzOlTy','onQQLoginNumLimited','1372jByAxy','onQRCodeLoginSucceed','82122kaqrUA','405818pKZCfq','onLogoutSucceed','onQRCodeSessionUserScaned'];_0x1b90=function(){return _0x36a1ee;};return _0x1b90();}(function(_0x366ee2,_0x12a3aa){var _0x2fee7c=_0x2f62,_0x1f45cd=_0x366ee2();while(!![]){try{var _0x41c781=-parseInt(_0x2fee7c(0x164))/0x1+-parseInt(_0x2fee7c(0x160))/0x2+parseInt(_0x2fee7c(0x15f))/0x3*(-parseInt(_0x2fee7c(0x16c))/0x4)+-parseInt(_0x2fee7c(0x16a))/0x5+-parseInt(_0x2fee7c(0x172))/0x6*(parseInt(_0x2fee7c(0x15d))/0x7)+parseInt(_0x2fee7c(0x16e))/0x8*(-parseInt(_0x2fee7c(0x168))/0x9)+parseInt(_0x2fee7c(0x163))/0xa*(parseInt(_0x2fee7c(0x171))/0xb);if(_0x41c781===_0x12a3aa)break;else _0x1f45cd['push'](_0x1f45cd['shift']());}catch(_0x106e75){_0x1f45cd['push'](_0x1f45cd['shift']());}}}(_0x1b90,0x72477));export class LoginListener{[_0x472096(0x170)](..._0x5951ac){}[_0x472096(0x16d)](..._0x7e59b0){}[_0x472096(0x169)](..._0x3bd450){}['onQRCodeGetPicture'](_0x870a08){}['onQRCodeLoginPollingStarted'](..._0x2512bb){}[_0x472096(0x162)](..._0x34a5f3){}[_0x472096(0x15e)](_0x432748){}[_0x472096(0x166)](..._0x40723a){}['onLoginFailed'](..._0x2e3717){}[_0x472096(0x161)](..._0x57ac99){}[_0x472096(0x165)](..._0x2d25fb){}[_0x472096(0x167)](..._0x12ee99){}['onQRCodeSessionQuickLoginFailed'](..._0x36bc89){}[_0x472096(0x16f)](..._0x4e6509){}['OnConfirmUnusualDeviceFailed'](..._0x384d7c){}[_0x472096(0x173)](..._0x5b0c5c){}[_0x472096(0x16b)](..._0x2213d4){}}
|
@@ -1,4 +1,4 @@
|
|||||||
import { RawMessage } from '@/core/qqnt/entities';
|
import { RawMessage } from '@/core/entities';
|
||||||
export interface OnRichMediaDownloadCompleteParams {
|
export interface OnRichMediaDownloadCompleteParams {
|
||||||
fileModelId: string;
|
fileModelId: string;
|
||||||
msgElementId: string;
|
msgElementId: string;
|
||||||
@@ -90,6 +90,7 @@ export interface IKernelMsgListener {
|
|||||||
onUserSecQualityChanged(...args: unknown[]): void;
|
onUserSecQualityChanged(...args: unknown[]): void;
|
||||||
onMsgWithRichLinkInfoUpdate(...args: unknown[]): void;
|
onMsgWithRichLinkInfoUpdate(...args: unknown[]): void;
|
||||||
onRedTouchChanged(...args: unknown[]): void;
|
onRedTouchChanged(...args: unknown[]): void;
|
||||||
|
onBroadcastHelperProgerssUpdate(...args: unknown[]): void;
|
||||||
}
|
}
|
||||||
export interface NodeIKernelMsgListener {
|
export interface NodeIKernelMsgListener {
|
||||||
new (listener: IKernelMsgListener): NodeIKernelMsgListener;
|
new (listener: IKernelMsgListener): NodeIKernelMsgListener;
|
||||||
@@ -163,4 +164,5 @@ export declare class MsgListener implements IKernelMsgListener {
|
|||||||
onUserSecQualityChanged(...args: unknown[]): void;
|
onUserSecQualityChanged(...args: unknown[]): void;
|
||||||
onMsgWithRichLinkInfoUpdate(...args: unknown[]): void;
|
onMsgWithRichLinkInfoUpdate(...args: unknown[]): void;
|
||||||
onRedTouchChanged(...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 _0x532ad0=_0x42b5;(function(_0x27e107,_0x244977){var _0x315824=_0x42b5,_0x1f57df=_0x27e107();while(!![]){try{var _0x1361fc=parseInt(_0x315824(0x133))/0x1+parseInt(_0x315824(0x136))/0x2+-parseInt(_0x315824(0x143))/0x3*(-parseInt(_0x315824(0x145))/0x4)+-parseInt(_0x315824(0x14d))/0x5*(-parseInt(_0x315824(0x14c))/0x6)+parseInt(_0x315824(0x125))/0x7+parseInt(_0x315824(0x13f))/0x8+-parseInt(_0x315824(0x129))/0x9;if(_0x1361fc===_0x244977)break;else _0x1f57df['push'](_0x1f57df['shift']());}catch(_0x5a2c16){_0x1f57df['push'](_0x1f57df['shift']());}}}(_0x11fb,0x5386e));function _0x42b5(_0x24f12a,_0x42260b){var _0x11fbb4=_0x11fb();return _0x42b5=function(_0x42b52c,_0x402f03){_0x42b52c=_0x42b52c-0x11a;var _0x488bd1=_0x11fbb4[_0x42b52c];return _0x488bd1;},_0x42b5(_0x24f12a,_0x42260b);}function _0x11fb(){var _0x1d1abe=['12092391GWyniR','onSearchGroupFileInfoUpdate','onKickedOffLine','onCustomWithdrawConfigUpdate','onContactUnreadCntUpdate','onNtMsgSyncStart','onFirstViewDirectMsgUpdate','onFeedEventUpdate','onBroadcastHelperProgerssUpdate','onRichMediaUploadComplete','208177tnYpku','onImportOldDbProgressUpdate','onMsgDelete','1184800EqPuHp','onBroadcastHelperProgressUpdate','onReadFeedEventUpdate','onUnreadCntUpdate','onHitEmojiKeywordResult','onDraftUpdate','onMsgEventListUpdate','onUnreadCntAfterFirstView','onUserChannelTabStatusChanged','1039248KhIfJQ','onTempChatInfoUpdate','onEmojiResourceUpdate','onLineDev','368247FMsNuJ','onRecvMsg','4Pjrlqv','onUserOnlineStatusChanged','onLogLevelChanged','onMsgSecurityNotify','onGroupFileInfoAdd','onMsgSettingUpdate','onGuildInteractiveUpdate','602358TwCRHB','5EGewSO','onMsgInfoListUpdate','onGroupTransferInfoAdd','onGrabPasswordRedBag','onUserSecQualityChanged','onlineStatusBigIconDownloadPush','onGroupGuildUpdate','onRecvMsgSvrRspTransInfo','onRecvS2CMsg','onGuildMsgAbFlagChanged','onFirstViewGroupGuildMapping','onMsgQRCodeStatusChanged','onGroupFileInfoUpdate','onGroupTransferInfoUpdate','onMsgWithRichLinkInfoUpdate','onHitCsRelatedEmojiResult','onRecvSysMsg','onRedTouchChanged','onBroadcastHelperDownloadComplete','onSysMsgNotification','onChannelFreqLimitInfoUpdate','onRichMediaDownloadComplete','3724700vkWbhw','onMsgAbstractUpdate','onRichMediaProgerssUpdate','onMsgBoxChanged'];_0x11fb=function(){return _0x1d1abe;};return _0x11fb();}export class MsgListener{['onAddSendMsg'](_0x1d7722){}[_0x532ad0(0x121)](_0x35a6ae){}[_0x532ad0(0x137)](_0x5985c6){}[_0x532ad0(0x123)](_0x12866e,_0x4d4730,_0x5a21ff){}[_0x532ad0(0x12d)](_0x58ebf2){}[_0x532ad0(0x12c)](_0x380242){}[_0x532ad0(0x13b)](_0x1b6eaa,_0xa9b230,_0x46d5ef){}['onEmojiDownloadComplete'](_0x94843){}[_0x532ad0(0x141)](_0x544686){}[_0x532ad0(0x130)](_0x1d5268){}['onFileMsgCome'](_0x5d5041){}[_0x532ad0(0x12f)](_0x5cba19){}[_0x532ad0(0x157)](_0x26a72d){}[_0x532ad0(0x150)](_0x3d8f1e,_0xaa6ac1,_0x29d1a9,_0x5360bd,_0x470762){}[_0x532ad0(0x149)](_0x5ec763){}[_0x532ad0(0x11b)](_0x3ae61e){}[_0x532ad0(0x153)](_0x33eebc){}[_0x532ad0(0x14f)](_0x46e3b1){}[_0x532ad0(0x11c)](_0x46454d){}[_0x532ad0(0x14b)](_0x35ba8f){}[_0x532ad0(0x156)](_0x166d80){}['onGuildNotificationAbstractUpdate'](_0x4b9664){}[_0x532ad0(0x11e)](_0x3bccdb){}[_0x532ad0(0x13a)](_0xfa8e6e){}['onHitRelatedEmojiResult'](_0x39b86f){}[_0x532ad0(0x134)](_0x2a5e8b){}['onInputStatusPush'](_0x57143b){}[_0x532ad0(0x12b)](_0x4f40ff){}[_0x532ad0(0x142)](_0x33eb4a){}[_0x532ad0(0x147)](_0xe84669){}[_0x532ad0(0x126)](_0xf8a9ee){}[_0x532ad0(0x128)](_0x55a7fd){}[_0x532ad0(0x135)](_0xfd70c8,_0x56b6ba){}[_0x532ad0(0x13c)](_0x3b3298){}['onMsgInfoListAdd'](_0x279357){}[_0x532ad0(0x14e)](_0x242edb){}[_0x532ad0(0x11a)](_0x29083e){}['onMsgRecall'](_0x1ecb16,_0xf376f1,_0x2d6fba){}[_0x532ad0(0x148)](_0xed9df9){}[_0x532ad0(0x14a)](_0x4c72ec){}['onNtFirstViewMsgSyncEnd'](){}['onNtMsgSyncEnd'](){}[_0x532ad0(0x12e)](){}[_0x532ad0(0x138)](_0x209546){}['onRecvGroupGuildFlag'](_0xf37bd5){}[_0x532ad0(0x144)](_0x53ff67){}[_0x532ad0(0x154)](_0x3c41d2,_0x29e0b3,_0x52aae4,_0x58dfda,_0x2940c1,_0x16fbef){}['onRecvOnlineFileMsg'](_0x2818ea){}[_0x532ad0(0x155)](_0x81111a){}[_0x532ad0(0x11f)](_0x4ccd77){}['onRecvUDCFlag'](_0x1da039){}[_0x532ad0(0x124)](_0x1a9fb3){}[_0x532ad0(0x127)](_0x1fa6e1){}[_0x532ad0(0x132)](_0x24ffed){}[_0x532ad0(0x12a)](_0x216217){}['onSendMsgError'](_0x207686,_0x1e8e89,_0x10f811,_0x449dd5){}[_0x532ad0(0x122)](_0x4b61a3,_0xbcbba8,_0x5f4b39,_0x779f26){}[_0x532ad0(0x140)](_0x55d678){}[_0x532ad0(0x13d)](_0x2df247){}[_0x532ad0(0x139)](_0x468e39){}[_0x532ad0(0x13e)](_0x245c1c){}[_0x532ad0(0x146)](_0x2b1d77){}['onUserTabStatusChanged'](_0x3d8917){}[_0x532ad0(0x152)](_0x19901f,_0x4b2ee1,_0x16a61b){}['onlineStatusSmallIconDownloadPush'](_0x2b1877,_0x1391a8,_0x3cf3ab){}[_0x532ad0(0x151)](..._0x5b2c41){}[_0x532ad0(0x11d)](..._0x4eb457){}[_0x532ad0(0x120)](..._0x2a3775){}[_0x532ad0(0x131)](..._0x4fc839){}}
|
@@ -1,4 +1,4 @@
|
|||||||
import { User } from '@/core/qqnt/entities';
|
import { User } from '@/core/entities';
|
||||||
interface IProfileListener {
|
interface IProfileListener {
|
||||||
onProfileSimpleChanged(...args: unknown[]): void;
|
onProfileSimpleChanged(...args: unknown[]): void;
|
||||||
onProfileDetailInfoChanged(profile: User): 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 _0x251038=_0x32e9;(function(_0x230a9e,_0x3d87b9){var _0x4dee39=_0x32e9,_0x2c8bbe=_0x230a9e();while(!![]){try{var _0x197e84=-parseInt(_0x4dee39(0x1d6))/0x1*(-parseInt(_0x4dee39(0x1cf))/0x2)+parseInt(_0x4dee39(0x1ce))/0x3+-parseInt(_0x4dee39(0x1cc))/0x4*(parseInt(_0x4dee39(0x1c7))/0x5)+parseInt(_0x4dee39(0x1c8))/0x6+-parseInt(_0x4dee39(0x1d5))/0x7*(parseInt(_0x4dee39(0x1c9))/0x8)+-parseInt(_0x4dee39(0x1d1))/0x9*(parseInt(_0x4dee39(0x1d4))/0xa)+-parseInt(_0x4dee39(0x1cb))/0xb*(-parseInt(_0x4dee39(0x1d2))/0xc);if(_0x197e84===_0x3d87b9)break;else _0x2c8bbe['push'](_0x2c8bbe['shift']());}catch(_0x504427){_0x2c8bbe['push'](_0x2c8bbe['shift']());}}}(_0x34e7,0xc5d2d));function _0x32e9(_0x400c42,_0x3d2349){var _0x34e77b=_0x34e7();return _0x32e9=function(_0x32e982,_0x4593dc){_0x32e982=_0x32e982-0x1c7;var _0xbb217c=_0x34e77b[_0x32e982];return _0xbb217c;},_0x32e9(_0x400c42,_0x3d2349);}function _0x34e7(){var _0x2d51f6=['5131368xrYPfD','4376VzoPkZ','onProfileSimpleChanged','6677eZRRli','5434068oeLqah','onStrangerRemarkChanged','3828573brTBek','36RkYyRp','onProfileDetailInfoChanged','9RoJyyY','28524tyJIjK','onSelfStatusChanged','14646890YQLBfp','13055DhIBaB','59966AjDEtA','5SyHAgD'];_0x34e7=function(){return _0x2d51f6;};return _0x34e7();}export class ProfileListener{[_0x251038(0x1ca)](..._0x1553d1){}[_0x251038(0x1d0)](_0xc3f91b){}['onStatusUpdate'](..._0x530924){}[_0x251038(0x1d3)](..._0x2cb1fc){}[_0x251038(0x1cd)](..._0x1d4f91){}}
|
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 @@
|
|||||||
|
var _0x121e78=_0x27c6;function _0x371b(){var _0x5b0fd3=['4UDjqIq','1086080yLPtLg','onRobotFriendListChanged','2723798cboUdQ','onRobotListChanged','8464236utHbYv','2568291dqWikN','10235133SaLixm','976077eWhAaw','1647736ajCmJY','28xFVxKs'];_0x371b=function(){return _0x5b0fd3;};return _0x371b();}(function(_0xcc90e1,_0xf0e62a){var _0x1cc121=_0x27c6,_0x278161=_0xcc90e1();while(!![]){try{var _0x87eda8=parseInt(_0x1cc121(0xa3))/0x1+parseInt(_0x1cc121(0x9e))/0x2+-parseInt(_0x1cc121(0xa1))/0x3+parseInt(_0x1cc121(0xa6))/0x4*(-parseInt(_0x1cc121(0xa7))/0x5)+parseInt(_0x1cc121(0xa0))/0x6+-parseInt(_0x1cc121(0xa5))/0x7*(parseInt(_0x1cc121(0xa4))/0x8)+-parseInt(_0x1cc121(0xa2))/0x9;if(_0x87eda8===_0xf0e62a)break;else _0x278161['push'](_0x278161['shift']());}catch(_0x33fb82){_0x278161['push'](_0x278161['shift']());}}}(_0x371b,0xae618));function _0x27c6(_0x27d278,_0x4b2189){var _0x371b68=_0x371b();return _0x27c6=function(_0x27c655,_0x15ce67){_0x27c655=_0x27c655-0x9d;var _0x47737b=_0x371b68[_0x27c655];return _0x47737b;},_0x27c6(_0x27d278,_0x4b2189);}export class KernelRobotListener{[_0x121e78(0x9d)](..._0x2732d1){}[_0x121e78(0x9f)](..._0x1fceff){}['onRobotProfileChanged'](..._0x307080){}}
|
1
src/core.lib/src/listeners/NodeIKernelSessionListener.js
Normal file
1
src/core.lib/src/listeners/NodeIKernelSessionListener.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
function _0x39a8(){var _0x4c537e=['onGProSessionCreate','376NWznIo','onGetSelfTinyId','onNTSessionCreate','302071aActse','370510LoUqVi','6746960HXICBk','1398081GvGbCY','onUserOnlineResult','7611768OiGfDN','onSessionInitComplete','1361038LLbDFv','1235064EPrTFB'];_0x39a8=function(){return _0x4c537e;};return _0x39a8();}var _0x52d870=_0x5ce5;(function(_0x5a20c8,_0x33ce0a){var _0xbeaf1d=_0x5ce5,_0x32b791=_0x5a20c8();while(!![]){try{var _0x52dad3=parseInt(_0xbeaf1d(0x179))/0x1+-parseInt(_0xbeaf1d(0x180))/0x2+parseInt(_0xbeaf1d(0x182))/0x3+-parseInt(_0xbeaf1d(0x17a))/0x4+-parseInt(_0xbeaf1d(0x181))/0x5+-parseInt(_0xbeaf1d(0x184))/0x6+-parseInt(_0xbeaf1d(0x17f))/0x7*(-parseInt(_0xbeaf1d(0x17c))/0x8);if(_0x52dad3===_0x33ce0a)break;else _0x32b791['push'](_0x32b791['shift']());}catch(_0xe7ed92){_0x32b791['push'](_0x32b791['shift']());}}}(_0x39a8,0xb572f));function _0x5ce5(_0x192502,_0x369c05){var _0x39a8fd=_0x39a8();return _0x5ce5=function(_0x5ce539,_0x1bef1f){_0x5ce539=_0x5ce539-0x178;var _0x53a358=_0x39a8fd[_0x5ce539];return _0x53a358;},_0x5ce5(_0x192502,_0x369c05);}export class SessionListener{[_0x52d870(0x17e)](_0x3125a0){}[_0x52d870(0x17b)](_0x84e309){}[_0x52d870(0x178)](_0x431585){}['onOpentelemetryInit'](_0x172a79){}[_0x52d870(0x183)](_0x5bfad0){}[_0x52d870(0x17d)](_0x5eed62){}}
|
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 @@
|
|||||||
|
var _0x4d4fd1=_0x4a09;function _0x5800(){var _0xa25b49=['onCleanCacheStorageChanged','onCleanCacheProgressChanged','5079666jaYHxw','34840wRFjFN','onScanCacheProgressChanged','5aDCquY','3678890plGeVj','1534260Cnxzqe','4409552VRsfsf','1393iCTKyA','27YeYxcB','onFinishScan','359622tzmEBC','onChatCleanDone','110qYqDNn','6632145ammGyB'];_0x5800=function(){return _0xa25b49;};return _0x5800();}(function(_0x1dd2a7,_0x2c2da0){var _0x41e87d=_0x4a09,_0x27f614=_0x1dd2a7();while(!![]){try{var _0x4fe0d0=-parseInt(_0x41e87d(0x12a))/0x1+-parseInt(_0x41e87d(0x12f))/0x2*(parseInt(_0x41e87d(0x12d))/0x3)+parseInt(_0x41e87d(0x12b))/0x4+-parseInt(_0x41e87d(0x128))/0x5*(parseInt(_0x41e87d(0x125))/0x6)+parseInt(_0x41e87d(0x12c))/0x7*(parseInt(_0x41e87d(0x126))/0x8)+-parseInt(_0x41e87d(0x132))/0x9+parseInt(_0x41e87d(0x129))/0xa*(parseInt(_0x41e87d(0x131))/0xb);if(_0x4fe0d0===_0x2c2da0)break;else _0x27f614['push'](_0x27f614['shift']());}catch(_0x2920f3){_0x27f614['push'](_0x27f614['shift']());}}}(_0x5800,0xde9e8));function _0x4a09(_0x2066ff,_0x4262d9){var _0x58006b=_0x5800();return _0x4a09=function(_0x4a093e,_0x446870){_0x4a093e=_0x4a093e-0x125;var _0x405ad6=_0x58006b[_0x4a093e];return _0x405ad6;},_0x4a09(_0x2066ff,_0x4262d9);}export class StorageCleanListener{[_0x4d4fd1(0x134)](_0x26fed1){}[_0x4d4fd1(0x127)](_0x650ea3){}[_0x4d4fd1(0x133)](_0x30e89c){}[_0x4d4fd1(0x12e)](_0xfe9883){}[_0x4d4fd1(0x130)](_0x380628){}}
|
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(_0xaad254,_0x2ded86){var _0x272df5=_0x1f65,_0x1f246a=_0xaad254();while(!![]){try{var _0x4a1c1e=parseInt(_0x272df5(0xdc))/0x1+-parseInt(_0x272df5(0xdb))/0x2*(parseInt(_0x272df5(0xdd))/0x3)+parseInt(_0x272df5(0xde))/0x4+parseInt(_0x272df5(0xd9))/0x5*(parseInt(_0x272df5(0xda))/0x6)+parseInt(_0x272df5(0xdf))/0x7+parseInt(_0x272df5(0xd7))/0x8*(-parseInt(_0x272df5(0xd8))/0x9)+-parseInt(_0x272df5(0xe0))/0xa;if(_0x4a1c1e===_0x2ded86)break;else _0x1f246a['push'](_0x1f246a['shift']());}catch(_0x5ca8f1){_0x1f246a['push'](_0x1f246a['shift']());}}}(_0x3469,0x7660f));function _0x1f65(_0x271658,_0x102e1b){var _0x346900=_0x3469();return _0x1f65=function(_0x1f655f,_0x9afbc5){_0x1f655f=_0x1f655f-0xd7;var _0x2da023=_0x346900[_0x1f655f];return _0x2da023;},_0x1f65(_0x271658,_0x102e1b);}export*from'./NodeIKernelSessionListener';export*from'./NodeIKernelLoginListener';function _0x3469(){var _0x3fc991=['349620qtSXxS','52068FvkcBz','2446264jrVXgm','2334710LdDLJu','9475660liyOkT','8ujIoPK','27315HLDbMw','2217680YEmTtu','12EYofus','86ndYoyS'];_0x3469=function(){return _0x3fc991;};return _0x3469();}export*from'./NodeIKernelMsgListener';export*from'./NodeIKernelGroupListener';export*from'./NodeIKernelBuddyListener';export*from'./NodeIKernelProfileListener';export*from'./NodeIKernelRobotListener';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>;
|
|
||||||
}
|
|
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user