mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2026-03-02 16:50:27 +00:00
Compare commits
394 Commits
dependabot
...
v1.2.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dc34c4d00c | ||
|
|
fb42729dec | ||
|
|
b06989216a | ||
|
|
e5144f08cd | ||
|
|
c4a60190e8 | ||
|
|
efe9e4fa4c | ||
|
|
45800b1559 | ||
|
|
b0b2b8104f | ||
|
|
8dbc012825 | ||
|
|
a434176063 | ||
|
|
a013f750c7 | ||
|
|
aa1f49d02f | ||
|
|
7125a26309 | ||
|
|
329a35ebf0 | ||
|
|
d30043f595 | ||
|
|
745dfa1911 | ||
|
|
76203f49a7 | ||
|
|
870a915377 | ||
|
|
c174fce227 | ||
|
|
2b6e42e919 | ||
|
|
df73e1e5a3 | ||
|
|
3e902311d4 | ||
|
|
64a0037265 | ||
|
|
bcd4e38093 | ||
|
|
181a77d627 | ||
|
|
b353595ba9 | ||
|
|
75e3bb4f17 | ||
|
|
d2fa9192d4 | ||
|
|
4bcadc2de4 | ||
|
|
8ddff74260 | ||
|
|
95940fdb64 | ||
|
|
9cd5708948 | ||
|
|
d361683d79 | ||
|
|
9ad17a01f7 | ||
|
|
22ca1d443c | ||
|
|
2662e875ca | ||
|
|
8ae0d07ec1 | ||
|
|
76a9edb7f5 | ||
|
|
0ccb464e5b | ||
|
|
bef600efa2 | ||
|
|
58a182cd33 | ||
|
|
aa43334f41 | ||
|
|
a2a4c97f6c | ||
|
|
4217ba99fd | ||
|
|
589725f5cc | ||
|
|
3fea4602f8 | ||
|
|
8ea6aae875 | ||
|
|
2c70b2af68 | ||
|
|
54a2cbcb42 | ||
|
|
fdef821c60 | ||
|
|
dfa798a35d | ||
|
|
39b8eb6ff1 | ||
|
|
6cf71f67a9 | ||
|
|
f2e919725e | ||
|
|
869599126e | ||
|
|
3b1b200f6f | ||
|
|
93c646e3e4 | ||
|
|
3552f80a21 | ||
|
|
66d3a63998 | ||
|
|
6447825978 | ||
|
|
18b7df9fca | ||
|
|
c3781cab96 | ||
|
|
776098dba6 | ||
|
|
8d1b4f61e7 | ||
|
|
c13e2bdb96 | ||
|
|
4682254157 | ||
|
|
d7ca6b9213 | ||
|
|
4a76afbde8 | ||
|
|
a68349c23a | ||
|
|
920e005366 | ||
|
|
659f339020 | ||
|
|
3ee2d463af | ||
|
|
686ddb5460 | ||
|
|
e5d62488b7 | ||
|
|
eb93dd5005 | ||
|
|
6999d02d2d | ||
|
|
790e2b1427 | ||
|
|
a29c7cdfe4 | ||
|
|
6b7cd692a6 | ||
|
|
4d3925872a | ||
|
|
2bd0f6934a | ||
|
|
51783f17ed | ||
|
|
ce3aef3526 | ||
|
|
ee70afdfbb | ||
|
|
d96c4a56a2 | ||
|
|
9a39513dea | ||
|
|
8f22d63315 | ||
|
|
7f2a5bb95e | ||
|
|
0118dbd5fb | ||
|
|
09405de26c | ||
|
|
efa5ee0e57 | ||
|
|
80d558f37a | ||
|
|
901adc3fc7 | ||
|
|
01417be954 | ||
|
|
43b780cbe6 | ||
|
|
e83f36a12f | ||
|
|
77e3fc4ab0 | ||
|
|
eafd1adaba | ||
|
|
6b53abb7c9 | ||
|
|
f994c5d284 | ||
|
|
6fda220107 | ||
|
|
da290ed1c3 | ||
|
|
7e9cd80a1c | ||
|
|
379b7413d8 | ||
|
|
9181a4df16 | ||
|
|
df982afd51 | ||
|
|
5c2c3b4317 | ||
|
|
92d1309103 | ||
|
|
c43ee3c1d6 | ||
|
|
e0726e5283 | ||
|
|
5f3775584b | ||
|
|
77873d63c5 | ||
|
|
9e6b09765e | ||
|
|
1ad6ea4049 | ||
|
|
7c41da1cb9 | ||
|
|
adcf4bfc53 | ||
|
|
7a6321a9c1 | ||
|
|
d56b27a7b0 | ||
|
|
ed7657ab5f | ||
|
|
a414838416 | ||
|
|
93646577dc | ||
|
|
46db66038e | ||
|
|
efc4e9ce56 | ||
|
|
8d5eac7f80 | ||
|
|
7b94e49b81 | ||
|
|
c35fd4bdc8 | ||
|
|
98590e2d90 | ||
|
|
e6da0e5dd5 | ||
|
|
cb2baf747d | ||
|
|
a2f2eb03ce | ||
|
|
5c6acbb780 | ||
|
|
1be7031199 | ||
|
|
ed6399bde9 | ||
|
|
6709893781 | ||
|
|
686a426cda | ||
|
|
4f90bc7813 | ||
|
|
e307b289ae | ||
|
|
3baeff61a7 | ||
|
|
93ab9d12ee | ||
|
|
36e1317792 | ||
|
|
fa3e90a021 | ||
|
|
782a69cf13 | ||
|
|
d495f351c0 | ||
|
|
30bd3d2d52 | ||
|
|
ff5a21cca5 | ||
|
|
f8abb73c92 | ||
|
|
e97f323d9a | ||
|
|
3d27a4c05d | ||
|
|
9dbc13dbe4 | ||
|
|
c46a4c75b1 | ||
|
|
0bded73f16 | ||
|
|
1333733684 | ||
|
|
003be934de | ||
|
|
93ef20d358 | ||
|
|
94e1a6f0ba | ||
|
|
8661d09d57 | ||
|
|
0e5e21dc4e | ||
|
|
3b25c4987c | ||
|
|
2212eb17aa | ||
|
|
768bac1db8 | ||
|
|
3aef75085f | ||
|
|
ce8bef638a | ||
|
|
f0a0c90304 | ||
|
|
cd6c32b21d | ||
|
|
b31876d2d1 | ||
|
|
ebab8a190e | ||
|
|
1b7ce8e7a5 | ||
|
|
646bb6bd79 | ||
|
|
5a84b97ca9 | ||
|
|
6d41b5a4a1 | ||
|
|
a8bce36f3b | ||
|
|
ac2132f8ba | ||
|
|
cab4b57abe | ||
|
|
938fb30359 | ||
|
|
62346d7d9d | ||
|
|
cf1e5ca64b | ||
|
|
7d2d683d96 | ||
|
|
fe5042f1c3 | ||
|
|
a1dd76aee0 | ||
|
|
d1c91be167 | ||
|
|
9748d99f34 | ||
|
|
c90ffbeb62 | ||
|
|
eb7fafeabf | ||
|
|
3e50629462 | ||
|
|
65281a4554 | ||
|
|
454ec09d6a | ||
|
|
60e3c6858d | ||
|
|
f911f5b4fc | ||
|
|
ad1694d291 | ||
|
|
1130965f26 | ||
|
|
fe1f28998b | ||
|
|
45727fce05 | ||
|
|
d5c23e5add | ||
|
|
e3a8285f6c | ||
|
|
a791221cf6 | ||
|
|
b954d9b403 | ||
|
|
5e7e24a271 | ||
|
|
ffb1e598f6 | ||
|
|
bc2da8a645 | ||
|
|
6f2be3ed30 | ||
|
|
033a7bffb3 | ||
|
|
f2b2ea61a1 | ||
|
|
6f0783acc4 | ||
|
|
ce60aa3823 | ||
|
|
8075e70606 | ||
|
|
4402fc2d0a | ||
|
|
3e3ecda551 | ||
|
|
50beb8f346 | ||
|
|
8e033e3e06 | ||
|
|
dc029a318b | ||
|
|
8e91bc2c8e | ||
|
|
0ff5b4e90b | ||
|
|
20dec19bfe | ||
|
|
d261fbff26 | ||
|
|
6594b33bcc | ||
|
|
a1bb6cc1b1 | ||
|
|
7ce195b68e | ||
|
|
16d8d04aaa | ||
|
|
59565f7d90 | ||
|
|
43784a2495 | ||
|
|
3811d7469e | ||
|
|
c72b40a1e1 | ||
|
|
f00933969d | ||
|
|
759adc45e3 | ||
|
|
27ecf78372 | ||
|
|
c91b83a7ba | ||
|
|
39373ee63a | ||
|
|
2db64c69ae | ||
|
|
a699b71c02 | ||
|
|
6c07d22cda | ||
|
|
a2ee900ed5 | ||
|
|
e709f31b99 | ||
|
|
35afb12756 | ||
|
|
9bed9fe162 | ||
|
|
4ff5553804 | ||
|
|
32213be7a7 | ||
|
|
84894a73e1 | ||
|
|
b6ea185ce7 | ||
|
|
814ac0f731 | ||
|
|
a40bb29da3 | ||
|
|
e9b90079c0 | ||
|
|
dba383c27e | ||
|
|
42059b5817 | ||
|
|
f92a17c01b | ||
|
|
d6552ce333 | ||
|
|
0db89bde5a | ||
|
|
56a12185d4 | ||
|
|
c40170db5d | ||
|
|
1df3e9c414 | ||
|
|
b1570df8b9 | ||
|
|
023fd1ce36 | ||
|
|
a7fe74bc0c | ||
|
|
26c9abd9da | ||
|
|
a5e34645c5 | ||
|
|
b2831c0a19 | ||
|
|
648c1ea0f9 | ||
|
|
9cd927e06a | ||
|
|
4272413f55 | ||
|
|
e1711b7af6 | ||
|
|
f7d3f27d45 | ||
|
|
3a7a47f82d | ||
|
|
cc211706d5 | ||
|
|
22f74be4cd | ||
|
|
5a00d14f94 | ||
|
|
ecb4e7bf9f | ||
|
|
56e5b546e1 | ||
|
|
272f5a2f4f | ||
|
|
ddcbe78a01 | ||
|
|
00b6c964e2 | ||
|
|
d7d2b06ecc | ||
|
|
fafc59360d | ||
|
|
19e105785e | ||
|
|
b87ac09e43 | ||
|
|
af9092d7c7 | ||
|
|
24a1ffd652 | ||
|
|
662813cc58 | ||
|
|
d890b78290 | ||
|
|
58747d7d4a | ||
|
|
0773a4f39c | ||
|
|
66cc7f8a1f | ||
|
|
01ab40bf4a | ||
|
|
4c09147fd1 | ||
|
|
f9f426d788 | ||
|
|
ff8fa1bf31 | ||
|
|
59f99e4f6a | ||
|
|
7449ce9c3b | ||
|
|
f6bc8f0a1f | ||
|
|
4d10b8cdee | ||
|
|
5a61c5de09 | ||
|
|
f84d0db811 | ||
|
|
36ce3b08fe | ||
|
|
da8ea5b545 | ||
|
|
fad3dbf4cd | ||
|
|
034d12c347 | ||
|
|
c94dbf1d9a | ||
|
|
e516687a9e | ||
|
|
4a2f77b0a6 | ||
|
|
7b29ecba71 | ||
|
|
11241b8e07 | ||
|
|
52bbd1f20b | ||
|
|
4044750515 | ||
|
|
b670c546b9 | ||
|
|
f37bbf93cb | ||
|
|
87311ab41a | ||
|
|
ecb4d1845c | ||
|
|
35c232ab25 | ||
|
|
df0be2e251 | ||
|
|
871b3a102b | ||
|
|
02299e3892 | ||
|
|
6af4d6f5b8 | ||
|
|
4fb5700367 | ||
|
|
8579276381 | ||
|
|
7ba60b22c5 | ||
|
|
031932f41c | ||
|
|
079d0a89b1 | ||
|
|
c4fdce6d64 | ||
|
|
5604c2b29f | ||
|
|
74b5ab2b47 | ||
|
|
c29cbfe123 | ||
|
|
6fe5cb1ffd | ||
|
|
7edd5a7a8e | ||
|
|
c1edc1b99b | ||
|
|
4d1d890f72 | ||
|
|
fe0f82fa2b | ||
|
|
84083a65a8 | ||
|
|
fc91c6bc08 | ||
|
|
09120171ba | ||
|
|
a362f920dc | ||
|
|
9d7729f548 | ||
|
|
ed56e177cf | ||
|
|
9db28bd502 | ||
|
|
aded70eb2e | ||
|
|
dfbad85465 | ||
|
|
52076fe182 | ||
|
|
5575c3cb13 | ||
|
|
637d32efff | ||
|
|
fd54658e53 | ||
|
|
2f39a8d76e | ||
|
|
6a3e793500 | ||
|
|
3b3ffeda6b | ||
|
|
f7d92a3b11 | ||
|
|
d9d9ba8bf1 | ||
|
|
f5d9090183 | ||
|
|
705ecd1ef1 | ||
|
|
08b5266a86 | ||
|
|
ecc4846ba8 | ||
|
|
4aab705d11 | ||
|
|
4615a68bcc | ||
|
|
bf6934e8ac | ||
|
|
af8c304bd4 | ||
|
|
51dac5a5a8 | ||
|
|
56463d9e36 | ||
|
|
a6a339dc59 | ||
|
|
8423304ab5 | ||
|
|
bb7408dbe9 | ||
|
|
7eff4dcf02 | ||
|
|
d7ee3fec3d | ||
|
|
5e026a3e8d | ||
|
|
d5e117b89f | ||
|
|
c87a5501df | ||
|
|
7584ebba0b | ||
|
|
66075e3960 | ||
|
|
193ba781a0 | ||
|
|
3e5dd64acc | ||
|
|
d66ab7d389 | ||
|
|
d2e6b27ecd | ||
|
|
0588541357 | ||
|
|
096ea84af6 | ||
|
|
04d0cfd510 | ||
|
|
7653f969ec | ||
|
|
c4ab6a4a8d | ||
|
|
d1ecd1318f | ||
|
|
8d65b1427d | ||
|
|
e693a6057e | ||
|
|
d0aa490ac3 | ||
|
|
0b6cad7d4f | ||
|
|
14e6c6d9a6 | ||
|
|
b2061347a5 | ||
|
|
79979f0a3b | ||
|
|
48d70b2349 | ||
|
|
b1f6309662 | ||
|
|
1acde76292 | ||
|
|
3b4867d7ab | ||
|
|
5ae965f4d3 | ||
|
|
742427b77b | ||
|
|
3d70a101f1 | ||
|
|
99062a5ea3 | ||
|
|
056d87f7ae | ||
|
|
df5a58772c | ||
|
|
e45db05b8e | ||
|
|
d234f74703 | ||
|
|
3ae2a1be4a | ||
|
|
2b828abd90 | ||
|
|
4b598b1575 |
21
.editorconfig
Normal file
21
.editorconfig
Normal file
@@ -0,0 +1,21 @@
|
||||
# EditorConfig is awesome: https://EditorConfig.org
|
||||
|
||||
# top-most EditorConfig file
|
||||
root = true
|
||||
|
||||
# Unix-style newlines with a newline ending every file
|
||||
[*]
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
|
||||
# Matches multiple files with brace expansion notation
|
||||
# Set default charset
|
||||
charset = utf-8
|
||||
|
||||
# 2 space indentation
|
||||
[*.{cjs,mjs,js,jsx,ts,tsx,css,scss,sass,html,json}]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
# Unfortunately, EditorConfig doesn't support space configuration inside import braces directly.
|
||||
# You'll need to rely on your linter/formatter like ESLint or Prettier for that.
|
||||
1
.env.development
Normal file
1
.env.development
Normal file
@@ -0,0 +1 @@
|
||||
VITE_BUILD_TYPE = Development
|
||||
1
.env.production
Normal file
1
.env.production
Normal file
@@ -0,0 +1 @@
|
||||
VITE_BUILD_TYPE = Production
|
||||
67
.eslintrc.cjs
Normal file
67
.eslintrc.cjs
Normal file
@@ -0,0 +1,67 @@
|
||||
module.exports = {
|
||||
'env': {
|
||||
'es2021': true,
|
||||
'node': true
|
||||
},
|
||||
'ignorePatterns': ['src/core/', 'src/core.lib/'],
|
||||
'extends': [
|
||||
'eslint:recommended',
|
||||
'plugin:@typescript-eslint/recommended'
|
||||
],
|
||||
'overrides': [
|
||||
{
|
||||
'env': {
|
||||
'node': true
|
||||
},
|
||||
'files': [
|
||||
'.eslintrc.{js,cjs}'
|
||||
],
|
||||
'parserOptions': {
|
||||
'sourceType': 'script'
|
||||
}
|
||||
}
|
||||
],
|
||||
'parser': '@typescript-eslint/parser',
|
||||
'parserOptions': {
|
||||
'ecmaVersion': 'latest',
|
||||
'sourceType': 'module'
|
||||
},
|
||||
'plugins': [
|
||||
'@typescript-eslint',
|
||||
'import'
|
||||
],
|
||||
'settings': {
|
||||
'import/parsers': {
|
||||
'@typescript-eslint/parser': ['.ts']
|
||||
},
|
||||
'import/resolver': {
|
||||
'typescript': {
|
||||
'alwaysTryTypes': true
|
||||
}
|
||||
}
|
||||
},
|
||||
'rules': {
|
||||
'indent': [
|
||||
'error',
|
||||
2
|
||||
],
|
||||
'linebreak-style': [
|
||||
'error',
|
||||
'unix'
|
||||
],
|
||||
'quotes': [
|
||||
'error',
|
||||
'single'
|
||||
],
|
||||
'semi': [
|
||||
'error',
|
||||
'always'
|
||||
],
|
||||
'no-unused-vars': 'off',
|
||||
'no-async-promise-executor': 'off',
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
'@typescript-eslint/no-unused-vars': 'off',
|
||||
'@typescript-eslint/no-var-requires': 'off',
|
||||
'object-curly-spacing': ['error', 'always'],
|
||||
}
|
||||
};
|
||||
81
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
81
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
@@ -0,0 +1,81 @@
|
||||
name: Bug 反馈
|
||||
description: 报告可能的 NapCat 异常行为
|
||||
title: '[BUG] '
|
||||
labels: bug
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
欢迎来到 NapCat 的 Issue Tracker!请填写以下表格来提交 Bug。
|
||||
在提交新的 Bug 反馈前,请确保您:
|
||||
* 已经搜索了现有的 issues,并且没有找到可以解决您问题的方法
|
||||
* 不与现有的某一 issue 重复
|
||||
- type: input
|
||||
id: system-version
|
||||
attributes:
|
||||
label: 系统版本
|
||||
description: 运行 QQNT 的系统版本
|
||||
placeholder: Windows 10 Pro Workstation 22H2
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: qqnt-version
|
||||
attributes:
|
||||
label: QQNT 版本
|
||||
description: 可在 QQNT 的「关于」的设置页中找到
|
||||
placeholder: 9.9.7-21804
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: napcat-version
|
||||
attributes:
|
||||
label: NapCat 版本
|
||||
description: 可在 LiteLoaderQQNT 的设置页或是 QQNT 的设置页侧栏中找到
|
||||
placeholder: 1.0.0
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: onebot-client-version
|
||||
attributes:
|
||||
label: OneBot 客户端
|
||||
description: 连接至 NapCat 的客户端版本信息
|
||||
placeholder: Overflow 2.16.0-2cf7991-SNAPSHOT
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: what-happened
|
||||
attributes:
|
||||
label: 发生了什么?
|
||||
description: 填写你认为的 NapCat 的不正常行为
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: how-reproduce
|
||||
attributes:
|
||||
label: 如何复现
|
||||
description: 填写应当如何操作才能触发这个不正常行为
|
||||
placeholder: |
|
||||
1. xxx
|
||||
2. xxx
|
||||
3. xxx
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: what-expected
|
||||
attributes:
|
||||
label: 期望的结果?
|
||||
description: 填写你认为 NapCat 应当执行的正常行为
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: napcat-log
|
||||
attributes:
|
||||
label: NapCat 运行日志
|
||||
description: 粘贴相关日志内容到此处
|
||||
render: shell
|
||||
- type: textarea
|
||||
id: onebot-client-log
|
||||
attributes:
|
||||
label: OneBot 客户端运行日志
|
||||
description: 粘贴 OneBot 客户端的相关日志内容到此处
|
||||
render: shell
|
||||
11
.github/dependabot.yml
vendored
Normal file
11
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
# To get started with Dependabot version updates, you'll need to specify which
|
||||
# package ecosystems to update and where the package manifests are located.
|
||||
# Please see the documentation for all configuration options:
|
||||
# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
|
||||
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "npm" # See documentation for possible values
|
||||
directory: "/" # Location of package manifests
|
||||
schedule:
|
||||
interval: "daily"
|
||||
74
.github/workflows/build.yml
vendored
Normal file
74
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,74 @@
|
||||
name: "Build"
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
permissions: write-all
|
||||
|
||||
jobs:
|
||||
build-linux:
|
||||
if: ${{ startsWith(github.event.head_commit.message, 'build:') }}
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target_platform: [linux]
|
||||
target_arch: [x64, arm64]
|
||||
steps:
|
||||
- name: Clone Main Repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: 'NapNeko/NapCatQQ'
|
||||
submodules: true
|
||||
ref: main
|
||||
token: ${{ secrets.NAPCAT_BUILD }}
|
||||
- name: Use Node.js 20.X
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20.x
|
||||
- name: Build NuCat Linux
|
||||
run: |
|
||||
npm i --arch=${{ matrix.target_arch }} --platform=${{ matrix.target_platform }}
|
||||
npm run build:prod
|
||||
cd dist
|
||||
npm i --omit=dev --arch=${{ matrix.target_arch }} --platform=${{ matrix.target_platform }}
|
||||
cd ..
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: NapCat.${{ matrix.target_platform }}.${{ matrix.target_arch }}
|
||||
path: dist
|
||||
build-win32:
|
||||
if: ${{ startsWith(github.event.head_commit.message, 'build:') }}
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target_platform: [win32]
|
||||
target_arch: [x64]
|
||||
steps:
|
||||
- name: Clone Main Repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: 'NapNeko/NapCatQQ'
|
||||
submodules: true
|
||||
ref: main
|
||||
token: ${{ secrets.NAPCAT_BUILD }}
|
||||
- name: Use Node.js 20.X
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20.x
|
||||
- name: Build NuCat Linux
|
||||
run: |
|
||||
npm i --arch=${{ matrix.target_arch }} --platform=${{ matrix.target_platform }}
|
||||
npm run build:prod
|
||||
cd dist
|
||||
npm i --omit=dev --arch=${{ matrix.target_arch }} --platform=${{ matrix.target_platform }}
|
||||
cd ..
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: NapCat.${{ matrix.target_platform }}.${{ matrix.target_arch }}
|
||||
path: dist
|
||||
138
.github/workflows/release.yml
vendored
Normal file
138
.github/workflows/release.yml
vendored
Normal file
@@ -0,0 +1,138 @@
|
||||
name: "release"
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- "v*"
|
||||
|
||||
permissions: write-all
|
||||
|
||||
jobs:
|
||||
check-version:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Clone Repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: main
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Extract version from tag
|
||||
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
|
||||
|
||||
- name: Use Node.js 20.X
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20.x
|
||||
|
||||
- name: Check Version
|
||||
run: |
|
||||
ls
|
||||
node ./script/checkVersion.cjs
|
||||
sh ./checkVersion.sh
|
||||
build-linux:
|
||||
needs: [check-version]
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target_platform: [linux]
|
||||
target_arch: [x64, arm64]
|
||||
steps:
|
||||
- name: Clone Main Repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: 'NapNeko/NapCatQQ'
|
||||
submodules: true
|
||||
ref: main
|
||||
token: ${{ secrets.NAPCAT_BUILD }}
|
||||
- name: Use Node.js 20.X
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20.x
|
||||
|
||||
- name: Build NuCat Linux
|
||||
run: |
|
||||
export NAPCAT_BUILDSYS=${{ matrix.target_platform }}
|
||||
export NAPCAT_BUILDARCH=${{ matrix.target_arch }}
|
||||
npm i --arch=${{ matrix.target_arch }} --platform=${{ matrix.target_platform }}
|
||||
npm run build:prod
|
||||
cd dist
|
||||
npm i --omit=dev --arch=${{ matrix.target_arch }} --platform=${{ matrix.target_platform }}
|
||||
cd ..
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: NapCat.${{ matrix.target_platform }}.${{ matrix.target_arch }}
|
||||
path: dist
|
||||
build-win32:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [check-version]
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target_platform: [win32]
|
||||
target_arch: [x64]
|
||||
steps:
|
||||
- name: Clone Main Repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: 'NapNeko/NapCatQQ'
|
||||
submodules: true
|
||||
ref: main
|
||||
token: ${{ secrets.NAPCAT_BUILD }}
|
||||
|
||||
- name: Use Node.js 20.X
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20.x
|
||||
|
||||
- name: Build NuCat Linux
|
||||
run: |
|
||||
export NAPCAT_BUILDSYS=${{ matrix.target_platform }}
|
||||
export NAPCAT_BUILDARCH=${{ matrix.target_arch }}
|
||||
npm i --arch=${{ matrix.target_arch }} --platform=${{ matrix.target_platform }}
|
||||
npm run build:prod
|
||||
cd dist
|
||||
npm i --omit=dev --arch=${{ matrix.target_arch }} --platform=${{ matrix.target_platform }}
|
||||
cd ..
|
||||
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: NapCat.${{ matrix.target_platform }}.${{ matrix.target_arch }}
|
||||
path: dist
|
||||
|
||||
release-napcat:
|
||||
needs: [build-win32,build-linux]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Download All Artifact
|
||||
uses: actions/download-artifact@v4
|
||||
|
||||
- name: Compress subdirectories
|
||||
run: |
|
||||
for dir in */; do
|
||||
base=$(basename "$dir")
|
||||
zip -r "${base}.zip" "$dir"
|
||||
done
|
||||
|
||||
- name: Extract version from tag
|
||||
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
|
||||
|
||||
- name: Clone Changes Log
|
||||
run: curl -o CHANGELOG.md https://fastly.jsdelivr.net/gh/NapNeko/NapCatQQ@main/CHANGELOG.md
|
||||
|
||||
- name: Create Release Draft and Upload Artifacts
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
name: NapCat V${{ env.VERSION }}
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
body_path: CHANGELOG.md
|
||||
files: |
|
||||
NapCat.win32.x64.zip
|
||||
NapCat.linux.x64.zip
|
||||
NapCat.linux.arm64.zip
|
||||
# NapCat.darwin.x64.zip
|
||||
# NapCat.darwin.arm64.zip
|
||||
draft: true
|
||||
17
.gitignore
vendored
Normal file
17
.gitignore
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
# Logs
|
||||
|
||||
# Develop
|
||||
node_modules/
|
||||
package-lock.json
|
||||
out/
|
||||
dist/
|
||||
src/core.lib/common/
|
||||
|
||||
# Editor
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea/*
|
||||
|
||||
# Build
|
||||
*.db
|
||||
checkVersion.sh
|
||||
4
.gitmodules
vendored
Normal file
4
.gitmodules
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
[submodule "src/core"]
|
||||
path = src/core
|
||||
url = https://github.com/NapNeko/core.git
|
||||
branch = master
|
||||
28
CHANGELOG.md
Normal file
28
CHANGELOG.md
Normal file
@@ -0,0 +1,28 @@
|
||||
# v1.2.0
|
||||
|
||||
QQ Version: Windows 9.9.9-23361 / Linux 3.2.7-23361
|
||||
|
||||
## 修复与优化
|
||||
|
||||
* 修复图片URL,支持 Win/Linux X64 获取Rkey,暂时不支持arm64
|
||||
* 适配最新版 Windows 9.9.9-23361 / Linux 3.2.7-23361 提升了兼容性 - 修复 SYS: Listener Proxy
|
||||
* 修复群成员加入时间 上次活跃 活跃等级字段 - 影响 API: /get_group_member_info /get_group_member_list
|
||||
* 修复视频所需的 ffmpeg 路径不正确导致视频封面和时长获取失败 - 影响 Event/API
|
||||
* 优化数据库对消息储存,消耗储存减少 - 影响 Sys: OneBot
|
||||
* 修复他人管理员被撤销时没有上报
|
||||
|
||||
## 新增与调整
|
||||
* 支持商城表情发送和上报 url
|
||||
* 支持获取群公告 - 新增 API: /_get_group_notice
|
||||
* 支持了设置已读群/私聊消息接口 - 新增 API: /mark_private_msg_as_read /mark_group_msg_as_read
|
||||
* 支持了好友添加上报事件 - 新增 Event: AddFriend
|
||||
* 支持wsHost和httpHost配置
|
||||
* 支持获取官方Bot账号范围 - 新增 API: /get_robot_uin_range
|
||||
* 支持设置自身在线状态 - 新增 API: /set_online_status
|
||||
* 支持表情回应api和上报 - 新增 Event/API
|
||||
* 支持获取Cookies 实现更加稳定 且支持Skey缓存3600S Pskey每次刷新 - 新增 API: /get_cookies
|
||||
* 支持 服务端踢下线 / 其它设备上线 / 重复登录 / 自身在线状态变更 日志 - 新增 Sys: Log
|
||||
* 支持了消息统计 - API: /get_status
|
||||
* 支持单条消息转发 - API /forward_friend_single_msg、/forward_group_single_msg
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2024 NapCatQQ
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
41
README.md
41
README.md
@@ -1,14 +1,35 @@
|
||||
# NapCatQQ
|
||||
<div align="center">
|
||||
<img src="https://socialify.git.ci/NapNeko/NapCatQQ/image?description=1&language=1&logo=https%3A%2F%2Fraw.githubusercontent.com%2FNapNeko%2FNapCatQQ%2Fmain%2Flogo.png&name=1&stargazers=1&theme=Auto" alt="NapCatQQ" width="640" height="320" />
|
||||
</div>
|
||||
|
||||
## 介绍
|
||||
无
|
||||
## 项目介绍
|
||||
|
||||
## 下载与安装
|
||||
前往release获取
|
||||
NapCatQQ 是基于 PC NTQQ 本体实现一套无头 Bot 框架。
|
||||
|
||||
## 使用与配置
|
||||
参考文档
|
||||
名字寓意 瞌睡猫QQ,像睡着了一样在后台低占用运行的无需GUI界面的NTQQ。
|
||||
|
||||
## 开源与安全
|
||||
为了防止过于扩散与违规使用,未来 NapCat 发版都会不公布源码,在未来形势有所转变下可能会发布源码。
|
||||
代码将进行混淆与插桩,请不要违法使用与宣传本项目。
|
||||
## 如何使用
|
||||
|
||||
可前往 [Release](https://github.com/NapNeko/NapCatQQ/releases/) 页面下载最新版本
|
||||
|
||||
**首次使用** 请务必前往 [官方文档](https://napneko.github.io/) 查看使用文档与教程
|
||||
|
||||
|
||||
## 项目声明
|
||||
|
||||
* 请不要在无关地方宣传NapCatQQ,本项目只是用于学习 node 相关知识,切勿用于违法用途
|
||||
|
||||
* NapCat 不会收集用户隐私信息,但是未来可能会为了更好的利于 NapCat 的优化会收集一些设备信息,如 cpu 架构,系统版本等
|
||||
|
||||
## 相关链接
|
||||
[Telegram Link](https://t.me/+nLZEnpne-pQ1OWFl)
|
||||
|
||||
## 鸣谢名单
|
||||
|
||||
[OpenShamrock]()
|
||||
|
||||
[Lagrange]()
|
||||
|
||||
<!--
|
||||
QQ群:545402644
|
||||
-->
|
||||
|
||||
64
package.json
Normal file
64
package.json
Normal file
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"name": "napcat",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"version": "1.2.0",
|
||||
"scripts": {
|
||||
"watch:dev": "vite --mode development",
|
||||
"watch:prod": "vite --mode production",
|
||||
"build:dev": "vite build --mode development",
|
||||
"build:prod": "vite build --mode production",
|
||||
"build": "npm run build:dev",
|
||||
"build:core": "cd ./src/core && npm run build && cd ../.. && node ./script/copy-core.cjs",
|
||||
"watch": "npm run watch:dev",
|
||||
"debug-win": "powershell dist/napcat.ps1",
|
||||
"lint": "eslint --fix src/**/*.{js,ts}",
|
||||
"release": "npm run build:prod",
|
||||
"depend": "cd dist && npm install --omit=dev"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@log4js-node/log4js-api": "^1.0.2",
|
||||
"@rollup/plugin-commonjs": "^25.0.7",
|
||||
"@rollup/plugin-node-resolve": "^15.2.3",
|
||||
"@rollup/plugin-typescript": "^11.1.6",
|
||||
"@types/cors": "^2.8.17",
|
||||
"@types/express": "^4.17.21",
|
||||
"@types/figlet": "^1.5.8",
|
||||
"@types/fluent-ffmpeg": "^2.1.24",
|
||||
"@types/node": "^20.11.30",
|
||||
"@types/qrcode-terminal": "^0.12.2",
|
||||
"@types/uuid": "^9.0.8",
|
||||
"@types/ws": "^8.5.10",
|
||||
"@typescript-eslint/eslint-plugin": "^7.4.0",
|
||||
"@typescript-eslint/parser": "^7.4.0",
|
||||
"eslint": "^8.57.0",
|
||||
"eslint-import-resolver-typescript": "^3.6.1",
|
||||
"eslint-plugin-import": "^2.29.1",
|
||||
"i": "^0.3.7",
|
||||
"javascript-obfuscator": "^4.1.0",
|
||||
"protobufjs-cli": "^1.1.2",
|
||||
"rollup": "^4.13.2",
|
||||
"rollup-plugin-dts": "^6.1.0",
|
||||
"rollup-plugin-obfuscator": "^1.1.0",
|
||||
"typescript": "^5.3.3",
|
||||
"vite": "^5.2.6",
|
||||
"vite-plugin-cp": "^4.0.8",
|
||||
"vite-plugin-dts": "^3.8.2",
|
||||
"vite-tsconfig-paths": "^4.3.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"commander": "^12.0.0",
|
||||
"cors": "^2.8.5",
|
||||
"express": "^5.0.0-beta.2",
|
||||
"fast-xml-parser": "^4.3.6",
|
||||
"file-type": "^19.0.0",
|
||||
"fluent-ffmpeg": "^2.1.2",
|
||||
"image-size": "^1.1.1",
|
||||
"log4js": "^6.9.1",
|
||||
"qrcode-terminal": "^0.12.0",
|
||||
"silk-wasm": "^3.3.4",
|
||||
"sqlite3": "^5.1.7",
|
||||
"uuid": "^9.0.1",
|
||||
"ws": "^8.16.0"
|
||||
}
|
||||
}
|
||||
13
script/checkVersion.cjs
Normal file
13
script/checkVersion.cjs
Normal file
@@ -0,0 +1,13 @@
|
||||
let fs = require("fs");
|
||||
let process = require("process")
|
||||
console.log("[NapCat] [CheckVersion] 开始检测当前仓库版本...");
|
||||
let currentVersion = require("../package.json").version;
|
||||
let targetVersion = process.env.VERSION;
|
||||
console.log("[NapCat] [CheckVersion] currentVersion:", currentVersion, " targetVersion:", targetVersion);
|
||||
// fs.mkdirSync("./dist");
|
||||
if (currentVersion === targetVersion) {
|
||||
fs.writeFileSync("./checkVersion.sh", "#!/bin/bashe\necho \"CheckVersion Is Done\"")
|
||||
} else {
|
||||
let runscript = "sed -i 's/\"version\": \"" + currentVersion + "\"/\"version\": \"" + targetVersion + "\"/g' package.json";
|
||||
fs.writeFileSync("./checkVersion.sh", "#!/bin/bashe\ngit config --global user.email \"bot@test.wumiao.wang\"\n git config --global user.name \"Version\"\n" + runscript + "\ngit add .\n git commit -m \"chore:version change\"\n git push -u origin main")
|
||||
}
|
||||
32
script/copy-core.cjs
Normal file
32
script/copy-core.cjs
Normal file
@@ -0,0 +1,32 @@
|
||||
let fs = require('fs');
|
||||
let path = require('path');
|
||||
|
||||
const coreDistDir = path.join(path.resolve(__dirname, '../'), 'src/core/dist/core/src');
|
||||
const coreLibDir = path.join(path.resolve(__dirname, '../'), 'src/core.lib/src');
|
||||
|
||||
function copyDir(currentPath, outputDir) {
|
||||
fs.readdir(currentPath, { withFileTypes: true }, (err, entries) => {
|
||||
if (err?.errno === -4058) return;
|
||||
|
||||
entries.forEach(entry => {
|
||||
const localBasePath = path.join(currentPath, entry.name);
|
||||
const outputLocalBasePath = path.join(outputDir, entry.name);
|
||||
|
||||
if (entry.isDirectory()) {
|
||||
// 如果是目录,递归调用
|
||||
if (!fs.existsSync(outputLocalBasePath)) {
|
||||
fs.mkdirSync(outputLocalBasePath, { recursive: true });
|
||||
}
|
||||
copyDir(localBasePath, outputLocalBasePath);
|
||||
}
|
||||
else{
|
||||
// 如果是文件,直接复制
|
||||
fs.copyFile(localBasePath, outputLocalBasePath, (err) => {
|
||||
if (err) throw err;
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
copyDir(coreDistDir, coreLibDir);
|
||||
21
script/gen-version.ts
Normal file
21
script/gen-version.ts
Normal file
@@ -0,0 +1,21 @@
|
||||
import fs from 'fs'
|
||||
import path from 'path'
|
||||
import { version } from '../src/onebot11/version'
|
||||
|
||||
const manifestPath = path.join(__dirname, '../package.json')
|
||||
|
||||
function readManifest (): any {
|
||||
if (fs.existsSync(manifestPath)) {
|
||||
return JSON.parse(fs.readFileSync(manifestPath, 'utf-8'))
|
||||
}
|
||||
}
|
||||
|
||||
function writeManifest (manifest: any) {
|
||||
fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2))
|
||||
}
|
||||
|
||||
const manifest = readManifest()
|
||||
if (version !== manifest.version) {
|
||||
manifest.version = version
|
||||
writeManifest(manifest)
|
||||
}
|
||||
3
script/napcat-custom.bat
Normal file
3
script/napcat-custom.bat
Normal file
@@ -0,0 +1,3 @@
|
||||
chcp 65001
|
||||
set ELECTRON_RUN_AS_NODE=1
|
||||
"H:\Program Files\QQNT最新版\QQ.exe" %~dp0/napcat.cjs %*
|
||||
15
script/napcat-gc.ps1
Normal file
15
script/napcat-gc.ps1
Normal file
@@ -0,0 +1,15 @@
|
||||
function Get-QQpath {
|
||||
try {
|
||||
$key = Get-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ"
|
||||
$uninstallString = $key.UninstallString
|
||||
return [System.IO.Path]::GetDirectoryName($uninstallString) + "\QQ.exe"
|
||||
}
|
||||
catch {
|
||||
throw "Error getting UninstallString: $_"
|
||||
}
|
||||
}
|
||||
$params = $args -join " "
|
||||
$QQpath = Get-QQpath
|
||||
$Bootfile = Join-Path (Get-Location) "\dist\inject.cjs"
|
||||
$env:ELECTRON_RUN_AS_NODE = 1
|
||||
Start-Process powershell -ArgumentList "-noexit", "-noprofile", "-command &{& '$QQpath' --expose-gc $Bootfile $params}"
|
||||
17
script/napcat-log.ps1
Normal file
17
script/napcat-log.ps1
Normal file
@@ -0,0 +1,17 @@
|
||||
function Get-QQpath {
|
||||
try {
|
||||
$key = Get-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ"
|
||||
$uninstallString = $key.UninstallString
|
||||
return [System.IO.Path]::GetDirectoryName($uninstallString) + "\QQ.exe"
|
||||
}
|
||||
catch {
|
||||
return "D:\QQ.exe"
|
||||
}
|
||||
}
|
||||
$params = $args -join " "
|
||||
$QQpath = Get-QQpath
|
||||
$Bootfile = Join-Path $PSScriptRoot "napcat.cjs"
|
||||
$env:ELECTRON_RUN_AS_NODE = 1
|
||||
$argumentList = '-noexit', '-noprofile', "-command `"$QQpath`" `"$Bootfile`" $params"
|
||||
Start-Process powershell -ArgumentList $argumentList -RedirectStandardOutput "log.txt" -RedirectStandardError "error.txt"
|
||||
powershell Get-Content -Wait -Encoding UTF8 log.txt
|
||||
18
script/napcat-utf8.bat
Normal file
18
script/napcat-utf8.bat
Normal file
@@ -0,0 +1,18 @@
|
||||
@echo off
|
||||
setlocal enabledelayedexpansion
|
||||
chcp 65001
|
||||
:loop_read
|
||||
for /f "tokens=2*" %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ" /v "UninstallString"') do (
|
||||
set "RetString=%%b"
|
||||
goto :napcat_boot
|
||||
)
|
||||
|
||||
:napcat_boot
|
||||
for %%a in ("!RetString!") do (
|
||||
set "pathWithoutUninstall=%%~dpa"
|
||||
)
|
||||
|
||||
set "QQPath=!pathWithoutUninstall!QQ.exe"
|
||||
set ELECTRON_RUN_AS_NODE=1
|
||||
echo !QQPath!
|
||||
"!QQPath!" ./napcat.cjs %*
|
||||
15
script/napcat-utf8.ps1
Normal file
15
script/napcat-utf8.ps1
Normal file
@@ -0,0 +1,15 @@
|
||||
function Get-QQpath {
|
||||
try {
|
||||
$key = Get-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ"
|
||||
$uninstallString = $key.UninstallString
|
||||
return [System.IO.Path]::GetDirectoryName($uninstallString) + "\QQ.exe"
|
||||
}
|
||||
catch {
|
||||
return "D:\QQ.exe"
|
||||
}
|
||||
}
|
||||
$params = $args -join " "
|
||||
$QQpath = Get-QQpath
|
||||
$Bootfile = Join-Path $PSScriptRoot "napcat.cjs"
|
||||
$env:ELECTRON_RUN_AS_NODE = 1
|
||||
Start-Process powershell -ArgumentList "-noexit", "-noprofile", "-command &{& chcp 65001;& '$QQpath' $Bootfile $params}"
|
||||
17
script/napcat.bat
Normal file
17
script/napcat.bat
Normal file
@@ -0,0 +1,17 @@
|
||||
@echo off
|
||||
setlocal enabledelayedexpansion
|
||||
:loop_read
|
||||
for /f "tokens=2*" %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ" /v "UninstallString"') do (
|
||||
set "RetString=%%b"
|
||||
goto :napcat_boot
|
||||
)
|
||||
|
||||
:napcat_boot
|
||||
for %%a in ("!RetString!") do (
|
||||
set "pathWithoutUninstall=%%~dpa"
|
||||
)
|
||||
|
||||
set "QQPath=!pathWithoutUninstall!QQ.exe"
|
||||
set ELECTRON_RUN_AS_NODE=1
|
||||
echo !QQPath!
|
||||
"!QQPath!" ./napcat.cjs %*
|
||||
15
script/napcat.ps1
Normal file
15
script/napcat.ps1
Normal file
@@ -0,0 +1,15 @@
|
||||
function Get-QQpath {
|
||||
try {
|
||||
$key = Get-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ"
|
||||
$uninstallString = $key.UninstallString
|
||||
return [System.IO.Path]::GetDirectoryName($uninstallString) + "\QQ.exe"
|
||||
}
|
||||
catch {
|
||||
return "D:\QQ.exe"
|
||||
}
|
||||
}
|
||||
$params = $args -join " "
|
||||
$QQpath = Get-QQpath
|
||||
$Bootfile = Join-Path $PSScriptRoot "napcat.cjs"
|
||||
$env:ELECTRON_RUN_AS_NODE = 1
|
||||
Start-Process powershell -ArgumentList "-noexit", "-noprofile", "-command &{& '$QQpath' $Bootfile $params}"
|
||||
4
script/napcat.sh
Normal file
4
script/napcat.sh
Normal file
@@ -0,0 +1,4 @@
|
||||
#!/bin/bash
|
||||
SCRIPT_DIR=$(realpath $(dirname "${BASH_SOURCE[0]}"))
|
||||
export ELECTRON_RUN_AS_NODE=1
|
||||
/opt/QQ/qq ${SCRIPT_DIR}/napcat.cjs $@
|
||||
122
src/common/server/http.ts
Normal file
122
src/common/server/http.ts
Normal file
@@ -0,0 +1,122 @@
|
||||
import express, { Express, Request, Response } from 'express';
|
||||
import cors from 'cors';
|
||||
import http from 'http';
|
||||
import { log, logDebug, logError } from '../utils/log';
|
||||
import { ob11Config } from '@/onebot11/config';
|
||||
|
||||
type RegisterHandler = (res: Response, payload: any) => Promise<any>
|
||||
|
||||
export abstract class HttpServerBase {
|
||||
name: string = 'NapCatQQ';
|
||||
private readonly expressAPP: Express;
|
||||
private server: http.Server | null = null;
|
||||
|
||||
constructor() {
|
||||
this.expressAPP = express();
|
||||
this.expressAPP.use(cors());
|
||||
this.expressAPP.use(express.urlencoded({ extended: true, limit: '5000mb' }));
|
||||
this.expressAPP.use((req, res, next) => {
|
||||
// 兼容处理没有带content-type的请求
|
||||
// log("req.headers['content-type']", req.headers['content-type'])
|
||||
req.headers['content-type'] = 'application/json';
|
||||
const originalJson = express.json({ limit: '5000mb' });
|
||||
// 调用原始的express.json()处理器
|
||||
originalJson(req, res, (err) => {
|
||||
if (err) {
|
||||
logError('Error parsing JSON:', err);
|
||||
return res.status(400).send('Invalid JSON');
|
||||
}
|
||||
next();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
authorize(req: Request, res: Response, next: () => void) {
|
||||
const serverToken = ob11Config.token;
|
||||
let clientToken = '';
|
||||
const authHeader = req.get('authorization');
|
||||
if (authHeader) {
|
||||
clientToken = authHeader.split('Bearer ').pop() || '';
|
||||
logDebug('receive http header token', clientToken);
|
||||
} else if (req.query.access_token) {
|
||||
if (Array.isArray(req.query.access_token)) {
|
||||
clientToken = req.query.access_token[0].toString();
|
||||
} else {
|
||||
clientToken = req.query.access_token.toString();
|
||||
}
|
||||
logDebug('receive http url token', clientToken);
|
||||
}
|
||||
|
||||
if (serverToken && clientToken != serverToken) {
|
||||
return res.status(403).send(JSON.stringify({ message: 'token verify failed!' }));
|
||||
}
|
||||
next();
|
||||
}
|
||||
|
||||
start(port: number, host: string) {
|
||||
try {
|
||||
this.expressAPP.get('/', (req: Request, res: Response) => {
|
||||
res.send(`${this.name}已启动`);
|
||||
});
|
||||
this.listen(port, host);
|
||||
} catch (e: any) {
|
||||
logError('HTTP服务启动失败', e.toString());
|
||||
// llonebotError.httpServerError = "HTTP服务启动失败, " + e.toString()
|
||||
}
|
||||
}
|
||||
|
||||
stop() {
|
||||
// llonebotError.httpServerError = ""
|
||||
if (this.server) {
|
||||
this.server.close();
|
||||
this.server = null;
|
||||
}
|
||||
}
|
||||
|
||||
restart(port: number, host: string) {
|
||||
this.stop();
|
||||
this.start(port, host);
|
||||
}
|
||||
|
||||
abstract handleFailed(res: Response, payload: any, err: any): void
|
||||
|
||||
registerRouter(method: 'post' | 'get' | string, url: string, handler: RegisterHandler) {
|
||||
if (!url.startsWith('/')) {
|
||||
url = '/' + url;
|
||||
}
|
||||
|
||||
// @ts-expect-error wait fix
|
||||
if (!this.expressAPP[method]) {
|
||||
const err = `${this.name} register router failed,${method} not exist`;
|
||||
logError(err);
|
||||
throw err;
|
||||
}
|
||||
// @ts-expect-error wait fix
|
||||
this.expressAPP[method](url, this.authorize, async (req: Request, res: Response) => {
|
||||
let payload = req.body;
|
||||
if (method == 'get') {
|
||||
payload = req.query;
|
||||
} else if (req.query) {
|
||||
payload = { ...req.query, ...req.body };
|
||||
}
|
||||
logDebug('收到http请求', url, payload);
|
||||
try {
|
||||
res.send(await handler(res, payload));
|
||||
} catch (e: any) {
|
||||
this.handleFailed(res, payload, e.stack.toString());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
protected listen(port: number, host: string = '0.0.0.0') {
|
||||
host = host || '0.0.0.0';
|
||||
try {
|
||||
this.server = this.expressAPP.listen(port, host, () => {
|
||||
const info = `${this.name} started ${host}:${port}`;
|
||||
log(info);
|
||||
});
|
||||
}catch (e: any) {
|
||||
logError('HTTP服务启动失败, 请检查监听的ip地址和端口', e.stack.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
104
src/common/server/websocket.ts
Normal file
104
src/common/server/websocket.ts
Normal file
@@ -0,0 +1,104 @@
|
||||
import { WebSocket, WebSocketServer } from 'ws';
|
||||
import urlParse from 'url';
|
||||
import { IncomingMessage } from 'node:http';
|
||||
import { log } from '@/common/utils/log';
|
||||
|
||||
class WebsocketClientBase {
|
||||
private wsClient: WebSocket | undefined;
|
||||
|
||||
constructor() {
|
||||
}
|
||||
|
||||
send(msg: string) {
|
||||
if (this.wsClient && this.wsClient.readyState == WebSocket.OPEN) {
|
||||
this.wsClient.send(msg);
|
||||
}
|
||||
}
|
||||
|
||||
onMessage(msg: string) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
export class WebsocketServerBase {
|
||||
private ws: WebSocketServer | null = null;
|
||||
public token: string = '';
|
||||
|
||||
constructor() {
|
||||
}
|
||||
|
||||
start(port: number, host: string = '') {
|
||||
try {
|
||||
this.ws = new WebSocketServer({
|
||||
port ,
|
||||
host: '',
|
||||
maxPayload: 1024 * 1024 * 1024
|
||||
});
|
||||
log(`ws服务启动成功, ${host}:${port}`);
|
||||
} catch (e: any) {
|
||||
throw Error('ws服务启动失败, 请检查监听的ip和端口' + e.toString());
|
||||
}
|
||||
this.ws.on('connection', (wsClient, req) => {
|
||||
const url: string = req.url!.split('?').shift() || '/';
|
||||
this.authorize(wsClient, req);
|
||||
this.onConnect(wsClient, url, req);
|
||||
wsClient.on('message', async (msg) => {
|
||||
this.onMessage(wsClient, url, msg.toString());
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
stop() {
|
||||
this.ws && this.ws.close((err) => {
|
||||
log('ws server close failed!', err);
|
||||
});
|
||||
this.ws = null;
|
||||
}
|
||||
|
||||
restart(port: number) {
|
||||
this.stop();
|
||||
this.start(port);
|
||||
}
|
||||
|
||||
authorize(wsClient: WebSocket, req: IncomingMessage) {
|
||||
const url = req.url!.split('?').shift();
|
||||
log('ws connect', url);
|
||||
let clientToken: string = '';
|
||||
const authHeader = req.headers['authorization'];
|
||||
if (authHeader) {
|
||||
clientToken = authHeader.split('Bearer ').pop() || '';
|
||||
log('receive ws header token', clientToken);
|
||||
} else {
|
||||
const parsedUrl = urlParse.parse(req.url || '/', true);
|
||||
const urlToken = parsedUrl.query.access_token;
|
||||
if (urlToken) {
|
||||
if (Array.isArray(urlToken)) {
|
||||
clientToken = urlToken[0];
|
||||
} else {
|
||||
clientToken = urlToken;
|
||||
}
|
||||
log('receive ws url token', clientToken);
|
||||
}
|
||||
}
|
||||
if (this.token && clientToken != this.token) {
|
||||
this.authorizeFailed(wsClient);
|
||||
return wsClient.close();
|
||||
}
|
||||
}
|
||||
|
||||
authorizeFailed(wsClient: WebSocket) {
|
||||
|
||||
}
|
||||
|
||||
onConnect(wsClient: WebSocket, url: string, req: IncomingMessage) {
|
||||
|
||||
}
|
||||
|
||||
onMessage(wsClient: WebSocket, url: string, msg: string) {
|
||||
|
||||
}
|
||||
|
||||
sendHeart() {
|
||||
|
||||
}
|
||||
}
|
||||
33
src/common/utils/AsyncQueue.ts
Normal file
33
src/common/utils/AsyncQueue.ts
Normal file
@@ -0,0 +1,33 @@
|
||||
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);
|
||||
if (this.tasks.length === 1) {
|
||||
this.runQueue().then().catch(()=>{});
|
||||
}
|
||||
}
|
||||
|
||||
private async runQueue() {
|
||||
while (this.tasks.length > 0) {
|
||||
const task = this.tasks[0];
|
||||
try {
|
||||
if (task instanceof Promise) {
|
||||
await task;
|
||||
}
|
||||
else{
|
||||
task();
|
||||
}
|
||||
} 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
72
src/common/utils/QQBasicInfo.ts
Normal file
72
src/common/utils/QQBasicInfo.ts
Normal file
@@ -0,0 +1,72 @@
|
||||
import path from 'node:path';
|
||||
import fs from 'node:fs';
|
||||
import os from 'node:os';
|
||||
import { systemPlatform } from '@/common/utils/system';
|
||||
|
||||
export const exePath = process.execPath;
|
||||
|
||||
export const pkgInfoPath = path.join(path.dirname(exePath), 'resources', 'app', 'package.json');
|
||||
let configVersionInfoPath;
|
||||
|
||||
if (os.platform() !== 'linux') {
|
||||
configVersionInfoPath = path.join(path.dirname(exePath), 'resources', 'app', 'versions', 'config.json');
|
||||
} else {
|
||||
const userPath = os.homedir();
|
||||
const appDataPath = path.resolve(userPath, './.config/QQ');
|
||||
configVersionInfoPath = path.resolve(appDataPath, './versions/config.json');
|
||||
}
|
||||
|
||||
if (typeof configVersionInfoPath !== 'string') {
|
||||
throw new Error('Something went wrong when load QQ info path');
|
||||
}
|
||||
|
||||
export { configVersionInfoPath };
|
||||
|
||||
type QQPkgInfo = {
|
||||
version: string;
|
||||
buildVersion: string;
|
||||
platform: string;
|
||||
eleArch: string;
|
||||
}
|
||||
type QQVersionConfigInfo = {
|
||||
baseVersion: string;
|
||||
curVersion: string;
|
||||
prevVersion: string;
|
||||
onErrorVersions: Array<any>;
|
||||
buildId: string;
|
||||
}
|
||||
|
||||
let _qqVersionConfigInfo: QQVersionConfigInfo = {
|
||||
'baseVersion': '9.9.9-23361',
|
||||
'curVersion': '9.9.9-23361',
|
||||
'prevVersion': '',
|
||||
'onErrorVersions': [],
|
||||
'buildId': '23361'
|
||||
};
|
||||
|
||||
if (fs.existsSync(configVersionInfoPath)) {
|
||||
try {
|
||||
const _ =JSON.parse(fs.readFileSync(configVersionInfoPath).toString());
|
||||
_qqVersionConfigInfo = Object.assign(_qqVersionConfigInfo, _);
|
||||
} catch (e) {
|
||||
console.error('Load QQ version config info failed, Use default version', e);
|
||||
}
|
||||
}
|
||||
|
||||
export const qqVersionConfigInfo: QQVersionConfigInfo = _qqVersionConfigInfo;
|
||||
|
||||
export const qqPkgInfo: QQPkgInfo = require(pkgInfoPath);
|
||||
// platform_type: 3,
|
||||
// app_type: 4,
|
||||
// app_version: '9.9.9-23159',
|
||||
// qua: 'V1_WIN_NQ_9.9.9_23159_GW_B',
|
||||
// appid: '537213764',
|
||||
// platVer: '10.0.26100',
|
||||
// clientVer: '9.9.9-23159',
|
||||
|
||||
let _appid: string = '537213803'; // 默认为 Windows 平台的 appid
|
||||
if (systemPlatform === 'linux') {
|
||||
_appid = '537213827';
|
||||
}
|
||||
// todo: mac 平台的 appid
|
||||
export const appid = _appid;
|
||||
135
src/common/utils/audio.ts
Normal file
135
src/common/utils/audio.ts
Normal file
@@ -0,0 +1,135 @@
|
||||
import fs from 'fs';
|
||||
import { encode, getDuration, getWavFileInfo, isWav } from 'silk-wasm';
|
||||
import fsPromise from 'fs/promises';
|
||||
import { log, logError } from './log';
|
||||
import path from 'node:path';
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
import { spawn } from 'node:child_process';
|
||||
import { getTempDir } from '@/common/utils/file';
|
||||
|
||||
let TEMP_DIR = './';
|
||||
setTimeout(() => {
|
||||
TEMP_DIR = getTempDir();
|
||||
}, 100);
|
||||
export async function encodeSilk(filePath: string) {
|
||||
function getFileHeader(filePath: string) {
|
||||
// 定义要读取的字节数
|
||||
const bytesToRead = 7;
|
||||
try {
|
||||
const buffer = fs.readFileSync(filePath, {
|
||||
encoding: null,
|
||||
flag: 'r',
|
||||
});
|
||||
|
||||
const fileHeader = buffer.toString('hex', 0, bytesToRead);
|
||||
return fileHeader;
|
||||
} catch (err) {
|
||||
console.error('读取文件错误:', err);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
async function isWavFile(filePath: string) {
|
||||
return isWav(fs.readFileSync(filePath));
|
||||
}
|
||||
|
||||
async function guessDuration(pttPath: string) {
|
||||
const pttFileInfo = await fsPromise.stat(pttPath);
|
||||
let duration = pttFileInfo.size / 1024 / 3; // 3kb/s
|
||||
duration = Math.floor(duration);
|
||||
duration = Math.max(1, duration);
|
||||
log('通过文件大小估算语音的时长:', duration);
|
||||
return duration;
|
||||
}
|
||||
|
||||
// function verifyDuration(oriDuration: number, guessDuration: number) {
|
||||
// // 单位都是秒
|
||||
// if (oriDuration - guessDuration > 10) {
|
||||
// return guessDuration
|
||||
// }
|
||||
// oriDuration = Math.max(1, oriDuration)
|
||||
// return oriDuration
|
||||
// }
|
||||
// async function getAudioSampleRate(filePath: string) {
|
||||
// try {
|
||||
// const mm = await import('music-metadata');
|
||||
// const metadata = await mm.parseFile(filePath);
|
||||
// log(`${filePath}采样率`, metadata.format.sampleRate);
|
||||
// return metadata.format.sampleRate;
|
||||
// } catch (error) {
|
||||
// log(`${filePath}采样率获取失败`, error.stack);
|
||||
// // console.error(error);
|
||||
// }
|
||||
// }
|
||||
|
||||
try {
|
||||
const pttPath = path.join(TEMP_DIR, uuidv4());
|
||||
if (getFileHeader(filePath) !== '02232153494c4b') {
|
||||
log(`语音文件${filePath}需要转换成silk`);
|
||||
const _isWav = await isWavFile(filePath);
|
||||
const pcmPath = pttPath + '.pcm';
|
||||
let sampleRate = 0;
|
||||
const convert = () => {
|
||||
return new Promise<Buffer>((resolve, reject) => {
|
||||
// todo: 通过配置文件获取ffmpeg路径
|
||||
const ffmpegPath = process.env.FFMPEG_PATH || 'ffmpeg';
|
||||
const cp = spawn(ffmpegPath, ['-y', '-i', filePath, '-ar', '24000', '-ac', '1', '-f', 's16le', pcmPath]);
|
||||
cp.on('error', err => {
|
||||
log('FFmpeg处理转换出错: ', err.message);
|
||||
return reject(err);
|
||||
});
|
||||
cp.on('exit', (code, signal) => {
|
||||
const EXIT_CODES = [0, 255];
|
||||
if (code == null || EXIT_CODES.includes(code)) {
|
||||
sampleRate = 24000;
|
||||
const data = fs.readFileSync(pcmPath);
|
||||
fs.unlink(pcmPath, (err) => {
|
||||
});
|
||||
return resolve(data);
|
||||
}
|
||||
log(`FFmpeg exit: code=${code ?? 'unknown'} sig=${signal ?? 'unknown'}`);
|
||||
reject(Error('FFmpeg处理转换失败'));
|
||||
});
|
||||
});
|
||||
};
|
||||
let input: Buffer;
|
||||
if (!_isWav) {
|
||||
input = await convert();
|
||||
} else {
|
||||
input = fs.readFileSync(filePath);
|
||||
const allowSampleRate = [8000, 12000, 16000, 24000, 32000, 44100, 48000];
|
||||
const { fmt } = getWavFileInfo(input);
|
||||
// log(`wav文件信息`, fmt)
|
||||
if (!allowSampleRate.includes(fmt.sampleRate)) {
|
||||
input = await convert();
|
||||
}
|
||||
}
|
||||
const silk = await encode(input, sampleRate);
|
||||
fs.writeFileSync(pttPath, silk.data);
|
||||
log(`语音文件${filePath}转换成功!`, pttPath, '时长:', silk.duration);
|
||||
return {
|
||||
converted: true,
|
||||
path: pttPath,
|
||||
duration: silk.duration / 1000
|
||||
};
|
||||
} else {
|
||||
const silk = fs.readFileSync(filePath);
|
||||
let duration = 0;
|
||||
try {
|
||||
duration = getDuration(silk) / 1000;
|
||||
} catch (e: any) {
|
||||
log('获取语音文件时长失败, 使用文件大小推测时长', filePath, e.stack);
|
||||
duration = await guessDuration(filePath);
|
||||
}
|
||||
|
||||
return {
|
||||
converted: false,
|
||||
path: filePath,
|
||||
duration,
|
||||
};
|
||||
}
|
||||
} catch (error: any) {
|
||||
logError('convert silk failed', error.stack);
|
||||
return {};
|
||||
}
|
||||
}
|
||||
19
src/common/utils/cpmodule.ts
Normal file
19
src/common/utils/cpmodule.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
import * as os from 'os';
|
||||
import path from 'node:path';
|
||||
import fs from 'fs';
|
||||
|
||||
export function getModuleWithArchName(moduleName: string) {
|
||||
const systemPlatform = os.platform();
|
||||
const cpuArch = os.arch();
|
||||
return `${moduleName}-${systemPlatform}-${cpuArch}.node`;
|
||||
}
|
||||
|
||||
export function cpModule(moduleName: string) {
|
||||
const currentDir = path.resolve(__dirname);
|
||||
const fileName = `./${getModuleWithArchName(moduleName)}`;
|
||||
try {
|
||||
fs.copyFileSync(path.join(currentDir, fileName), path.join(currentDir, `${moduleName}.node`));
|
||||
} catch (e) {
|
||||
|
||||
}
|
||||
}
|
||||
272
src/common/utils/file.ts
Normal file
272
src/common/utils/file.ts
Normal file
@@ -0,0 +1,272 @@
|
||||
import fs from 'fs';
|
||||
import fsPromise from 'fs/promises';
|
||||
import crypto from 'crypto';
|
||||
import util from 'util';
|
||||
import path from 'node:path';
|
||||
import { log } from './log';
|
||||
import { dbUtil } from '@/core/utils/db';
|
||||
import * as fileType from 'file-type';
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
import { napCatCore } from '@/core';
|
||||
|
||||
export const getNapCatDir = () => {
|
||||
const p = path.join(napCatCore.dataPath, 'NapCat');
|
||||
fs.mkdirSync(p, { recursive: true });
|
||||
return p;
|
||||
};
|
||||
export const getTempDir = () => {
|
||||
const p = path.join(getNapCatDir(), 'temp');
|
||||
// 创建临时目录
|
||||
if (!fs.existsSync(p)) {
|
||||
fs.mkdirSync(p, { recursive: true });
|
||||
}
|
||||
return p;
|
||||
};
|
||||
|
||||
|
||||
export function isGIF(path: string) {
|
||||
const buffer = Buffer.alloc(4);
|
||||
const fd = fs.openSync(path, 'r');
|
||||
fs.readSync(fd, buffer, 0, 4, 0);
|
||||
fs.closeSync(fd);
|
||||
return buffer.toString() === 'GIF8';
|
||||
}
|
||||
|
||||
// 定义一个异步函数来检查文件是否存在
|
||||
export function checkFileReceived(path: string, timeout: number = 3000): Promise<void> {
|
||||
return new Promise((resolve, reject) => {
|
||||
const startTime = Date.now();
|
||||
|
||||
function check() {
|
||||
if (fs.existsSync(path)) {
|
||||
resolve();
|
||||
} else if (Date.now() - startTime > timeout) {
|
||||
reject(new Error(`文件不存在: ${path}`));
|
||||
} else {
|
||||
setTimeout(check, 100);
|
||||
}
|
||||
}
|
||||
|
||||
check();
|
||||
});
|
||||
}
|
||||
|
||||
export async function file2base64(path: string) {
|
||||
const readFile = util.promisify(fs.readFile);
|
||||
const result = {
|
||||
err: '',
|
||||
data: ''
|
||||
};
|
||||
try {
|
||||
// 读取文件内容
|
||||
// if (!fs.existsSync(path)){
|
||||
// path = path.replace("\\Ori\\", "\\Thumb\\");
|
||||
// }
|
||||
try {
|
||||
await checkFileReceived(path, 5000);
|
||||
} catch (e: any) {
|
||||
result.err = e.toString();
|
||||
return result;
|
||||
}
|
||||
const data = await readFile(path);
|
||||
// 转换为Base64编码
|
||||
result.data = data.toString('base64');
|
||||
} catch (err: any) {
|
||||
result.err = err.toString();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
export function calculateFileMD5(filePath: string): Promise<string> {
|
||||
return new Promise((resolve, reject) => {
|
||||
// 创建一个流式读取器
|
||||
const stream = fs.createReadStream(filePath);
|
||||
const hash = crypto.createHash('md5');
|
||||
|
||||
stream.on('data', (data: Buffer) => {
|
||||
// 当读取到数据时,更新哈希对象的状态
|
||||
hash.update(data);
|
||||
});
|
||||
|
||||
stream.on('end', () => {
|
||||
// 文件读取完成,计算哈希
|
||||
const md5 = hash.digest('hex');
|
||||
resolve(md5);
|
||||
});
|
||||
|
||||
stream.on('error', (err: Error) => {
|
||||
// 处理可能的读取错误
|
||||
reject(err);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export interface HttpDownloadOptions {
|
||||
url: string;
|
||||
headers?: Record<string, string> | string;
|
||||
}
|
||||
|
||||
export async function httpDownload(options: string | HttpDownloadOptions): Promise<Buffer> {
|
||||
const chunks: Buffer[] = [];
|
||||
let url: string;
|
||||
let headers: Record<string, string> = {
|
||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'
|
||||
};
|
||||
if (typeof options === 'string') {
|
||||
url = options;
|
||||
} else {
|
||||
url = options.url;
|
||||
if (options.headers) {
|
||||
if (typeof options.headers === 'string') {
|
||||
headers = JSON.parse(options.headers);
|
||||
} else {
|
||||
headers = options.headers;
|
||||
}
|
||||
}
|
||||
}
|
||||
const fetchRes = await fetch(url, headers);
|
||||
if (!fetchRes.ok) throw new Error(`下载文件失败: ${fetchRes.statusText}`);
|
||||
|
||||
const blob = await fetchRes.blob();
|
||||
const buffer = await blob.arrayBuffer();
|
||||
return Buffer.from(buffer);
|
||||
}
|
||||
|
||||
type Uri2LocalRes = {
|
||||
success: boolean,
|
||||
errMsg: string,
|
||||
fileName: string,
|
||||
ext: string,
|
||||
path: string,
|
||||
isLocal: boolean
|
||||
}
|
||||
|
||||
export async function uri2local(uri: string, fileName: string | null = null): Promise<Uri2LocalRes> {
|
||||
const res = {
|
||||
success: false,
|
||||
errMsg: '',
|
||||
fileName: '',
|
||||
ext: '',
|
||||
path: '',
|
||||
isLocal: false
|
||||
};
|
||||
if (!fileName) {
|
||||
fileName = uuidv4();
|
||||
}
|
||||
let filePath = path.join(getTempDir(), fileName);
|
||||
let url = null;
|
||||
try {
|
||||
url = new URL(uri);
|
||||
} catch (e: any) {
|
||||
res.errMsg = `uri ${uri} 解析失败,` + e.toString() + ` 可能${uri}不存在`;
|
||||
return res;
|
||||
}
|
||||
|
||||
// log("uri protocol", url.protocol, uri);
|
||||
if (url.protocol == 'base64:') {
|
||||
// base64转成文件
|
||||
const base64Data = uri.split('base64://')[1];
|
||||
try {
|
||||
const buffer = Buffer.from(base64Data, 'base64');
|
||||
fs.writeFileSync(filePath, buffer);
|
||||
|
||||
} catch (e: any) {
|
||||
res.errMsg = 'base64文件下载失败,' + e.toString();
|
||||
return res;
|
||||
}
|
||||
} else if (url.protocol == 'http:' || url.protocol == 'https:') {
|
||||
// 下载文件
|
||||
let buffer: Buffer | null = null;
|
||||
try {
|
||||
buffer = await httpDownload(uri);
|
||||
} catch (e: any) {
|
||||
res.errMsg = `${url}下载失败,` + e.toString();
|
||||
return res;
|
||||
}
|
||||
try {
|
||||
const pathInfo = path.parse(decodeURIComponent(url.pathname));
|
||||
if (pathInfo.name) {
|
||||
fileName = pathInfo.name;
|
||||
if (pathInfo.ext) {
|
||||
fileName += pathInfo.ext;
|
||||
// res.ext = pathInfo.ext
|
||||
}
|
||||
}
|
||||
res.fileName = fileName;
|
||||
filePath = path.join(getTempDir(), uuidv4() + fileName);
|
||||
fs.writeFileSync(filePath, buffer);
|
||||
} catch (e: any) {
|
||||
res.errMsg = `${url}下载失败,` + e.toString();
|
||||
return res;
|
||||
}
|
||||
} else {
|
||||
let pathname: string;
|
||||
if (url.protocol === 'file:') {
|
||||
// await fs.copyFile(url.pathname, filePath);
|
||||
pathname = decodeURIComponent(url.pathname);
|
||||
if (process.platform === 'win32') {
|
||||
filePath = pathname.slice(1);
|
||||
} else {
|
||||
filePath = pathname;
|
||||
}
|
||||
} else {
|
||||
const cache = await dbUtil.getFileCacheByName(uri);
|
||||
if (cache) {
|
||||
filePath = cache.path;
|
||||
} else {
|
||||
filePath = uri;
|
||||
}
|
||||
}
|
||||
|
||||
res.isLocal = true;
|
||||
}
|
||||
// else{
|
||||
// res.errMsg = `不支持的file协议,` + url.protocol
|
||||
// return res
|
||||
// }
|
||||
// if (isGIF(filePath) && !res.isLocal) {
|
||||
// await fs.rename(filePath, filePath + ".gif");
|
||||
// filePath += ".gif";
|
||||
// }
|
||||
if (!res.isLocal && !res.ext) {
|
||||
try {
|
||||
const ext: string | undefined = (await fileType.fileTypeFromFile(filePath))?.ext;
|
||||
if (ext) {
|
||||
log('获取文件类型', ext, filePath);
|
||||
fs.renameSync(filePath, filePath + `.${ext}`);
|
||||
filePath += `.${ext}`;
|
||||
res.fileName += `.${ext}`;
|
||||
res.ext = ext;
|
||||
}
|
||||
} catch (e) {
|
||||
// log("获取文件类型失败", filePath,e.stack)
|
||||
}
|
||||
}
|
||||
res.success = true;
|
||||
res.path = filePath;
|
||||
return res;
|
||||
}
|
||||
|
||||
export async function copyFolder(sourcePath: string, destPath: string) {
|
||||
try {
|
||||
const entries = await fsPromise.readdir(sourcePath, { withFileTypes: true });
|
||||
await fsPromise.mkdir(destPath, { recursive: true });
|
||||
for (const entry of entries) {
|
||||
const srcPath = path.join(sourcePath, entry.name);
|
||||
const dstPath = path.join(destPath, entry.name);
|
||||
if (entry.isDirectory()) {
|
||||
await copyFolder(srcPath, dstPath);
|
||||
} else {
|
||||
try {
|
||||
await fsPromise.copyFile(srcPath, dstPath);
|
||||
} catch (error) {
|
||||
console.error(`无法复制文件 '${srcPath}' 到 '${dstPath}': ${error}`);
|
||||
// 这里可以决定是否要继续复制其他文件
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('复制文件夹时出错:', error);
|
||||
}
|
||||
}
|
||||
37
src/common/utils/helper.ts
Normal file
37
src/common/utils/helper.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
import crypto from 'node:crypto';
|
||||
|
||||
export function sleep(ms: number): Promise<void> {
|
||||
return new Promise(resolve => setTimeout(resolve, ms));
|
||||
}
|
||||
|
||||
export function getMd5(s: string) {
|
||||
|
||||
const h = crypto.createHash('md5');
|
||||
h.update(s);
|
||||
return h.digest('hex');
|
||||
}
|
||||
|
||||
export function isNull(value: any) {
|
||||
return value === undefined || value === null;
|
||||
}
|
||||
|
||||
export function isNumeric(str: string) {
|
||||
return /^\d+$/.test(str);
|
||||
}
|
||||
|
||||
export function truncateString(obj: any, maxLength = 500) {
|
||||
if (obj !== null && typeof obj === 'object') {
|
||||
Object.keys(obj).forEach(key => {
|
||||
if (typeof obj[key] === 'string') {
|
||||
// 如果是字符串且超过指定长度,则截断
|
||||
if (obj[key].length > maxLength) {
|
||||
obj[key] = obj[key].substring(0, maxLength) + '...';
|
||||
}
|
||||
} else if (typeof obj[key] === 'object') {
|
||||
// 如果是对象或数组,则递归调用
|
||||
truncateString(obj[key], maxLength);
|
||||
}
|
||||
});
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
116
src/common/utils/log.ts
Normal file
116
src/common/utils/log.ts
Normal file
@@ -0,0 +1,116 @@
|
||||
import log4js, { Configuration } from 'log4js';
|
||||
import { truncateString } from '@/common/utils/helper';
|
||||
import path from 'node:path';
|
||||
import { SelfInfo } from '@/core';
|
||||
|
||||
export enum LogLevel {
|
||||
DEBUG = 'debug',
|
||||
INFO = 'info',
|
||||
WARN = 'warn',
|
||||
ERROR = 'error',
|
||||
FATAL = 'fatal',
|
||||
}
|
||||
|
||||
const logDir = path.join(path.resolve(__dirname), 'logs');
|
||||
|
||||
function getFormattedTimestamp() {
|
||||
const now = new Date();
|
||||
const year = now.getFullYear();
|
||||
const month = (now.getMonth() + 1).toString().padStart(2, '0');
|
||||
const day = now.getDate().toString().padStart(2, '0');
|
||||
const hours = now.getHours().toString().padStart(2, '0');
|
||||
const minutes = now.getMinutes().toString().padStart(2, '0');
|
||||
const seconds = now.getSeconds().toString().padStart(2, '0');
|
||||
return `${year}-${month}-${day}_${hours}-${minutes}-${seconds}`;
|
||||
}
|
||||
|
||||
const filename = `${getFormattedTimestamp()}.log`;
|
||||
const logPath = path.join(logDir, filename);
|
||||
|
||||
const logConfig: Configuration = {
|
||||
appenders: {
|
||||
FileAppender: { // 输出到文件的appender
|
||||
type: 'file',
|
||||
filename: logPath, // 指定日志文件的位置和文件名
|
||||
maxLoogSize: 10485760, // 日志文件的最大大小(单位:字节),这里设置为10MB
|
||||
layout: {
|
||||
type: 'pattern',
|
||||
pattern: '%d{yyyy-MM-dd hh:mm:ss} [%p] - %m'
|
||||
}
|
||||
},
|
||||
ConsoleAppender: { // 输出到控制台的appender
|
||||
type: 'console',
|
||||
layout: {
|
||||
type: 'pattern',
|
||||
pattern: '%d{yyyy-MM-dd hh:mm:ss} [%p] - %m'
|
||||
}
|
||||
}
|
||||
},
|
||||
categories: {
|
||||
default: { appenders: ['FileAppender', 'ConsoleAppender'], level: 'debug' }, // 默认情况下同时输出到文件和控制台
|
||||
file: { appenders: ['FileAppender'], level: 'debug' },
|
||||
console: { appenders: ['ConsoleAppender'], level: 'debug' }
|
||||
}
|
||||
};
|
||||
|
||||
log4js.configure(logConfig);
|
||||
|
||||
|
||||
export function setLogLevel(fileLogLevel: LogLevel, consoleLogLevel: LogLevel) {
|
||||
logConfig.categories.file.level = fileLogLevel;
|
||||
logConfig.categories.console.level = consoleLogLevel;
|
||||
log4js.configure(logConfig);
|
||||
}
|
||||
|
||||
export function setLogSelfInfo(selfInfo: SelfInfo) {
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-expect-error
|
||||
logConfig.appenders.FileAppender.layout.pattern = logConfig.appenders.ConsoleAppender.layout.pattern =
|
||||
`%d{yyyy-MM-dd hh:mm:ss} [%p] ${selfInfo.nick}(${selfInfo.uin}) %m`;
|
||||
log4js.configure(logConfig);
|
||||
}
|
||||
|
||||
let fileLogEnabled = true;
|
||||
let consoleLogEnabled = true;
|
||||
export function enableFileLog(enable: boolean) {
|
||||
fileLogEnabled = enable;
|
||||
}
|
||||
export function enableConsoleLog(enable: boolean) {
|
||||
consoleLogEnabled = enable;
|
||||
}
|
||||
|
||||
function formatMsg(msg: any[]){
|
||||
let logMsg = '';
|
||||
for (const msgItem of msg) {
|
||||
// 判断是否是对象
|
||||
if (typeof msgItem === 'object') {
|
||||
const obj = JSON.parse(JSON.stringify(msgItem, null, 2));
|
||||
logMsg += JSON.stringify(truncateString(obj)) + ' ';
|
||||
continue;
|
||||
}
|
||||
logMsg += msgItem + ' ';
|
||||
}
|
||||
return '\n' + logMsg + '\n';
|
||||
}
|
||||
|
||||
function _log(level: LogLevel, ...args: any[]){
|
||||
if (consoleLogEnabled){
|
||||
log4js.getLogger('console')[level](formatMsg(args));
|
||||
}
|
||||
if (fileLogEnabled){
|
||||
log4js.getLogger('file')[level](formatMsg(args));
|
||||
}
|
||||
}
|
||||
|
||||
export function log(...args: any[]) {
|
||||
// info 等级
|
||||
_log(LogLevel.INFO, ...args);
|
||||
}
|
||||
|
||||
export function logDebug(...args: any[]) {
|
||||
_log(LogLevel.DEBUG, ...args);
|
||||
}
|
||||
|
||||
export function logError(...args: any[]) {
|
||||
_log(LogLevel.ERROR, ...args);
|
||||
}
|
||||
7
src/common/utils/qqlevel.ts
Normal file
7
src/common/utils/qqlevel.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
// QQ等级换算
|
||||
import { QQLevel } from '../../core/src/entities';
|
||||
|
||||
export function calcQQLevel(level: QQLevel) {
|
||||
const { crownNum, sunNum, moonNum, starNum } = level;
|
||||
return crownNum * 64 + sunNum * 16 + moonNum * 4 + starNum;
|
||||
}
|
||||
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();
|
||||
});
|
||||
|
||||
}
|
||||
10
src/common/utils/system.ts
Normal file
10
src/common/utils/system.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import os from 'node:os';
|
||||
import path from 'node:path';
|
||||
|
||||
export const systemPlatform = os.platform();
|
||||
export const cpuArch = os.arch();
|
||||
export const systemVersion = os.release();
|
||||
export const hostname = os.hostname();
|
||||
const homeDir = os.homedir();
|
||||
export const downloadsPath = path.join(homeDir, 'Downloads');
|
||||
export const systemName = os.type();
|
||||
44
src/common/utils/umami.ts
Normal file
44
src/common/utils/umami.ts
Normal file
@@ -0,0 +1,44 @@
|
||||
import { request } from 'node:https';
|
||||
export function postLoginStatus() {
|
||||
const req = request(
|
||||
{
|
||||
hostname: 'napcat.wumiao.wang',
|
||||
path: '/api/send',
|
||||
port: 443,
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0'
|
||||
}
|
||||
},
|
||||
(res) => {
|
||||
//let data = '';
|
||||
res.on('data', (chunk) => {
|
||||
//data += chunk;
|
||||
});
|
||||
res.on('error', (err) => {
|
||||
});
|
||||
res.on('end', () => {
|
||||
//console.log('Response:', data);
|
||||
});
|
||||
}
|
||||
);
|
||||
req.on('error', (e) => {
|
||||
// console.error('Request error:', e);
|
||||
});
|
||||
const StatesData = {
|
||||
type: 'event',
|
||||
payload: {
|
||||
'website': '952bf82f-8f49-4456-aec5-e17db5f27f7e',
|
||||
'hostname': 'napcat.demo.cn',
|
||||
'screen': '1920x1080',
|
||||
'language': 'zh-CN',
|
||||
'title': 'OneBot.Login',
|
||||
'url': '/login/onebot11/1.2.0',
|
||||
'referrer': 'https://napcat.demo.cn/login?type=onebot11'
|
||||
}
|
||||
};
|
||||
req.write(JSON.stringify(StatesData));
|
||||
|
||||
req.end();
|
||||
}
|
||||
44
src/common/utils/version.ts
Normal file
44
src/common/utils/version.ts
Normal file
@@ -0,0 +1,44 @@
|
||||
import { get as httpsGet } from 'node:https';
|
||||
function requestMirror(url: string): Promise<string | undefined> {
|
||||
return new Promise((resolve, reject) => {
|
||||
httpsGet(url, (response) => {
|
||||
let data = '';
|
||||
response.on('data', (chunk) => {
|
||||
data += chunk;
|
||||
});
|
||||
|
||||
response.on('end', () => {
|
||||
try {
|
||||
const parsedData = JSON.parse(data);
|
||||
const version = parsedData.version;
|
||||
resolve(version);
|
||||
} catch (error) {
|
||||
// 解析失败或无法访问域名,跳过
|
||||
resolve(undefined);
|
||||
}
|
||||
});
|
||||
}).on('error', (error) => {
|
||||
// 请求失败,跳过
|
||||
resolve(undefined);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export async function checkVersion(): Promise<string> {
|
||||
return new Promise(async (resolve, reject) => {
|
||||
const MirrorList =
|
||||
[
|
||||
'https://fastly.jsdelivr.net/gh/NapNeko/NapCatQQ@main/package.json',
|
||||
'https://gcore.jsdelivr.net/gh/NapNeko/NapCatQQ@main/package.json',
|
||||
'https://cdn.jsdelivr.us/gh/NapNeko/NapCatQQ@main/package.json',
|
||||
'https://jsd.cdn.zzko.cn/gh/NapNeko/NapCatQQ@main/package.json'
|
||||
];
|
||||
for (const url of MirrorList) {
|
||||
const version = await requestMirror(url);
|
||||
if (version) {
|
||||
resolve(version);
|
||||
}
|
||||
}
|
||||
reject('get verison error!');
|
||||
});
|
||||
}
|
||||
87
src/common/utils/video.ts
Normal file
87
src/common/utils/video.ts
Normal file
File diff suppressed because one or more lines are too long
1
src/core
Submodule
1
src/core
Submodule
Submodule src/core added at db31eb4f35
BIN
src/core.lib/MoeHoo-linux-x64.node
Normal file
BIN
src/core.lib/MoeHoo-linux-x64.node
Normal file
Binary file not shown.
BIN
src/core.lib/MoeHoo-win32-x64.node
Normal file
BIN
src/core.lib/MoeHoo-win32-x64.node
Normal file
Binary file not shown.
22
src/core.lib/package.json
Normal file
22
src/core.lib/package.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"name": "@napneko/core",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"type": "module",
|
||||
"main": "./index.js",
|
||||
"files": [
|
||||
"lib"
|
||||
],
|
||||
"scripts": {
|
||||
"lint": "eslint --fix ./src/**/*.ts",
|
||||
"build:dev": "vite build --mode development",
|
||||
"build:prod": "vite build --mode production",
|
||||
"build": "npm run build:dev"
|
||||
},
|
||||
"author": "NapNeko",
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://github.com/NapNeko/NapCatQQ/issues"
|
||||
},
|
||||
"homepage": "https://github.com/NapNeko/NapCatQQ#readme"
|
||||
}
|
||||
14
src/core.lib/src/adapters/NodeIDependsAdapter.d.ts
vendored
Normal file
14
src/core.lib/src/adapters/NodeIDependsAdapter.d.ts
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
interface IDependsAdapter {
|
||||
onMSFStatusChange(arg1: number, arg2: number): void;
|
||||
onMSFSsoError(args: unknown): void;
|
||||
getGroupCode(args: unknown): void;
|
||||
}
|
||||
export interface NodeIDependsAdapter extends IDependsAdapter {
|
||||
new (adapter: IDependsAdapter): NodeIDependsAdapter;
|
||||
}
|
||||
export declare class DependsAdapter implements IDependsAdapter {
|
||||
onMSFStatusChange(arg1: number, arg2: number): void;
|
||||
onMSFSsoError(args: unknown): void;
|
||||
getGroupCode(args: unknown): void;
|
||||
}
|
||||
export {};
|
||||
1
src/core.lib/src/adapters/NodeIDependsAdapter.js
Normal file
1
src/core.lib/src/adapters/NodeIDependsAdapter.js
Normal file
@@ -0,0 +1 @@
|
||||
var _0x19cca1=_0x3b67;function _0x3b67(_0x4e2d62,_0x2b703c){var _0x43da95=_0x43da();return _0x3b67=function(_0x3b6794,_0x5e2486){_0x3b6794=_0x3b6794-0x186;var _0x30a87a=_0x43da95[_0x3b6794];return _0x30a87a;},_0x3b67(_0x4e2d62,_0x2b703c);}function _0x43da(){var _0x485bdb=['onMSFSsoError','2718873aSehtg','46326dbXYaL','13KNQOpC','getGroupCode','500FKyOoW','2825766sIjvqf','2443SNCuSJ','onMSFStatusChange','5149530LDXDOT','28430WpXmXq','6928nFtyJZ','25344720iHJUOk'];_0x43da=function(){return _0x485bdb;};return _0x43da();}(function(_0x503e40,_0x4b232d){var _0x5cda5a=_0x3b67,_0xa74c3b=_0x503e40();while(!![]){try{var _0x3b6569=-parseInt(_0x5cda5a(0x192))/0x1*(-parseInt(_0x5cda5a(0x191))/0x2)+-parseInt(_0x5cda5a(0x190))/0x3+parseInt(_0x5cda5a(0x187))/0x4*(-parseInt(_0x5cda5a(0x18c))/0x5)+-parseInt(_0x5cda5a(0x188))/0x6+parseInt(_0x5cda5a(0x189))/0x7*(parseInt(_0x5cda5a(0x18d))/0x8)+-parseInt(_0x5cda5a(0x18b))/0x9+parseInt(_0x5cda5a(0x18e))/0xa;if(_0x3b6569===_0x4b232d)break;else _0xa74c3b['push'](_0xa74c3b['shift']());}catch(_0x55844b){_0xa74c3b['push'](_0xa74c3b['shift']());}}}(_0x43da,0x749d5));export class DependsAdapter{[_0x19cca1(0x18a)](_0x1d14d4,_0x4f88a6){}[_0x19cca1(0x18f)](_0x156ded){}[_0x19cca1(0x186)](_0x4766d7){}}
|
||||
14
src/core.lib/src/adapters/NodeIDispatcherAdapter.d.ts
vendored
Normal file
14
src/core.lib/src/adapters/NodeIDispatcherAdapter.d.ts
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
interface IDispatcherAdapter {
|
||||
dispatchRequest(arg: unknown): void;
|
||||
dispatchCall(arg: unknown): void;
|
||||
dispatchCallWithJson(arg: unknown): void;
|
||||
}
|
||||
export interface NodeIDispatcherAdapter extends IDispatcherAdapter {
|
||||
new (adapter: IDispatcherAdapter): NodeIDispatcherAdapter;
|
||||
}
|
||||
export declare class DispatcherAdapter implements IDispatcherAdapter {
|
||||
dispatchRequest(arg: unknown): void;
|
||||
dispatchCall(arg: unknown): void;
|
||||
dispatchCallWithJson(arg: unknown): void;
|
||||
}
|
||||
export {};
|
||||
1
src/core.lib/src/adapters/NodeIDispatcherAdapter.js
Normal file
1
src/core.lib/src/adapters/NodeIDispatcherAdapter.js
Normal file
@@ -0,0 +1 @@
|
||||
function _0x5373(_0x2b9ce7,_0xffbb7d){var _0x2366ad=_0x2366();return _0x5373=function(_0x537331,_0x559829){_0x537331=_0x537331-0xd4;var _0x1f83da=_0x2366ad[_0x537331];return _0x1f83da;},_0x5373(_0x2b9ce7,_0xffbb7d);}var _0x278f04=_0x5373;(function(_0x367efd,_0x3f1bf7){var _0x384670=_0x5373,_0x565677=_0x367efd();while(!![]){try{var _0x26beb0=-parseInt(_0x384670(0xdf))/0x1*(parseInt(_0x384670(0xe1))/0x2)+parseInt(_0x384670(0xd5))/0x3*(parseInt(_0x384670(0xdd))/0x4)+-parseInt(_0x384670(0xda))/0x5*(parseInt(_0x384670(0xe0))/0x6)+-parseInt(_0x384670(0xd7))/0x7+-parseInt(_0x384670(0xdb))/0x8*(parseInt(_0x384670(0xde))/0x9)+-parseInt(_0x384670(0xd6))/0xa*(-parseInt(_0x384670(0xd4))/0xb)+parseInt(_0x384670(0xd9))/0xc;if(_0x26beb0===_0x3f1bf7)break;else _0x565677['push'](_0x565677['shift']());}catch(_0x4de050){_0x565677['push'](_0x565677['shift']());}}}(_0x2366,0x57694));export class DispatcherAdapter{[_0x278f04(0xd8)](_0x2a639c){}[_0x278f04(0xdc)](_0x3df573){}['dispatchCallWithJson'](_0x6e6a4c){}}function _0x2366(){var _0xc6638c=['1898568MMlxTI','dispatchCall','1799812jXdYXo','27pZjsRH','6007PSOqrs','625128YiqIDj','6meDdBF','362461TnDcTN','3EkkoSG','70NqnjQm','663054oxnAYm','dispatchRequest','13527120ltVhkv','30ruWnzX'];_0x2366=function(){return _0xc6638c;};return _0x2366();}
|
||||
24
src/core.lib/src/adapters/NodeIGlobalAdapter.d.ts
vendored
Normal file
24
src/core.lib/src/adapters/NodeIGlobalAdapter.d.ts
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
interface IGlobalAdapter {
|
||||
onLog(...args: unknown[]): void;
|
||||
onGetSrvCalTime(...args: unknown[]): void;
|
||||
onShowErrUITips(...args: unknown[]): void;
|
||||
fixPicImgType(...args: unknown[]): void;
|
||||
getAppSetting(...args: unknown[]): void;
|
||||
onInstallFinished(...args: unknown[]): void;
|
||||
onUpdateGeneralFlag(...args: unknown[]): void;
|
||||
onGetOfflineMsg(...args: unknown[]): void;
|
||||
}
|
||||
export interface NodeIGlobalAdapter extends IGlobalAdapter {
|
||||
new (adapter: IGlobalAdapter): NodeIGlobalAdapter;
|
||||
}
|
||||
export declare class GlobalAdapter implements IGlobalAdapter {
|
||||
onLog(...args: unknown[]): void;
|
||||
onGetSrvCalTime(...args: unknown[]): void;
|
||||
onShowErrUITips(...args: unknown[]): void;
|
||||
fixPicImgType(...args: unknown[]): void;
|
||||
getAppSetting(...args: unknown[]): void;
|
||||
onInstallFinished(...args: unknown[]): void;
|
||||
onUpdateGeneralFlag(...args: unknown[]): void;
|
||||
onGetOfflineMsg(...args: unknown[]): void;
|
||||
}
|
||||
export {};
|
||||
1
src/core.lib/src/adapters/NodeIGlobalAdapter.js
Normal file
1
src/core.lib/src/adapters/NodeIGlobalAdapter.js
Normal file
@@ -0,0 +1 @@
|
||||
var _0x507796=_0x4dd4;(function(_0x5d8a39,_0x2e8960){var _0x151ed0=_0x4dd4,_0x5c0894=_0x5d8a39();while(!![]){try{var _0x412819=-parseInt(_0x151ed0(0x9a))/0x1+-parseInt(_0x151ed0(0x99))/0x2+parseInt(_0x151ed0(0x9c))/0x3*(parseInt(_0x151ed0(0xa4))/0x4)+-parseInt(_0x151ed0(0x9f))/0x5+-parseInt(_0x151ed0(0xa2))/0x6*(parseInt(_0x151ed0(0xa0))/0x7)+-parseInt(_0x151ed0(0x9d))/0x8*(-parseInt(_0x151ed0(0x9b))/0x9)+parseInt(_0x151ed0(0xa3))/0xa;if(_0x412819===_0x2e8960)break;else _0x5c0894['push'](_0x5c0894['shift']());}catch(_0x1543ea){_0x5c0894['push'](_0x5c0894['shift']());}}}(_0x1fbf,0x7ea3f));function _0x4dd4(_0x5acf60,_0x5e2498){var _0x1fbfa9=_0x1fbf();return _0x4dd4=function(_0x4dd4ed,_0x493fef){_0x4dd4ed=_0x4dd4ed-0x98;var _0xe69a6f=_0x1fbfa9[_0x4dd4ed];return _0xe69a6f;},_0x4dd4(_0x5acf60,_0x5e2498);}function _0x1fbf(){var _0x46492c=['726755BvXnhR','21eovJev','fixPicImgType','946908fciiBt','10083230HbWaVK','8wfvDYM','onGetOfflineMsg','onShowErrUITips','getAppSetting','1566992IQpUwL','299110syqAMD','27NHBruA','1243551NyRWug','1020728hSDVQy','onInstallFinished'];_0x1fbf=function(){return _0x46492c;};return _0x1fbf();}export class GlobalAdapter{['onLog'](..._0x5dfe5f){}['onGetSrvCalTime'](..._0x42ea71){}[_0x507796(0xa6)](..._0x1e2771){}[_0x507796(0xa1)](..._0x43eacc){}[_0x507796(0x98)](..._0x4fad89){}[_0x507796(0x9e)](..._0x3d6570){}['onUpdateGeneralFlag'](..._0x233bc3){}[_0x507796(0xa5)](..._0x13035d){}}
|
||||
3
src/core.lib/src/adapters/index.d.ts
vendored
Normal file
3
src/core.lib/src/adapters/index.d.ts
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
export * from './NodeIDependsAdapter';
|
||||
export * from './NodeIDispatcherAdapter';
|
||||
export * from './NodeIGlobalAdapter';
|
||||
1
src/core.lib/src/adapters/index.js
Normal file
1
src/core.lib/src/adapters/index.js
Normal file
@@ -0,0 +1 @@
|
||||
(function(_0x3ddc3c,_0x2196c4){var _0x19e16a=_0x18ea,_0x1b8482=_0x3ddc3c();while(!![]){try{var _0x4c96bb=-parseInt(_0x19e16a(0x1f5))/0x1*(parseInt(_0x19e16a(0x1f6))/0x2)+-parseInt(_0x19e16a(0x1fc))/0x3*(-parseInt(_0x19e16a(0x1f8))/0x4)+-parseInt(_0x19e16a(0x1fa))/0x5+-parseInt(_0x19e16a(0x1f3))/0x6*(-parseInt(_0x19e16a(0x1f9))/0x7)+-parseInt(_0x19e16a(0x1fb))/0x8*(parseInt(_0x19e16a(0x1f4))/0x9)+parseInt(_0x19e16a(0x1f7))/0xa+-parseInt(_0x19e16a(0x1f2))/0xb;if(_0x4c96bb===_0x2196c4)break;else _0x1b8482['push'](_0x1b8482['shift']());}catch(_0x5704d2){_0x1b8482['push'](_0x1b8482['shift']());}}}(_0x50c1,0x5914c));function _0x18ea(_0x59a999,_0xa62c8b){var _0x50c133=_0x50c1();return _0x18ea=function(_0x18eaf4,_0x5b2dd8){_0x18eaf4=_0x18eaf4-0x1f2;var _0xdb4126=_0x50c133[_0x18eaf4];return _0xdb4126;},_0x18ea(_0x59a999,_0xa62c8b);}export*from'./NodeIDependsAdapter';export*from'./NodeIDispatcherAdapter';export*from'./NodeIGlobalAdapter';function _0x50c1(){var _0x25f92a=['244svyoWI','18956RxJdBu','866245nHgMjv','40RonzIC','3126noqWuq','408672rSzKzb','864zoStvL','104022dAaYDi','260044qjwCVq','2UiMGjy','4395970MYGRWb'];_0x50c1=function(){return _0x25f92a;};return _0x50c1();}
|
||||
33
src/core.lib/src/apis/file.d.ts
vendored
Normal file
33
src/core.lib/src/apis/file.d.ts
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
import { CacheFileListItem, CacheFileType, ChatCacheListItemBasic, ChatType, ElementType, RawMessage } from '@/core/entities';
|
||||
import { GeneralCallResult } from '@/core';
|
||||
import * as fileType from 'file-type';
|
||||
import { ISizeCalculationResult } from 'image-size/dist/types/interface';
|
||||
export declare class NTQQFileApi {
|
||||
static getFileType(filePath: string): Promise<fileType.FileTypeResult | undefined>;
|
||||
static copyFile(filePath: string, destPath: string): Promise<void>;
|
||||
static getFileSize(filePath: string): Promise<number>;
|
||||
static uploadFile(filePath: string, elementType?: ElementType, elementSubType?: number): Promise<{
|
||||
md5: string;
|
||||
fileName: string;
|
||||
path: string;
|
||||
fileSize: number;
|
||||
ext: string;
|
||||
}>;
|
||||
static downloadMedia(msgId: string, chatType: ChatType, peerUid: string, elementId: string, thumbPath: string, sourcePath: string, timeout?: number, force?: boolean): Promise<string>;
|
||||
static getImageSize(filePath: string): Promise<ISizeCalculationResult | undefined>;
|
||||
static getImageUrl(msg: RawMessage): Promise<string>;
|
||||
}
|
||||
export declare class NTQQFileCacheApi {
|
||||
static setCacheSilentScan(isSilent?: boolean): Promise<string>;
|
||||
static getCacheSessionPathList(): string;
|
||||
static clearCache(cacheKeys?: Array<string>): unknown;
|
||||
static addCacheScannedPaths(pathMap?: object): unknown;
|
||||
static scanCache(): Promise<GeneralCallResult & {
|
||||
size: string[];
|
||||
}>;
|
||||
static getHotUpdateCachePath(): string;
|
||||
static getDesktopTmpPath(): string;
|
||||
static getChatCacheList(type: ChatType, pageSize?: number, pageIndex?: number): unknown;
|
||||
static getFileCacheInfo(fileType: CacheFileType, pageSize?: number, lastRecord?: CacheFileListItem): void;
|
||||
static clearChatCache(chats?: ChatCacheListItemBasic[], fileKeys?: string[]): Promise<unknown>;
|
||||
}
|
||||
1
src/core.lib/src/apis/file.js
Normal file
1
src/core.lib/src/apis/file.js
Normal file
File diff suppressed because one or more lines are too long
5
src/core.lib/src/apis/friend.d.ts
vendored
Normal file
5
src/core.lib/src/apis/friend.d.ts
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
import { FriendRequest, User } from '@/core/entities';
|
||||
export declare class NTQQFriendApi {
|
||||
static getFriends(forced?: boolean): Promise<User[]>;
|
||||
static handleFriendRequest(request: FriendRequest, accept: boolean): Promise<void>;
|
||||
}
|
||||
1
src/core.lib/src/apis/friend.js
Normal file
1
src/core.lib/src/apis/friend.js
Normal file
@@ -0,0 +1 @@
|
||||
const _0x327915=_0x564b;(function(_0x2e46de,_0x32429){const _0x25e762=_0x564b,_0x54d6c9=_0x2e46de();while(!![]){try{const _0x4d804f=parseInt(_0x25e762(0x141))/0x1+parseInt(_0x25e762(0x148))/0x2*(-parseInt(_0x25e762(0x12f))/0x3)+parseInt(_0x25e762(0x132))/0x4*(parseInt(_0x25e762(0x12d))/0x5)+parseInt(_0x25e762(0x136))/0x6+-parseInt(_0x25e762(0x142))/0x7+parseInt(_0x25e762(0x149))/0x8+parseInt(_0x25e762(0x138))/0x9;if(_0x4d804f===_0x32429)break;else _0x54d6c9['push'](_0x54d6c9['shift']());}catch(_0x3a2885){_0x54d6c9['push'](_0x54d6c9['shift']());}}}(_0x5b8c,0xeef4e));function _0x5b8c(){const _0x3261b2=['JpBwQ','friendUid','349292rZMGNe','reqTime','uid','Bltxv','3198366VaHWrP','rEjUL','4904334BJWSZt','getBuddyService','push','NSGct','approvalFriendRequest','addListener','uin','delete','onBuddyListChange','1782105sxSTUD','8412243LcAaMR','getBuddyList','erKVn','开始获取好友列表','getFriends','获取好友列表超时','2197058AvBzFy','557280jXZTqm','ysELY','rbzhB','onLoginSuccess','then','buddyList','session','20UKwLKb','获取好友列表完成','3vYxReh'];_0x5b8c=function(){return _0x3261b2;};return _0x5b8c();}import{BuddyListener,napCatCore}from'@/core';function _0x564b(_0x347121,_0x4157c3){const _0x5b8ce7=_0x5b8c();return _0x564b=function(_0x564b28,_0x4847e6){_0x564b28=_0x564b28-0x128;let _0x35e1df=_0x5b8ce7[_0x564b28];return _0x35e1df;},_0x564b(_0x347121,_0x4157c3);}import{logDebug}from'@/common/utils/log';import{uid2UinMap}from'@/core/data';import{randomUUID}from'crypto';const buddyChangeTasks=new Map(),buddyListener=new BuddyListener();buddyListener[_0x327915(0x140)]=_0x37416c=>{const _0x50bfe2=_0x327915,_0x529cf1={'EArLC':function(_0x3676f4,_0x2762b7){return _0x3676f4(_0x2762b7);}};for(const [_0x22967e,_0x11e636]of buddyChangeTasks){_0x529cf1['EArLC'](_0x11e636,_0x37416c),buddyChangeTasks[_0x50bfe2(0x13f)](_0x22967e);}},setTimeout(()=>{const _0xa7114d=_0x327915;napCatCore[_0xa7114d(0x129)](()=>{const _0x988e4=_0xa7114d;napCatCore[_0x988e4(0x13d)](buddyListener);});},0x64);export class NTQQFriendApi{static async[_0x327915(0x146)](_0x87cae5=![]){const _0x3d612f=_0x327915,_0x383a4a={'ysELY':function(_0x377aef,_0x630508){return _0x377aef(_0x630508);},'Bltxv':function(_0x302a07,_0x739814,_0x47d689){return _0x302a07(_0x739814,_0x47d689);},'erKVn':_0x3d612f(0x145),'NSGct':function(_0x9fad3f,_0x1428b9){return _0x9fad3f(_0x1428b9);},'rEjUL':_0x3d612f(0x147),'xkKTE':function(_0xfa4d95){return _0xfa4d95();}};return new Promise((_0xb5ffe5,_0x53cb63)=>{const _0xd25d1f=_0x3d612f,_0x4db5ff={'JpBwQ':function(_0x46165b,_0x23dcb3){const _0x17f1ef=_0x564b;return _0x383a4a[_0x17f1ef(0x13b)](_0x46165b,_0x23dcb3);},'rbzhB':_0x383a4a[_0xd25d1f(0x137)]};let _0x4e386c=![];_0x383a4a[_0xd25d1f(0x135)](setTimeout,()=>{const _0x25b6a5=_0xd25d1f;!_0x4e386c&&(_0x4db5ff[_0x25b6a5(0x130)](logDebug,_0x4db5ff[_0x25b6a5(0x128)]),_0x4db5ff['JpBwQ'](_0x53cb63,_0x4db5ff['rbzhB']));},0x1388);const _0x59b5fb=[],_0x4020d5=_0x1158ce=>{const _0x5d7db9=_0xd25d1f;for(const _0x2405ca of _0x1158ce){for(const _0x527fe3 of _0x2405ca[_0x5d7db9(0x12b)]){_0x59b5fb[_0x5d7db9(0x13a)](_0x527fe3),uid2UinMap[_0x527fe3[_0x5d7db9(0x134)]]=_0x527fe3[_0x5d7db9(0x13e)];}}_0x4e386c=!![],logDebug(_0x5d7db9(0x12e),_0x59b5fb),_0x383a4a[_0x5d7db9(0x14a)](_0xb5ffe5,_0x59b5fb);};buddyChangeTasks['set'](_0x383a4a['xkKTE'](randomUUID),_0x4020d5),napCatCore[_0xd25d1f(0x12c)][_0xd25d1f(0x139)]()[_0xd25d1f(0x143)](_0x87cae5)[_0xd25d1f(0x12a)](_0x248b5d=>{const _0x59fb5e=_0xd25d1f;_0x383a4a[_0x59fb5e(0x135)](logDebug,_0x383a4a[_0x59fb5e(0x144)],_0x248b5d);});});}static async['handleFriendRequest'](_0x1cf1f1,_0x5252ac){const _0x33a2ff=_0x327915;napCatCore[_0x33a2ff(0x12c)][_0x33a2ff(0x139)]()?.[_0x33a2ff(0x13c)]({'friendUid':_0x1cf1f1[_0x33a2ff(0x131)],'reqTime':_0x1cf1f1[_0x33a2ff(0x133)],'accept':_0x5252ac});}}
|
||||
20
src/core.lib/src/apis/group.d.ts
vendored
Normal file
20
src/core.lib/src/apis/group.d.ts
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
import { GroupMember, GroupRequestOperateTypes, GroupMemberRole, GroupNotify, Group } from '../entities';
|
||||
export declare class NTQQGroupApi {
|
||||
static getGroups(forced?: boolean): Promise<Group[]>;
|
||||
static getGroupMembers(groupQQ: string, num?: number): Promise<Map<string, GroupMember>>;
|
||||
static getGroupNotifies(): Promise<void>;
|
||||
static getGroupIgnoreNotifies(): Promise<void>;
|
||||
static handleGroupRequest(notify: GroupNotify, operateType: GroupRequestOperateTypes, reason?: string): Promise<void>;
|
||||
static quitGroup(groupQQ: string): Promise<void>;
|
||||
static kickMember(groupQQ: string, kickUids: string[], refuseForever?: boolean, kickReason?: string): Promise<void>;
|
||||
static banMember(groupQQ: string, memList: Array<{
|
||||
uid: string;
|
||||
timeStamp: number;
|
||||
}>): Promise<void>;
|
||||
static banGroup(groupQQ: string, shutUp: boolean): Promise<void>;
|
||||
static setMemberCard(groupQQ: string, memberUid: string, cardName: string): Promise<void>;
|
||||
static setMemberRole(groupQQ: string, memberUid: string, role: GroupMemberRole): Promise<void>;
|
||||
static setGroupName(groupQQ: string, groupName: string): Promise<void>;
|
||||
static setGroupTitle(groupQQ: string, uid: string, title: string): Promise<void>;
|
||||
static publishGroupBulletin(groupQQ: string, title: string, content: string): void;
|
||||
}
|
||||
1
src/core.lib/src/apis/group.js
Normal file
1
src/core.lib/src/apis/group.js
Normal file
File diff suppressed because one or more lines are too long
6
src/core.lib/src/apis/index.d.ts
vendored
Normal file
6
src/core.lib/src/apis/index.d.ts
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
export * from './file';
|
||||
export * from './friend';
|
||||
export * from './group';
|
||||
export * from './msg';
|
||||
export * from './user';
|
||||
export * from './webapi';
|
||||
1
src/core.lib/src/apis/index.js
Normal file
1
src/core.lib/src/apis/index.js
Normal file
@@ -0,0 +1 @@
|
||||
function _0xbc1b(_0x3e9440,_0x4dd314){var _0x328cfa=_0x328c();return _0xbc1b=function(_0xbc1b91,_0x21cbab){_0xbc1b91=_0xbc1b91-0x139;var _0x23d317=_0x328cfa[_0xbc1b91];return _0x23d317;},_0xbc1b(_0x3e9440,_0x4dd314);}(function(_0x2a9ad9,_0x105444){var _0x4df036=_0xbc1b,_0x4404de=_0x2a9ad9();while(!![]){try{var _0xd6ff50=-parseInt(_0x4df036(0x13a))/0x1*(parseInt(_0x4df036(0x13e))/0x2)+-parseInt(_0x4df036(0x142))/0x3*(-parseInt(_0x4df036(0x143))/0x4)+-parseInt(_0x4df036(0x13b))/0x5*(parseInt(_0x4df036(0x140))/0x6)+-parseInt(_0x4df036(0x13d))/0x7+parseInt(_0x4df036(0x13c))/0x8+parseInt(_0x4df036(0x13f))/0x9+parseInt(_0x4df036(0x141))/0xa*(parseInt(_0x4df036(0x139))/0xb);if(_0xd6ff50===_0x105444)break;else _0x4404de['push'](_0x4404de['shift']());}catch(_0x5225ed){_0x4404de['push'](_0x4404de['shift']());}}}(_0x328c,0xcd7fc));export*from'./file';function _0x328c(){var _0x5319a9=['722LahlVI','55GwkVRA','13245072IDasaX','10379320ajSNYf','2086ucOfUp','1829565losmEC','315870NhUrBy','20LjcJxA','152457babiKn','120kEUETL','1502248smLhhN'];_0x328c=function(){return _0x5319a9;};return _0x328c();}export*from'./friend';export*from'./group';export*from'./msg';export*from'./user';export*from'./webapi';
|
||||
25
src/core.lib/src/apis/msg.d.ts
vendored
Normal file
25
src/core.lib/src/apis/msg.d.ts
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
import { Peer, RawMessage, SendMessageElement } from '@/core/entities';
|
||||
import { GeneralCallResult } from '@/core/services/common';
|
||||
export declare class NTQQMsgApi {
|
||||
static setEmojiLike(peer: Peer, msgSeq: string, emojiId: string, set?: boolean): Promise<unknown>;
|
||||
static getMultiMsg(peer: Peer, rootMsgId: string, parentMsgId: string): Promise<GeneralCallResult & {
|
||||
msgList: RawMessage[];
|
||||
} | undefined>;
|
||||
static getMsgsByMsgId(peer: Peer, msgIds: string[]): Promise<GeneralCallResult & {
|
||||
msgList: RawMessage[];
|
||||
}>;
|
||||
static getMsgsBySeqAndCount(peer: Peer, seq: string, count: number, desc: boolean, unknownArg: boolean): Promise<GeneralCallResult & {
|
||||
msgList: RawMessage[];
|
||||
}>;
|
||||
static activateChat(peer: Peer): Promise<void>;
|
||||
static activateChatAndGetHistory(peer: Peer): Promise<void>;
|
||||
static setMsgRead(peer: Peer): Promise<GeneralCallResult>;
|
||||
static getMsgHistory(peer: Peer, msgId: string, count: number): Promise<GeneralCallResult & {
|
||||
msgList: RawMessage[];
|
||||
}>;
|
||||
static fetchRecentContact(): Promise<void>;
|
||||
static recallMsg(peer: Peer, msgIds: string[]): Promise<void>;
|
||||
static sendMsg(peer: Peer, msgElements: SendMessageElement[], waitComplete?: boolean, timeout?: number): Promise<RawMessage>;
|
||||
static forwardMsg(srcPeer: Peer, destPeer: Peer, msgIds: string[]): Promise<GeneralCallResult>;
|
||||
static multiForwardMsg(srcPeer: Peer, destPeer: Peer, msgIds: string[]): Promise<RawMessage>;
|
||||
}
|
||||
1
src/core.lib/src/apis/msg.js
Normal file
1
src/core.lib/src/apis/msg.js
Normal file
File diff suppressed because one or more lines are too long
17
src/core.lib/src/apis/sign.d.ts
vendored
Normal file
17
src/core.lib/src/apis/sign.d.ts
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
export interface IdMusicSignPostData {
|
||||
type: 'qq' | '163';
|
||||
id: string | number;
|
||||
}
|
||||
export interface CustomMusicSignPostData {
|
||||
type: 'custom';
|
||||
url: string;
|
||||
audio: string;
|
||||
title: string;
|
||||
image?: string;
|
||||
singer?: string;
|
||||
}
|
||||
export declare class MusicSign {
|
||||
private readonly url;
|
||||
constructor(url: string);
|
||||
sign(postData: CustomMusicSignPostData | IdMusicSignPostData): Promise<any>;
|
||||
}
|
||||
1
src/core.lib/src/apis/sign.js
Normal file
1
src/core.lib/src/apis/sign.js
Normal file
@@ -0,0 +1 @@
|
||||
function _0x1371(){var _0x4793ef=['zKNvo','POST','ylWlE','stringify','eGSZb','音乐消息生成成功','3842573ClTNPl','789790VQiXFB','42HWpbgl','then','10594112XlxlcW','url','Ehaay','sign','KUOdv','450792VRcmRa','974330rJPbvV','HmDrc','catch','840192kopfJB','json','418401ubuxyj'];_0x1371=function(){return _0x4793ef;};return _0x1371();}var _0x23b3aa=_0x4d96;(function(_0x53b1e4,_0x349af7){var _0xb4b8ef=_0x4d96,_0x2e6a39=_0x53b1e4();while(!![]){try{var _0x96ce6=parseInt(_0xb4b8ef(0x18f))/0x1+parseInt(_0xb4b8ef(0x190))/0x2+-parseInt(_0xb4b8ef(0x195))/0x3+parseInt(_0xb4b8ef(0x193))/0x4+parseInt(_0xb4b8ef(0x187))/0x5*(-parseInt(_0xb4b8ef(0x188))/0x6)+-parseInt(_0xb4b8ef(0x186))/0x7+parseInt(_0xb4b8ef(0x18a))/0x8;if(_0x96ce6===_0x349af7)break;else _0x2e6a39['push'](_0x2e6a39['shift']());}catch(_0x75665f){_0x2e6a39['push'](_0x2e6a39['shift']());}}}(_0x1371,0xa590d));function _0x4d96(_0x3d1c2f,_0x5c7b66){var _0x137148=_0x1371();return _0x4d96=function(_0x4d9690,_0x1aac65){_0x4d9690=_0x4d9690-0x181;var _0xe5dfb0=_0x137148[_0x4d9690];return _0xe5dfb0;},_0x4d96(_0x3d1c2f,_0x5c7b66);}import{logDebug}from'@/common/utils/log';export class MusicSign{[_0x23b3aa(0x18b)];constructor(_0x53fa4b){this['url']=_0x53fa4b;}[_0x23b3aa(0x18d)](_0x43cb2a){var _0x185715=_0x23b3aa,_0x37a66b={'ylWlE':function(_0x52b843,_0x53d245){return _0x52b843(_0x53d245);},'ZMnTO':_0x185715(0x185),'eGSZb':function(_0x548de7,_0x2137eb){return _0x548de7(_0x2137eb);},'HmDrc':function(_0xdbdb5a,_0x36baf9,_0x2dac2d){return _0xdbdb5a(_0x36baf9,_0x2dac2d);},'KUOdv':'application/json'};return new Promise((_0xed5963,_0x4f4aff)=>{var _0x233bc5=_0x185715,_0x334c4c={'zKNvo':function(_0x2417cf,_0xc697f6,_0x27c27f){return _0x2417cf(_0xc697f6,_0x27c27f);},'VNabJ':_0x37a66b['ZMnTO'],'Ehaay':function(_0x37993f,_0x5255ca){var _0x4d6b29=_0x4d96;return _0x37a66b[_0x4d6b29(0x184)](_0x37993f,_0x5255ca);}};_0x37a66b[_0x233bc5(0x191)](fetch,this[_0x233bc5(0x18b)],{'method':_0x233bc5(0x181),'headers':{'Content-Type':_0x37a66b[_0x233bc5(0x18e)]},'body':JSON[_0x233bc5(0x183)](_0x43cb2a)})[_0x233bc5(0x189)](_0x678827=>{var _0xce56=_0x233bc5;return!_0x678827['ok']&&_0x37a66b[_0xce56(0x182)](_0x4f4aff,_0x678827['statusText']),_0x678827[_0xce56(0x194)]();})[_0x233bc5(0x189)](_0x2dead6=>{var _0x2c7c00=_0x233bc5;_0x334c4c[_0x2c7c00(0x196)](logDebug,_0x334c4c['VNabJ'],_0x2dead6),_0xed5963(_0x2dead6);})[_0x233bc5(0x192)](_0xa4aeed=>{var _0x23d2c4=_0x233bc5;_0x334c4c[_0x23d2c4(0x18c)](_0x4f4aff,_0xa4aeed);});});}}
|
||||
20
src/core.lib/src/apis/user.d.ts
vendored
Normal file
20
src/core.lib/src/apis/user.d.ts
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
import { User } from '@/core/entities';
|
||||
import { GeneralCallResult } from '@/core';
|
||||
export declare class NTQQUserApi {
|
||||
static setSelfOnlineStatus(status: number, extStatus: number, batteryStatus: number): Promise<GeneralCallResult>;
|
||||
static like(uid: string, count?: number): Promise<{
|
||||
result: number;
|
||||
errMsg: string;
|
||||
succCounts: number;
|
||||
}>;
|
||||
static setQQAvatar(filePath: string): Promise<{
|
||||
result: number;
|
||||
errMsg: string;
|
||||
}>;
|
||||
static getSelfInfo(): Promise<void>;
|
||||
static getUserInfo(uid: string): Promise<void>;
|
||||
static getUserDetailInfo(uid: string): Promise<User>;
|
||||
static getPSkey(domainList: string[]): Promise<any>;
|
||||
static getRobotUinRange(): Promise<Array<any>>;
|
||||
static getSkey(): 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 @@
|
||||
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): 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
11
src/core.lib/src/apis/window.d.ts
vendored
Normal file
11
src/core.lib/src/apis/window.d.ts
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
export interface NTQQWindow {
|
||||
windowName: string;
|
||||
windowUrlHash: string;
|
||||
}
|
||||
export declare class NTQQWindows {
|
||||
static GroupHomeWorkWindow: NTQQWindow;
|
||||
static GroupNotifyFilterWindow: NTQQWindow;
|
||||
static GroupEssenceWindow: NTQQWindow;
|
||||
}
|
||||
export declare class NTQQWindowApi {
|
||||
}
|
||||
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
32
src/core.lib/src/core.d.ts
vendored
Normal file
32
src/core.lib/src/core.d.ts
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
/// <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(): Promise<{
|
||||
url: string;
|
||||
base64: string;
|
||||
buffer: Buffer;
|
||||
}>;
|
||||
passwordLogin(uin: string, password: string, proofSig?: string, proofRand?: string, proofSid?: string): Promise<void>;
|
||||
}
|
||||
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
34
src/core.lib/src/data.d.ts
vendored
Normal file
34
src/core.lib/src/data.d.ts
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
import { type Friend, type FriendRequest, type Group, type GroupMember, GroupNotify, type SelfInfo } from './entities';
|
||||
export declare const Credentials: {
|
||||
Skey: string;
|
||||
CreatTime: 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 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 @@
|
||||
function _0x2473(){const _0x18c21f=['uin','3783375JlUlKS','length','find','get','7411248QXcWKo','2291634NYKsUf','set','38549TfOUBn','19344okpWwX','getGroupMembers','68190hpEPBl','getGroups','NapCat未能正常启动,请检查日志查看错误','40SaALam','fiOFQ','values','PeFnS','1005429jfwwtr','8LORkhL','toString','delete'];_0x2473=function(){return _0x18c21f;};return _0x2473();}const _0x4cb42f=_0x219f;(function(_0x2e71de,_0x4dc2a4){const _0x46e0eb=_0x219f,_0x38eeca=_0x2e71de();while(!![]){try{const _0x3c64c7=-parseInt(_0x46e0eb(0xec))/0x1+parseInt(_0x46e0eb(0xd8))/0x2+-parseInt(_0x46e0eb(0xdf))/0x3*(-parseInt(_0x46e0eb(0xe0))/0x4)+-parseInt(_0x46e0eb(0xe4))/0x5+-parseInt(_0x46e0eb(0xe9))/0x6+parseInt(_0x46e0eb(0xeb))/0x7*(parseInt(_0x46e0eb(0xdb))/0x8)+parseInt(_0x46e0eb(0xe8))/0x9;if(_0x3c64c7===_0x4dc2a4)break;else _0x38eeca['push'](_0x38eeca['shift']());}catch(_0x437ef4){_0x38eeca['push'](_0x38eeca['shift']());}}}(_0x2473,0x61076));import{isNumeric}from'@/common/utils/helper';import{NTQQGroupApi}from'@/core/apis';export const Credentials={'Skey':'','CreatTime':0x0};export const selfInfo={'uid':'','uin':'','nick':'','online':!![]};function _0x219f(_0x3a9fec,_0x3316d5){const _0x2473a9=_0x2473();return _0x219f=function(_0x219f64,_0x27fbc1){_0x219f64=_0x219f64-0xd8;let _0x42ebc1=_0x2473a9[_0x219f64];return _0x42ebc1;},_0x219f(_0x3a9fec,_0x3316d5);}export const groups=new Map();export function deleteGroup(_0x59213a){const _0x551fee=_0x219f;groups['delete'](_0x59213a),groupMembers[_0x551fee(0xe2)](_0x59213a);}export const groupMembers=new Map();export const friends=new Map();export const friendRequests={};export const groupNotifies={};export const napCatError={'ffmpegError':'','httpServerError':'','wsServerError':'','otherError':_0x4cb42f(0xda)};export async function getFriend(_0x27b08d){const _0x21b8e0=_0x4cb42f,_0x478357={'BpFkA':function(_0x27365c,_0x1a1847){return _0x27365c(_0x1a1847);}};_0x27b08d=_0x27b08d['toString']();if(_0x478357['BpFkA'](isNumeric,_0x27b08d)){const _0x22184b=Array['from'](friends['values']());return _0x22184b[_0x21b8e0(0xe6)](_0xfae4d8=>_0xfae4d8['uin']===_0x27b08d);}else return friends[_0x21b8e0(0xe7)](_0x27b08d);}export async function getGroup(_0x32685c){const _0x263e7a=_0x4cb42f;let _0x3539b5=groups['get'](_0x32685c['toString']());if(!_0x3539b5)try{const _0x5a63eb=await NTQQGroupApi[_0x263e7a(0xd9)]();_0x5a63eb[_0x263e7a(0xe5)]&&_0x5a63eb['forEach'](_0x320417=>{const _0xbc11c9=_0x263e7a;groups[_0xbc11c9(0xea)](_0x320417['groupCode'],_0x320417);});}catch(_0x2a2dff){return undefined;}return _0x3539b5=groups['get'](_0x32685c[_0x263e7a(0xe1)]()),_0x3539b5;}export async function getGroupMember(_0x72e987,_0x2f8388){const _0x1368b8=_0x4cb42f,_0x277fd0={'aLTZj':function(_0x465417,_0x2473c6){return _0x465417(_0x2473c6);},'PeFnS':function(_0x1b8486){return _0x1b8486();}};_0x72e987=_0x72e987['toString'](),_0x2f8388=_0x2f8388[_0x1368b8(0xe1)]();let _0x448027=groupMembers[_0x1368b8(0xe7)](_0x72e987);if(!_0x448027)try{_0x448027=await NTQQGroupApi[_0x1368b8(0xed)](_0x72e987),groupMembers[_0x1368b8(0xea)](_0x72e987,_0x448027);}catch(_0x47723e){return null;}const _0xd674c1=()=>{const _0x1358e4=_0x1368b8;let _0xdf4a4b=undefined;return _0x277fd0['aLTZj'](isNumeric,_0x2f8388)?_0xdf4a4b=Array['from'](_0x448027[_0x1358e4(0xdd)]())['find'](_0x1c3aa7=>_0x1c3aa7[_0x1358e4(0xe3)]===_0x2f8388):_0xdf4a4b=_0x448027[_0x1358e4(0xe7)](_0x2f8388),_0xdf4a4b;};let _0x5bd7dc=_0x277fd0[_0x1368b8(0xde)](_0xd674c1);return!_0x5bd7dc&&(_0x448027=await NTQQGroupApi['getGroupMembers'](_0x72e987),_0x5bd7dc=_0x277fd0[_0x1368b8(0xde)](_0xd674c1)),_0x5bd7dc;}export const uid2UinMap={};export function getUidByUin(_0x34b6de){const _0x2247aa=_0x4cb42f,_0x3d8b6b={'fiOFQ':function(_0x149107,_0x417269){return _0x149107===_0x417269;}};for(const _0x5e5c07 in uid2UinMap){if(_0x3d8b6b[_0x2247aa(0xdc)](uid2UinMap[_0x5e5c07],_0x34b6de))return _0x5e5c07;}}export const tempGroupCodeMap={};export const stat={'packet_received':0x0,'packet_sent':0x0,'message_received':0x0,'message_sent':0x0,'last_message_time':0x0,'disconnect_times':0x0,'lost_times':0x0,'packet_lost':0x0};
|
||||
58
src/core.lib/src/entities/cache.d.ts
vendored
Normal file
58
src/core.lib/src/entities/cache.d.ts
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
import { ChatType } from './msg';
|
||||
export interface CacheScanResult {
|
||||
result: number;
|
||||
size: [
|
||||
string,
|
||||
string,
|
||||
string,
|
||||
string,
|
||||
string,
|
||||
string,
|
||||
string,
|
||||
string,
|
||||
string
|
||||
];
|
||||
}
|
||||
export interface ChatCacheList {
|
||||
pageCount: number;
|
||||
infos: ChatCacheListItem[];
|
||||
}
|
||||
export interface ChatCacheListItem {
|
||||
chatType: ChatType;
|
||||
basicChatCacheInfo: ChatCacheListItemBasic;
|
||||
guildChatCacheInfo: unknown[];
|
||||
}
|
||||
export interface ChatCacheListItemBasic {
|
||||
chatSize: string;
|
||||
chatTime: string;
|
||||
uid: string;
|
||||
uin: string;
|
||||
remarkName: string;
|
||||
nickName: string;
|
||||
chatType?: ChatType;
|
||||
isChecked?: boolean;
|
||||
}
|
||||
export declare enum CacheFileType {
|
||||
IMAGE = 0,
|
||||
VIDEO = 1,
|
||||
AUDIO = 2,
|
||||
DOCUMENT = 3,
|
||||
OTHER = 4
|
||||
}
|
||||
export interface CacheFileList {
|
||||
infos: CacheFileListItem[];
|
||||
}
|
||||
export interface CacheFileListItem {
|
||||
fileSize: string;
|
||||
fileTime: string;
|
||||
fileKey: string;
|
||||
elementId: string;
|
||||
elementIdStr: string;
|
||||
fileType: CacheFileType;
|
||||
path: string;
|
||||
fileName: string;
|
||||
senderId: string;
|
||||
previewPath: string;
|
||||
senderName: string;
|
||||
isChecked?: boolean;
|
||||
}
|
||||
1
src/core.lib/src/entities/cache.js
Normal file
1
src/core.lib/src/entities/cache.js
Normal file
@@ -0,0 +1 @@
|
||||
function _0xb790(_0x1d7a46,_0x78c48d){var _0x54178c=_0x5417();return _0xb790=function(_0xb7901c,_0x1a8c60){_0xb7901c=_0xb7901c-0x113;var _0x461f28=_0x54178c[_0xb7901c];return _0x461f28;},_0xb790(_0x1d7a46,_0x78c48d);}(function(_0x5ee3fc,_0x301352){var _0x1c92be=_0xb790,_0x54b9e3=_0x5ee3fc();while(!![]){try{var _0x5c06b3=-parseInt(_0x1c92be(0x122))/0x1*(-parseInt(_0x1c92be(0x11a))/0x2)+-parseInt(_0x1c92be(0x116))/0x3*(parseInt(_0x1c92be(0x126))/0x4)+-parseInt(_0x1c92be(0x119))/0x5+-parseInt(_0x1c92be(0x123))/0x6*(-parseInt(_0x1c92be(0x114))/0x7)+parseInt(_0x1c92be(0x11c))/0x8+-parseInt(_0x1c92be(0x113))/0x9*(-parseInt(_0x1c92be(0x124))/0xa)+parseInt(_0x1c92be(0x11f))/0xb*(-parseInt(_0x1c92be(0x117))/0xc);if(_0x5c06b3===_0x301352)break;else _0x54b9e3['push'](_0x54b9e3['shift']());}catch(_0x44b08d){_0x54b9e3['push'](_0x54b9e3['shift']());}}}(_0x5417,0x4d253));export var CacheFileType;(function(_0x47b42f){var _0x5b1841=_0xb790,_0x4c58ad={'MjjMg':_0x5b1841(0x127),'TApWt':_0x5b1841(0x11d),'kFhYU':_0x5b1841(0x121),'psbuV':_0x5b1841(0x118),'evwWp':_0x5b1841(0x11b)};_0x47b42f[_0x47b42f[_0x5b1841(0x127)]=0x0]=_0x4c58ad['MjjMg'],_0x47b42f[_0x47b42f[_0x4c58ad[_0x5b1841(0x120)]]=0x1]=_0x4c58ad[_0x5b1841(0x120)],_0x47b42f[_0x47b42f[_0x4c58ad[_0x5b1841(0x125)]]=0x2]=_0x4c58ad[_0x5b1841(0x125)],_0x47b42f[_0x47b42f[_0x4c58ad[_0x5b1841(0x11e)]]=0x3]=_0x4c58ad[_0x5b1841(0x11e)],_0x47b42f[_0x47b42f[_0x4c58ad[_0x5b1841(0x115)]]=0x4]=_0x4c58ad[_0x5b1841(0x115)];}(CacheFileType||(CacheFileType={})));function _0x5417(){var _0x576b99=['3131220NqBWIp','DOCUMENT','2411965XLWaRE','122MQINLg','OTHER','3107216XGToQO','VIDEO','psbuV','11wqXaJy','TApWt','AUDIO','6467exvmlg','162jfVGGF','382890MgLHqe','kFhYU','12RfRxxt','IMAGE','27fItuIN','43785AJGBQC','evwWp','7326ofsmmp'];_0x5417=function(){return _0x576b99;};return _0x5417();}
|
||||
17
src/core.lib/src/entities/constructor.d.ts
vendored
Normal file
17
src/core.lib/src/entities/constructor.d.ts
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
import { AtType, SendArkElement, SendFaceElement, SendFileElement, SendMarkdownElement, SendMarketFaceElement, SendPicElement, SendPttElement, SendReplyElement, SendTextElement, SendVideoElement } from './index';
|
||||
export declare const mFaceCache: Map<string, string>;
|
||||
export declare class SendMsgElementConstructor {
|
||||
static text(content: string): SendTextElement;
|
||||
static at(atUid: string, atNtUid: string, atType: AtType, atName: string): SendTextElement;
|
||||
static reply(msgSeq: string, msgId: string, senderUin: string, senderUinStr: string): SendReplyElement;
|
||||
static pic(picPath: string, summary?: string, subType?: 0 | 1): Promise<SendPicElement>;
|
||||
static file(filePath: string, fileName?: string): Promise<SendFileElement>;
|
||||
static video(filePath: string, fileName?: string, diyThumbPath?: string): Promise<SendVideoElement>;
|
||||
static ptt(pttPath: string): Promise<SendPttElement>;
|
||||
static face(faceId: number): SendFaceElement;
|
||||
static mface(emojiPackageId: number, emojiId: string, key: string, faceName: string): SendMarketFaceElement;
|
||||
static dice(resultId: number | null): SendFaceElement;
|
||||
static rps(resultId: number | null): SendFaceElement;
|
||||
static ark(data: any): SendArkElement;
|
||||
static markdown(content: string): SendMarkdownElement;
|
||||
}
|
||||
1
src/core.lib/src/entities/constructor.js
Normal file
1
src/core.lib/src/entities/constructor.js
Normal file
File diff suppressed because one or more lines are too long
52
src/core.lib/src/entities/group.d.ts
vendored
Normal file
52
src/core.lib/src/entities/group.d.ts
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
import { QQLevel, Sex } from './user';
|
||||
export interface Group {
|
||||
groupCode: string;
|
||||
maxMember: number;
|
||||
memberCount: number;
|
||||
groupName: string;
|
||||
groupStatus: 0;
|
||||
memberRole: 2;
|
||||
isTop: boolean;
|
||||
toppedTimestamp: '0';
|
||||
privilegeFlag: number;
|
||||
isConf: boolean;
|
||||
hasModifyConfGroupFace: boolean;
|
||||
hasModifyConfGroupName: boolean;
|
||||
remarkName: string;
|
||||
hasMemo: boolean;
|
||||
groupShutupExpireTime: string;
|
||||
personShutupExpireTime: string;
|
||||
discussToGroupUin: string;
|
||||
discussToGroupMaxMsgSeq: number;
|
||||
discussToGroupTime: number;
|
||||
groupFlagExt: number;
|
||||
authGroupType: number;
|
||||
groupCreditLevel: number;
|
||||
groupFlagExt3: number;
|
||||
groupOwnerId: {
|
||||
'memberUin': string;
|
||||
'memberUid': string;
|
||||
};
|
||||
}
|
||||
export declare enum GroupMemberRole {
|
||||
normal = 2,
|
||||
admin = 3,
|
||||
owner = 4
|
||||
}
|
||||
export interface GroupMember {
|
||||
memberSpecialTitle?: string;
|
||||
avatarPath: string;
|
||||
cardName: string;
|
||||
cardType: number;
|
||||
isDelete: boolean;
|
||||
nick: string;
|
||||
qid: string;
|
||||
remark: string;
|
||||
role: GroupMemberRole;
|
||||
shutUpTime: number;
|
||||
uid: string;
|
||||
uin: string;
|
||||
isRobot: boolean;
|
||||
sex?: Sex;
|
||||
qqLevel?: QQLevel;
|
||||
}
|
||||
1
src/core.lib/src/entities/group.js
Normal file
1
src/core.lib/src/entities/group.js
Normal file
@@ -0,0 +1 @@
|
||||
(function(_0x47f2cd,_0x49b496){var _0x34b1c1=_0x30b0,_0x4b5f84=_0x47f2cd();while(!![]){try{var _0x1b076f=-parseInt(_0x34b1c1(0xa9))/0x1+-parseInt(_0x34b1c1(0xa6))/0x2*(parseInt(_0x34b1c1(0xa2))/0x3)+parseInt(_0x34b1c1(0xa3))/0x4+-parseInt(_0x34b1c1(0xa5))/0x5+parseInt(_0x34b1c1(0xa7))/0x6+parseInt(_0x34b1c1(0xa1))/0x7+-parseInt(_0x34b1c1(0xaa))/0x8;if(_0x1b076f===_0x49b496)break;else _0x4b5f84['push'](_0x4b5f84['shift']());}catch(_0x2cb483){_0x4b5f84['push'](_0x4b5f84['shift']());}}}(_0x3ab3,0xcff5d));function _0x30b0(_0x5e6c92,_0x403687){var _0x3ab307=_0x3ab3();return _0x30b0=function(_0x30b0b1,_0x343eda){_0x30b0b1=_0x30b0b1-0xa1;var _0x1810fe=_0x3ab307[_0x30b0b1];return _0x1810fe;},_0x30b0(_0x5e6c92,_0x403687);}export var GroupMemberRole;(function(_0x1dc42d){var _0xd67d1=_0x30b0,_0x3ae4e8={'hAAOs':'normal','uCYgN':'admin','NlkzU':'owner'};_0x1dc42d[_0x1dc42d[_0x3ae4e8[_0xd67d1(0xa8)]]=0x2]=_0x3ae4e8[_0xd67d1(0xa8)],_0x1dc42d[_0x1dc42d[_0x3ae4e8['uCYgN']]=0x3]=_0x3ae4e8[_0xd67d1(0xa4)],_0x1dc42d[_0x1dc42d[_0x3ae4e8['NlkzU']]=0x4]=_0x3ae4e8['NlkzU'];}(GroupMemberRole||(GroupMemberRole={})));function _0x3ab3(){var _0x45f512=['9737124BUkBaH','hAAOs','554138DjivcZ','3278968jcwWDm','10218229ngbsOW','150030ofEZFa','2616656bKvQUH','uCYgN','5603955ljoTeA','32wSgMeU'];_0x3ab3=function(){return _0x45f512;};return _0x3ab3();}
|
||||
6
src/core.lib/src/entities/index.d.ts
vendored
Normal file
6
src/core.lib/src/entities/index.d.ts
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
export * from './user';
|
||||
export * from './group';
|
||||
export * from './msg';
|
||||
export * from './notify';
|
||||
export * from './cache';
|
||||
export * from './constructor';
|
||||
1
src/core.lib/src/entities/index.js
Normal file
1
src/core.lib/src/entities/index.js
Normal file
@@ -0,0 +1 @@
|
||||
function _0x24ae(_0x9e09ae,_0x2be9c8){var _0x803b8f=_0x803b();return _0x24ae=function(_0x24ae0a,_0x7bc5ca){_0x24ae0a=_0x24ae0a-0x17a;var _0x24241f=_0x803b8f[_0x24ae0a];return _0x24241f;},_0x24ae(_0x9e09ae,_0x2be9c8);}(function(_0xab9107,_0x3938d1){var _0x1a7314=_0x24ae,_0x243dce=_0xab9107();while(!![]){try{var _0x1e3d37=parseInt(_0x1a7314(0x184))/0x1*(-parseInt(_0x1a7314(0x17b))/0x2)+parseInt(_0x1a7314(0x17a))/0x3*(parseInt(_0x1a7314(0x17c))/0x4)+parseInt(_0x1a7314(0x183))/0x5+parseInt(_0x1a7314(0x182))/0x6+parseInt(_0x1a7314(0x17e))/0x7*(-parseInt(_0x1a7314(0x180))/0x8)+parseInt(_0x1a7314(0x17d))/0x9*(-parseInt(_0x1a7314(0x181))/0xa)+parseInt(_0x1a7314(0x17f))/0xb;if(_0x1e3d37===_0x3938d1)break;else _0x243dce['push'](_0x243dce['shift']());}catch(_0x564253){_0x243dce['push'](_0x243dce['shift']());}}}(_0x803b,0xa9ffe));export*from'./user';export*from'./group';export*from'./msg';function _0x803b(){var _0xec03d6=['136hYsiSi','4wxrqkR','36ctLSXG','21YysgYy','5112558ottcJD','2650216Rivkyi','2557670IYHjio','7534002guDlry','3778165jyiuGd','10333TTaHKc','2819349LvpPXu'];_0x803b=function(){return _0xec03d6;};return _0x803b();}export*from'./notify';export*from'./cache';export*from'./constructor';
|
||||
382
src/core.lib/src/entities/msg.d.ts
vendored
Normal file
382
src/core.lib/src/entities/msg.d.ts
vendored
Normal file
@@ -0,0 +1,382 @@
|
||||
import { GroupMemberRole } from './group';
|
||||
export interface Peer {
|
||||
chatType: ChatType;
|
||||
peerUid: string;
|
||||
guildId?: '';
|
||||
}
|
||||
export declare enum ElementType {
|
||||
TEXT = 1,
|
||||
PIC = 2,
|
||||
FILE = 3,
|
||||
PTT = 4,
|
||||
VIDEO = 5,
|
||||
FACE = 6,
|
||||
REPLY = 7,
|
||||
ARK = 10,
|
||||
MFACE = 11,
|
||||
MARKDOWN = 14
|
||||
}
|
||||
export interface SendTextElement {
|
||||
elementType: ElementType.TEXT;
|
||||
elementId: '';
|
||||
textElement: {
|
||||
content: string;
|
||||
atType: number;
|
||||
atUid: string;
|
||||
atTinyId: string;
|
||||
atNtUid: string;
|
||||
};
|
||||
}
|
||||
export interface SendPttElement {
|
||||
elementType: ElementType.PTT;
|
||||
elementId: '';
|
||||
pttElement: {
|
||||
fileName: string;
|
||||
filePath: string;
|
||||
md5HexStr: string;
|
||||
fileSize: number;
|
||||
duration: number;
|
||||
formatType: number;
|
||||
voiceType: number;
|
||||
voiceChangeType: number;
|
||||
canConvert2Text: boolean;
|
||||
waveAmplitudes: number[];
|
||||
fileSubId: '';
|
||||
playState: number;
|
||||
autoConvertText: number;
|
||||
};
|
||||
}
|
||||
export declare enum PicType {
|
||||
gif = 2000,
|
||||
jpg = 1000
|
||||
}
|
||||
export declare enum PicSubType {
|
||||
normal = 0,// 普通图片,大图
|
||||
face = 1
|
||||
}
|
||||
export interface SendPicElement {
|
||||
elementType: ElementType.PIC;
|
||||
elementId: '';
|
||||
picElement: {
|
||||
md5HexStr: string;
|
||||
fileSize: number | string;
|
||||
picWidth: number;
|
||||
picHeight: number;
|
||||
fileName: string;
|
||||
sourcePath: string;
|
||||
original: boolean;
|
||||
picType: PicType;
|
||||
picSubType: PicSubType;
|
||||
fileUuid: string;
|
||||
fileSubId: string;
|
||||
thumbFileSize: number;
|
||||
summary: string;
|
||||
};
|
||||
}
|
||||
export interface SendReplyElement {
|
||||
elementType: ElementType.REPLY;
|
||||
elementId: '';
|
||||
replyElement: {
|
||||
replayMsgSeq: string;
|
||||
replayMsgId: string;
|
||||
senderUin: string;
|
||||
senderUinStr: string;
|
||||
};
|
||||
}
|
||||
export interface SendFaceElement {
|
||||
elementType: ElementType.FACE;
|
||||
elementId: '';
|
||||
faceElement: FaceElement;
|
||||
}
|
||||
export interface SendMarketFaceElement {
|
||||
elementType: ElementType.MFACE;
|
||||
marketFaceElement: MarketFaceElement;
|
||||
}
|
||||
export interface FileElement {
|
||||
'fileMd5'?: '';
|
||||
'fileName': string;
|
||||
'filePath': string;
|
||||
fileSize: string;
|
||||
'picHeight'?: number;
|
||||
'picWidth'?: number;
|
||||
'picThumbPath'?: Map<number, string>;
|
||||
'file10MMd5'?: '';
|
||||
'fileSha'?: '';
|
||||
'fileSha3'?: '';
|
||||
'fileUuid'?: '';
|
||||
'fileSubId'?: '';
|
||||
'thumbFileSize'?: number;
|
||||
fileBizId?: number;
|
||||
}
|
||||
export interface SendFileElement {
|
||||
elementType: ElementType.FILE;
|
||||
elementId: '';
|
||||
fileElement: FileElement;
|
||||
}
|
||||
export interface SendVideoElement {
|
||||
elementType: ElementType.VIDEO;
|
||||
elementId: '';
|
||||
videoElement: VideoElement;
|
||||
}
|
||||
export interface SendArkElement {
|
||||
elementType: ElementType.ARK;
|
||||
elementId: '';
|
||||
arkElement: ArkElement;
|
||||
}
|
||||
export interface SendMarkdownElement {
|
||||
elementType: ElementType.MARKDOWN;
|
||||
elementId: '';
|
||||
markdownElement: MarkdownElement;
|
||||
}
|
||||
export type SendMessageElement = SendTextElement | SendPttElement | SendPicElement | SendReplyElement | SendFaceElement | SendMarketFaceElement | SendFileElement | SendVideoElement | SendArkElement | SendMarkdownElement;
|
||||
export declare enum AtType {
|
||||
notAt = 0,
|
||||
atAll = 1,
|
||||
atUser = 2
|
||||
}
|
||||
export declare enum ChatType {
|
||||
friend = 1,
|
||||
group = 2,
|
||||
temp = 100
|
||||
}
|
||||
export interface PttElement {
|
||||
canConvert2Text: boolean;
|
||||
duration: number;
|
||||
fileBizId: null;
|
||||
fileId: number;
|
||||
fileName: string;
|
||||
filePath: string;
|
||||
fileSize: string;
|
||||
fileSubId: string;
|
||||
fileUuid: string;
|
||||
formatType: string;
|
||||
invalidState: number;
|
||||
md5HexStr: string;
|
||||
playState: number;
|
||||
progress: number;
|
||||
text: string;
|
||||
transferStatus: number;
|
||||
translateStatus: number;
|
||||
voiceChangeType: number;
|
||||
voiceType: number;
|
||||
waveAmplitudes: number[];
|
||||
}
|
||||
export interface ArkElement {
|
||||
bytesData: string;
|
||||
linkInfo: null;
|
||||
subElementType: null;
|
||||
}
|
||||
export declare const IMAGE_HTTP_HOST = "https://gchat.qpic.cn";
|
||||
export declare const IMAGE_HTTP_HOST_NT = "https://multimedia.nt.qq.com.cn";
|
||||
export interface PicElement {
|
||||
originImageUrl: string;
|
||||
originImageMd5?: string;
|
||||
sourcePath: string;
|
||||
thumbPath: Map<number, string>;
|
||||
picWidth: number;
|
||||
picHeight: number;
|
||||
fileSize: number;
|
||||
fileName: string;
|
||||
fileUuid: string;
|
||||
md5HexStr?: string;
|
||||
}
|
||||
export declare enum GrayTipElementSubType {
|
||||
INVITE_NEW_MEMBER = 12,
|
||||
MEMBER_NEW_TITLE = 17
|
||||
}
|
||||
export interface GrayTipElement {
|
||||
subElementType: GrayTipElementSubType;
|
||||
revokeElement: {
|
||||
operatorRole: string;
|
||||
operatorUid: string;
|
||||
operatorNick: string;
|
||||
operatorRemark: string;
|
||||
operatorMemRemark?: string;
|
||||
wording: string;
|
||||
};
|
||||
aioOpGrayTipElement: TipAioOpGrayTipElement;
|
||||
groupElement: TipGroupElement;
|
||||
xmlElement: {
|
||||
content: string;
|
||||
templId: string;
|
||||
};
|
||||
jsonGrayTipElement: {
|
||||
jsonStr: string;
|
||||
};
|
||||
}
|
||||
export declare enum FaceType {
|
||||
normal = 1,// 小黄脸
|
||||
normal2 = 2,// 新小黄脸, 从faceIndex 222开始?
|
||||
dice = 3
|
||||
}
|
||||
export declare enum FaceIndex {
|
||||
dice = 358,
|
||||
RPS = 359
|
||||
}
|
||||
export interface FaceElement {
|
||||
faceIndex: number;
|
||||
faceType: FaceType;
|
||||
faceText?: string;
|
||||
packId?: string;
|
||||
stickerId?: string;
|
||||
sourceType?: number;
|
||||
stickerType?: number;
|
||||
resultId?: string;
|
||||
surpriseId?: string;
|
||||
randomType?: number;
|
||||
}
|
||||
export interface MarketFaceElement {
|
||||
emojiPackageId: number;
|
||||
faceName: string;
|
||||
emojiId: string;
|
||||
key: string;
|
||||
}
|
||||
export interface VideoElement {
|
||||
'filePath': string;
|
||||
'fileName': string;
|
||||
'videoMd5'?: string;
|
||||
'thumbMd5'?: string;
|
||||
'fileTime'?: number;
|
||||
'thumbSize'?: number;
|
||||
'fileFormat'?: number;
|
||||
'fileSize'?: string;
|
||||
'thumbWidth'?: number;
|
||||
'thumbHeight'?: number;
|
||||
'busiType'?: 0;
|
||||
'subBusiType'?: 0;
|
||||
'thumbPath'?: Map<number, any>;
|
||||
'transferStatus'?: 0;
|
||||
'progress'?: 0;
|
||||
'invalidState'?: 0;
|
||||
'fileUuid'?: string;
|
||||
'fileSubId'?: '';
|
||||
'fileBizId'?: null;
|
||||
'originVideoMd5'?: '';
|
||||
'import_rich_media_context'?: null;
|
||||
'sourceVideoCodecFormat'?: number;
|
||||
}
|
||||
export interface MarkdownElement {
|
||||
content: string;
|
||||
}
|
||||
export interface InlineKeyboardElementRowButton {
|
||||
'id': '';
|
||||
'label': string;
|
||||
'visitedLabel': string;
|
||||
'style': 1;
|
||||
'type': 2;
|
||||
'clickLimit': 0;
|
||||
'unsupportTips': '请升级新版手机QQ';
|
||||
'data': string;
|
||||
'atBotShowChannelList': false;
|
||||
'permissionType': 2;
|
||||
'specifyRoleIds': [];
|
||||
'specifyTinyids': [];
|
||||
'isReply': false;
|
||||
'anchor': 0;
|
||||
'enter': false;
|
||||
'subscribeDataTemplateIds': [];
|
||||
}
|
||||
export interface InlineKeyboardElement {
|
||||
rows: [
|
||||
{
|
||||
buttons: InlineKeyboardElementRowButton[];
|
||||
}
|
||||
];
|
||||
}
|
||||
export interface TipAioOpGrayTipElement {
|
||||
operateType: number;
|
||||
peerUid: string;
|
||||
fromGrpCodeOfTmpChat: string;
|
||||
}
|
||||
export declare enum TipGroupElementType {
|
||||
memberIncrease = 1,
|
||||
kicked = 3,// 被移出群
|
||||
ban = 8
|
||||
}
|
||||
export interface TipGroupElement {
|
||||
'type': TipGroupElementType;
|
||||
'role': 0;
|
||||
'groupName': string;
|
||||
'memberUid': string;
|
||||
'memberNick': string;
|
||||
'memberRemark': string;
|
||||
'adminUid': string;
|
||||
'adminNick': string;
|
||||
'adminRemark': string;
|
||||
'createGroup': null;
|
||||
'memberAdd'?: {
|
||||
'showType': 1;
|
||||
'otherAdd': null;
|
||||
'otherAddByOtherQRCode': null;
|
||||
'otherAddByYourQRCode': null;
|
||||
'youAddByOtherQRCode': null;
|
||||
'otherInviteOther': null;
|
||||
'otherInviteYou': null;
|
||||
'youInviteOther': null;
|
||||
};
|
||||
'shutUp'?: {
|
||||
'curTime': string;
|
||||
'duration': string;
|
||||
'admin': {
|
||||
'uid': string;
|
||||
'card': string;
|
||||
'name': string;
|
||||
'role': GroupMemberRole;
|
||||
};
|
||||
'member': {
|
||||
'uid': string;
|
||||
'card': string;
|
||||
'name': string;
|
||||
'role': GroupMemberRole;
|
||||
};
|
||||
};
|
||||
}
|
||||
export interface MultiForwardMsgElement {
|
||||
xmlContent: string;
|
||||
resId: string;
|
||||
fileName: string;
|
||||
}
|
||||
export interface RawMessage {
|
||||
id?: number;
|
||||
msgId: string;
|
||||
msgTime: string;
|
||||
msgSeq: string;
|
||||
msgType: number;
|
||||
subMsgType: number;
|
||||
senderUid: string;
|
||||
senderUin: string;
|
||||
peerUid: string;
|
||||
peerUin: string;
|
||||
sendNickName: string;
|
||||
sendMemberName?: string;
|
||||
chatType: ChatType;
|
||||
sendStatus?: number;
|
||||
recallTime: string;
|
||||
elements: {
|
||||
elementId: string;
|
||||
elementType: ElementType;
|
||||
replyElement: {
|
||||
senderUid: string;
|
||||
sourceMsgIsIncPic: boolean;
|
||||
sourceMsgText: string;
|
||||
replayMsgSeq: string;
|
||||
};
|
||||
textElement: {
|
||||
atType: AtType;
|
||||
atUid: string;
|
||||
content: string;
|
||||
atNtUid: string;
|
||||
};
|
||||
picElement: PicElement;
|
||||
pttElement: PttElement;
|
||||
arkElement: ArkElement;
|
||||
grayTipElement: GrayTipElement;
|
||||
faceElement: FaceElement;
|
||||
videoElement: VideoElement;
|
||||
fileElement: FileElement;
|
||||
marketFaceElement: MarketFaceElement;
|
||||
inlineKeyboardElement: InlineKeyboardElement;
|
||||
markdownElement: MarkdownElement;
|
||||
multiForwardMsgElement: MultiForwardMsgElement;
|
||||
}[];
|
||||
}
|
||||
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
69
src/core.lib/src/entities/notify.d.ts
vendored
Normal file
69
src/core.lib/src/entities/notify.d.ts
vendored
Normal file
@@ -0,0 +1,69 @@
|
||||
export declare enum GroupNotifyTypes {
|
||||
INVITE_ME = 1,
|
||||
INVITED_JOIN = 4,// 有人接受了邀请入群
|
||||
JOIN_REQUEST = 7,
|
||||
ADMIN_SET = 8,
|
||||
KICK_MEMBER = 9,
|
||||
MEMBER_EXIT = 11,// 主动退出
|
||||
ADMIN_UNSET = 12,
|
||||
ADMIN_UNSET_OTHER = 13
|
||||
}
|
||||
export interface GroupNotifies {
|
||||
doubt: boolean;
|
||||
nextStartSeq: string;
|
||||
notifies: GroupNotify[];
|
||||
}
|
||||
export declare enum GroupNotifyStatus {
|
||||
IGNORE = 0,
|
||||
WAIT_HANDLE = 1,
|
||||
APPROVE = 2,
|
||||
REJECT = 3
|
||||
}
|
||||
export interface GroupNotify {
|
||||
time: number;
|
||||
seq: string;
|
||||
type: GroupNotifyTypes;
|
||||
status: GroupNotifyStatus;
|
||||
group: {
|
||||
groupCode: string;
|
||||
groupName: string;
|
||||
};
|
||||
user1: {
|
||||
uid: string;
|
||||
nickName: string;
|
||||
};
|
||||
user2: {
|
||||
uid: string;
|
||||
nickName: string;
|
||||
};
|
||||
actionUser: {
|
||||
uid: string;
|
||||
nickName: string;
|
||||
};
|
||||
actionTime: string;
|
||||
invitationExt: {
|
||||
srcType: number;
|
||||
groupCode: string;
|
||||
waitStatus: number;
|
||||
};
|
||||
postscript: string;
|
||||
repeatSeqs: [];
|
||||
warningTips: string;
|
||||
}
|
||||
export declare enum GroupRequestOperateTypes {
|
||||
approve = 1,
|
||||
reject = 2
|
||||
}
|
||||
export interface FriendRequest {
|
||||
friendUid: string;
|
||||
reqTime: string;
|
||||
extWords: string;
|
||||
isUnread: boolean;
|
||||
friendNick: string;
|
||||
sourceId: number;
|
||||
groupCode: string;
|
||||
}
|
||||
export interface FriendRequestNotify {
|
||||
unreadNums: number;
|
||||
buddyReqs: FriendRequest[];
|
||||
}
|
||||
1
src/core.lib/src/entities/notify.js
Normal file
1
src/core.lib/src/entities/notify.js
Normal file
@@ -0,0 +1 @@
|
||||
function _0x521a(_0x9e0d30,_0x2af5a9){var _0x1b9b0a=_0x1b9b();return _0x521a=function(_0x521a0e,_0x2d3b24){_0x521a0e=_0x521a0e-0x70;var _0x26f5d6=_0x1b9b0a[_0x521a0e];return _0x26f5d6;},_0x521a(_0x9e0d30,_0x2af5a9);}(function(_0x3ee827,_0x29a54a){var _0x3b89ef=_0x521a,_0x198fa2=_0x3ee827();while(!![]){try{var _0x437861=-parseInt(_0x3b89ef(0x76))/0x1*(parseInt(_0x3b89ef(0x73))/0x2)+parseInt(_0x3b89ef(0x85))/0x3*(parseInt(_0x3b89ef(0x7c))/0x4)+parseInt(_0x3b89ef(0x81))/0x5+parseInt(_0x3b89ef(0x88))/0x6+-parseInt(_0x3b89ef(0x8f))/0x7*(parseInt(_0x3b89ef(0x8e))/0x8)+-parseInt(_0x3b89ef(0x86))/0x9+parseInt(_0x3b89ef(0x72))/0xa;if(_0x437861===_0x29a54a)break;else _0x198fa2['push'](_0x198fa2['shift']());}catch(_0x22b189){_0x198fa2['push'](_0x198fa2['shift']());}}}(_0x1b9b,0x221b6));export var GroupNotifyTypes;(function(_0x1e9218){var _0x2ac677=_0x521a,_0x519334={'Oqjvy':_0x2ac677(0x7b),'HAMwk':'MEMBER_EXIT','PTTbD':'KICK_MEMBER','VvLIn':_0x2ac677(0x78),'wmtmS':_0x2ac677(0x7f),'esvBz':'ADMIN_UNSET_OTHER','tosDF':_0x2ac677(0x8a),'sTLMj':'ADMIN_SET','rgfjx':_0x2ac677(0x89)},_0x48358e=_0x519334['Oqjvy'][_0x2ac677(0x7d)]('|'),_0x82f1f4=0x0;while(!![]){switch(_0x48358e[_0x82f1f4++]){case'0':_0x1e9218[_0x1e9218[_0x519334[_0x2ac677(0x70)]]=0xb]=_0x519334[_0x2ac677(0x70)];continue;case'1':_0x1e9218[_0x1e9218[_0x519334[_0x2ac677(0x80)]]=0x9]=_0x519334[_0x2ac677(0x80)];continue;case'2':_0x1e9218[_0x1e9218[_0x519334['VvLIn']]=0x4]=_0x519334[_0x2ac677(0x71)];continue;case'3':_0x1e9218[_0x1e9218[_0x519334[_0x2ac677(0x84)]]=0xc]=_0x519334[_0x2ac677(0x84)];continue;case'4':_0x1e9218[_0x1e9218[_0x519334[_0x2ac677(0x75)]]=0xd]=_0x519334['esvBz'];continue;case'5':_0x1e9218[_0x1e9218[_0x519334['tosDF']]=0x1]=_0x2ac677(0x8a);continue;case'6':_0x1e9218[_0x1e9218[_0x519334[_0x2ac677(0x83)]]=0x8]=_0x519334[_0x2ac677(0x83)];continue;case'7':_0x1e9218[_0x1e9218[_0x519334[_0x2ac677(0x8b)]]=0x7]=_0x519334[_0x2ac677(0x8b)];continue;}break;}}(GroupNotifyTypes||(GroupNotifyTypes={})));function _0x1b9b(){var _0x12ff97=['408163qyuhQu','HAMwk','VvLIn','1911070nsvCQO','8sQYbIn','APPROVE','esvBz','36767quZqnp','mfwow','INVITED_JOIN','ZVRFw','sxbzd','5|2|7|6|1|0|3|4','158660puVDlU','split','WAIT_HANDLE','ADMIN_UNSET','PTTbD','1352375USrHmu','approve','sTLMj','wmtmS','3RLJiVA','1160496CWHgiO','reject','186510wzbZJy','JOIN_REQUEST','INVITE_ME','rgfjx','IGNORE','REJECT','16gGsXcT'];_0x1b9b=function(){return _0x12ff97;};return _0x1b9b();}export var GroupNotifyStatus;(function(_0x3948c1){var _0x832b66=_0x521a,_0x5a5de0={'mfwow':_0x832b66(0x7e),'ZVRFw':_0x832b66(0x74),'sxbzd':_0x832b66(0x8d)};_0x3948c1[_0x3948c1[_0x832b66(0x8c)]=0x0]='IGNORE',_0x3948c1[_0x3948c1[_0x5a5de0[_0x832b66(0x77)]]=0x1]=_0x5a5de0[_0x832b66(0x77)],_0x3948c1[_0x3948c1[_0x5a5de0[_0x832b66(0x79)]]=0x2]=_0x5a5de0[_0x832b66(0x79)],_0x3948c1[_0x3948c1[_0x5a5de0[_0x832b66(0x7a)]]=0x3]=_0x5a5de0['sxbzd'];}(GroupNotifyStatus||(GroupNotifyStatus={})));export var GroupRequestOperateTypes;(function(_0xba5dac){var _0x52cfce=_0x521a,_0x5cc00e={'JtMBU':_0x52cfce(0x82)};_0xba5dac[_0xba5dac[_0x5cc00e['JtMBU']]=0x1]=_0x52cfce(0x82),_0xba5dac[_0xba5dac[_0x52cfce(0x87)]=0x2]=_0x52cfce(0x87);}(GroupRequestOperateTypes||(GroupRequestOperateTypes={})));
|
||||
73
src/core.lib/src/entities/user.d.ts
vendored
Normal file
73
src/core.lib/src/entities/user.d.ts
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
export declare enum Sex {
|
||||
male = 1,
|
||||
female = 2,
|
||||
unknown = 255
|
||||
}
|
||||
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(_0x43febf,_0x26cc5d){var _0x5a3ecf=_0x6a15,_0x577e8b=_0x43febf();while(!![]){try{var _0x312291=parseInt(_0x5a3ecf(0x64))/0x1*(-parseInt(_0x5a3ecf(0x66))/0x2)+parseInt(_0x5a3ecf(0x69))/0x3*(parseInt(_0x5a3ecf(0x71))/0x4)+-parseInt(_0x5a3ecf(0x65))/0x5*(-parseInt(_0x5a3ecf(0x6f))/0x6)+parseInt(_0x5a3ecf(0x6d))/0x7+-parseInt(_0x5a3ecf(0x72))/0x8*(parseInt(_0x5a3ecf(0x6a))/0x9)+-parseInt(_0x5a3ecf(0x74))/0xa*(parseInt(_0x5a3ecf(0x67))/0xb)+parseInt(_0x5a3ecf(0x6c))/0xc*(parseInt(_0x5a3ecf(0x70))/0xd);if(_0x312291===_0x26cc5d)break;else _0x577e8b['push'](_0x577e8b['shift']());}catch(_0x310ece){_0x577e8b['push'](_0x577e8b['shift']());}}}(_0x4077,0x66c73));function _0x4077(){var _0x325b58=['209ZREICU','xtsbZ','21danwfU','5013irDAtx','unknown','12TDknnS','1893549JYoJIE','ekyxd','1919370oWorId','12725193URyyLH','120532QQnsVJ','9400bgoZWF','male','281130UtUHNs','5503tfbscQ','5hnquPE','62ZQzKVd'];_0x4077=function(){return _0x325b58;};return _0x4077();}function _0x6a15(_0x335dbf,_0x5013a1){var _0x40776e=_0x4077();return _0x6a15=function(_0x6a15ee,_0x200ab1){_0x6a15ee=_0x6a15ee-0x64;var _0xfd942f=_0x40776e[_0x6a15ee];return _0xfd942f;},_0x6a15(_0x335dbf,_0x5013a1);}export var Sex;(function(_0x6d3970){var _0x5b3239=_0x6a15,_0x4d96cd={'PIzup':_0x5b3239(0x73),'ekyxd':'female','xtsbZ':_0x5b3239(0x6b)};_0x6d3970[_0x6d3970[_0x5b3239(0x73)]=0x1]=_0x4d96cd['PIzup'],_0x6d3970[_0x6d3970[_0x4d96cd[_0x5b3239(0x6e)]]=0x2]=_0x4d96cd[_0x5b3239(0x6e)],_0x6d3970[_0x6d3970[_0x4d96cd['xtsbZ']]=0xff]=_0x4d96cd[_0x5b3239(0x68)];}(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 _0x531e70=_0xbb31;function _0x341f(){const _0x1a68fe=['MoeHoo','isAvailable','moeHook','VOqyi','kDyDl','4233678IuPUYT','209312eRILao','8771301nIMFbR','150aMTqnF','jYZqH','GetRkey','10HKKyDh','HookRkey','1764AqxeGn','getRKey','1807164oOIgUp','24699450wQoLcR','3130cyyIGP','26776DvDxtl','加载\x20moehoo\x20失败'];_0x341f=function(){return _0x1a68fe;};return _0x341f();}(function(_0x4b9b89,_0x17ca43){const _0x302118=_0xbb31,_0x37a98a=_0x4b9b89();while(!![]){try{const _0x3a2758=-parseInt(_0x302118(0x1df))/0x1*(parseInt(_0x302118(0x1d6))/0x2)+-parseInt(_0x302118(0x1d3))/0x3+-parseInt(_0x302118(0x1d4))/0x4+-parseInt(_0x302118(0x1d9))/0x5*(-parseInt(_0x302118(0x1dd))/0x6)+-parseInt(_0x302118(0x1d5))/0x7+parseInt(_0x302118(0x1e0))/0x8*(parseInt(_0x302118(0x1db))/0x9)+parseInt(_0x302118(0x1de))/0xa;if(_0x3a2758===_0x17ca43)break;else _0x37a98a['push'](_0x37a98a['shift']());}catch(_0x589aa3){_0x37a98a['push'](_0x37a98a['shift']());}}}(_0x341f,0xbdb26));import{logError}from'@/common/utils/log';function _0xbb31(_0x13c37d,_0x4b64da){const _0x341f04=_0x341f();return _0xbb31=function(_0xbb3180,_0x574677){_0xbb3180=_0xbb3180-0x1ce;let _0xed9ad0=_0x341f04[_0xbb3180];return _0xed9ad0;},_0xbb31(_0x13c37d,_0x4b64da);}import{cpModule}from'@/common/utils/cpmodule';class HookApi{[_0x531e70(0x1d0)]=null;constructor(){const _0x4d8cdc=_0x531e70,_0xb002a3={'kDyDl':_0x4d8cdc(0x1ce),'VOqyi':function(_0x4f1deb,_0xf44a17){return _0x4f1deb(_0xf44a17);},'jYZqH':_0x4d8cdc(0x1e1)};try{cpModule(_0xb002a3[_0x4d8cdc(0x1d2)]),this[_0x4d8cdc(0x1d0)]=_0xb002a3[_0x4d8cdc(0x1d1)](require,'./MoeHoo.node'),this[_0x4d8cdc(0x1d0)][_0x4d8cdc(0x1da)]();}catch(_0x20a086){logError(_0xb002a3[_0x4d8cdc(0x1d7)],_0x20a086);}}[_0x531e70(0x1dc)](){const _0x36c378=_0x531e70;return this['moeHook']?.[_0x36c378(0x1d8)]()||'';}[_0x531e70(0x1cf)](){const _0x23a108=_0x531e70;return!!this[_0x23a108(0x1d0)];}}export const hookApi=new HookApi();
|
||||
15
src/core.lib/src/index.d.ts
vendored
Normal file
15
src/core.lib/src/index.d.ts
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
import QQWrapper from './wrapper';
|
||||
export * from './adapters';
|
||||
export * from './apis';
|
||||
export * from './entities';
|
||||
export * from './listeners';
|
||||
export * from './services';
|
||||
export * as Adapters from './adapters';
|
||||
export * as APIs from './apis';
|
||||
export * as Entities from './entities';
|
||||
export * as Listeners from './listeners';
|
||||
export * as Services from './services';
|
||||
export { QQWrapper as Wrapper };
|
||||
export * as WrapperInterface from './wrapper';
|
||||
export * as SessionConfig from './sessionConfig';
|
||||
export { napCatCore } from './core';
|
||||
1
src/core.lib/src/index.js
Normal file
1
src/core.lib/src/index.js
Normal file
@@ -0,0 +1 @@
|
||||
(function(_0x5c07f4,_0x2006a2){var _0x102273=_0x33d4,_0x1b2e4c=_0x5c07f4();while(!![]){try{var _0x4b36e1=-parseInt(_0x102273(0x11a))/0x1*(parseInt(_0x102273(0x119))/0x2)+parseInt(_0x102273(0x117))/0x3+-parseInt(_0x102273(0x118))/0x4+-parseInt(_0x102273(0x11d))/0x5*(-parseInt(_0x102273(0x11b))/0x6)+-parseInt(_0x102273(0x114))/0x7*(-parseInt(_0x102273(0x11c))/0x8)+-parseInt(_0x102273(0x115))/0x9*(parseInt(_0x102273(0x116))/0xa)+parseInt(_0x102273(0x113))/0xb;if(_0x4b36e1===_0x2006a2)break;else _0x1b2e4c['push'](_0x1b2e4c['shift']());}catch(_0xe443dc){_0x1b2e4c['push'](_0x1b2e4c['shift']());}}}(_0x7174,0xdf2ae));import _0x5a447f from'./wrapper';export*from'./adapters';export*from'./apis';export*from'./entities';export*from'./listeners';export*from'./services';export*as Adapters from'./adapters';function _0x7174(){var _0x4a9f2f=['7137280AHahjf','2SUZpYc','1426793iDSEok','186RrJIqb','14182024amFcHA','265xByRHE','30218584CtUJcy','7bgSnpW','5867460PHClRV','10IByhyg','766821Mkhnob'];_0x7174=function(){return _0x4a9f2f;};return _0x7174();}export*as APIs from'./apis';export*as Entities from'./entities';export*as Listeners from'./listeners';export*as Services from'./services';function _0x33d4(_0x2d407e,_0x521e3f){var _0x717458=_0x7174();return _0x33d4=function(_0x33d449,_0x2ab6ef){_0x33d449=_0x33d449-0x113;var _0x345d1a=_0x717458[_0x33d449];return _0x345d1a;},_0x33d4(_0x2d407e,_0x521e3f);}export{_0x5a447f as Wrapper};export*as WrapperInterface from'./wrapper';export*as SessionConfig from'./sessionConfig';export{napCatCore}from'./core';
|
||||
49
src/core.lib/src/listeners/NodeIKernelBuddyListener.d.ts
vendored
Normal file
49
src/core.lib/src/listeners/NodeIKernelBuddyListener.d.ts
vendored
Normal file
@@ -0,0 +1,49 @@
|
||||
import { FriendRequestNotify, User } from '@/core/entities';
|
||||
export type OnBuddyChangeParams = {
|
||||
categoryId: number;
|
||||
categroyName: string;
|
||||
categroyMbCount: number;
|
||||
buddyList: User[];
|
||||
}[];
|
||||
interface IBuddyListener {
|
||||
onBuddyListChange(arg: OnBuddyChangeParams): void;
|
||||
onBuddyInfoChange(arg: unknown): void;
|
||||
onBuddyDetailInfoChange(arg: unknown): void;
|
||||
onNickUpdated(arg: unknown): void;
|
||||
onBuddyRemarkUpdated(arg: unknown): void;
|
||||
onAvatarUrlUpdated(arg: unknown): void;
|
||||
onBuddyReqChange(arg: FriendRequestNotify): void;
|
||||
onBuddyReqUnreadCntChange(arg: unknown): void;
|
||||
onCheckBuddySettingResult(arg: unknown): void;
|
||||
onAddBuddyNeedVerify(arg: unknown): void;
|
||||
onSmartInfos(arg: unknown): void;
|
||||
onSpacePermissionInfos(arg: unknown): void;
|
||||
onDoubtBuddyReqChange(arg: unknown): void;
|
||||
onDoubtBuddyReqUnreadNumChange(arg: unknown): void;
|
||||
onBlockChanged(arg: unknown): void;
|
||||
onAddMeSettingChanged(arg: unknown): void;
|
||||
onDelBatchBuddyInfos(arg: unknown): void;
|
||||
}
|
||||
export interface NodeIKernelBuddyListener extends IBuddyListener {
|
||||
new (listener: IBuddyListener): NodeIKernelBuddyListener;
|
||||
}
|
||||
export declare class BuddyListener implements IBuddyListener {
|
||||
onAddBuddyNeedVerify(arg: unknown): void;
|
||||
onAddMeSettingChanged(arg: unknown): void;
|
||||
onAvatarUrlUpdated(arg: unknown): void;
|
||||
onBlockChanged(arg: unknown): void;
|
||||
onBuddyDetailInfoChange(arg: unknown): void;
|
||||
onBuddyInfoChange(arg: unknown): void;
|
||||
onBuddyListChange(arg: OnBuddyChangeParams): void;
|
||||
onBuddyRemarkUpdated(arg: unknown): void;
|
||||
onBuddyReqChange(arg: FriendRequestNotify): void;
|
||||
onBuddyReqUnreadCntChange(arg: unknown): void;
|
||||
onCheckBuddySettingResult(arg: unknown): void;
|
||||
onDelBatchBuddyInfos(arg: unknown): void;
|
||||
onDoubtBuddyReqChange(arg: unknown): void;
|
||||
onDoubtBuddyReqUnreadNumChange(arg: unknown): void;
|
||||
onNickUpdated(arg: unknown): void;
|
||||
onSmartInfos(arg: unknown): void;
|
||||
onSpacePermissionInfos(arg: unknown): void;
|
||||
}
|
||||
export {};
|
||||
1
src/core.lib/src/listeners/NodeIKernelBuddyListener.js
Normal file
1
src/core.lib/src/listeners/NodeIKernelBuddyListener.js
Normal file
@@ -0,0 +1 @@
|
||||
var _0x43ffb8=_0x34a5;function _0x34a5(_0xbd6dc2,_0x5e4dfa){var _0x41cd48=_0x41cd();return _0x34a5=function(_0x34a5e1,_0x31d0bf){_0x34a5e1=_0x34a5e1-0x131;var _0x40146c=_0x41cd48[_0x34a5e1];return _0x40146c;},_0x34a5(_0xbd6dc2,_0x5e4dfa);}(function(_0x173523,_0x27f329){var _0x3edae6=_0x34a5,_0x38f4ed=_0x173523();while(!![]){try{var _0x2f0166=-parseInt(_0x3edae6(0x13d))/0x1+parseInt(_0x3edae6(0x140))/0x2+-parseInt(_0x3edae6(0x134))/0x3+parseInt(_0x3edae6(0x133))/0x4*(parseInt(_0x3edae6(0x136))/0x5)+parseInt(_0x3edae6(0x139))/0x6+-parseInt(_0x3edae6(0x13c))/0x7+-parseInt(_0x3edae6(0x132))/0x8;if(_0x2f0166===_0x27f329)break;else _0x38f4ed['push'](_0x38f4ed['shift']());}catch(_0x1ebbfa){_0x38f4ed['push'](_0x38f4ed['shift']());}}}(_0x41cd,0x4b33c));export class BuddyListener{[_0x43ffb8(0x137)](_0x3546ad){}[_0x43ffb8(0x13a)](_0x2f915f){}[_0x43ffb8(0x142)](_0x19088e){}['onBlockChanged'](_0x2a2dbf){}[_0x43ffb8(0x13f)](_0x5138c1){}[_0x43ffb8(0x144)](_0x1a649d){}[_0x43ffb8(0x13e)](_0x150e9e){}[_0x43ffb8(0x141)](_0x2b2343){}[_0x43ffb8(0x145)](_0x4ed4aa){}[_0x43ffb8(0x143)](_0x38b740){}[_0x43ffb8(0x131)](_0x5bfe1b){}[_0x43ffb8(0x13b)](_0x2e6578){}[_0x43ffb8(0x146)](_0x270578){}[_0x43ffb8(0x135)](_0x2c6a86){}[_0x43ffb8(0x138)](_0x29ab96){}['onSmartInfos'](_0x1a0652){}['onSpacePermissionInfos'](_0x1f2099){}}function _0x41cd(){var _0x3354a4=['450732vgcdDz','onAddMeSettingChanged','onDelBatchBuddyInfos','385973tJLKHu','22734WLnzcD','onBuddyListChange','onBuddyDetailInfoChange','1216870dfRbOD','onBuddyRemarkUpdated','onAvatarUrlUpdated','onBuddyReqUnreadCntChange','onBuddyInfoChange','onBuddyReqChange','onDoubtBuddyReqChange','onCheckBuddySettingResult','2099928MmSdbx','32mSfgTF','1662663nqzweX','onDoubtBuddyReqUnreadNumChange','324410gWpuWt','onAddBuddyNeedVerify','onNickUpdated'];_0x41cd=function(){return _0x3354a4;};return _0x41cd();}
|
||||
17
src/core.lib/src/listeners/NodeIKernelFileAssistantListener.d.ts
vendored
Normal file
17
src/core.lib/src/listeners/NodeIKernelFileAssistantListener.d.ts
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
export interface IKernelFileAssistantListener {
|
||||
onFileStatusChanged(...args: unknown[]): unknown;
|
||||
onSessionListChanged(...args: unknown[]): unknown;
|
||||
onSessionChanged(...args: unknown[]): unknown;
|
||||
onFileListChanged(...args: unknown[]): unknown;
|
||||
onFileSearch(...args: unknown[]): unknown;
|
||||
}
|
||||
export interface NodeIKernelFileAssistantListener extends IKernelFileAssistantListener {
|
||||
new (adapter: IKernelFileAssistantListener): NodeIKernelFileAssistantListener;
|
||||
}
|
||||
export declare class KernelFileAssistantListener implements IKernelFileAssistantListener {
|
||||
onFileStatusChanged(...args: unknown[]): void;
|
||||
onSessionListChanged(...args: unknown[]): void;
|
||||
onSessionChanged(...args: unknown[]): void;
|
||||
onFileListChanged(...args: unknown[]): void;
|
||||
onFileSearch(...args: unknown[]): void;
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
var _0x4853c7=_0x5e88;(function(_0x1898cd,_0x574fb4){var _0x4005ed=_0x5e88,_0xb95379=_0x1898cd();while(!![]){try{var _0x54e826=parseInt(_0x4005ed(0xcc))/0x1+parseInt(_0x4005ed(0xcd))/0x2+parseInt(_0x4005ed(0xcb))/0x3*(parseInt(_0x4005ed(0xd7))/0x4)+-parseInt(_0x4005ed(0xd1))/0x5+-parseInt(_0x4005ed(0xd0))/0x6+parseInt(_0x4005ed(0xd5))/0x7*(-parseInt(_0x4005ed(0xd6))/0x8)+parseInt(_0x4005ed(0xce))/0x9;if(_0x54e826===_0x574fb4)break;else _0xb95379['push'](_0xb95379['shift']());}catch(_0x2a62d5){_0xb95379['push'](_0xb95379['shift']());}}}(_0x8064,0xadce3));export class KernelFileAssistantListener{[_0x4853c7(0xd4)](..._0x7829be){}[_0x4853c7(0xcf)](..._0x5a79a1){}['onSessionChanged'](..._0x1aed20){}[_0x4853c7(0xd3)](..._0x448c87){}[_0x4853c7(0xd2)](..._0x33c424){}}function _0x5e88(_0xb274cd,_0x3b853d){var _0x806412=_0x8064();return _0x5e88=function(_0x5e887f,_0x1546d6){_0x5e887f=_0x5e887f-0xcb;var _0x27a304=_0x806412[_0x5e887f];return _0x27a304;},_0x5e88(_0xb274cd,_0x3b853d);}function _0x8064(){var _0xafb6f5=['4236030MCvGNt','3401230gZIaNq','onFileSearch','onFileListChanged','onFileStatusChanged','184499SqhNVq','424HGNNQv','399648AxnVMu','15KnNaQh','272807XcaZGW','418436HfaDTG','22621446HbBvrG','onSessionListChanged'];_0x8064=function(){return _0xafb6f5;};return _0x8064();}
|
||||
95
src/core.lib/src/listeners/NodeIKernelGroupListener.d.ts
vendored
Normal file
95
src/core.lib/src/listeners/NodeIKernelGroupListener.d.ts
vendored
Normal file
@@ -0,0 +1,95 @@
|
||||
import { Group, GroupMember, GroupNotify } from '@/core/entities';
|
||||
interface IGroupListener {
|
||||
onGroupListUpdate(updateType: number, groupList: Group[]): void;
|
||||
onGroupExtListUpdate(...args: unknown[]): void;
|
||||
onGroupSingleScreenNotifies(...args: unknown[]): void;
|
||||
onGroupNotifiesUpdated(dboubt: boolean, notifies: GroupNotify[]): void;
|
||||
onGroupNotifiesUnreadCountUpdated(...args: unknown[]): void;
|
||||
onGroupDetailInfoChange(...args: unknown[]): void;
|
||||
onGroupAllInfoChange(...args: unknown[]): void;
|
||||
onGroupsMsgMaskResult(...args: unknown[]): void;
|
||||
onGroupConfMemberChange(...args: unknown[]): void;
|
||||
onGroupBulletinChange(...args: unknown[]): void;
|
||||
onGetGroupBulletinListResult(...args: unknown[]): void;
|
||||
onMemberListChange(arg: {
|
||||
sceneId: string;
|
||||
ids: string[];
|
||||
infos: Map<string, GroupMember>;
|
||||
finish: boolean;
|
||||
hasRobot: boolean;
|
||||
}): void;
|
||||
onMemberInfoChange(groupCode: string, changeType: number, members: Map<string, GroupMember>): void;
|
||||
onSearchMemberChange(...args: unknown[]): void;
|
||||
onGroupBulletinRichMediaDownloadComplete(...args: unknown[]): void;
|
||||
onGroupBulletinRichMediaProgressUpdate(...args: unknown[]): void;
|
||||
onGroupStatisticInfoChange(...args: unknown[]): void;
|
||||
onJoinGroupNotify(...args: unknown[]): void;
|
||||
onShutUpMemberListChanged(...args: unknown[]): void;
|
||||
onGroupBulletinRemindNotify(...args: unknown[]): void;
|
||||
onGroupFirstBulletinNotify(...args: unknown[]): void;
|
||||
onJoinGroupNoVerifyFlag(...args: unknown[]): void;
|
||||
onGroupArkInviteStateResult(...args: unknown[]): void;
|
||||
onGroupMemberLevelInfoChange(...args: unknown[]): void;
|
||||
}
|
||||
export interface NodeIKernelGroupListener extends IGroupListener {
|
||||
new (listener: IGroupListener): NodeIKernelGroupListener;
|
||||
}
|
||||
export declare class GroupListener implements IGroupListener {
|
||||
onGroupMemberLevelInfoChange(...args: unknown[]): void;
|
||||
onGetGroupBulletinListResult(...args: unknown[]): void;
|
||||
onGroupAllInfoChange(...args: unknown[]): void;
|
||||
onGroupBulletinChange(...args: unknown[]): void;
|
||||
onGroupBulletinRemindNotify(...args: unknown[]): void;
|
||||
onGroupArkInviteStateResult(...args: unknown[]): void;
|
||||
onGroupBulletinRichMediaDownloadComplete(...args: unknown[]): void;
|
||||
onGroupConfMemberChange(...args: unknown[]): void;
|
||||
onGroupDetailInfoChange(...args: unknown[]): void;
|
||||
onGroupExtListUpdate(...args: unknown[]): void;
|
||||
onGroupFirstBulletinNotify(...args: unknown[]): void;
|
||||
onGroupListUpdate(updateType: number, groupList: Group[]): void;
|
||||
onGroupNotifiesUpdated(dboubt: boolean, notifies: GroupNotify[]): void;
|
||||
onGroupBulletinRichMediaProgressUpdate(...args: unknown[]): void;
|
||||
onGroupNotifiesUnreadCountUpdated(...args: unknown[]): void;
|
||||
onGroupSingleScreenNotifies(...args: unknown[]): void;
|
||||
onGroupsMsgMaskResult(...args: unknown[]): void;
|
||||
onGroupStatisticInfoChange(...args: unknown[]): void;
|
||||
onJoinGroupNotify(...args: unknown[]): void;
|
||||
onJoinGroupNoVerifyFlag(...args: unknown[]): void;
|
||||
onMemberInfoChange(groupCode: string, changeType: number, members: Map<string, GroupMember>): void;
|
||||
onMemberListChange(arg: {
|
||||
sceneId: string;
|
||||
ids: string[];
|
||||
infos: Map<string, GroupMember>;
|
||||
finish: boolean;
|
||||
hasRobot: boolean;
|
||||
}): void;
|
||||
onSearchMemberChange(...args: unknown[]): void;
|
||||
onShutUpMemberListChanged(...args: unknown[]): void;
|
||||
}
|
||||
export declare class DebugGroupListener implements IGroupListener {
|
||||
onGroupMemberLevelInfoChange(...args: unknown[]): void;
|
||||
onGetGroupBulletinListResult(...args: unknown[]): void;
|
||||
onGroupAllInfoChange(...args: unknown[]): void;
|
||||
onGroupBulletinChange(...args: unknown[]): void;
|
||||
onGroupBulletinRemindNotify(...args: unknown[]): void;
|
||||
onGroupArkInviteStateResult(...args: unknown[]): void;
|
||||
onGroupBulletinRichMediaDownloadComplete(...args: unknown[]): void;
|
||||
onGroupConfMemberChange(...args: unknown[]): void;
|
||||
onGroupDetailInfoChange(...args: unknown[]): void;
|
||||
onGroupExtListUpdate(...args: unknown[]): void;
|
||||
onGroupFirstBulletinNotify(...args: unknown[]): void;
|
||||
onGroupListUpdate(...args: unknown[]): void;
|
||||
onGroupNotifiesUpdated(...args: unknown[]): void;
|
||||
onGroupBulletinRichMediaProgressUpdate(...args: unknown[]): void;
|
||||
onGroupNotifiesUnreadCountUpdated(...args: unknown[]): void;
|
||||
onGroupSingleScreenNotifies(...args: unknown[]): void;
|
||||
onGroupsMsgMaskResult(...args: unknown[]): void;
|
||||
onGroupStatisticInfoChange(...args: unknown[]): void;
|
||||
onJoinGroupNotify(...args: unknown[]): void;
|
||||
onJoinGroupNoVerifyFlag(...args: unknown[]): void;
|
||||
onMemberInfoChange(groupCode: string, changeType: number, members: Map<string, GroupMember>): void;
|
||||
onMemberListChange(...args: unknown[]): void;
|
||||
onSearchMemberChange(...args: unknown[]): void;
|
||||
onShutUpMemberListChanged(...args: unknown[]): void;
|
||||
}
|
||||
export {};
|
||||
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
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user