mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-07-19 12:03:37 +00:00
Compare commits
124 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
45c922c377 | ||
![]() |
f854c258bd | ||
![]() |
a643fac073 | ||
![]() |
861f105bea | ||
![]() |
bf10ce9f1e | ||
![]() |
ccf521d0a8 | ||
![]() |
6075d98eaa | ||
![]() |
a3801fc243 | ||
![]() |
a1f0c05f3a | ||
![]() |
a568c96929 | ||
![]() |
d58bcf3c0e | ||
![]() |
985f2e6436 | ||
![]() |
ad441fa793 | ||
![]() |
316300cc86 | ||
![]() |
5c4f37b234 | ||
![]() |
77b51a072d | ||
![]() |
2536e1ae6a | ||
![]() |
14822c9599 | ||
![]() |
e53c37adc9 | ||
![]() |
c37539354c | ||
![]() |
ae0277f33c | ||
![]() |
b863896249 | ||
![]() |
5b42f8b743 | ||
![]() |
3883fab614 | ||
![]() |
61d6bcec4b | ||
![]() |
3b5902b033 | ||
![]() |
3a88c21a3b | ||
![]() |
91a5055dee | ||
![]() |
7befd1469f | ||
![]() |
c72ebe495c | ||
![]() |
19e06b97e6 | ||
![]() |
7519825303 | ||
![]() |
d9315bf309 | ||
![]() |
8c36c809a0 | ||
![]() |
8138aa3cb2 | ||
![]() |
87aef3ca78 | ||
![]() |
a3f1d26d6b | ||
![]() |
06cebc5670 | ||
![]() |
867fd62d77 | ||
![]() |
650cdf2916 | ||
![]() |
ebf461f2fd | ||
![]() |
27fa319b2a | ||
![]() |
d95ac894f4 | ||
![]() |
ae84a8dd11 | ||
![]() |
2fc963f986 | ||
![]() |
be1f938ebd | ||
![]() |
cccf4d503d | ||
![]() |
9dad2a8ac6 | ||
![]() |
75af104f07 | ||
![]() |
76ecba245b | ||
![]() |
3697c2ced8 | ||
![]() |
b9d1d84716 | ||
![]() |
64b2d547ce | ||
![]() |
d8d2ff7e4e | ||
![]() |
8aa5dc6482 | ||
![]() |
474ba20e61 | ||
![]() |
bdea2d02a9 | ||
![]() |
c4307481f1 | ||
![]() |
b8ac1b28bd | ||
![]() |
24038cda95 | ||
![]() |
86c82e9608 | ||
![]() |
daab5d150b | ||
![]() |
9ff82bdb90 | ||
![]() |
c6d70ef1cf | ||
![]() |
15d4bb3c76 | ||
![]() |
3e698981fd | ||
![]() |
9d45c934a5 | ||
![]() |
c2bf9cf93e | ||
![]() |
b3c6fd7f26 | ||
![]() |
ccd155de71 | ||
![]() |
1f90d2e46b | ||
![]() |
4c5d974c22 | ||
![]() |
392eda1cbc | ||
![]() |
a9da3279e8 | ||
![]() |
1ce8351180 | ||
![]() |
96c334478a | ||
![]() |
f1b0875b05 | ||
![]() |
cea9e11c83 | ||
![]() |
f098b39200 | ||
![]() |
012d948b59 | ||
![]() |
3334cd0a71 | ||
![]() |
d63d53fd88 | ||
![]() |
a7fa39b2fd | ||
![]() |
40bb42e193 | ||
![]() |
9c382c639b | ||
![]() |
a43cde38f1 | ||
![]() |
c35d2e08cd | ||
![]() |
3377c383c1 | ||
![]() |
c00e6d95cd | ||
![]() |
725fccf4ed | ||
![]() |
13129bd219 | ||
![]() |
4561977bcf | ||
![]() |
40be8a91f5 | ||
![]() |
2a04d5830b | ||
![]() |
82a38574f3 | ||
![]() |
fea3a33c2b | ||
![]() |
9a502cdf6f | ||
![]() |
4b616299cf | ||
![]() |
102243e064 | ||
![]() |
4b21ac5ebe | ||
![]() |
4dd7363dd3 | ||
![]() |
3d5e5ab78f | ||
![]() |
73045a1b21 | ||
![]() |
871173a7cf | ||
![]() |
0002313093 | ||
![]() |
948cf5cca6 | ||
![]() |
d40230879c | ||
![]() |
ab22b775f1 | ||
![]() |
42c85224ba | ||
![]() |
e57444a353 | ||
![]() |
3c6503d495 | ||
![]() |
149b518f48 | ||
![]() |
74621447ff | ||
![]() |
3280952931 | ||
![]() |
9e670e2736 | ||
![]() |
9fc6347a2f | ||
![]() |
ec7a15a192 | ||
![]() |
7f99982810 | ||
![]() |
935d83aaf8 | ||
![]() |
0ff6edd546 | ||
![]() |
94f629585a | ||
![]() |
89c04be02f | ||
![]() |
3151965ea8 | ||
![]() |
bdf5159be1 |
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: "Build"
|
||||
name: "Build Action"
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
@@ -47,7 +47,7 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target_platform: [win32]
|
||||
target_arch: [x64]
|
||||
target_arch: [x64,ia32]
|
||||
steps:
|
||||
- name: Clone Main Repository
|
||||
uses: actions/checkout@v4
|
||||
|
5
.github/workflows/release.yml
vendored
5
.github/workflows/release.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: "release"
|
||||
name: "Build Release"
|
||||
|
||||
on:
|
||||
push:
|
||||
@@ -72,7 +72,7 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target_platform: [win32]
|
||||
target_arch: [x64]
|
||||
target_arch: [x64,ia32]
|
||||
steps:
|
||||
- name: Clone Main Repository
|
||||
uses: actions/checkout@v4
|
||||
@@ -130,6 +130,7 @@ jobs:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
body_path: CHANGELOG.md
|
||||
files: |
|
||||
NapCat.win32.ia32.zip
|
||||
NapCat.win32.x64.zip
|
||||
NapCat.linux.x64.zip
|
||||
NapCat.linux.arm64.zip
|
||||
|
69
.github/workflows/test.yml
vendored
Normal file
69
.github/workflows/test.yml
vendored
Normal file
@@ -0,0 +1,69 @@
|
||||
name: "Build Test"
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
permissions: write-all
|
||||
|
||||
jobs:
|
||||
build-linux:
|
||||
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:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target_platform: [win32]
|
||||
target_arch: [x64,ia32]
|
||||
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
|
13
docs/changelogs/CHANGELOG.v1.6.3.md
Normal file
13
docs/changelogs/CHANGELOG.v1.6.3.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# v1.6.3
|
||||
|
||||
QQ Version: Windows 9.9.11-24815 / Linux 3.2.9-24815
|
||||
|
||||
## 修复与优化
|
||||
* 修复带有groupid的私聊消息异常发送到群聊消息
|
||||
* 尝试修复rws热重载失效问题
|
||||
* 尝试修复进群事件无法正常获取uin
|
||||
|
||||
## 新增与调整
|
||||
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
@@ -1,10 +1,10 @@
|
||||
# v1.4.4
|
||||
|
||||
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||
|
||||
## 更新
|
||||
* **重大更新:**更新了版本号
|
||||
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
||||
|
||||
# v1.4.4
|
||||
|
||||
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||
|
||||
## 更新
|
||||
* **重大更新:**更新了版本号
|
||||
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
||||
|
@@ -1,12 +1,12 @@
|
||||
# v1.4.5
|
||||
|
||||
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||
|
||||
## 修复与优化
|
||||
* 紧急修复二维扫码问题
|
||||
|
||||
## 新增与调整
|
||||
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
||||
|
||||
# v1.4.5
|
||||
|
||||
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||
|
||||
## 修复与优化
|
||||
* 紧急修复二维扫码问题
|
||||
|
||||
## 新增与调整
|
||||
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
||||
|
@@ -1,12 +1,12 @@
|
||||
# v1.4.6
|
||||
|
||||
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||
|
||||
## 修复与优化
|
||||
* 优化整体稳定性
|
||||
|
||||
## 新增与调整
|
||||
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
||||
|
||||
# v1.4.6
|
||||
|
||||
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||
|
||||
## 修复与优化
|
||||
* 优化整体稳定性
|
||||
|
||||
## 新增与调整
|
||||
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
||||
|
@@ -1,11 +1,11 @@
|
||||
# v1.4.7
|
||||
|
||||
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||
|
||||
## 修复与优化
|
||||
* 临时扩展 Api: GoCQHTTPUploadGroupFile folder_id字段 用于选择文件夹
|
||||
|
||||
## 新增与调整
|
||||
|
||||
|
||||
# v1.4.7
|
||||
|
||||
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||
|
||||
## 修复与优化
|
||||
* 临时扩展 Api: GoCQHTTPUploadGroupFile folder_id字段 用于选择文件夹
|
||||
|
||||
## 新增与调整
|
||||
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
12
docs/changelogs/old/CHANGELOG.v1.4.8.md
Normal file
12
docs/changelogs/old/CHANGELOG.v1.4.8.md
Normal file
@@ -0,0 +1,12 @@
|
||||
# v1.4.8
|
||||
|
||||
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||
|
||||
## 修复与优化
|
||||
* 优化Guid的生成方式
|
||||
* 支持临时消息获取群来源
|
||||
|
||||
## 新增与调整
|
||||
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
11
docs/changelogs/old/CHANGELOG.v1.4.9.md
Normal file
11
docs/changelogs/old/CHANGELOG.v1.4.9.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# v1.4.9
|
||||
|
||||
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||
|
||||
## 修复与优化
|
||||
* 修复接口调用问题 接口标准化 API:set_group_add_request
|
||||
|
||||
## 新增与调整
|
||||
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
11
docs/changelogs/old/CHANGELOG.v1.5.0.md
Normal file
11
docs/changelogs/old/CHANGELOG.v1.5.0.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# v1.5.0
|
||||
|
||||
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||
|
||||
## 修复与优化
|
||||
* 修正各Api默认值
|
||||
|
||||
## 新增与调整
|
||||
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
12
docs/changelogs/old/CHANGELOG.v1.5.1.md
Normal file
12
docs/changelogs/old/CHANGELOG.v1.5.1.md
Normal file
@@ -0,0 +1,12 @@
|
||||
# v1.5.1
|
||||
|
||||
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||
|
||||
## 修复与优化
|
||||
* 支持 新Api: set_self_profile 可设置个性签名
|
||||
* 修复 Api: get_group_system_msg
|
||||
* 整理日志、添加颜色、使用统一的日志函数以提高日志可读性
|
||||
## 新增与调整
|
||||
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
13
docs/changelogs/old/CHANGELOG.v1.5.2.md
Normal file
13
docs/changelogs/old/CHANGELOG.v1.5.2.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# v1.5.2
|
||||
|
||||
QQ Version: Windows 9.9.10-24108 / Linux 3.2.7-23361
|
||||
|
||||
## 修复与优化
|
||||
* 替换Uid/Uin为内部实现
|
||||
* 增加HttpApi调用稳定性
|
||||
* 修复 GetMsg 兼容性
|
||||
|
||||
## 新增与调整
|
||||
* 支持真正意义上的陌生人信息获取 Api: GoCQHTTP_GetStrangerInfo
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
15
docs/changelogs/old/CHANGELOG.v1.5.3.md
Normal file
15
docs/changelogs/old/CHANGELOG.v1.5.3.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# v1.5.3
|
||||
|
||||
QQ Version: Windows 9.9.11-24568 / Linux 3.2.9-23568
|
||||
|
||||
## 修复与优化
|
||||
* 修复引用消息id问题
|
||||
* 修复添加好友的通知
|
||||
|
||||
## 新增与调整
|
||||
* 扩展群分享Json生成
|
||||
* 扩展关于收藏的一系列接口
|
||||
* 支持专属群头衔获取
|
||||
* 支持视频获取直链
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
11
docs/changelogs/old/CHANGELOG.v1.5.4.md
Normal file
11
docs/changelogs/old/CHANGELOG.v1.5.4.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# v1.5.4
|
||||
|
||||
QQ Version: Windows 9.9.11-24568 / Linux 3.2.9-23568
|
||||
|
||||
## 修复与优化
|
||||
* 紧急修复视频与文件问题
|
||||
|
||||
## 新增与调整
|
||||
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
11
docs/changelogs/old/CHANGELOG.v1.5.5.md
Normal file
11
docs/changelogs/old/CHANGELOG.v1.5.5.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# v1.5.5
|
||||
|
||||
QQ Version: Windows 9.9.11-24568 / Linux 3.2.9-23568
|
||||
|
||||
## 修复与优化
|
||||
* 紧急修复一些问题
|
||||
|
||||
## 新增与调整
|
||||
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
11
docs/changelogs/old/CHANGELOG.v1.5.6.md
Normal file
11
docs/changelogs/old/CHANGELOG.v1.5.6.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# v1.5.6
|
||||
|
||||
QQ Version: Windows 9.9.11-24568 / Linux 3.2.9-24568
|
||||
|
||||
## 修复与优化
|
||||
* 修复一些问题
|
||||
|
||||
## 新增与调整
|
||||
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
11
docs/changelogs/old/CHANGELOG.v1.5.7.md
Normal file
11
docs/changelogs/old/CHANGELOG.v1.5.7.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# v1.5.7
|
||||
|
||||
QQ Version: Windows 9.9.11-24568 / Linux 3.2.9-24568
|
||||
|
||||
## 修复与优化
|
||||
* 修复一些问题
|
||||
|
||||
## 新增与调整
|
||||
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
14
docs/changelogs/old/CHANGELOG.v1.5.8.md
Normal file
14
docs/changelogs/old/CHANGELOG.v1.5.8.md
Normal file
@@ -0,0 +1,14 @@
|
||||
# v1.5.8
|
||||
|
||||
QQ Version: Windows 9.9.11-24568 / Linux 3.2.9-24568
|
||||
|
||||
## 修复与优化
|
||||
* 修复视频文件残留问题
|
||||
* 重构 getcookies接口 支持大部分常见域
|
||||
|
||||
## 新增与调整
|
||||
* 日志大小限制
|
||||
* 支持 QQ音乐 卡片 无签名支持时 启用内置方法(缺点没有封面 限速1min/条)
|
||||
* 支持Window X86-32机器
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
12
docs/changelogs/old/CHANGELOG.v1.5.9.md
Normal file
12
docs/changelogs/old/CHANGELOG.v1.5.9.md
Normal file
@@ -0,0 +1,12 @@
|
||||
# v1.5.9
|
||||
|
||||
QQ Version: Windows 9.9.11-24815 / Linux 3.2.9-24815
|
||||
|
||||
## 修复与优化
|
||||
* 优化缓存问题
|
||||
* 修复poke异常上报
|
||||
|
||||
## 新增与调整
|
||||
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
11
docs/changelogs/old/CHANGELOG.v1.6.0.md
Normal file
11
docs/changelogs/old/CHANGELOG.v1.6.0.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# v1.6.0
|
||||
|
||||
QQ Version: Windows 9.9.11-24815 / Linux 3.2.9-24815
|
||||
|
||||
## 修复与优化
|
||||
|
||||
|
||||
## 新增与调整
|
||||
* 新增图片subtype属性 区分表情图片与商城图片
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
11
docs/changelogs/old/CHANGELOG.v1.6.1.md
Normal file
11
docs/changelogs/old/CHANGELOG.v1.6.1.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# v1.6.1
|
||||
|
||||
QQ Version: Windows 9.9.11-24815 / Linux 3.2.9-24815
|
||||
|
||||
## 修复与优化
|
||||
|
||||
|
||||
## 新增与调整
|
||||
* 修复poke异常事件
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
13
docs/changelogs/old/CHANGELOG.v1.6.2.md
Normal file
13
docs/changelogs/old/CHANGELOG.v1.6.2.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# v1.6.2
|
||||
|
||||
QQ Version: Windows 9.9.11-24815 / Linux 3.2.9-24815
|
||||
|
||||
## 修复与优化
|
||||
* 修复获取Cookies异常崩溃问题
|
||||
* 尝试修复成员退群缓存问题
|
||||
* 修复自身退群后群缓存清理问题
|
||||
|
||||
## 新增与调整
|
||||
|
||||
|
||||
新增的 API 详细见[API文档](https://napneko.github.io/zh-CN/develop/extends_api)
|
2
docs/develop/Android.md
Normal file
2
docs/develop/Android.md
Normal file
@@ -0,0 +1,2 @@
|
||||
# 开始
|
||||
jadx 跳转于 `com.tencent.qqnt.kernel.*`
|
42
docs/develop/GetMemberExt.md
Normal file
42
docs/develop/GetMemberExt.md
Normal file
@@ -0,0 +1,42 @@
|
||||
# Android
|
||||
```java
|
||||
GroupMemberExtReq groupMemberExtReq = new GroupMemberExtReq();
|
||||
groupMemberExtReq.sourceType = MemberExtSourceType.TITLETYPE.ordinal();
|
||||
groupMemberExtReq.groupCode = longOrNull.longValue();
|
||||
groupMemberExtReq.beginUin = "0";
|
||||
groupMemberExtReq.dataTime = "0";
|
||||
Long[] lArr = new Long[1];
|
||||
AppInterface a2 = dVar.a();
|
||||
lArr[0] = Long.valueOf(a2 != null ? a2.getLongAccountUin() : 0L);
|
||||
arrayListOf = CollectionsKt__CollectionsKt.arrayListOf(lArr);
|
||||
groupMemberExtReq.uinList = arrayListOf;
|
||||
MemberExtInfoFilter memberExtInfoFilter = new MemberExtInfoFilter();
|
||||
memberExtInfoFilter.memberLevelInfoUin = 1;
|
||||
memberExtInfoFilter.memberLevelInfoPoint = 1;
|
||||
memberExtInfoFilter.memberLevelInfoActiveDay = 1;
|
||||
memberExtInfoFilter.memberLevelInfoLevel = 1;
|
||||
memberExtInfoFilter.levelName = 1;
|
||||
memberExtInfoFilter.dataTime = 1;
|
||||
memberExtInfoFilter.sysShowFlag = 1;
|
||||
memberExtInfoFilter.userShowFlag = 1;
|
||||
memberExtInfoFilter.userShowFlagNew = 1;
|
||||
memberExtInfoFilter.levelNameNew = 1;
|
||||
Unit unit = Unit.INSTANCE;
|
||||
groupMemberExtReq.memberExtFilter = memberExtInfoFilter;
|
||||
troopLevelFrequencyControl.f(troopUin, new TroopListRepo$fetchTroopLevelInfo$2(b2, groupMemberExtReq, troopUin, new com.tencent.qqnt.troopmemberlist.report.c("fetchTroopLevelInfo")));
|
||||
```
|
||||
# Win
|
||||
参数解析位于 sub_181456A10(24108) -> wrapper.node(24108)+1456A10
|
||||
IGroupService.GetMemberExt(param: object);
|
||||
param展开如下
|
||||
```
|
||||
groupCode string
|
||||
beginUin string
|
||||
dataTime string
|
||||
uinList Array<string>
|
||||
uinNum string
|
||||
groupType string
|
||||
richCardNameVer string
|
||||
sourceType number
|
||||
memberExtFilter object// 参数解析位于 sub_18145A6D0(24108) -> wrapper.node(24108)+145A6D0
|
||||
```
|
48
docs/develop/Image.NTAndroid.md
Normal file
48
docs/develop/Image.NTAndroid.md
Normal file
@@ -0,0 +1,48 @@
|
||||
public static final int C2C_PIC_DOWNLOAD = 1004;
|
||||
public static final String C2C_PIC_DOWNLOAD_DOMAIN = "c2cpicdw.qpic.cn";
|
||||
public static final String C2C_PIC_DOWNLOAD_QUIC_DOMAIN = "c2cpicdw.quic.qpic.cn";
|
||||
public static final int FLAG_NOT_UPLOAD = 3;
|
||||
public static final int FLAG_UPLOADINFO_ERROR = 4;
|
||||
public static final int GROUP_PIC_DOWNLOAD = 1000;
|
||||
public static final String GROUP_PIC_DOWNLOAD_DOMAIN = "gchat.qpic.cn";
|
||||
public static final String GROUP_PIC_DOWNLOAD_QUIC_DOMAIN = "gchat.quic.qpic.cn";
|
||||
public static final String GUILD_PIC_DOWNLOAD_DOMAIN = "gchat.qpic.cn/qmeetpic";
|
||||
public static final boolean NEW_STORE_FLAG = true;
|
||||
public static final String PTT_VIDEO_DOWNLOAD_DOMAIN = "grouptalk.c2c.qq.com";
|
||||
|
||||
protected static final int AVIF_DECODE_EXCEPTION = 4;
|
||||
protected static final int AVIF_DECODE_FAIL = 1;
|
||||
protected static final int AVIF_DECODE_FAIL_SO_FAIL = 2;
|
||||
protected static final int AVIF_DECODE_FAIL_UNKNOWN = 6;
|
||||
protected static final int AVIF_DECODE_FILETYPE_ERROR = 5;
|
||||
protected static final int AVIF_DECODE_OOM = 3;
|
||||
protected static final int AVIF_DECODE_RENAME_FAIL = 7;
|
||||
protected static final int AVIF_DECODE_SUC = 0;
|
||||
public static final String AVIF_FILE_SUFFIX = ".avif";
|
||||
public static final int AVIF_REQ_APPRUNTIME_NULL = 12;
|
||||
public static final int AVIF_REQ_CODEC_UNSURPPORT = 5;
|
||||
protected static final int AVIF_REQ_DENSITY_UNSURPPORT = 10;
|
||||
protected static final int AVIF_REQ_FLASH_PHOTO = 9;
|
||||
protected static final int AVIF_REQ_HAS_TMP_AVIF = 7;
|
||||
protected static final int AVIF_REQ_INVALID_MSG_RECORD = 2;
|
||||
protected static final int AVIF_REQ_IS_RAW_PHOTO = 3;
|
||||
protected static final int AVIF_REQ_OUTPUTSTREAM_UNSURPPORT = 11;
|
||||
protected static final int AVIF_REQ_OVERSIZE = 6;
|
||||
protected static final int AVIF_REQ_RETRY = 1;
|
||||
public static final int AVIF_REQ_SO_DOWNLOAD_FAILED = 8;
|
||||
protected static final int AVIF_REQ_SUC = 0;
|
||||
public static final int AVIF_REQ_SWITCH_CLOSE = 4;
|
||||
public static final String C2C_PIC_DOWNLOAD_ERROR_CODE = "C2CPicDownloadErrorCode";
|
||||
static final int DOWNLOAD_ST_COMPLETE = 1;
|
||||
static final int DOWNLOAD_ST_HEAD = 2;
|
||||
static final int DOWNLOAD_ST_LEFT = 4;
|
||||
static final int DOWNLOAD_ST_PART = 3;
|
||||
private static final int ENCRYPT_APPID = 1600000226;
|
||||
public static final String GROUP_PIC_DOWNLOAD_ERROR_CODE = "GroupPicDownloadErrorCode";
|
||||
public static final String KEY_PIC_DOWNLOAD_ERROR_CODE = "param_detail_code";
|
||||
protected static final int QUIC_FAIL_IP_LIST_EMPTY = 1;
|
||||
protected static final int QUIC_FAIL_REQUEST_HTTPS = 3;
|
||||
protected static final int QUIC_FAIL_REQUEST_QUIC = 2;
|
||||
protected static final int QUIC_FAIL_SO_LOAD = 4;
|
||||
public static final String REPORT_TAG_DIRECT_DOWNLOAD_FAIL = "report_direct_download_fail";
|
||||
public static final String REQ_PARAM_AVIF = "tp=avif";
|
444
docs/develop/Msg常量NTAndroid.md
Normal file
444
docs/develop/Msg常量NTAndroid.md
Normal file
@@ -0,0 +1,444 @@
|
||||
```java
|
||||
MsgConstant
|
||||
int ARKSTRUCTELEMENTSUBTYPETENCENTDOCFROMMINIAPP = 1;
|
||||
int ARKSTRUCTELEMENTSUBTYPETENCENTDOCFROMPLUSPANEL = 2;
|
||||
int ARKSTRUCTELEMENTSUBTYPEUNKNOWN = 0;
|
||||
int ATTYPEALL = 1;
|
||||
int ATTYPECATEGORY = 512;
|
||||
int ATTYPECHANNEL = 16;
|
||||
int ATTYPEME = 4;
|
||||
int ATTYPEONE = 2;
|
||||
int ATTYPEONLINE = 64;
|
||||
int ATTYPEROLE = 8;
|
||||
int ATTYPESUMMON = 32;
|
||||
int ATTYPESUMMONONLINE = 128;
|
||||
int ATTYPESUMMONROLE = 256;
|
||||
int ATTYPEUNKNOWN = 0;
|
||||
int CALENDARELEMSUBTYPECOMMON = 3;
|
||||
int CALENDARELEMSUBTYPESTRONG = 1;
|
||||
int CALENDARELEMSUBTYPEUNKNOWN = 0;
|
||||
int CALENDARELEMSUBTYPEWEAK = 2;
|
||||
int FACEBUBBLEELEMSUBTYPENORMAL = 1;
|
||||
int FACEBUBBLEELEMSUBTYPEUNKNOWN = 0;
|
||||
int FETCHLONGMSGERRCODEMSGEXPIRED = 196;
|
||||
int FILEELEMENTSUBTYPEAI = 16;
|
||||
int FILEELEMENTSUBTYPEAPP = 11;
|
||||
int FILEELEMENTSUBTYPEAUDIO = 3;
|
||||
int FILEELEMENTSUBTYPEDOC = 4;
|
||||
int FILEELEMENTSUBTYPEEMOTICON = 15;
|
||||
int FILEELEMENTSUBTYPEEXCEL = 6;
|
||||
int FILEELEMENTSUBTYPEFOLDER = 13;
|
||||
int FILEELEMENTSUBTYPEHTML = 10;
|
||||
int FILEELEMENTSUBTYPEIPA = 14;
|
||||
int FILEELEMENTSUBTYPENORMAL = 0;
|
||||
int FILEELEMENTSUBTYPEPDF = 7;
|
||||
int FILEELEMENTSUBTYPEPIC = 1;
|
||||
int FILEELEMENTSUBTYPEPPT = 5;
|
||||
int FILEELEMENTSUBTYPEPSD = 12;
|
||||
int FILEELEMENTSUBTYPETXT = 8;
|
||||
int FILEELEMENTSUBTYPEVIDEO = 2;
|
||||
int FILEELEMENTSUBTYPEZIP = 9;
|
||||
int GRAYTIPELEMENTSUBTYPEAIOOP = 15;
|
||||
int GRAYTIPELEMENTSUBTYPEBLOCK = 14;
|
||||
int GRAYTIPELEMENTSUBTYPEBUDDY = 5;
|
||||
int GRAYTIPELEMENTSUBTYPEBUDDYNOTIFY = 9;
|
||||
int GRAYTIPELEMENTSUBTYPEEMOJIREPLY = 3;
|
||||
int GRAYTIPELEMENTSUBTYPEESSENCE = 7;
|
||||
int GRAYTIPELEMENTSUBTYPEFEED = 6;
|
||||
int GRAYTIPELEMENTSUBTYPEFEEDCHANNELMSG = 11;
|
||||
int GRAYTIPELEMENTSUBTYPEFILE = 10;
|
||||
int GRAYTIPELEMENTSUBTYPEGROUP = 4;
|
||||
int GRAYTIPELEMENTSUBTYPEGROUPNOTIFY = 8;
|
||||
int GRAYTIPELEMENTSUBTYPEJSON = 17;
|
||||
int GRAYTIPELEMENTSUBTYPELOCALMSG = 13;
|
||||
int GRAYTIPELEMENTSUBTYPEPROCLAMATION = 2;
|
||||
int GRAYTIPELEMENTSUBTYPEREVOKE = 1;
|
||||
int GRAYTIPELEMENTSUBTYPEUNKNOWN = 0;
|
||||
int GRAYTIPELEMENTSUBTYPEWALLET = 16;
|
||||
int GRAYTIPELEMENTSUBTYPEXMLMSG = 12;
|
||||
int INLINEKEYBOARDBUTTONRENDERSTYLEBLUEBLACKGROUND = 4;
|
||||
int INLINEKEYBOARDBUTTONRENDERSTYLEBLUEBORDER = 1;
|
||||
int INLINEKEYBOARDBUTTONRENDERSTYLEGRAYBORDER = 0;
|
||||
int INLINEKEYBOARDBUTTONRENDERSTYLENOBORDER = 2;
|
||||
int INLINEKEYBOARDBUTTONRENDERSTYLEREDCHARACTER = 3;
|
||||
int INPUTSTATUSTYPECANCEL = 2;
|
||||
int INPUTSTATUSTYPESPEAK = 3;
|
||||
int INPUTSTATUSTYPETEXT = 1;
|
||||
int KACTIVITYMSG = 22;
|
||||
int KADDLOCALMSGEXTINFOTYPEPROLOGUEMSG = 1;
|
||||
int KANONYMOUSATMEMSGTYPEINMSGBOX = 1001;
|
||||
int KANONYMOUSFLAGFROMOTHERPEOPLE = 1;
|
||||
int KANONYMOUSFLAGFROMOWN = 2;
|
||||
int KANONYMOUSFLAGINVALID = 0;
|
||||
int KAPPCHANNELMSG = 16;
|
||||
int KATALLMSGTYPEINMSGBOX = 2000;
|
||||
int KATMEMSGTYPEINMSGBOX = 1000;
|
||||
int KATTRIBUTETYPEADELIEMSG = 16;
|
||||
int KATTRIBUTETYPEEXTENDBUSINESS = 13;
|
||||
int KATTRIBUTETYPEFEEDBACKSTATE = 17;
|
||||
int KATTRIBUTETYPEGROUPHONOR = 2;
|
||||
int KATTRIBUTETYPEKINGHONOR = 3;
|
||||
int KATTRIBUTETYPELONGMSG = 8;
|
||||
int KATTRIBUTETYPEMEMORYSTATEMSGINFO = 18;
|
||||
int KATTRIBUTETYPEMSG = 0;
|
||||
int KATTRIBUTETYPEMSGBOXEVENTTYPE = 14;
|
||||
int KATTRIBUTETYPEPERSONAL = 1;
|
||||
int KATTRIBUTETYPEPUBLICACCOUNT = 4;
|
||||
int KATTRIBUTETYPEQQCONNECT = 12;
|
||||
int KATTRIBUTETYPESENDMSGRSPTRANSSVRINFO = 15;
|
||||
int KATTRIBUTETYPESHAREDMSGINFO = 5;
|
||||
int KATTRIBUTETYPETEMPCHATGAMESESSION = 6;
|
||||
int KATTRIBUTETYPETOROBOTMSG = 9;
|
||||
int KATTRIBUTETYPEUININFO = 7;
|
||||
int KATTRIBUTETYPEZPLAN = 11;
|
||||
int KAUTOREPLYTEXTNONEINDEX = -1;
|
||||
int KAVRECORDMSG = 19;
|
||||
int KBUSINESSTYPGUILD = 1;
|
||||
int KBUSINESSTYPNT = 0;
|
||||
int KCHATTYPEADELIE = 42;
|
||||
int KCHATTYPEBUDDYNOTIFY = 5;
|
||||
int KCHATTYPEC2C = 1;
|
||||
int KCHATTYPECIRCLE = 113;
|
||||
int KCHATTYPEDATALINE = 8;
|
||||
int KCHATTYPEDATALINEMQQ = 134;
|
||||
int KCHATTYPEDISC = 3;
|
||||
int KCHATTYPEFAV = 41;
|
||||
int KCHATTYPEGAMEMESSAGE = 105;
|
||||
int KCHATTYPEGAMEMESSAGEFOLDER = 116;
|
||||
int KCHATTYPEGROUP = 2;
|
||||
int KCHATTYPEGROUPBLESS = 133;
|
||||
int KCHATTYPEGROUPGUILD = 9;
|
||||
int KCHATTYPEGROUPHELPER = 7;
|
||||
int KCHATTYPEGROUPNOTIFY = 6;
|
||||
int KCHATTYPEGUILD = 4;
|
||||
int KCHATTYPEGUILDMETA = 16;
|
||||
int KCHATTYPEMATCHFRIEND = 104;
|
||||
int KCHATTYPEMATCHFRIENDFOLDER = 109;
|
||||
int KCHATTYPENEARBY = 106;
|
||||
int KCHATTYPENEARBYASSISTANT = 107;
|
||||
int KCHATTYPENEARBYFOLDER = 110;
|
||||
int KCHATTYPENEARBYHELLOFOLDER = 112;
|
||||
int KCHATTYPENEARBYINTERACT = 108;
|
||||
int KCHATTYPEQQNOTIFY = 132;
|
||||
int KCHATTYPERELATEACCOUNT = 131;
|
||||
int KCHATTYPESERVICEASSISTANT = 118;
|
||||
int KCHATTYPESERVICEASSISTANTSUB = 201;
|
||||
int KCHATTYPESQUAREPUBLIC = 115;
|
||||
int KCHATTYPESUBSCRIBEFOLDER = 30;
|
||||
int KCHATTYPETEMPADDRESSBOOK = 111;
|
||||
int KCHATTYPETEMPBUSSINESSCRM = 102;
|
||||
int KCHATTYPETEMPC2CFROMGROUP = 100;
|
||||
int KCHATTYPETEMPC2CFROMUNKNOWN = 99;
|
||||
int KCHATTYPETEMPFRIENDVERIFY = 101;
|
||||
int KCHATTYPETEMPNEARBYPRO = 119;
|
||||
int KCHATTYPETEMPPUBLICACCOUNT = 103;
|
||||
int KCHATTYPETEMPWPA = 117;
|
||||
int KCHATTYPEUNKNOWN = 0;
|
||||
int KCHATTYPEWEIYUN = 40;
|
||||
int KCOMMONREDENVELOPEMSGTYPEINMSGBOX = 1007;
|
||||
int KDOWNSOURCETYPEAIOINNER = 1;
|
||||
int KDOWNSOURCETYPEBIGSCREEN = 2;
|
||||
int KDOWNSOURCETYPEHISTORY = 3;
|
||||
int KDOWNSOURCETYPEUNKNOWN = 0;
|
||||
int KELEMTYPEACTIVITY = 25;
|
||||
int KELEMTYPEACTIVITYSTATE = 41;
|
||||
int KELEMTYPEACTIVITYSUBTYPECREATEMOBATEAM = 12;
|
||||
int KELEMTYPEACTIVITYSUBTYPEDISBANDMOBATEAM = 11;
|
||||
int KELEMTYPEACTIVITYSUBTYPEFEEDSQUARE = 10001;
|
||||
int KELEMTYPEACTIVITYSUBTYPEFINISHGAME = 16;
|
||||
int KELEMTYPEACTIVITYSUBTYPEFINISHMATCHTEAM = 14;
|
||||
int KELEMTYPEACTIVITYSUBTYPEHOTCHAT = 10000;
|
||||
int KELEMTYPEACTIVITYSUBTYPEMINIGAME = 18;
|
||||
int KELEMTYPEACTIVITYSUBTYPEMUSICPLAY = 17;
|
||||
int KELEMTYPEACTIVITYSUBTYPENEWSMOBA = 9;
|
||||
int KELEMTYPEACTIVITYSUBTYPENOLIVE = 2;
|
||||
int KELEMTYPEACTIVITYSUBTYPENOSCREENSHARE = 7;
|
||||
int KELEMTYPEACTIVITYSUBTYPENOVOICE = 3;
|
||||
int KELEMTYPEACTIVITYSUBTYPEONLIVE = 1;
|
||||
int KELEMTYPEACTIVITYSUBTYPEONSCREENSHARE = 6;
|
||||
int KELEMTYPEACTIVITYSUBTYPEONVOICE = 4;
|
||||
int KELEMTYPEACTIVITYSUBTYPESTARTMATCHTEAM = 13;
|
||||
int KELEMTYPEACTIVITYSUBTYPETARTGAME = 15;
|
||||
int KELEMTYPEACTIVITYSUBTYPEUNKNOWN = 0;
|
||||
int KELEMTYPEADELIEACTIONBAR = 44;
|
||||
int KELEMTYPEADELIERECOMMENDEDMSG = 43;
|
||||
int KELEMTYPEARKSTRUCT = 10;
|
||||
int KELEMTYPEAVRECORD = 21;
|
||||
int KELEMTYPECALENDAR = 19;
|
||||
int KELEMTYPEFACE = 6;
|
||||
int KELEMTYPEFACEBUBBLE = 27;
|
||||
int KELEMTYPEFEED = 22;
|
||||
int KELEMTYPEFILE = 3;
|
||||
int KELEMTYPEGIPHY = 15;
|
||||
int KELEMTYPEGRAYTIP = 8;
|
||||
int KELEMTYPEINLINEKEYBOARD = 17;
|
||||
int KELEMTYPEINTEXTGIFT = 18;
|
||||
int KELEMTYPELIVEGIFT = 12;
|
||||
int KELEMTYPEMARKDOWN = 14;
|
||||
int KELEMTYPEMARKETFACE = 11;
|
||||
int KELEMTYPEMULTIFORWARD = 16;
|
||||
int KELEMTYPEONLINEFILE = 23;
|
||||
int KELEMTYPEPIC = 2;
|
||||
int KELEMTYPEPROLOGUE = 46;
|
||||
int KELEMTYPEPTT = 4;
|
||||
int KELEMTYPEREPLY = 7;
|
||||
int KELEMTYPESHARELOCATION = 28;
|
||||
int KELEMTYPESTRUCTLONGMSG = 13;
|
||||
int KELEMTYPETASKTOPMSG = 29;
|
||||
int KELEMTYPETEXT = 1;
|
||||
int KELEMTYPETOFU = 26;
|
||||
int KELEMTYPEUNKNOWN = 0;
|
||||
int KELEMTYPEVIDEO = 5;
|
||||
int KELEMTYPEWALLET = 9;
|
||||
int KELEMTYPEYOLOGAMERESULT = 20;
|
||||
int KENTERAIO = 1;
|
||||
int KEXITAIO = 2;
|
||||
int KFEEDBACKBUTTONTYPEDISLIKE = 2;
|
||||
int KFEEDBACKBUTTONTYPELIKE = 1;
|
||||
int KFEEDBACKBUTTONTYPEPROMPTCLICK = 5;
|
||||
int KFEEDBACKBUTTONTYPEREGENERATE = 4;
|
||||
int KFEEDBACKBUTTONTYPEUNKNOWN = 0;
|
||||
int KFEEDBACKOPTLIKE = 1;
|
||||
int KFEEDBACKOPTUNKNOWN = 0;
|
||||
int KFEEDBACKOPTUNLIKE = 2;
|
||||
int KFRIENDNEWADDEDMSGTYPEINMSGBOX = 1008;
|
||||
int KGAMEBOXNEWMSGTYPEINMSGBOX = 3000;
|
||||
int KGIFTATMEMSGTYPEINMSGBOX = 1005;
|
||||
int KGROUPFILEATALLMSGTYPEINMSGBOX = 2001;
|
||||
int KGROUPHOMEWORK = 20000;
|
||||
int KGROUPHOMEWORKTASK = 20001;
|
||||
int KGROUPKEYWORDMSGTYPEINMSGBOX = 2006;
|
||||
int KGROUPMANNOUNCEATALLMSGTYPEINMSGBOX = 2004;
|
||||
int KGROUPTASKATALLMSGTYPEINMSGBOX = 2003;
|
||||
int KGROUPUNREADTYPEINMSGBOX = 2007;
|
||||
int KGUILDCHANNELLIST = 10;
|
||||
int KHIGHLIGHTWORDINTEMPCHATTYPEINMSGBOX = 1009;
|
||||
int KHOMEWORKREMINDER = 10000;
|
||||
int KLIKEORDISLIKESTATEDISLIKE = 2;
|
||||
int KLIKEORDISLIKESTATELIKE = 1;
|
||||
int KLIKEORDISLIKESTATENONESELECTED = 0;
|
||||
int KMARKETFACE = 17;
|
||||
int KMEMORYSTATEMSGTYPEADELIEWELCOME = 1;
|
||||
int KMEMORYSTATEMSGTYPEUNKNOWN = 0;
|
||||
int KMINIPROGRAMNOTICE = 114;
|
||||
int KMSGSUBTYPEARKGROUPANNOUNCE = 3;
|
||||
int KMSGSUBTYPEARKGROUPANNOUNCECONFIRMREQUIRED = 4;
|
||||
int KMSGSUBTYPEARKGROUPGIFTATME = 5;
|
||||
int KMSGSUBTYPEARKGROUPTASKATALL = 6;
|
||||
int KMSGSUBTYPEARKMULTIMSG = 7;
|
||||
int KMSGSUBTYPEARKNORMAL = 0;
|
||||
int KMSGSUBTYPEARKTENCENTDOCFROMMINIAPP = 1;
|
||||
int KMSGSUBTYPEARKTENCENTDOCFROMPLUSPANEL = 2;
|
||||
int KMSGSUBTYPEEMOTICON = 15;
|
||||
int KMSGSUBTYPEFILEAPP = 11;
|
||||
int KMSGSUBTYPEFILEAUDIO = 3;
|
||||
int KMSGSUBTYPEFILEDOC = 4;
|
||||
int KMSGSUBTYPEFILEEXCEL = 6;
|
||||
int KMSGSUBTYPEFILEFOLDER = 13;
|
||||
int KMSGSUBTYPEFILEHTML = 10;
|
||||
int KMSGSUBTYPEFILEIPA = 14;
|
||||
int KMSGSUBTYPEFILENORMAL = 0;
|
||||
int KMSGSUBTYPEFILEPDF = 7;
|
||||
int KMSGSUBTYPEFILEPIC = 1;
|
||||
int KMSGSUBTYPEFILEPPT = 5;
|
||||
int KMSGSUBTYPEFILEPSD = 12;
|
||||
int KMSGSUBTYPEFILETXT = 8;
|
||||
int KMSGSUBTYPEFILEVIDEO = 2;
|
||||
int KMSGSUBTYPEFILEZIP = 9;
|
||||
int KMSGSUBTYPELINK = 5;
|
||||
int KMSGSUBTYPEMARKETFACE = 1;
|
||||
int KMSGSUBTYPEMIXEMOTICON = 7;
|
||||
int KMSGSUBTYPEMIXFACE = 3;
|
||||
int KMSGSUBTYPEMIXMARKETFACE = 2;
|
||||
int KMSGSUBTYPEMIXPIC = 1;
|
||||
int KMSGSUBTYPEMIXREPLY = 4;
|
||||
int KMSGSUBTYPEMIXTEXT = 0;
|
||||
int KMSGSUBTYPETENCENTDOC = 6;
|
||||
int KMSGTYPEARKSTRUCT = 11;
|
||||
int KMSGTYPEFACEBUBBLE = 24;
|
||||
int KMSGTYPEFILE = 3;
|
||||
int KMSGTYPEGIFT = 14;
|
||||
int KMSGTYPEGIPHY = 13;
|
||||
int KMSGTYPEGRAYTIPS = 5;
|
||||
int KMSGTYPEMIX = 2;
|
||||
int KMSGTYPEMULTIMSGFORWARD = 8;
|
||||
int KMSGTYPENULL = 1;
|
||||
int KMSGTYPEONLINEFILE = 21;
|
||||
int KMSGTYPEONLINEFOLDER = 27;
|
||||
int KMSGTYPEPROLOGUE = 29;
|
||||
int KMSGTYPEPTT = 6;
|
||||
int KMSGTYPEREPLY = 9;
|
||||
int KMSGTYPESHARELOCATION = 25;
|
||||
int KMSGTYPESTRUCT = 4;
|
||||
int KMSGTYPESTRUCTLONGMSG = 12;
|
||||
int KMSGTYPETEXTGIFT = 15;
|
||||
int KMSGTYPEUNKNOWN = 0;
|
||||
int KMSGTYPEVIDEO = 7;
|
||||
int KMSGTYPEWALLET = 10;
|
||||
int KNEEDCONFIRMGROUPMANNOUNCEATALLMSGTYPEINMSGBOX = 2005;
|
||||
int KNOTPASSTHROUGHEVENTTYPEUPPERBOUNDARY = 9999;
|
||||
int KPTTFORMATTYPEAMR = 0;
|
||||
int KPTTFORMATTYPESILK = 1;
|
||||
int KPTTTRANSLATESTATUSFAIL = 3;
|
||||
int KPTTTRANSLATESTATUSSUC = 2;
|
||||
int KPTTTRANSLATESTATUSTRANSLATING = 1;
|
||||
int KPTTTRANSLATESTATUSUNKNOWN = 0;
|
||||
int KPTTVIPLEVELTYPENONE = 0;
|
||||
int KPTTVIPLEVELTYPEQQVIP = 0;
|
||||
int KPTTVIPLEVELTYPESVIP = 0;
|
||||
int KPTTVOICECHANGETYPEBEASTMACHINE = 7;
|
||||
int KPTTVOICECHANGETYPEBOY = 2;
|
||||
int KPTTVOICECHANGETYPECATCHCOLD = 13;
|
||||
int KPTTVOICECHANGETYPEECHO = 5;
|
||||
int KPTTVOICECHANGETYPEFATGUY = 16;
|
||||
int KPTTVOICECHANGETYPEFLASHING = 9;
|
||||
int KPTTVOICECHANGETYPEGIRL = 1;
|
||||
int KPTTVOICECHANGETYPEHORRIBLE = 3;
|
||||
int KPTTVOICECHANGETYPEKINDERGARTEN = 6;
|
||||
int KPTTVOICECHANGETYPEMEDAROT = 15;
|
||||
int KPTTVOICECHANGETYPENONE = 0;
|
||||
int KPTTVOICECHANGETYPEOPTIMUSPRIME = 8;
|
||||
int KPTTVOICECHANGETYPEOUTOFDATE = 14;
|
||||
int KPTTVOICECHANGETYPEPAPI = 11;
|
||||
int KPTTVOICECHANGETYPEQUICK = 4;
|
||||
int KPTTVOICECHANGETYPESTUTTER = 10;
|
||||
int KPTTVOICECHANGETYPETRAPPEDBEAST = 12;
|
||||
int KPTTVOICETYPEINTERCOM = 1;
|
||||
int KPTTVOICETYPESOUNDRECORD = 2;
|
||||
int KPTTVOICETYPEUNKNOW = 0;
|
||||
int KPTTVOICETYPEVOICECHANGE = 3;
|
||||
int KPUBLICACCOUNTTIANSHUHIGHLIGHTWORDTYPEINMSGBOX = 1010;
|
||||
int KREPLYABSELEMTYPEFACE = 2;
|
||||
int KREPLYABSELEMTYPEPIC = 3;
|
||||
int KREPLYABSELEMTYPETEXT = 1;
|
||||
int KREPLYABSELEMTYPEUNKNOWN = 0;
|
||||
int KREPLYATMEMSGTYPEINMSGBOX = 1002;
|
||||
int KRMDOWNTYPEORIG = 1;
|
||||
int KRMDOWNTYPETHUMB = 2;
|
||||
int KRMDOWNTYPEUNKNOWN = 0;
|
||||
int KRMFILETHUMBSIZE128 = 128;
|
||||
int KRMFILETHUMBSIZE320 = 320;
|
||||
int KRMFILETHUMBSIZE384 = 384;
|
||||
int KRMFILETHUMBSIZE750 = 750;
|
||||
int KRMPICAIOTHUMBSIZE = 0;
|
||||
int KRMPICTHUMBSIZE198 = 198;
|
||||
int KRMPICTHUMBSIZE720 = 720;
|
||||
int KRMPICTYPEBMP = 3;
|
||||
int KRMPICTYPECHECKOTHER = 900;
|
||||
int KRMPICTYPEGIF = 2;
|
||||
int KRMPICTYPEJPG = 0;
|
||||
int KRMPICTYPENEWPICAPNG = 2001;
|
||||
int KRMPICTYPENEWPICBMP = 1005;
|
||||
int KRMPICTYPENEWPICGIF = 2000;
|
||||
int KRMPICTYPENEWPICJPEG = 1000;
|
||||
int KRMPICTYPENEWPICPNG = 1001;
|
||||
int KRMPICTYPENEWPICPROGERSSIVJPEG = 1003;
|
||||
int KRMPICTYPENEWPICSHARPP = 1004;
|
||||
int KRMPICTYPENEWPICWEBP = 1002;
|
||||
int KRMPICTYPEPNG = 1;
|
||||
int KRMPICTYPEUNKOWN = 0;
|
||||
int KRMTHUMBSIZEZERO = 0;
|
||||
int KRMTRNASFERSTATUSDOWNLOADING = 3;
|
||||
int KRMTRNASFERSTATUSFAIL = 5;
|
||||
int KRMTRNASFERSTATUSINIT = 1;
|
||||
int KRMTRNASFERSTATUSSUC = 4;
|
||||
int KRMTRNASFERSTATUSUNKOW = 0;
|
||||
int KRMTRNASFERSTATUSUPLOADING = 2;
|
||||
int KRMTRNASFERSTATUSUSERCANCEL = 6;
|
||||
int KSEEKINGPARTNERFLAGSEEKING = 1;
|
||||
int KSEEKINGPARTNERFLAGUNKNOWN = 0;
|
||||
int KSENDSTATUSFAILED = 0;
|
||||
int KSENDSTATUSSENDING = 1;
|
||||
int KSENDSTATUSSUCCESS = 2;
|
||||
int KSENDSTATUSSUCCESSNOSEQ = 3;
|
||||
int KSENDTYPEDROPPED = 6;
|
||||
int KSENDTYPELOCAL = 3;
|
||||
int KSENDTYPEOTHERDEVICE = 2;
|
||||
int KSENDTYPERECV = 0;
|
||||
int KSENDTYPESELF = 1;
|
||||
int KSENDTYPESELFFORWARD = 4;
|
||||
int KSENDTYPESELFMULTIFORWARD = 5;
|
||||
int KSESSIONTYPEADDRESSBOOK = 5;
|
||||
int KSESSIONTYPEC2C = 1;
|
||||
int KSESSIONTYPEDISC = 3;
|
||||
int KSESSIONTYPEFAV = 41;
|
||||
int KSESSIONTYPEGROUP = 2;
|
||||
int KSESSIONTYPEGROUPBLESS = 52;
|
||||
int KSESSIONTYPEGUILD = 4;
|
||||
int KSESSIONTYPEGUILDMETA = 16;
|
||||
int KSESSIONTYPENEARBYPRO = 54;
|
||||
int KSESSIONTYPEQQNOTIFY = 51;
|
||||
int KSESSIONTYPERELATEACCOUNT = 50;
|
||||
int KSESSIONTYPESERVICEASSISTANT = 19;
|
||||
int KSESSIONTYPESUBSCRIBEFOLDER = 30;
|
||||
int KSESSIONTYPETYPEBUDDYNOTIFY = 7;
|
||||
int KSESSIONTYPETYPEGROUPHELPER = 9;
|
||||
int KSESSIONTYPETYPEGROUPNOTIFY = 8;
|
||||
int KSESSIONTYPEUNKNOWN = 0;
|
||||
int KSESSIONTYPEWEIYUN = 40;
|
||||
int KSPECIALCAREMSGTYPEINMSGBOX = 1006;
|
||||
int KSPECIFIEDREDENVELOPEATMEMSGTYPEINMSGBOX = 1004;
|
||||
int KSPECIFIEDREDENVELOPEATONEMSGTYPEINMSGBOX = 1003;
|
||||
int KTENCENTDOCTYPEADDON = 110;
|
||||
int KTENCENTDOCTYPEDOC = 0;
|
||||
int KTENCENTDOCTYPEDRAWING = 89;
|
||||
int KTENCENTDOCTYPEDRIVE = 101;
|
||||
int KTENCENTDOCTYPEFILE = 100;
|
||||
int KTENCENTDOCTYPEFLOWCHART = 91;
|
||||
int KTENCENTDOCTYPEFOLDER = 3;
|
||||
int KTENCENTDOCTYPEFORM = 2;
|
||||
int KTENCENTDOCTYPEMIND = 90;
|
||||
int KTENCENTDOCTYPENOTES = 5;
|
||||
int KTENCENTDOCTYPEPDF = 6;
|
||||
int KTENCENTDOCTYPEPROGRAM = 7;
|
||||
int KTENCENTDOCTYPESHEET = 1;
|
||||
int KTENCENTDOCTYPESLIDE = 4;
|
||||
int KTENCENTDOCTYPESMARTCANVAS = 8;
|
||||
int KTENCENTDOCTYPESMARTSHEET = 9;
|
||||
int KTENCENTDOCTYPESPEECH = 102;
|
||||
int KTENCENTDOCTYPEUNKNOWN = 10;
|
||||
int KTOFURECORDMSG = 23;
|
||||
int KTOPMSGTYPETASK = 1;
|
||||
int KTOPMSGTYPEUNKNOWN = 0;
|
||||
int KTRIGGERTYPEAUTO = 1;
|
||||
int KTRIGGERTYPEMANUAL = 0;
|
||||
int KUNKNOWN = 0;
|
||||
int KUNKNOWNTYPEINMSGBOX = 0;
|
||||
int KUNREADCNTUPTYPEALLDIRECTSESSION = 4;
|
||||
int KUNREADCNTUPTYPEALLFEEDSINGUILD = 6;
|
||||
int KUNREADCNTUPTYPEALLGUILD = 3;
|
||||
int KUNREADCNTUPTYPECATEGORY = 5;
|
||||
int KUNREADCNTUPTYPECHANNEL = 1;
|
||||
int KUNREADCNTUPTYPECONTACT = 0;
|
||||
int KUNREADCNTUPTYPEGUILD = 2;
|
||||
int KUNREADCNTUPTYPEGUILDGROUP = 7;
|
||||
int KUNREADSHOWTTYPEGRAYPOINT = 2;
|
||||
int KUNREADSHOWTYPEREDPOINT = 1;
|
||||
int KUNREADSHOWTYPESMALLGRAYPOINT = 4;
|
||||
int KUNREADSHOWTYPESMALLREDPOINT = 3;
|
||||
int KUNREADSHOWTYPEUNKNOWN = 0;
|
||||
int KVASGIFTCOINTYPECOIN = 0;
|
||||
int KVASGIFTCOINTYPEMARKETCOIN = 1;
|
||||
int KYOLOGAMERESULTMSG = 18;
|
||||
int PIC_800_RECOMMENDED = 7;
|
||||
int PIC_AIGC_EMOJI = 14;
|
||||
int PIC_ALBUM_GIF = 11;
|
||||
int PIC_COMMERCIAL_ADVERTISING = 9;
|
||||
int PIC_FIND = 10;
|
||||
int PIC_HOT = 2;
|
||||
int PIC_HOT_EMOJI = 13;
|
||||
int PIC_NORMAL = 0;
|
||||
int PIC_PK = 3;
|
||||
int PIC_QQZONE = 5;
|
||||
int PIC_SELFIE_GIF = 8;
|
||||
int PIC_SEND_FROM_TAB_SEARCH_BOX = 12;
|
||||
int PIC_USER = 1;
|
||||
int PIC_WISDOM_FIGURE = 4;
|
||||
int REPLYORIGINALMSGSTATEHASRECALL = 1;
|
||||
int REPLYORIGINALMSGSTATEUNKNOWN = 0;
|
||||
int SHARELOCATIONELEMSUBTYPENORMAL = 1;
|
||||
int SHARELOCATIONELEMSUBTYPEUNKNOWN = 0;
|
||||
int TEXTELEMENTSUBTYPELINK = 1;
|
||||
int TEXTELEMENTSUBTYPETENCENTDOC = 2;
|
||||
int TEXTELEMENTSUBTYPEUNKNOWN = 0;
|
||||
```
|
24
docs/develop/参与开发.md
Normal file
24
docs/develop/参与开发.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# 前排提示
|
||||
由于Core未处于开源,非组织人员无法参与Core开发,此处为Core开发提示
|
||||
|
||||
# 准备工具
|
||||
frida ida-pro jadx x64dbg ce 内部调试脚本
|
||||
|
||||
## ida-pro
|
||||
1. 用于快速分析入参和返回类型
|
||||
2. 通过静态QLog推测语义
|
||||
3. 提取Listener与Service (常用)
|
||||
## frida
|
||||
1. 用于动态获取QLog推测语义
|
||||
2. 捕捉Native函数 实际入参与数据 分析中间流程
|
||||
|
||||
## jadx
|
||||
1. 通过其它平台实现 静态获取QLog推测语义
|
||||
2. 提供部分未调用代码 参考
|
||||
|
||||
## x64dbg
|
||||
1. 验证IDA的Hook点
|
||||
|
||||
## 内部脚本
|
||||
1. 提取Listener与Service (不调用无类型 不推荐)
|
||||
2. 获取NT调用流程
|
1
docs/develop/碎碎的研究记录.md
Normal file
1
docs/develop/碎碎的研究记录.md
Normal file
@@ -0,0 +1 @@
|
||||
getMsgUniqueId 传入时间 产出一个唯一ID 发送消息作为一个参数
|
16
package.json
16
package.json
@@ -2,7 +2,7 @@
|
||||
"name": "napcat",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"version": "1.4.7",
|
||||
"version": "1.6.3",
|
||||
"scripts": {
|
||||
"watch:dev": "vite --mode development",
|
||||
"watch:prod": "vite --mode production",
|
||||
@@ -18,7 +18,13 @@
|
||||
"depend": "cd dist && npm install --omit=dev"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.24.7",
|
||||
"@babel/preset-typescript": "^7.24.7",
|
||||
"vite-plugin-babel": "^1.2.0",
|
||||
"@babel/plugin-proposal-class-properties": "^7.18.6",
|
||||
"@babel/plugin-proposal-decorators": "^7.24.7",
|
||||
"@log4js-node/log4js-api": "^1.0.2",
|
||||
"@protobuf-ts/plugin": "^2.9.4",
|
||||
"@rollup/plugin-node-resolve": "^15.2.3",
|
||||
"@rollup/plugin-typescript": "^11.1.6",
|
||||
"@types/cors": "^2.8.17",
|
||||
@@ -27,7 +33,7 @@
|
||||
"@types/fluent-ffmpeg": "^2.1.24",
|
||||
"@types/node": "^20.11.30",
|
||||
"@types/qrcode-terminal": "^0.12.2",
|
||||
"@types/uuid": "^9.0.8",
|
||||
"@types/uuid": "^10.0.0",
|
||||
"@types/ws": "^8.5.10",
|
||||
"@typescript-eslint/eslint-plugin": "^7.4.0",
|
||||
"@typescript-eslint/parser": "^7.4.0",
|
||||
@@ -43,11 +49,11 @@
|
||||
"vite": "^5.2.6",
|
||||
"vite-plugin-cp": "^4.0.8",
|
||||
"vite-plugin-dts": "^3.8.2",
|
||||
"vite-tsconfig-paths": "^4.3.2",
|
||||
"@protobuf-ts/plugin": "^2.9.4"
|
||||
"vite-tsconfig-paths": "^4.3.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"ajv": "^8.13.0",
|
||||
"chalk": "^5.3.0",
|
||||
"commander": "^12.0.0",
|
||||
"cors": "^2.8.5",
|
||||
"express": "^5.0.0-beta.2",
|
||||
@@ -60,7 +66,7 @@
|
||||
"qrcode-terminal": "^0.12.0",
|
||||
"silk-wasm": "^3.3.4",
|
||||
"sqlite3": "^5.1.7",
|
||||
"uuid": "^9.0.1",
|
||||
"uuid": "^10.0.0",
|
||||
"ws": "^8.16.0"
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
import { sleep } from '@/common/utils/helper';
|
||||
|
||||
import { logError } from './log';
|
||||
type AsyncQueueTask = (() => void) | (()=>Promise<void>);
|
||||
|
||||
|
||||
@@ -26,7 +26,8 @@ export class AsyncQueue {
|
||||
await taskRet;
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
// console.error(e);
|
||||
logError(e);
|
||||
}
|
||||
this.tasks.shift();
|
||||
await sleep(100);
|
||||
|
@@ -1,181 +1,182 @@
|
||||
import { NodeIKernelMsgListener } from "@/core";
|
||||
import { NodeIQQNTWrapperSession } from "@/core/wrapper";
|
||||
import { randomUUID } from "crypto";
|
||||
|
||||
interface Internal_MapKey {
|
||||
timeout: number,
|
||||
createtime: number,
|
||||
func: Function
|
||||
}
|
||||
|
||||
export class ListenerClassBase {
|
||||
[key: string]: string;
|
||||
}
|
||||
|
||||
export interface ListenerIBase {
|
||||
// eslint-disable-next-line @typescript-eslint/no-misused-new
|
||||
new(listener: any): ListenerClassBase;
|
||||
}
|
||||
|
||||
export class NTEventWrapper {
|
||||
|
||||
private ListenerMap: { [key: string]: ListenerIBase } | undefined;//ListenerName-Unique -> Listener构造函数
|
||||
private WrapperSession: NodeIQQNTWrapperSession | undefined;//WrapperSession
|
||||
private ListenerManger: Map<string, ListenerClassBase> = new Map<string, ListenerClassBase>(); //ListenerName-Unique -> Listener实例
|
||||
private EventTask = new Map<string, Map<string, Map<string, Internal_MapKey>>>();//tasks ListenerMainName -> ListenerSubName-> uuid -> {timeout,createtime,func}
|
||||
constructor() {
|
||||
|
||||
}
|
||||
createProxyDispatch(ListenerMainName: string) {
|
||||
let current = this;
|
||||
return new Proxy({}, {
|
||||
get(target: any, prop: any, receiver: any) {
|
||||
// console.log('get', prop, typeof target[prop]);
|
||||
if (typeof target[prop] === 'undefined') {
|
||||
// 如果方法不存在,返回一个函数,这个函数调用existentMethod
|
||||
return (...args: any[]) => {
|
||||
current.DispatcherListener.apply(current, [ListenerMainName, prop, ...args]).then();
|
||||
};
|
||||
}
|
||||
// 如果方法存在,正常返回
|
||||
return Reflect.get(target, prop, receiver);
|
||||
}
|
||||
});
|
||||
}
|
||||
init({ ListenerMap, WrapperSession }: { ListenerMap: { [key: string]: typeof ListenerClassBase }, WrapperSession: NodeIQQNTWrapperSession }) {
|
||||
this.ListenerMap = ListenerMap;
|
||||
this.WrapperSession = WrapperSession;
|
||||
}
|
||||
CreatEventFunction<T extends (...args: any) => any>(eventName: string): T | undefined {
|
||||
let eventNameArr = eventName.split('/');
|
||||
type eventType = {
|
||||
[key: string]: () => { [key: string]: (...params: Parameters<T>) => Promise<ReturnType<T>> }
|
||||
}
|
||||
if (eventNameArr.length > 1) {
|
||||
let serviceName = 'get' + eventNameArr[0].replace('NodeIKernel', '');
|
||||
let eventName = eventNameArr[1];
|
||||
//getNodeIKernelGroupListener,GroupService
|
||||
//console.log('2', eventName);
|
||||
let services = (this.WrapperSession as unknown as eventType)[serviceName]();
|
||||
let event = services[eventName];
|
||||
//重新绑定this
|
||||
event = event.bind(services);
|
||||
if (event) {
|
||||
return event as T;
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
}
|
||||
CreatListenerFunction<T>(listenerMainName: string, uniqueCode: string = ""): T {
|
||||
let ListenerType = this.ListenerMap![listenerMainName];
|
||||
let Listener = this.ListenerManger.get(listenerMainName + uniqueCode);
|
||||
if (!Listener && ListenerType) {
|
||||
Listener = new ListenerType(this.createProxyDispatch(listenerMainName));
|
||||
let ServiceSubName = listenerMainName.match(/^NodeIKernel(.*?)Listener$/)![1];
|
||||
let Service = "NodeIKernel" + ServiceSubName + "Service/addKernel" + ServiceSubName + "Listener";
|
||||
let addfunc = this.CreatEventFunction<(listener: T) => number>(Service);
|
||||
addfunc!(Listener as T);
|
||||
//console.log(addfunc!(Listener as T));
|
||||
this.ListenerManger.set(listenerMainName + uniqueCode, Listener);
|
||||
}
|
||||
return Listener as T;
|
||||
}
|
||||
//统一回调清理事件
|
||||
async DispatcherListener(ListenerMainName: string, ListenerSubName: string, ...args: any[]) {
|
||||
//console.log(ListenerMainName, this.EventTask.get(ListenerMainName), ListenerSubName, this.EventTask.get(ListenerMainName)?.get(ListenerSubName));
|
||||
this.EventTask.get(ListenerMainName)?.get(ListenerSubName)?.forEach((task, uuid) => {
|
||||
//console.log(task.func, uuid, task.createtime, task.timeout);
|
||||
if (task.createtime + task.timeout < Date.now()) {
|
||||
this.EventTask.get(ListenerMainName)?.get(ListenerSubName)?.delete(uuid);
|
||||
return;
|
||||
}
|
||||
task.func(...args);
|
||||
})
|
||||
}
|
||||
async CallNoListenerEvent<EventType extends (...args: any[]) => Promise<any>,>(EventName = '', timeout: number = 3000, ...args: Parameters<EventType>) {
|
||||
return new Promise<ReturnType<EventType>>(async (resolve, reject) => {
|
||||
let EventFunc = this.CreatEventFunction<EventType>(EventName);
|
||||
let complete = false;
|
||||
let Timeouter = setTimeout(() => {
|
||||
if (!complete) {
|
||||
reject(new Error('NTEvent EventName:' + EventName + ' timeout'));
|
||||
}
|
||||
}, timeout);
|
||||
let retData = await EventFunc!(...args);
|
||||
complete = true;
|
||||
resolve(retData);
|
||||
});
|
||||
}
|
||||
async CallNormalEvent<EventType extends (...args: any[]) => Promise<any>, ListenerType extends (...args: any[]) => void>(EventName = '', ListenerName = '', waitTimes = 1, timeout: number = 3000, ...args: Parameters<EventType>) {
|
||||
return new Promise<[EventRet: Awaited<ReturnType<EventType>>, ...Parameters<ListenerType>]>(async (resolve, reject) => {
|
||||
const id = randomUUID();
|
||||
let complete = 0;
|
||||
let retData: ArrayLike<Parameters<ListenerType>> | undefined = undefined;
|
||||
let retEvent: any = {};
|
||||
let databack = () => {
|
||||
if (complete < waitTimes) {
|
||||
reject(new Error('NTEvent EventName:' + EventName + ' ListenerName:' + ListenerName + ' timeout'));
|
||||
} else {
|
||||
|
||||
resolve([retEvent as Awaited<ReturnType<EventType>>, ...(retData as Parameters<ListenerType>)]);
|
||||
}
|
||||
}
|
||||
let Timeouter = setTimeout(databack, timeout);
|
||||
|
||||
let ListenerNameList = ListenerName.split('/');
|
||||
let ListenerMainName = ListenerNameList[0];
|
||||
let ListenerSubName = ListenerNameList[1];
|
||||
let eventCallbak = {
|
||||
timeout: timeout,
|
||||
createtime: Date.now(),
|
||||
func: (...args: any[]) => {
|
||||
complete++;
|
||||
//console.log('func', ...args);
|
||||
retData = args as ArrayLike<Parameters<ListenerType>>;
|
||||
if (complete >= waitTimes) {
|
||||
clearTimeout(Timeouter);
|
||||
databack();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!this.EventTask.get(ListenerMainName)) {
|
||||
this.EventTask.set(ListenerMainName, new Map());
|
||||
}
|
||||
if (!(this.EventTask.get(ListenerMainName)?.get(ListenerSubName))) {
|
||||
this.EventTask.get(ListenerMainName)?.set(ListenerSubName, new Map());
|
||||
}
|
||||
this.EventTask.get(ListenerMainName)?.get(ListenerSubName)?.set(id, eventCallbak);
|
||||
this.CreatListenerFunction(ListenerMainName);
|
||||
let EventFunc = this.CreatEventFunction<EventType>(EventName);
|
||||
retEvent = await EventFunc!(...args);
|
||||
});
|
||||
}
|
||||
}
|
||||
export const NTEventDispatch = new NTEventWrapper();
|
||||
|
||||
// 示例代码 快速创建事件
|
||||
// let NTEvent = new NTEventWrapper();
|
||||
// let TestEvent = NTEvent.CreatEventFunction<(force: boolean) => Promise<Number>>('NodeIKernelProfileLikeService/GetTest');
|
||||
// if (TestEvent) {
|
||||
// TestEvent(true);
|
||||
// }
|
||||
|
||||
// 示例代码 快速创建监听Listener类
|
||||
// let NTEvent = new NTEventWrapper();
|
||||
// NTEvent.CreatListenerFunction<NodeIKernelMsgListener>('NodeIKernelMsgListener', 'core')
|
||||
|
||||
|
||||
// 调用接口
|
||||
//let NTEvent = new NTEventWrapper();
|
||||
//let ret = await NTEvent.CallNormalEvent<(force: boolean) => Promise<Number>, (data1: string, data2: number) => void>('NodeIKernelProfileLikeService/GetTest', 'NodeIKernelMsgListener/onAddSendMsg', 1, 3000, true);
|
||||
|
||||
// 注册监听 解除监听
|
||||
// NTEventDispatch.RigisterListener('NodeIKernelMsgListener/onAddSendMsg','core',cb);
|
||||
// NTEventDispatch.UnRigisterListener('NodeIKernelMsgListener/onAddSendMsg','core');
|
||||
|
||||
// let GetTest = NTEventDispatch.CreatEvent('NodeIKernelProfileLikeService/GetTest','NodeIKernelMsgListener/onAddSendMsg',Mode);
|
||||
// GetTest('test');
|
||||
|
||||
// always模式
|
||||
import { NodeIKernelMsgListener } from '@/core';
|
||||
import { NodeIQQNTWrapperSession } from '@/core/wrapper';
|
||||
import { randomUUID } from 'crypto';
|
||||
|
||||
interface Internal_MapKey {
|
||||
timeout: number,
|
||||
createtime: number,
|
||||
func: (...arg: any[]) => any,
|
||||
}
|
||||
|
||||
export class ListenerClassBase {
|
||||
[key: string]: string;
|
||||
}
|
||||
|
||||
export interface ListenerIBase {
|
||||
// eslint-disable-next-line @typescript-eslint/no-misused-new
|
||||
new(listener: any): ListenerClassBase;
|
||||
}
|
||||
|
||||
export class NTEventWrapper {
|
||||
|
||||
private ListenerMap: { [key: string]: ListenerIBase } | undefined;//ListenerName-Unique -> Listener构造函数
|
||||
private WrapperSession: NodeIQQNTWrapperSession | undefined;//WrapperSession
|
||||
private ListenerManger: Map<string, ListenerClassBase> = new Map<string, ListenerClassBase>(); //ListenerName-Unique -> Listener实例
|
||||
private EventTask = new Map<string, Map<string, Map<string, Internal_MapKey>>>();//tasks ListenerMainName -> ListenerSubName-> uuid -> {timeout,createtime,func}
|
||||
constructor() {
|
||||
|
||||
}
|
||||
createProxyDispatch(ListenerMainName: string) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
||||
const current = this;
|
||||
return new Proxy({}, {
|
||||
get(target: any, prop: any, receiver: any) {
|
||||
// console.log('get', prop, typeof target[prop]);
|
||||
if (typeof target[prop] === 'undefined') {
|
||||
// 如果方法不存在,返回一个函数,这个函数调用existentMethod
|
||||
return (...args: any[]) => {
|
||||
current.DispatcherListener.apply(current, [ListenerMainName, prop, ...args]).then();
|
||||
};
|
||||
}
|
||||
// 如果方法存在,正常返回
|
||||
return Reflect.get(target, prop, receiver);
|
||||
}
|
||||
});
|
||||
}
|
||||
init({ ListenerMap, WrapperSession }: { ListenerMap: { [key: string]: typeof ListenerClassBase }, WrapperSession: NodeIQQNTWrapperSession }) {
|
||||
this.ListenerMap = ListenerMap;
|
||||
this.WrapperSession = WrapperSession;
|
||||
}
|
||||
CreatEventFunction<T extends (...args: any) => any>(eventName: string): T | undefined {
|
||||
const eventNameArr = eventName.split('/');
|
||||
type eventType = {
|
||||
[key: string]: () => { [key: string]: (...params: Parameters<T>) => Promise<ReturnType<T>> }
|
||||
}
|
||||
if (eventNameArr.length > 1) {
|
||||
const serviceName = 'get' + eventNameArr[0].replace('NodeIKernel', '');
|
||||
const eventName = eventNameArr[1];
|
||||
//getNodeIKernelGroupListener,GroupService
|
||||
//console.log('2', eventName);
|
||||
const services = (this.WrapperSession as unknown as eventType)[serviceName]();
|
||||
let event = services[eventName];
|
||||
//重新绑定this
|
||||
event = event.bind(services);
|
||||
if (event) {
|
||||
return event as T;
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
}
|
||||
CreatListenerFunction<T>(listenerMainName: string, uniqueCode: string = ''): T {
|
||||
const ListenerType = this.ListenerMap![listenerMainName];
|
||||
let Listener = this.ListenerManger.get(listenerMainName + uniqueCode);
|
||||
if (!Listener && ListenerType) {
|
||||
Listener = new ListenerType(this.createProxyDispatch(listenerMainName));
|
||||
const ServiceSubName = listenerMainName.match(/^NodeIKernel(.*?)Listener$/)![1];
|
||||
const Service = 'NodeIKernel' + ServiceSubName + 'Service/addKernel' + ServiceSubName + 'Listener';
|
||||
const addfunc = this.CreatEventFunction<(listener: T) => number>(Service);
|
||||
addfunc!(Listener as T);
|
||||
//console.log(addfunc!(Listener as T));
|
||||
this.ListenerManger.set(listenerMainName + uniqueCode, Listener);
|
||||
}
|
||||
return Listener as T;
|
||||
}
|
||||
//统一回调清理事件
|
||||
async DispatcherListener(ListenerMainName: string, ListenerSubName: string, ...args: any[]) {
|
||||
//console.log(ListenerMainName, this.EventTask.get(ListenerMainName), ListenerSubName, this.EventTask.get(ListenerMainName)?.get(ListenerSubName));
|
||||
this.EventTask.get(ListenerMainName)?.get(ListenerSubName)?.forEach((task, uuid) => {
|
||||
//console.log(task.func, uuid, task.createtime, task.timeout);
|
||||
if (task.createtime + task.timeout < Date.now()) {
|
||||
this.EventTask.get(ListenerMainName)?.get(ListenerSubName)?.delete(uuid);
|
||||
return;
|
||||
}
|
||||
task.func(...args);
|
||||
});
|
||||
}
|
||||
async CallNoListenerEvent<EventType extends (...args: any[]) => Promise<any>,>(EventName = '', timeout: number = 3000, ...args: Parameters<EventType>) {
|
||||
return new Promise<Awaited<ReturnType<EventType>>>(async (resolve, reject) => {
|
||||
const EventFunc = this.CreatEventFunction<EventType>(EventName);
|
||||
let complete = false;
|
||||
const Timeouter = setTimeout(() => {
|
||||
if (!complete) {
|
||||
reject(new Error('NTEvent EventName:' + EventName + ' timeout'));
|
||||
}
|
||||
}, timeout);
|
||||
const retData = await EventFunc!(...args);
|
||||
complete = true;
|
||||
resolve(retData);
|
||||
});
|
||||
}
|
||||
async CallNormalEvent<EventType extends (...args: any[]) => Promise<any>, ListenerType extends (...args: any[]) => void>(EventName = '', ListenerName = '', waitTimes = 1, timeout: number = 3000, ...args: Parameters<EventType>) {
|
||||
return new Promise<[EventRet: Awaited<ReturnType<EventType>>, ...Parameters<ListenerType>]>(async (resolve, reject) => {
|
||||
const id = randomUUID();
|
||||
let complete = 0;
|
||||
let retData: Parameters<ListenerType> | undefined = undefined;
|
||||
let retEvent: any = {};
|
||||
const databack = () => {
|
||||
if (complete < waitTimes) {
|
||||
reject(new Error('NTEvent EventName:' + EventName + ' ListenerName:' + ListenerName + ' timeout'));
|
||||
} else {
|
||||
resolve([retEvent as Awaited<ReturnType<EventType>>, ...retData!]);
|
||||
}
|
||||
};
|
||||
const Timeouter = setTimeout(databack, timeout);
|
||||
|
||||
const ListenerNameList = ListenerName.split('/');
|
||||
const ListenerMainName = ListenerNameList[0];
|
||||
const ListenerSubName = ListenerNameList[1];
|
||||
const eventCallbak = {
|
||||
timeout: timeout,
|
||||
createtime: Date.now(),
|
||||
func: (...args: any[]) => {
|
||||
complete++;
|
||||
//console.log('func', ...args);
|
||||
retData = args as Parameters<ListenerType>;
|
||||
if (complete >= waitTimes) {
|
||||
clearTimeout(Timeouter);
|
||||
databack();
|
||||
}
|
||||
}
|
||||
};
|
||||
if (!this.EventTask.get(ListenerMainName)) {
|
||||
this.EventTask.set(ListenerMainName, new Map());
|
||||
}
|
||||
if (!(this.EventTask.get(ListenerMainName)?.get(ListenerSubName))) {
|
||||
this.EventTask.get(ListenerMainName)?.set(ListenerSubName, new Map());
|
||||
}
|
||||
this.EventTask.get(ListenerMainName)?.get(ListenerSubName)?.set(id, eventCallbak);
|
||||
this.CreatListenerFunction(ListenerMainName);
|
||||
const EventFunc = this.CreatEventFunction<EventType>(EventName);
|
||||
//console.log("测试打点", args);
|
||||
retEvent = await EventFunc!(...(args as any[]));
|
||||
});
|
||||
}
|
||||
}
|
||||
export const NTEventDispatch = new NTEventWrapper();
|
||||
|
||||
// 示例代码 快速创建事件
|
||||
// let NTEvent = new NTEventWrapper();
|
||||
// let TestEvent = NTEvent.CreatEventFunction<(force: boolean) => Promise<Number>>('NodeIKernelProfileLikeService/GetTest');
|
||||
// if (TestEvent) {
|
||||
// TestEvent(true);
|
||||
// }
|
||||
|
||||
// 示例代码 快速创建监听Listener类
|
||||
// let NTEvent = new NTEventWrapper();
|
||||
// NTEvent.CreatListenerFunction<NodeIKernelMsgListener>('NodeIKernelMsgListener', 'core')
|
||||
|
||||
|
||||
// 调用接口
|
||||
//let NTEvent = new NTEventWrapper();
|
||||
//let ret = await NTEvent.CallNormalEvent<(force: boolean) => Promise<Number>, (data1: string, data2: number) => void>('NodeIKernelProfileLikeService/GetTest', 'NodeIKernelMsgListener/onAddSendMsg', 1, 3000, true);
|
||||
|
||||
// 注册监听 解除监听
|
||||
// NTEventDispatch.RigisterListener('NodeIKernelMsgListener/onAddSendMsg','core',cb);
|
||||
// NTEventDispatch.UnRigisterListener('NodeIKernelMsgListener/onAddSendMsg','core');
|
||||
|
||||
// let GetTest = NTEventDispatch.CreatEvent('NodeIKernelProfileLikeService/GetTest','NodeIKernelMsgListener/onAddSendMsg',Mode);
|
||||
// GetTest('test');
|
||||
|
||||
// always模式
|
||||
// NTEventDispatch.CreatEvent('NodeIKernelProfileLikeService/GetTest','NodeIKernelMsgListener/onAddSendMsg',Mode,(...args:any[])=>{ console.log(args) });
|
@@ -1,145 +1,145 @@
|
||||
import { logError, logDebug } from "@/common/utils/log";
|
||||
|
||||
type group_id = number;
|
||||
type user_id = number;
|
||||
|
||||
class cacheNode<T> {
|
||||
value: T;
|
||||
groupId: group_id;
|
||||
userId: user_id;
|
||||
prev: cacheNode<T> | null;
|
||||
next: cacheNode<T> | null;
|
||||
timestamp: number;
|
||||
|
||||
constructor(groupId: group_id, userId: user_id, value: T) {
|
||||
this.groupId = groupId;
|
||||
this.userId = userId;
|
||||
this.value = value;
|
||||
this.prev = null;
|
||||
this.next = null;
|
||||
this.timestamp = Date.now();
|
||||
}
|
||||
}
|
||||
|
||||
type cache<T> = { [key: group_id]: { [key: user_id]: cacheNode<T> } };
|
||||
class LRU<T> {
|
||||
private maxAge: number;
|
||||
private maxSize: number;
|
||||
private currentSize: number;
|
||||
private cache: cache<T>;
|
||||
private head: cacheNode<T> | null = null;
|
||||
private tail: cacheNode<T> | null = null;
|
||||
private onFuncs: ((node: cacheNode<T>) => void)[] = [];
|
||||
|
||||
constructor(maxAge: number = 2e4, maxSize: number = 5e3) {
|
||||
this.maxAge = maxAge;
|
||||
this.maxSize = maxSize;
|
||||
this.cache = Object.create(null);
|
||||
this.currentSize = 0;
|
||||
|
||||
if (maxSize == 0) return;
|
||||
setInterval(() => this.removeExpired(), this.maxAge);
|
||||
}
|
||||
|
||||
// 移除LRU节点
|
||||
private removeLRUNode(node: cacheNode<T>) {
|
||||
logDebug(
|
||||
"removeLRUNode",
|
||||
node.groupId,
|
||||
node.userId,
|
||||
node.value,
|
||||
this.currentSize
|
||||
);
|
||||
node.prev = node.next = null;
|
||||
delete this.cache[node.groupId][node.userId];
|
||||
this.removeNode(node);
|
||||
this.onFuncs.forEach((func) => func(node));
|
||||
this.currentSize--;
|
||||
}
|
||||
|
||||
public on(func: (node: cacheNode<T>) => void) {
|
||||
this.onFuncs.push(func);
|
||||
}
|
||||
|
||||
private removeExpired() {
|
||||
const now = Date.now();
|
||||
let current = this.tail;
|
||||
const nodesToRemove: cacheNode<T>[] = [];
|
||||
let removedCount = 0;
|
||||
|
||||
// 收集需要删除的节点
|
||||
while (current && now - current.timestamp > this.maxAge) {
|
||||
nodesToRemove.push(current);
|
||||
current = current.prev;
|
||||
removedCount++;
|
||||
if (removedCount >= 100) break;
|
||||
}
|
||||
|
||||
// 更新链表指向
|
||||
if (nodesToRemove.length > 0) {
|
||||
const newTail = nodesToRemove[nodesToRemove.length - 1].prev;
|
||||
if (newTail) {
|
||||
newTail.next = null;
|
||||
} else {
|
||||
this.head = null;
|
||||
}
|
||||
this.tail = newTail;
|
||||
}
|
||||
|
||||
nodesToRemove.forEach((node) => {
|
||||
node.prev = node.next = null;
|
||||
delete this.cache[node.groupId][node.userId];
|
||||
|
||||
this.currentSize--;
|
||||
this.onFuncs.forEach((func) => func(node));
|
||||
});
|
||||
}
|
||||
|
||||
private addNode(node: cacheNode<T>) {
|
||||
node.next = this.head;
|
||||
if (this.head) this.head.prev = node;
|
||||
if (!this.tail) this.tail = node;
|
||||
this.head = node;
|
||||
}
|
||||
|
||||
private removeNode(node: cacheNode<T>) {
|
||||
if (node.prev) node.prev.next = node.next;
|
||||
if (node.next) node.next.prev = node.prev;
|
||||
if (node === this.head) this.head = node.next;
|
||||
if (node === this.tail) this.tail = node.prev;
|
||||
}
|
||||
|
||||
private moveToHead(node: cacheNode<T>) {
|
||||
if (this.head === node) return;
|
||||
|
||||
this.removeNode(node);
|
||||
this.addNode(node);
|
||||
node.prev = null;
|
||||
}
|
||||
|
||||
public set(groupId: group_id, userId: user_id, value: T) {
|
||||
if (!this.cache[groupId]) {
|
||||
this.cache[groupId] = Object.create(null);
|
||||
}
|
||||
|
||||
const groupObject = this.cache[groupId];
|
||||
|
||||
if (groupObject[userId]) {
|
||||
const node = groupObject[userId];
|
||||
node.value = value;
|
||||
node.timestamp = Date.now();
|
||||
this.moveToHead(node);
|
||||
} else {
|
||||
const node = new cacheNode(groupId, userId, value);
|
||||
groupObject[userId] = node;
|
||||
this.currentSize++;
|
||||
this.addNode(node);
|
||||
if (this.currentSize > this.maxSize) {
|
||||
const tail = this.tail!;
|
||||
this.removeLRUNode(tail);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default LRU;
|
||||
import { logError, logDebug } from '@/common/utils/log';
|
||||
|
||||
type group_id = number;
|
||||
type user_id = number;
|
||||
|
||||
class cacheNode<T> {
|
||||
value: T;
|
||||
groupId: group_id;
|
||||
userId: user_id;
|
||||
prev: cacheNode<T> | null;
|
||||
next: cacheNode<T> | null;
|
||||
timestamp: number;
|
||||
|
||||
constructor(groupId: group_id, userId: user_id, value: T) {
|
||||
this.groupId = groupId;
|
||||
this.userId = userId;
|
||||
this.value = value;
|
||||
this.prev = null;
|
||||
this.next = null;
|
||||
this.timestamp = Date.now();
|
||||
}
|
||||
}
|
||||
|
||||
type cache<T> = { [key: group_id]: { [key: user_id]: cacheNode<T> } };
|
||||
class LRU<T> {
|
||||
private maxAge: number;
|
||||
private maxSize: number;
|
||||
private currentSize: number;
|
||||
private cache: cache<T>;
|
||||
private head: cacheNode<T> | null = null;
|
||||
private tail: cacheNode<T> | null = null;
|
||||
private onFuncs: ((node: cacheNode<T>) => void)[] = [];
|
||||
|
||||
constructor(maxAge: number = 2e4, maxSize: number = 5e3) {
|
||||
this.maxAge = maxAge;
|
||||
this.maxSize = maxSize;
|
||||
this.cache = Object.create(null);
|
||||
this.currentSize = 0;
|
||||
|
||||
if (maxSize == 0) return;
|
||||
setInterval(() => this.removeExpired(), this.maxAge);
|
||||
}
|
||||
|
||||
// 移除LRU节点
|
||||
private removeLRUNode(node: cacheNode<T>) {
|
||||
logDebug(
|
||||
'removeLRUNode',
|
||||
node.groupId,
|
||||
node.userId,
|
||||
node.value,
|
||||
this.currentSize
|
||||
);
|
||||
node.prev = node.next = null;
|
||||
delete this.cache[node.groupId][node.userId];
|
||||
this.removeNode(node);
|
||||
this.onFuncs.forEach((func) => func(node));
|
||||
this.currentSize--;
|
||||
}
|
||||
|
||||
public on(func: (node: cacheNode<T>) => void) {
|
||||
this.onFuncs.push(func);
|
||||
}
|
||||
|
||||
private removeExpired() {
|
||||
const now = Date.now();
|
||||
let current = this.tail;
|
||||
const nodesToRemove: cacheNode<T>[] = [];
|
||||
let removedCount = 0;
|
||||
|
||||
// 收集需要删除的节点
|
||||
while (current && now - current.timestamp > this.maxAge) {
|
||||
nodesToRemove.push(current);
|
||||
current = current.prev;
|
||||
removedCount++;
|
||||
if (removedCount >= 100) break;
|
||||
}
|
||||
|
||||
// 更新链表指向
|
||||
if (nodesToRemove.length > 0) {
|
||||
const newTail = nodesToRemove[nodesToRemove.length - 1].prev;
|
||||
if (newTail) {
|
||||
newTail.next = null;
|
||||
} else {
|
||||
this.head = null;
|
||||
}
|
||||
this.tail = newTail;
|
||||
}
|
||||
|
||||
nodesToRemove.forEach((node) => {
|
||||
node.prev = node.next = null;
|
||||
delete this.cache[node.groupId][node.userId];
|
||||
|
||||
this.currentSize--;
|
||||
this.onFuncs.forEach((func) => func(node));
|
||||
});
|
||||
}
|
||||
|
||||
private addNode(node: cacheNode<T>) {
|
||||
node.next = this.head;
|
||||
if (this.head) this.head.prev = node;
|
||||
if (!this.tail) this.tail = node;
|
||||
this.head = node;
|
||||
}
|
||||
|
||||
private removeNode(node: cacheNode<T>) {
|
||||
if (node.prev) node.prev.next = node.next;
|
||||
if (node.next) node.next.prev = node.prev;
|
||||
if (node === this.head) this.head = node.next;
|
||||
if (node === this.tail) this.tail = node.prev;
|
||||
}
|
||||
|
||||
private moveToHead(node: cacheNode<T>) {
|
||||
if (this.head === node) return;
|
||||
|
||||
this.removeNode(node);
|
||||
this.addNode(node);
|
||||
node.prev = null;
|
||||
}
|
||||
|
||||
public set(groupId: group_id, userId: user_id, value: T) {
|
||||
if (!this.cache[groupId]) {
|
||||
this.cache[groupId] = Object.create(null);
|
||||
}
|
||||
|
||||
const groupObject = this.cache[groupId];
|
||||
|
||||
if (groupObject[userId]) {
|
||||
const node = groupObject[userId];
|
||||
node.value = value;
|
||||
node.timestamp = Date.now();
|
||||
this.moveToHead(node);
|
||||
} else {
|
||||
const node = new cacheNode(groupId, userId, value);
|
||||
groupObject[userId] = node;
|
||||
this.currentSize++;
|
||||
this.addNode(node);
|
||||
if (this.currentSize > this.maxSize) {
|
||||
const tail = this.tail!;
|
||||
this.removeLRUNode(tail);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default LRU;
|
||||
|
53
src/common/utils/MessageUnique.ts
Normal file
53
src/common/utils/MessageUnique.ts
Normal file
@@ -0,0 +1,53 @@
|
||||
import crypto from 'crypto';
|
||||
|
||||
class LimitedHashTable<K, V> {
|
||||
private keyToValue: Map<K, V> = new Map();
|
||||
private valueToKey: Map<V, K> = new Map();
|
||||
private maxSize: number;
|
||||
private KeyQueneList: K[] = [];
|
||||
private ValueQueneList: V[] = [];
|
||||
constructor(maxSize: number) {
|
||||
this.maxSize = maxSize;
|
||||
}
|
||||
set(key: K, value: V): void {
|
||||
this.keyToValue.set(key, value);
|
||||
this.valueToKey.set(value, key);
|
||||
if (this.KeyQueneList.length >= this.maxSize || this.ValueQueneList.length >= this.maxSize) {
|
||||
this.KeyQueneList.shift();
|
||||
this.ValueQueneList.shift();
|
||||
}
|
||||
}
|
||||
|
||||
getValue(key: K): V | undefined {
|
||||
return this.keyToValue.get(key);
|
||||
}
|
||||
|
||||
getKey(value: V): K | undefined {
|
||||
return this.valueToKey.get(value);
|
||||
}
|
||||
|
||||
delete(key: K): void {
|
||||
const value = this.keyToValue.get(key);
|
||||
if (value !== undefined) {
|
||||
this.keyToValue.delete(key);
|
||||
this.valueToKey.delete(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class MessageUniqueWrapper {
|
||||
private msgIdMap: LimitedHashTable<number, string> = new LimitedHashTable(1000);
|
||||
createMsg(MsgId: string) {
|
||||
const ShortId = parseInt(crypto.createHash('sha1').update('2345').digest('hex').slice(0, 8), 16);
|
||||
this.msgIdMap.set(ShortId, MsgId);
|
||||
return ShortId;
|
||||
}
|
||||
getMsgIdByShortId(ShortId: number) {
|
||||
return this.msgIdMap.getValue(ShortId);
|
||||
}
|
||||
getShortIdByMsgId(MsgId: string) {
|
||||
return this.msgIdMap.getKey(MsgId);
|
||||
}
|
||||
}
|
||||
|
||||
export const MessageUnique = new MessageUniqueWrapper();
|
17
src/common/utils/Packet.ts
Normal file
17
src/common/utils/Packet.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
// 方案一 MiniApp发包方案
|
||||
// 前置条件: 处于GUI环境 存在MiniApp
|
||||
|
||||
import { NTQQSystemApi } from '@/core';
|
||||
|
||||
// 前排提示: 开发验证仅Win平台开展
|
||||
export class MiniAppUtil {
|
||||
static async RunMiniAppWithGUI() {
|
||||
//process.env.ELECTRON_RUN_AS_NODE = undefined;//没用还是得自己用cpp之类的语言写个程序转发参数
|
||||
return NTQQSystemApi.BootMiniApp(process.execPath, 'miniapp://open/1007?url=https%3A%2F%2Fm.q.qq.com%2Fa%2Fs%2Fedd0a83d3b8afe233dfa07adaaf8033f%3Fscene%3D1007%26min_refer%3D10001');
|
||||
}
|
||||
}
|
||||
// 方案二 MiniApp发包方案 替代MiniApp方案
|
||||
// 前置条件: 无
|
||||
export class MojoMiniAppUtil{
|
||||
|
||||
}
|
@@ -2,6 +2,7 @@ import path from 'node:path';
|
||||
import fs from 'node:fs';
|
||||
import os from 'node:os';
|
||||
import { systemPlatform } from '@/common/utils/system';
|
||||
import { logError } from '@/common/utils/log';
|
||||
|
||||
export const exePath = process.execPath;
|
||||
|
||||
@@ -37,11 +38,11 @@ type QQVersionConfigInfo = {
|
||||
}
|
||||
|
||||
let _qqVersionConfigInfo: QQVersionConfigInfo = {
|
||||
'baseVersion': '9.9.9-23361',
|
||||
'curVersion': '9.9.9-23361',
|
||||
'baseVersion': '9.9.11-24568',
|
||||
'curVersion': '9.9.11-24568',
|
||||
'prevVersion': '',
|
||||
'onErrorVersions': [],
|
||||
'buildId': '23361'
|
||||
'buildId': '24568'
|
||||
};
|
||||
|
||||
if (fs.existsSync(configVersionInfoPath)) {
|
||||
@@ -49,12 +50,12 @@ if (fs.existsSync(configVersionInfoPath)) {
|
||||
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);
|
||||
logError('Load QQ version config info failed, Use default version', e);
|
||||
}
|
||||
}
|
||||
|
||||
export const qqVersionConfigInfo: QQVersionConfigInfo = _qqVersionConfigInfo;
|
||||
|
||||
//V1_WIN_NQ_9.9.11_24568_GW_B
|
||||
export const qqPkgInfo: QQPkgInfo = JSON.parse(fs.readFileSync(pkgInfoPath).toString());
|
||||
// platform_type: 3,
|
||||
// app_type: 4,
|
||||
@@ -64,9 +65,13 @@ export const qqPkgInfo: QQPkgInfo = JSON.parse(fs.readFileSync(pkgInfoPath).toSt
|
||||
// platVer: '10.0.26100',
|
||||
// clientVer: '9.9.9-23159',
|
||||
|
||||
let _appid: string = '537213803'; // 默认为 Windows 平台的 appid
|
||||
// Linux
|
||||
// app_version: '3.2.9-24568',
|
||||
// qua: 'V1_LNX_NQ_3.2.9_24568_GW_B',
|
||||
|
||||
let _appid: string = '537226369'; // 默认为 Windows 平台的 appid
|
||||
if (systemPlatform === 'linux') {
|
||||
_appid = '537213827';
|
||||
_appid = '537226441';
|
||||
}
|
||||
// todo: mac 平台的 appid
|
||||
export const appid = _appid;
|
||||
|
@@ -24,7 +24,7 @@ export async function encodeSilk(filePath: string) {
|
||||
const fileHeader = buffer.toString('hex', 0, bytesToRead);
|
||||
return fileHeader;
|
||||
} catch (err) {
|
||||
console.error('读取文件错误:', err);
|
||||
logError('读取文件错误:', err);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@@ -4,7 +4,6 @@ import fs from 'fs';
|
||||
import { dirname } from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = dirname(__filename);
|
||||
export function getModuleWithArchName(moduleName: string) {
|
||||
|
@@ -1,509 +1,449 @@
|
||||
import { ElementType, FileElement, PicElement, PttElement, RawMessage, VideoElement } from '../../core/src/entities';
|
||||
|
||||
import sqlite3 from 'sqlite3';
|
||||
import { log, logDebug, logError } from '@/common/utils/log';
|
||||
import { NTQQMsgApi } from '@/core';
|
||||
import LRU from "@/common/utils/LRUCache";
|
||||
|
||||
export interface IRember {
|
||||
last_sent_time: number;
|
||||
join_time: number;
|
||||
user_id: number;
|
||||
}
|
||||
|
||||
|
||||
type DBMsg = {
|
||||
id: number,
|
||||
shortId: number,
|
||||
longId: string,
|
||||
seq: number,
|
||||
peerUid: string,
|
||||
chatType: number,
|
||||
}
|
||||
|
||||
type DBFile = {
|
||||
name: string; // 文件名
|
||||
path: string;
|
||||
url: string;
|
||||
size: number;
|
||||
uuid: string;
|
||||
msgId: string;
|
||||
elementId: string;
|
||||
element: PicElement | VideoElement | FileElement | PttElement;
|
||||
elementType: ElementType.PIC | ElementType.VIDEO | ElementType.FILE | ElementType.PTT;
|
||||
}
|
||||
|
||||
|
||||
class DBUtilBase {
|
||||
protected db: sqlite3.Database | undefined;
|
||||
|
||||
async init(dbPath: string) {
|
||||
if (this.db) {
|
||||
return;
|
||||
}
|
||||
return new Promise<void>((resolve, reject) => {
|
||||
this.db = new sqlite3.Database(dbPath, sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, (err) => {
|
||||
if (err) {
|
||||
logError('Could not connect to database', err);
|
||||
reject(err);
|
||||
return;
|
||||
}
|
||||
this.createTable();
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
protected createTable() {
|
||||
throw new Error('Method not implemented.');
|
||||
}
|
||||
|
||||
close() {
|
||||
this.db?.close();
|
||||
}
|
||||
}
|
||||
|
||||
class DBUtil extends DBUtilBase {
|
||||
private msgCache: Map<string | number, RawMessage> = new Map<string | number, RawMessage>();
|
||||
private globalMsgShortId = -2147483640;
|
||||
private groupIds: number[] = [];
|
||||
private LURCache = new LRU<number>();
|
||||
private LastSentCache = new (class {
|
||||
private cache: { gid: number; uid: number }[] = [];
|
||||
private maxSize: number;
|
||||
|
||||
constructor(maxSize: number = 5000) {
|
||||
this.maxSize = maxSize;
|
||||
}
|
||||
|
||||
get(gid: number, uid: number): boolean {
|
||||
const exists = this.cache.some(
|
||||
(entry) => entry.gid === gid && entry.uid === uid
|
||||
);
|
||||
if (!exists) {
|
||||
this.cache.push({ gid, uid });
|
||||
if (this.cache.length > this.maxSize) {
|
||||
this.cache.shift();
|
||||
}
|
||||
}
|
||||
|
||||
return exists;
|
||||
}
|
||||
})();
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
const interval = 1000 * 60 * 10; // 10分钟清理一次缓存
|
||||
setInterval(() => {
|
||||
logDebug('清理消息缓存');
|
||||
this.msgCache.forEach((msg, key) => {
|
||||
if ((Date.now() - parseInt(msg.msgTime) * 1000) > interval) {
|
||||
this.msgCache.delete(key);
|
||||
}
|
||||
});
|
||||
}, interval);
|
||||
}
|
||||
|
||||
async init(dbPath: string) {
|
||||
await super.init(dbPath);
|
||||
this.globalMsgShortId = await this.getCurrentMaxShortId();
|
||||
|
||||
|
||||
// 初始化群缓存列表
|
||||
this.db!.serialize(() => {
|
||||
const sql = `SELECT * FROM sqlite_master WHERE type='table'`;
|
||||
this.db!.all(sql, [], (err, rows: { name: string }[]) => {
|
||||
if (err) return logError(err);
|
||||
rows.forEach((row) => this.groupIds.push(parseInt(row.name)));
|
||||
//logDebug(`已加载 ${groupIds.length} 个群`);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
this.LURCache.on(async (node) => {
|
||||
const { value: time, groupId, userId } = node;
|
||||
|
||||
logDebug("插入发言时间", userId, groupId);
|
||||
await this.createGroupInfoTimeTableIfNotExist(groupId);
|
||||
|
||||
const method = await this.getDataSetMethod(groupId, userId);
|
||||
logDebug("插入发言时间方法判断", userId, groupId, method);
|
||||
|
||||
const sql =
|
||||
method == "update"
|
||||
? `UPDATE "${groupId}" SET last_sent_time = ? WHERE user_id = ?`
|
||||
: `INSERT INTO "${groupId}" (last_sent_time, user_id) VALUES (?, ?)`;
|
||||
|
||||
this.db!.all(sql, [time, userId], (err) => {
|
||||
if (err) {
|
||||
return logError("插入/更新发言时间失败", userId, groupId);
|
||||
}
|
||||
logDebug("插入/更新发言时间成功", userId, groupId);
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
async getDataSetMethod(groupId: number, userId: number) {
|
||||
// 缓存记录
|
||||
if (this.LastSentCache.get(groupId, userId)) {
|
||||
logDebug("缓存命中", userId, groupId);
|
||||
return "update";
|
||||
}
|
||||
|
||||
// 数据库判断
|
||||
return new Promise<"insert" | "update">((resolve, reject) => {
|
||||
this.db!.all(
|
||||
`SELECT * FROM "${groupId}" WHERE user_id = ?`,
|
||||
[userId],
|
||||
(err, rows) => {
|
||||
if (err) {
|
||||
logError("查询发言时间存在失败", userId, groupId, err);
|
||||
return logError("插入发言时间失败", userId, groupId, err);
|
||||
}
|
||||
|
||||
if (rows.length === 0) {
|
||||
logDebug("查询发言时间不存在", userId, groupId);
|
||||
return resolve("insert");
|
||||
}
|
||||
|
||||
logDebug("查询发言时间存在", userId, groupId);
|
||||
resolve("update");
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
async createGroupInfoTimeTableIfNotExist(groupId: number) {
|
||||
const createTableSQL = (groupId: number) =>
|
||||
`CREATE TABLE IF NOT EXISTS "${groupId}" (
|
||||
user_id INTEGER,
|
||||
last_sent_time INTEGER,
|
||||
join_time INTEGER,
|
||||
PRIMARY KEY (user_id)
|
||||
);`;
|
||||
|
||||
if (this.groupIds.includes(groupId)) {
|
||||
return;
|
||||
}
|
||||
return new Promise((resolve, reject) => {
|
||||
const sql = createTableSQL(groupId);
|
||||
this.db!.all(sql, (err) => {
|
||||
if (err) {
|
||||
reject(err);
|
||||
return;
|
||||
}
|
||||
this.groupIds.push(groupId);
|
||||
resolve(true);
|
||||
});
|
||||
});
|
||||
}
|
||||
protected createTable() {
|
||||
// 消息记录
|
||||
const createTableSQL = `
|
||||
CREATE TABLE IF NOT EXISTS msgs (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
shortId INTEGER NOT NULL UNIQUE,
|
||||
longId TEXT NOT NULL UNIQUE,
|
||||
seq INTEGER NOT NULL,
|
||||
peerUid TEXT NOT NULL,
|
||||
chatType INTEGER NOT NULL
|
||||
)`;
|
||||
this.db!.run(createTableSQL, function (err) {
|
||||
if (err) {
|
||||
logError('Could not create table msgs', err.stack);
|
||||
}
|
||||
});
|
||||
|
||||
// 文件缓存
|
||||
const createFileTableSQL = `
|
||||
CREATE TABLE IF NOT EXISTS files (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL,
|
||||
path TEXT NOT NULL,
|
||||
url TEXT,
|
||||
size INTEGER NOT NULL,
|
||||
uuid TEXT,
|
||||
elementType INTEGER,
|
||||
element TEXT NOT NULL,
|
||||
elementId TEXT NOT NULL,
|
||||
msgId TEXT NOT NULL
|
||||
)`;
|
||||
this.db!.run(createFileTableSQL, function (err) {
|
||||
if (err) {
|
||||
logError('Could not create table files', err);
|
||||
}
|
||||
});
|
||||
|
||||
// 接收到的临时会话消息uid
|
||||
const createTempUinTableSQL = `
|
||||
CREATE TABLE IF NOT EXISTS temp_uins (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
uid TEXT,
|
||||
uin TEXT
|
||||
)`;
|
||||
this.db!.run(createTempUinTableSQL, function (err) {
|
||||
if (err) {
|
||||
logError('Could not create table temp_uins', err);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private async getCurrentMaxShortId() {
|
||||
return new Promise<number>((resolve, reject) => {
|
||||
this.db!.get('SELECT MAX(shortId) as maxId FROM msgs', (err, row: { maxId: number }) => {
|
||||
if (err) {
|
||||
logDebug('Could not get max short id, Use default -2147483640', err);
|
||||
return resolve(-2147483640);
|
||||
}
|
||||
logDebug('数据库中消息最大短id', row?.maxId);
|
||||
resolve(row?.maxId ?? -2147483640);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
private async getMsg(query: string, params: any[]) {
|
||||
const stmt = this.db!.prepare(query);
|
||||
return new Promise<RawMessage | null>((resolve, reject) => {
|
||||
stmt.get(...params, (err: any, row: DBMsg) => {
|
||||
// log("getMsg", row, err);
|
||||
if (err) {
|
||||
logError('Could not get msg', err, query, params);
|
||||
return resolve(null);
|
||||
}
|
||||
if (!row) {
|
||||
// logDebug('不存在数据库中的消息,不进行处理', query, params);
|
||||
resolve(null);
|
||||
return;
|
||||
}
|
||||
const msgId = row.longId;
|
||||
NTQQMsgApi.getMsgsByMsgId({ peerUid: row.peerUid, chatType: row.chatType }, [msgId]).then(res => {
|
||||
const msg = res.msgList[0];
|
||||
if (!msg) {
|
||||
resolve(null);
|
||||
return;
|
||||
}
|
||||
msg.id = row.shortId;
|
||||
resolve(msg);
|
||||
}).catch(e => {
|
||||
resolve(null);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async getMsgByShortId(shortId: number): Promise<RawMessage | null> {
|
||||
if (this.msgCache.has(shortId)) {
|
||||
return this.msgCache.get(shortId)!;
|
||||
}
|
||||
const getStmt = 'SELECT * FROM msgs WHERE shortId = ?';
|
||||
return this.getMsg(getStmt, [shortId]);
|
||||
}
|
||||
|
||||
async getMsgByLongId(longId: string): Promise<RawMessage | null> {
|
||||
if (this.msgCache.has(longId)) {
|
||||
return this.msgCache.get(longId)!;
|
||||
}
|
||||
return this.getMsg('SELECT * FROM msgs WHERE longId = ?', [longId]);
|
||||
}
|
||||
|
||||
async getMsgBySeq(peerUid: string, seq: string): Promise<RawMessage | null> {
|
||||
const stmt = 'SELECT * FROM msgs WHERE peerUid = ? AND seq = ?';
|
||||
return this.getMsg(stmt, [peerUid, seq]);
|
||||
}
|
||||
|
||||
async addMsg(msg: RawMessage, update = true): Promise<number> {
|
||||
const existMsg = await this.getMsgByLongId(msg.msgId);
|
||||
if (existMsg) {
|
||||
// logDebug('消息已存在,更新数据库', msg.msgId);
|
||||
if (update) this.updateMsg(msg).then();
|
||||
return existMsg.id!;
|
||||
}
|
||||
const stmt = this.db!.prepare('INSERT INTO msgs (shortId, longId, seq, peerUid, chatType) VALUES (?, ?, ?, ?, ?)');
|
||||
// const runAsync = promisify(stmt.run.bind(stmt));
|
||||
const shortId = ++this.globalMsgShortId;
|
||||
msg.id = shortId;
|
||||
//logDebug(`记录消息到数据库, 消息长id: ${msg.msgId}, 短id: ${msg.id}`);
|
||||
this.msgCache.set(shortId, msg);
|
||||
this.msgCache.set(msg.msgId, msg);
|
||||
stmt.run(this.globalMsgShortId, msg.msgId, msg.msgSeq.toString(), msg.peerUid, msg.chatType, (err: any) => {
|
||||
if (err) {
|
||||
if (err.errno === 19) {
|
||||
this.getMsgByLongId(msg.msgId).then((msg: RawMessage | null) => {
|
||||
if (msg) {
|
||||
this.msgCache.set(shortId, msg);
|
||||
this.msgCache.set(msg.msgId, msg);
|
||||
// logDebug('获取消息短id成功', msg.id);
|
||||
} else {
|
||||
logError('db could not get msg by long id', err);
|
||||
}
|
||||
}).catch(e => logError('db getMsgByLongId error', e));
|
||||
} else {
|
||||
logError('db could not add msg', err);
|
||||
}
|
||||
}
|
||||
});
|
||||
return shortId;
|
||||
}
|
||||
|
||||
async updateMsg(msg: RawMessage) {
|
||||
const existMsg = this.msgCache.get(msg.msgId);
|
||||
if (existMsg) {
|
||||
Object.assign(existMsg, msg);
|
||||
}
|
||||
//logDebug(`更新消息, shortId:${msg.id}, seq: ${msg.msgSeq}, msgId: ${msg.msgId}`);
|
||||
const stmt = this.db!.prepare('UPDATE msgs SET seq=? WHERE longId=?');
|
||||
stmt.run(msg.msgSeq, msg.msgId, (err: any) => {
|
||||
if (err) {
|
||||
logError('updateMsg db error', err);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
async addFileCache(file: DBFile) {
|
||||
const stmt = this.db!.prepare('INSERT INTO files (name, path, url, size, uuid, elementType ,element, elementId, msgId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)');
|
||||
return new Promise((resolve, reject) => {
|
||||
stmt.run(file.name, file.path, file.url, file.size, file.uuid,
|
||||
file.elementType,
|
||||
JSON.stringify(file.element),
|
||||
file.elementId,
|
||||
file.msgId,
|
||||
function (err: any) {
|
||||
if (err) {
|
||||
logError('db could not add file', err);
|
||||
reject(err);
|
||||
}
|
||||
resolve(null);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
private async getFileCache(query: string, params: any[]) {
|
||||
const stmt = this.db!.prepare(query);
|
||||
return new Promise<DBFile | null>((resolve, reject) => {
|
||||
stmt.get(...params, (err: any, row: DBFile & { element: string }) => {
|
||||
if (err) {
|
||||
logError('db could not get file cache', err);
|
||||
reject(err);
|
||||
}
|
||||
if (row) {
|
||||
row.element = JSON.parse(row.element);
|
||||
}
|
||||
resolve(row);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async getFileCacheByName(name: string): Promise<DBFile | null> {
|
||||
return this.getFileCache('SELECT * FROM files WHERE name = ?', [name]);
|
||||
}
|
||||
|
||||
async getFileCacheByUuid(uuid: string): Promise<DBFile | null> {
|
||||
return this.getFileCache('SELECT * FROM files WHERE uuid = ?', [uuid]);
|
||||
}
|
||||
|
||||
// todo: 是否所有的文件都有uuid?语音消息有没有uuid?
|
||||
async updateFileCache(file: DBFile) {
|
||||
const stmt = this.db!.prepare('UPDATE files SET path = ?, url = ? WHERE uuid = ?');
|
||||
return new Promise((resolve, reject) => {
|
||||
stmt.run(file.path, file.url, file.uuid, function (err: any) {
|
||||
if (err) {
|
||||
logError('db could not update file cache', err);
|
||||
reject(err);
|
||||
}
|
||||
resolve(null);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// 被动收到的临时会话消息uin->uid
|
||||
async getReceivedTempUinMap() {
|
||||
const stmt = 'SELECT * FROM temp_uins';
|
||||
return new Promise<Record<string, string>>((resolve, reject) => {
|
||||
this.db!.all(stmt, (err, rows: { uin: string, uid: string }[]) => {
|
||||
if (err) {
|
||||
logError('db could not get temp uin map', err);
|
||||
reject(err);
|
||||
}
|
||||
const map: Record<string, string> = {};
|
||||
rows.forEach(row => {
|
||||
map[row.uin] = row.uid;
|
||||
});
|
||||
resolve(map);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// 通过uin获取临时会话消息uid
|
||||
async getUidByTempUin(uid: string) {
|
||||
const stmt = 'SELECT * FROM temp_uins WHERE uin = ?';
|
||||
return new Promise<string>((resolve, reject) => {
|
||||
this.db!.get(stmt, [uid], (err, row: { uin: string, uid: string }) => {
|
||||
if (err) {
|
||||
logError('db could not get temp uin map', err);
|
||||
reject(err);
|
||||
}
|
||||
resolve(row?.uid);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async addTempUin(uin: string, uid: string) {
|
||||
const existUid = await this.getUidByTempUin(uin);
|
||||
if (!existUid) {
|
||||
const stmt = this.db!.prepare('INSERT INTO temp_uins (uin, uid) VALUES (?, ?)');
|
||||
return new Promise((resolve, reject) => {
|
||||
stmt.run(uin, uid, function (err: any) {
|
||||
if (err) {
|
||||
logError('db could not add temp uin', err);
|
||||
reject(err);
|
||||
}
|
||||
resolve(null);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
async getLastSentTimeAndJoinTime(
|
||||
groupId: number
|
||||
): Promise<IRember[]> {
|
||||
logDebug("读取发言时间", groupId);
|
||||
return new Promise<IRember[]>((resolve, reject) => {
|
||||
this.db!.all(`SELECT * FROM "${groupId}" `, (err, rows: IRember[]) => {
|
||||
if (err) {
|
||||
logError("查询发言时间失败", groupId);
|
||||
return resolve([]);
|
||||
}
|
||||
logDebug("查询发言时间成功", groupId, rows);
|
||||
resolve(rows);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
insertLastSentTime(
|
||||
groupId: number,
|
||||
userId: number,
|
||||
time: number
|
||||
) {
|
||||
this.LURCache.set(groupId, userId, time)
|
||||
}
|
||||
async insertJoinTime(
|
||||
groupId: number,
|
||||
userId: number,
|
||||
time: number
|
||||
) {
|
||||
await this.createGroupInfoTimeTableIfNotExist(groupId);
|
||||
this.db!.all(
|
||||
`INSERT OR REPLACE INTO "${groupId}" (user_id, last_sent_time, join_time) VALUES (?,?,?)`,
|
||||
[userId, time, time],
|
||||
(err) => {
|
||||
if (err)
|
||||
logError(err),
|
||||
Promise.reject(),
|
||||
console.log("插入入群时间失败", userId, groupId);
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export const dbUtil = new DBUtil();
|
||||
import { ElementType, FileElement, PicElement, PttElement, RawMessage, VideoElement } from '../../core/src/entities';
|
||||
|
||||
import sqlite3 from 'sqlite3';
|
||||
import { log, logDebug, logError } from '@/common/utils/log';
|
||||
import { NTQQMsgApi } from '@/core';
|
||||
import LRU from '@/common/utils/LRUCache';
|
||||
|
||||
export interface IRember {
|
||||
last_sent_time: number;
|
||||
join_time: number;
|
||||
user_id: number;
|
||||
}
|
||||
|
||||
|
||||
type DBMsg = {
|
||||
id: number,
|
||||
shortId: number,
|
||||
longId: string,
|
||||
seq: number,
|
||||
peerUid: string,
|
||||
chatType: number,
|
||||
}
|
||||
|
||||
type DBFile = {
|
||||
name: string; // 文件名
|
||||
path: string;
|
||||
url: string;
|
||||
size: number;
|
||||
uuid: string;
|
||||
msgId: string;
|
||||
elementId: string;
|
||||
element: PicElement | VideoElement | FileElement | PttElement;
|
||||
elementType: ElementType.PIC | ElementType.VIDEO | ElementType.FILE | ElementType.PTT;
|
||||
}
|
||||
|
||||
|
||||
class DBUtilBase {
|
||||
protected db: sqlite3.Database | undefined;
|
||||
|
||||
async init(dbPath: string) {
|
||||
if (this.db) {
|
||||
return;
|
||||
}
|
||||
return new Promise<void>((resolve, reject) => {
|
||||
this.db = new sqlite3.Database(dbPath, sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, (err) => {
|
||||
if (err) {
|
||||
logError('Could not connect to database', err);
|
||||
reject(err);
|
||||
return;
|
||||
}
|
||||
this.createTable();
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
protected createTable() {
|
||||
throw new Error('Method not implemented.');
|
||||
}
|
||||
|
||||
close() {
|
||||
this.db?.close();
|
||||
}
|
||||
}
|
||||
|
||||
class DBUtil extends DBUtilBase {
|
||||
private msgCache: Map<string | number, RawMessage> = new Map<string | number, RawMessage>();
|
||||
private globalMsgShortId = -2147483640;
|
||||
private groupIds: number[] = [];
|
||||
private LURCache = new LRU<number>();
|
||||
private LastSentCache = new (class {
|
||||
private cache: { gid: number; uid: number }[] = [];
|
||||
private maxSize: number;
|
||||
|
||||
constructor(maxSize: number = 5000) {
|
||||
this.maxSize = maxSize;
|
||||
}
|
||||
|
||||
get(gid: number, uid: number): boolean {
|
||||
const exists = this.cache.some(
|
||||
(entry) => entry.gid === gid && entry.uid === uid
|
||||
);
|
||||
if (!exists) {
|
||||
this.cache.push({ gid, uid });
|
||||
if (this.cache.length > this.maxSize) {
|
||||
this.cache.shift();
|
||||
}
|
||||
}
|
||||
|
||||
return exists;
|
||||
}
|
||||
})();
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
const interval = 1000 * 60 * 10; // 10分钟清理一次缓存
|
||||
setInterval(() => {
|
||||
logDebug('清理消息缓存');
|
||||
this.msgCache.forEach((msg, key) => {
|
||||
if ((Date.now() - parseInt(msg.msgTime) * 1000) > interval) {
|
||||
this.msgCache.delete(key);
|
||||
}
|
||||
});
|
||||
}, interval);
|
||||
}
|
||||
|
||||
async init(dbPath: string) {
|
||||
await super.init(dbPath);
|
||||
this.globalMsgShortId = await this.getCurrentMaxShortId();
|
||||
|
||||
|
||||
// 初始化群缓存列表
|
||||
this.db!.serialize(() => {
|
||||
const sql = 'SELECT * FROM sqlite_master WHERE type=\'table\'';
|
||||
this.db!.all(sql, [], (err, rows: { name: string }[]) => {
|
||||
if (err) return logError(err);
|
||||
rows.forEach((row) => this.groupIds.push(parseInt(row.name)));
|
||||
//logDebug(`已加载 ${groupIds.length} 个群`);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
this.LURCache.on(async (node) => {
|
||||
const { value: time, groupId, userId } = node;
|
||||
|
||||
logDebug('插入发言时间', userId, groupId);
|
||||
await this.createGroupInfoTimeTableIfNotExist(groupId);
|
||||
|
||||
const method = await this.getDataSetMethod(groupId, userId);
|
||||
logDebug('插入发言时间方法判断', userId, groupId, method);
|
||||
|
||||
const sql =
|
||||
method == 'update'
|
||||
? `UPDATE "${groupId}" SET last_sent_time = ? WHERE user_id = ?`
|
||||
: `INSERT INTO "${groupId}" (last_sent_time, user_id) VALUES (?, ?)`;
|
||||
|
||||
this.db!.all(sql, [time, userId], (err) => {
|
||||
if (err) {
|
||||
return logError('插入/更新发言时间失败', userId, groupId);
|
||||
}
|
||||
logDebug('插入/更新发言时间成功', userId, groupId);
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
async getDataSetMethod(groupId: number, userId: number) {
|
||||
// 缓存记录
|
||||
if (this.LastSentCache.get(groupId, userId)) {
|
||||
logDebug('缓存命中', userId, groupId);
|
||||
return 'update';
|
||||
}
|
||||
|
||||
// 数据库判断
|
||||
return new Promise<'insert' | 'update'>((resolve, reject) => {
|
||||
this.db!.all(
|
||||
`SELECT * FROM "${groupId}" WHERE user_id = ?`,
|
||||
[userId],
|
||||
(err, rows) => {
|
||||
if (err) {
|
||||
logError('查询发言时间存在失败', userId, groupId, err);
|
||||
return logError('插入发言时间失败', userId, groupId, err);
|
||||
}
|
||||
|
||||
if (rows.length === 0) {
|
||||
logDebug('查询发言时间不存在', userId, groupId);
|
||||
return resolve('insert');
|
||||
}
|
||||
|
||||
logDebug('查询发言时间存在', userId, groupId);
|
||||
resolve('update');
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
async createGroupInfoTimeTableIfNotExist(groupId: number) {
|
||||
const createTableSQL = (groupId: number) =>
|
||||
`CREATE TABLE IF NOT EXISTS "${groupId}" (
|
||||
user_id INTEGER,
|
||||
last_sent_time INTEGER,
|
||||
join_time INTEGER,
|
||||
PRIMARY KEY (user_id)
|
||||
);`;
|
||||
|
||||
if (this.groupIds.includes(groupId)) {
|
||||
return;
|
||||
}
|
||||
return new Promise((resolve, reject) => {
|
||||
const sql = createTableSQL(groupId);
|
||||
this.db!.all(sql, (err) => {
|
||||
if (err) {
|
||||
reject(err);
|
||||
return;
|
||||
}
|
||||
this.groupIds.push(groupId);
|
||||
resolve(true);
|
||||
});
|
||||
});
|
||||
}
|
||||
protected createTable() {
|
||||
// 消息记录
|
||||
const createTableSQL = `
|
||||
CREATE TABLE IF NOT EXISTS msgs (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
shortId INTEGER NOT NULL UNIQUE,
|
||||
longId TEXT NOT NULL UNIQUE,
|
||||
seq INTEGER NOT NULL,
|
||||
peerUid TEXT NOT NULL,
|
||||
chatType INTEGER NOT NULL
|
||||
)`;
|
||||
this.db!.run(createTableSQL, function (err) {
|
||||
if (err) {
|
||||
logError('Could not create table msgs', err.stack);
|
||||
}
|
||||
});
|
||||
|
||||
// 文件缓存
|
||||
const createFileTableSQL = `
|
||||
CREATE TABLE IF NOT EXISTS files (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL,
|
||||
path TEXT NOT NULL,
|
||||
url TEXT,
|
||||
size INTEGER NOT NULL,
|
||||
uuid TEXT,
|
||||
elementType INTEGER,
|
||||
element TEXT NOT NULL,
|
||||
elementId TEXT NOT NULL,
|
||||
msgId TEXT NOT NULL
|
||||
)`;
|
||||
this.db!.run(createFileTableSQL, function (err) {
|
||||
if (err) {
|
||||
logError('Could not create table files', err);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private async getCurrentMaxShortId() {
|
||||
return new Promise<number>((resolve, reject) => {
|
||||
this.db!.get('SELECT MAX(shortId) as maxId FROM msgs', (err, row: { maxId: number }) => {
|
||||
if (err) {
|
||||
logDebug('Could not get max short id, Use default -2147483640', err);
|
||||
return resolve(-2147483640);
|
||||
}
|
||||
logDebug('数据库中消息最大短id', row?.maxId);
|
||||
resolve(row?.maxId ?? -2147483640);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
private async getMsg(query: string, params: any[]) {
|
||||
const stmt = this.db!.prepare(query);
|
||||
return new Promise<RawMessage | null>((resolve, reject) => {
|
||||
stmt.get(...params, (err: any, row: DBMsg) => {
|
||||
// log("getMsg", row, err);
|
||||
if (err) {
|
||||
logError('Could not get msg', err, query, params);
|
||||
return resolve(null);
|
||||
}
|
||||
if (!row) {
|
||||
// logDebug('不存在数据库中的消息,不进行处理', query, params);
|
||||
resolve(null);
|
||||
return;
|
||||
}
|
||||
const msgId = row.longId;
|
||||
NTQQMsgApi.getMsgsByMsgId({ peerUid: row.peerUid, chatType: row.chatType }, [msgId]).then(res => {
|
||||
const msg = res.msgList[0];
|
||||
if (!msg) {
|
||||
resolve(null);
|
||||
return;
|
||||
}
|
||||
msg.id = row.shortId;
|
||||
resolve(msg);
|
||||
}).catch(e => {
|
||||
resolve(null);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async getMsgByShortId(shortId: number): Promise<RawMessage | null> {
|
||||
if (this.msgCache.has(shortId)) {
|
||||
return this.msgCache.get(shortId)!;
|
||||
}
|
||||
const getStmt = 'SELECT * FROM msgs WHERE shortId = ?';
|
||||
return this.getMsg(getStmt, [shortId]);
|
||||
}
|
||||
|
||||
async getMsgByLongId(longId: string): Promise<RawMessage | null> {
|
||||
if (this.msgCache.has(longId)) {
|
||||
return this.msgCache.get(longId)!;
|
||||
}
|
||||
return this.getMsg('SELECT * FROM msgs WHERE longId = ?', [longId]);
|
||||
}
|
||||
|
||||
async getMsgBySeq(peerUid: string, seq: string): Promise<RawMessage | null> {
|
||||
const stmt = 'SELECT * FROM msgs WHERE peerUid = ? AND seq = ?';
|
||||
return this.getMsg(stmt, [peerUid, seq]);
|
||||
}
|
||||
|
||||
async addMsg(msg: RawMessage, update = true): Promise<number> {
|
||||
const existMsg = await this.getMsgByLongId(msg.msgId);
|
||||
if (existMsg) {
|
||||
// logDebug('消息已存在,更新数据库', msg.msgId);
|
||||
if (update) this.updateMsg(msg).then();
|
||||
return existMsg.id!;
|
||||
}
|
||||
const stmt = this.db!.prepare('INSERT INTO msgs (shortId, longId, seq, peerUid, chatType) VALUES (?, ?, ?, ?, ?)');
|
||||
// const runAsync = promisify(stmt.run.bind(stmt));
|
||||
const shortId = ++this.globalMsgShortId;
|
||||
msg.id = shortId;
|
||||
//logDebug(`记录消息到数据库, 消息长id: ${msg.msgId}, 短id: ${msg.id}`);
|
||||
this.msgCache.set(shortId, msg);
|
||||
this.msgCache.set(msg.msgId, msg);
|
||||
stmt.run(this.globalMsgShortId, msg.msgId, msg.msgSeq.toString(), msg.peerUid, msg.chatType, (err: any) => {
|
||||
if (err) {
|
||||
if (err.errno === 19) {
|
||||
this.getMsgByLongId(msg.msgId).then((msg: RawMessage | null) => {
|
||||
if (msg) {
|
||||
this.msgCache.set(shortId, msg);
|
||||
this.msgCache.set(msg.msgId, msg);
|
||||
// logDebug('获取消息短id成功', msg.id);
|
||||
} else {
|
||||
logError('db could not get msg by long id', err);
|
||||
}
|
||||
}).catch(e => logError('db getMsgByLongId error', e));
|
||||
} else {
|
||||
logError('db could not add msg', err);
|
||||
}
|
||||
}
|
||||
});
|
||||
return shortId;
|
||||
}
|
||||
|
||||
async updateMsg(msg: RawMessage) {
|
||||
const existMsg = this.msgCache.get(msg.msgId);
|
||||
if (existMsg) {
|
||||
Object.assign(existMsg, msg);
|
||||
}
|
||||
//logDebug(`更新消息, shortId:${msg.id}, seq: ${msg.msgSeq}, msgId: ${msg.msgId}`);
|
||||
const stmt = this.db!.prepare('UPDATE msgs SET seq=? WHERE longId=?');
|
||||
stmt.run(msg.msgSeq, msg.msgId, (err: any) => {
|
||||
if (err) {
|
||||
logError('updateMsg db error', err);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
async addFileCache(file: DBFile) {
|
||||
const stmt = this.db!.prepare('INSERT INTO files (name, path, url, size, uuid, elementType ,element, elementId, msgId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)');
|
||||
return new Promise((resolve, reject) => {
|
||||
stmt.run(file.name, file.path, file.url, file.size, file.uuid,
|
||||
file.elementType,
|
||||
JSON.stringify(file.element),
|
||||
file.elementId,
|
||||
file.msgId,
|
||||
function (err: any) {
|
||||
if (err) {
|
||||
logError('db could not add file', err);
|
||||
reject(err);
|
||||
}
|
||||
resolve(null);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
private async getFileCache(query: string, params: any[]) {
|
||||
const stmt = this.db!.prepare(query);
|
||||
return new Promise<DBFile | null>((resolve, reject) => {
|
||||
stmt.get(...params, (err: any, row: DBFile & { element: string }) => {
|
||||
if (err) {
|
||||
logError('db could not get file cache', err);
|
||||
reject(err);
|
||||
}
|
||||
if (row) {
|
||||
row.element = JSON.parse(row.element);
|
||||
}
|
||||
resolve(row);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async getFileCacheByName(name: string): Promise<DBFile | null> {
|
||||
return this.getFileCache('SELECT * FROM files WHERE name = ?', [name]);
|
||||
}
|
||||
|
||||
async getFileCacheByUuid(uuid: string): Promise<DBFile | null> {
|
||||
return this.getFileCache('SELECT * FROM files WHERE uuid = ?', [uuid]);
|
||||
}
|
||||
|
||||
// todo: 是否所有的文件都有uuid?语音消息有没有uuid?
|
||||
async updateFileCache(file: DBFile) {
|
||||
const stmt = this.db!.prepare('UPDATE files SET path = ?, url = ? WHERE uuid = ?');
|
||||
return new Promise((resolve, reject) => {
|
||||
stmt.run(file.path, file.url, file.uuid, function (err: any) {
|
||||
if (err) {
|
||||
logError('db could not update file cache', err);
|
||||
reject(err);
|
||||
}
|
||||
resolve(null);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async getLastSentTimeAndJoinTime(
|
||||
groupId: number
|
||||
): Promise<IRember[]> {
|
||||
logDebug('读取发言时间', groupId);
|
||||
return new Promise<IRember[]>((resolve, reject) => {
|
||||
this.db!.all(`SELECT * FROM "${groupId}" `, (err, rows: IRember[]) => {
|
||||
if (err) {
|
||||
logError('查询发言时间失败', groupId);
|
||||
return resolve([]);
|
||||
}
|
||||
logDebug('查询发言时间成功', groupId, rows);
|
||||
resolve(rows);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
insertLastSentTime(
|
||||
groupId: number,
|
||||
userId: number,
|
||||
time: number
|
||||
) {
|
||||
this.LURCache.set(groupId, userId, time);
|
||||
}
|
||||
async insertJoinTime(
|
||||
groupId: number,
|
||||
userId: number,
|
||||
time: number
|
||||
) {
|
||||
await this.createGroupInfoTimeTableIfNotExist(groupId);
|
||||
this.db!.all(
|
||||
`INSERT OR REPLACE INTO "${groupId}" (user_id, last_sent_time, join_time) VALUES (?,?,?)`,
|
||||
[userId, time, time],
|
||||
(err) => {
|
||||
if (err)
|
||||
logError(err),
|
||||
Promise.reject(),
|
||||
logError('插入入群时间失败', userId, groupId);
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export const dbUtil = new DBUtil();
|
||||
|
@@ -1,9 +1,9 @@
|
||||
import fs from 'fs';
|
||||
import fsPromise from 'fs/promises';
|
||||
import fsPromise, { stat } from 'fs/promises';
|
||||
import crypto from 'crypto';
|
||||
import util from 'util';
|
||||
import path from 'node:path';
|
||||
import { log } from './log';
|
||||
import { log, logError } from './log';
|
||||
import { dbUtil } from '@/common/utils/db';
|
||||
import * as fileType from 'file-type';
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
@@ -50,7 +50,40 @@ export function checkFileReceived(path: string, timeout: number = 3000): Promise
|
||||
check();
|
||||
});
|
||||
}
|
||||
// 定义一个异步函数来检查文件是否存在
|
||||
export async function checkFileReceived2(path: string, timeout: number = 3000): Promise<void> {
|
||||
// 使用 Promise.race 来同时进行文件状态检查和超时计时
|
||||
// Promise.race 会返回第一个解决(resolve)或拒绝(reject)的 Promise
|
||||
await Promise.race([
|
||||
checkFile(path),
|
||||
timeoutPromise(timeout, `文件不存在: ${path}`),
|
||||
]);
|
||||
}
|
||||
|
||||
// 转换超时时间至 Promise
|
||||
function timeoutPromise(timeout: number, errorMsg: string): Promise<void> {
|
||||
return new Promise((_, reject) => {
|
||||
setTimeout(() => {
|
||||
reject(new Error(errorMsg));
|
||||
}, timeout);
|
||||
});
|
||||
}
|
||||
|
||||
// 异步检查文件是否存在
|
||||
async function checkFile(path: string): Promise<void> {
|
||||
try {
|
||||
await stat(path);
|
||||
} catch (error: any) {
|
||||
if (error.code === 'ENOENT') {
|
||||
// 如果文件不存在,则抛出一个错误
|
||||
throw new Error(`文件不存在: ${path}`);
|
||||
} else {
|
||||
// 对于 stat 调用的其他错误,重新抛出
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
// 如果文件存在,则无需做任何事情,Promise 解决(resolve)自身
|
||||
}
|
||||
export async function file2base64(path: string) {
|
||||
const readFile = util.promisify(fs.readFile);
|
||||
const result = {
|
||||
@@ -262,12 +295,12 @@ export async function copyFolder(sourcePath: string, destPath: string) {
|
||||
try {
|
||||
await fsPromise.copyFile(srcPath, dstPath);
|
||||
} catch (error) {
|
||||
console.error(`无法复制文件 '${srcPath}' 到 '${dstPath}': ${error}`);
|
||||
logError(`无法复制文件 '${srcPath}' 到 '${dstPath}': ${error}`);
|
||||
// 这里可以决定是否要继续复制其他文件
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('复制文件夹时出错:', error);
|
||||
logError('复制文件夹时出错:', error);
|
||||
}
|
||||
}
|
||||
|
@@ -4,7 +4,7 @@ import fs from 'fs/promises';
|
||||
import { log, logDebug } from './log';
|
||||
import { dirname } from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
|
||||
import * as fsPromise from 'node:fs/promises';
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = dirname(__filename);
|
||||
@@ -43,8 +43,88 @@ export function truncateString(obj: any, maxLength = 500) {
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
export function simpleDecorator(target: any, context: any) {
|
||||
}
|
||||
|
||||
// export function CacheClassFunc(ttl: number = 3600 * 1000, customKey: string = '') {
|
||||
// const cache = new Map<string, { expiry: number; value: any }>();
|
||||
// return function CacheClassFuncDecorator(originalMethod: Function, context: ClassMethodDecoratorContext) {
|
||||
// async function CacheClassFuncDecoratorInternal(this: any, ...args: any[]) {
|
||||
// const key = `${customKey}${String(context.name)}.(${args.map(arg => JSON.stringify(arg)).join(', ')})`;
|
||||
// const cachedValue = cache.get(key);
|
||||
// if (cachedValue && cachedValue.expiry > Date.now()) {
|
||||
// return cachedValue.value;
|
||||
// }
|
||||
// const result = originalMethod.call(this, ...args);
|
||||
// cache.set(key, { expiry: Date.now() + ttl, value: result });
|
||||
// return result;
|
||||
// }
|
||||
// return CacheClassFuncDecoratorInternal;
|
||||
// }
|
||||
// }
|
||||
export function CacheClassFuncAsync(ttl: number = 3600 * 1000, customKey: string = '') {
|
||||
//console.log('CacheClassFuncAsync', ttl, customKey);
|
||||
function logExecutionTime(target: any, methodName: string, descriptor: PropertyDescriptor) {
|
||||
//console.log('logExecutionTime', target, methodName, descriptor);
|
||||
const cache = new Map<string, { expiry: number; value: any }>();
|
||||
const originalMethod = descriptor.value;
|
||||
descriptor.value = async function (...args: any[]) {
|
||||
const key = `${customKey}${String(methodName)}.(${args.map(arg => JSON.stringify(arg)).join(', ')})`;
|
||||
cache.forEach((value, key) => {
|
||||
if (value.expiry < Date.now()) {
|
||||
cache.delete(key);
|
||||
}
|
||||
});
|
||||
const cachedValue = cache.get(key);
|
||||
if (cachedValue && cachedValue.expiry > Date.now()) {
|
||||
return cachedValue.value;
|
||||
}
|
||||
// const start = Date.now();
|
||||
const result = await originalMethod.apply(this, args);
|
||||
// const end = Date.now();
|
||||
// console.log(`Method ${methodName} executed in ${end - start} ms.`);
|
||||
cache.set(key, { expiry: Date.now() + ttl, value: result });
|
||||
return result;
|
||||
};
|
||||
}
|
||||
return logExecutionTime;
|
||||
}
|
||||
|
||||
// export function CacheClassFuncAsync(ttl: number = 3600 * 1000, customKey: string = ''): any {
|
||||
// const cache = new Map<string, { expiry: number; value: any }>();
|
||||
|
||||
// // 注意:在JavaScript装饰器中,我们通常不直接处理ClassMethodDecoratorContext这样的类型,
|
||||
// // 因为装饰器的参数通常是目标类(对于类装饰器)、属性名(对于属性装饰器)等。
|
||||
// // 对于方法装饰器,我们关注的是方法本身及其描述符。
|
||||
// // 但这里我们维持原逻辑,假设有一个自定义的处理上下文的方式。
|
||||
|
||||
// return function (originalMethod: Function): any {
|
||||
// console.log(originalMethod);
|
||||
// // 由于JavaScript装饰器原生不支持异步直接定义,我们保持async定义以便处理异步方法。
|
||||
// async function decoratorWrapper(this: any, ...args: any[]): Promise<any> {
|
||||
// console.log(...args);
|
||||
// const key = `${customKey}${originalMethod.name}.(${args.map(arg => JSON.stringify(arg)).join(', ')})`;
|
||||
// const cachedValue = cache.get(key);
|
||||
// // 遍历cache 清除expiry内容
|
||||
// cache.forEach((value, key) => {
|
||||
// if (value.expiry < Date.now()) {
|
||||
// cache.delete(key);
|
||||
// }
|
||||
// });
|
||||
// if (cachedValue && cachedValue.expiry > Date.now()) {
|
||||
// return cachedValue.value;
|
||||
// }
|
||||
|
||||
// // 直接await异步方法的结果
|
||||
// const result = await originalMethod.apply(this, args);
|
||||
// cache.set(key, { expiry: Date.now() + ttl, value: result });
|
||||
// return result;
|
||||
// }
|
||||
|
||||
// // 返回装饰后的方法,保持与原方法相同的名称和描述符(如果需要更精细的控制,可以考虑使用Object.getOwnPropertyDescriptor等)
|
||||
// return decoratorWrapper;
|
||||
// };
|
||||
// }
|
||||
|
||||
/**
|
||||
* 函数缓存装饰器,根据方法名、参数、自定义key生成缓存键,在一定时间内返回缓存结果
|
||||
@@ -181,4 +261,26 @@ export function isEqual(obj1: any, obj2: any) {
|
||||
if (!isEqual(obj1[key], obj2[key])) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
export async function deleteOldFiles(directoryPath: string, daysThreshold: number) {
|
||||
try {
|
||||
const files = await fsPromise.readdir(directoryPath);
|
||||
|
||||
for (const file of files) {
|
||||
const filePath = path.join(directoryPath, file);
|
||||
const stats = await fsPromise.stat(filePath);
|
||||
const lastModifiedTime = stats.mtimeMs;
|
||||
const currentTime = Date.now();
|
||||
const timeDifference = currentTime - lastModifiedTime;
|
||||
const daysDifference = timeDifference / (1000 * 60 * 60 * 24);
|
||||
|
||||
if (daysDifference > daysThreshold) {
|
||||
await fsPromise.unlink(filePath); // Delete the file
|
||||
//console.log(`Deleted: ${filePath}`);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
//console.error('Error deleting files:', error);
|
||||
}
|
||||
}
|
||||
|
@@ -4,7 +4,7 @@ import path from 'node:path';
|
||||
import { SelfInfo } from '@/core';
|
||||
import { dirname } from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
|
||||
import chalk from 'chalk';
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = dirname(__filename);
|
||||
@@ -39,17 +39,17 @@ const logConfig: Configuration = {
|
||||
FileAppender: { // 输出到文件的appender
|
||||
type: 'file',
|
||||
filename: logPath, // 指定日志文件的位置和文件名
|
||||
maxLoogSize: 10485760, // 日志文件的最大大小(单位:字节),这里设置为10MB
|
||||
maxLogSize: 10485760, // 日志文件的最大大小(单位:字节),这里设置为10MB
|
||||
layout: {
|
||||
type: 'pattern',
|
||||
pattern: '%d{yyyy-MM-dd hh:mm:ss} [%p] - %m'
|
||||
pattern: '%d{yyyy-MM-dd hh:mm:ss} [%p] %X{userInfo} | %m'
|
||||
}
|
||||
},
|
||||
ConsoleAppender: { // 输出到控制台的appender
|
||||
type: 'console',
|
||||
layout: {
|
||||
type: 'pattern',
|
||||
pattern: '%d{yyyy-MM-dd hh:mm:ss} [%p] - %m'
|
||||
pattern: `%d{yyyy-MM-dd hh:mm:ss} [%[%p%]] ${chalk.magenta('%X{userInfo}')} | %m`
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -61,7 +61,9 @@ const logConfig: Configuration = {
|
||||
};
|
||||
|
||||
log4js.configure(logConfig);
|
||||
|
||||
const loggerConsole = log4js.getLogger('console');
|
||||
const loggerFile = log4js.getLogger('file');
|
||||
const loggerDefault = log4js.getLogger('default');
|
||||
|
||||
export function setLogLevel(fileLogLevel: LogLevel, consoleLogLevel: LogLevel) {
|
||||
logConfig.categories.file.level = fileLogLevel;
|
||||
@@ -70,12 +72,12 @@ export function setLogLevel(fileLogLevel: LogLevel, consoleLogLevel: LogLevel) {
|
||||
}
|
||||
|
||||
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);
|
||||
const userInfo = `${selfInfo.nick}(${selfInfo.uin})`;
|
||||
loggerConsole.addContext('userInfo', userInfo);
|
||||
loggerFile.addContext('userInfo', userInfo);
|
||||
loggerDefault.addContext('userInfo', userInfo);
|
||||
}
|
||||
setLogSelfInfo({ nick: '', uin: '', uid: '' });
|
||||
|
||||
let fileLogEnabled = true;
|
||||
let consoleLogEnabled = true;
|
||||
@@ -86,7 +88,7 @@ export function enableConsoleLog(enable: boolean) {
|
||||
consoleLogEnabled = enable;
|
||||
}
|
||||
|
||||
function formatMsg(msg: any[]){
|
||||
function formatMsg(msg: any[]) {
|
||||
let logMsg = '';
|
||||
for (const msgItem of msg) {
|
||||
// 判断是否是对象
|
||||
@@ -97,15 +99,18 @@ function formatMsg(msg: any[]){
|
||||
}
|
||||
logMsg += msgItem + ' ';
|
||||
}
|
||||
return '\n' + logMsg + '\n';
|
||||
return logMsg;
|
||||
}
|
||||
|
||||
function _log(level: LogLevel, ...args: any[]){
|
||||
if (consoleLogEnabled){
|
||||
log4js.getLogger('console')[level](formatMsg(args));
|
||||
// eslint-disable-next-line no-control-regex
|
||||
const colorEscape = /\x1B[@-_][0-?]*[ -/]*[@-~]/g;
|
||||
|
||||
function _log(level: LogLevel, ...args: any[]) {
|
||||
if (consoleLogEnabled) {
|
||||
loggerConsole[level](formatMsg(args));
|
||||
}
|
||||
if (fileLogEnabled){
|
||||
log4js.getLogger('file')[level](formatMsg(args));
|
||||
if (fileLogEnabled) {
|
||||
loggerFile[level](formatMsg(args).replace(colorEscape, ''));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -121,3 +126,11 @@ export function logDebug(...args: any[]) {
|
||||
export function logError(...args: any[]) {
|
||||
_log(LogLevel.ERROR, ...args);
|
||||
}
|
||||
|
||||
export function logWarn(...args: any[]) {
|
||||
_log(LogLevel.WARN, ...args);
|
||||
}
|
||||
|
||||
export function logFatal(...args: any[]) {
|
||||
_log(LogLevel.FATAL, ...args);
|
||||
}
|
@@ -1,12 +1,13 @@
|
||||
import https from 'node:https';
|
||||
import http from 'node:http';
|
||||
|
||||
import { readFileSync } from 'node:fs';
|
||||
import { NTQQUserApi } from '@/core';
|
||||
export class RequestUtil {
|
||||
// 适用于获取服务器下发cookies时获取,仅GET
|
||||
static async HttpsGetCookies(url: string): Promise<{ [key: string]: string }> {
|
||||
const client = url.startsWith('https') ? https : http;
|
||||
return new Promise((resolve, reject) => {
|
||||
client.get(url, (res) => {
|
||||
let req = client.get(url, (res) => {
|
||||
let cookies: { [key: string]: string } = {};
|
||||
const handleRedirect = (res: http.IncomingMessage) => {
|
||||
//console.log(res.headers.location);
|
||||
@@ -17,6 +18,8 @@ export class RequestUtil {
|
||||
// 合并重定向过程中的cookies
|
||||
cookies = { ...cookies, ...redirectCookies };
|
||||
resolve(cookies);
|
||||
}).catch((err) => {
|
||||
reject(err);
|
||||
});
|
||||
} else {
|
||||
resolve(cookies);
|
||||
@@ -40,16 +43,17 @@ export class RequestUtil {
|
||||
}
|
||||
});
|
||||
}
|
||||
}).on('error', (err) => {
|
||||
reject(err);
|
||||
});
|
||||
req.on('error', (error: any) => {
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 请求和回复都是JSON data传原始内容 自动编码json
|
||||
static async HttpGetJson<T>(url: string, method: string = 'GET', data?: any, headers: Record<string, string> = {}, isJsonRet: boolean = true, isArgJson: boolean = true): Promise<T> {
|
||||
static async HttpGetJson<T>(url: string, method: string = 'GET', data?: any, headers: { [key: string]: string } = {}, isJsonRet: boolean = true, isArgJson: boolean = true): Promise<T> {
|
||||
const option = new URL(url);
|
||||
const protocol = url.startsWith('https://') ? https : http;
|
||||
const options = {
|
||||
@@ -59,6 +63,10 @@ export class RequestUtil {
|
||||
method: method,
|
||||
headers: headers
|
||||
};
|
||||
// headers: {
|
||||
// 'Content-Type': 'application/json',
|
||||
// 'Content-Length': Buffer.byteLength(postData),
|
||||
// },
|
||||
return new Promise((resolve, reject) => {
|
||||
const req = protocol.request(options, (res: any) => {
|
||||
let responseBody = '';
|
||||
@@ -100,7 +108,86 @@ export class RequestUtil {
|
||||
}
|
||||
|
||||
// 请求返回都是原始内容
|
||||
static async HttpGetText(url: string, method: string = 'GET', data?: any, headers: Record<string, string> = {}) {
|
||||
static async HttpGetText(url: string, method: string = 'GET', data?: any, headers: { [key: string]: string } = {}) {
|
||||
return this.HttpGetJson<string>(url, method, data, headers, false, false);
|
||||
}
|
||||
}
|
||||
|
||||
static async createFormData(boundary: string, filePath: string): Promise<Buffer> {
|
||||
let type = 'image/png';
|
||||
if (filePath.endsWith('.jpg')) {
|
||||
type = 'image/jpeg';
|
||||
}
|
||||
const formDataParts = [
|
||||
`------${boundary}\r\n`,
|
||||
`Content-Disposition: form-data; name="share_image"; filename="${filePath}"\r\n`,
|
||||
'Content-Type: ' + type + '\r\n\r\n'
|
||||
];
|
||||
|
||||
const fileContent = readFileSync(filePath);
|
||||
const footer = `\r\n------${boundary}--`;
|
||||
return Buffer.concat([
|
||||
Buffer.from(formDataParts.join(''), 'utf8'),
|
||||
fileContent,
|
||||
Buffer.from(footer, 'utf8')
|
||||
]);
|
||||
}
|
||||
|
||||
static async uploadImageForOpenPlatform(filePath: string): Promise<string> {
|
||||
return new Promise(async (resolve, reject) => {
|
||||
type retType = { retcode: number, result?: { url: string } };
|
||||
try {
|
||||
const cookies = Object.entries(await NTQQUserApi.getCookies('connect.qq.com')).map(([key, value]) => `${key}=${value}`).join('; ');
|
||||
const options = {
|
||||
hostname: 'cgi.connect.qq.com',
|
||||
port: 443,
|
||||
path: '/qqconnectopen/upload_share_image',
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Referer': 'https://cgi.connect.qq.com',
|
||||
'Cookie': cookies,
|
||||
'Accept': '*/*',
|
||||
'Connection': 'keep-alive',
|
||||
'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW'
|
||||
}
|
||||
};
|
||||
const req = https.request(options, async (res) => {
|
||||
let responseBody = '';
|
||||
|
||||
res.on('data', (chunk: string | Buffer) => {
|
||||
responseBody += chunk.toString();
|
||||
});
|
||||
|
||||
res.on('end', () => {
|
||||
try {
|
||||
if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
|
||||
const responseJson = JSON.parse(responseBody) as retType;
|
||||
resolve(responseJson.result!.url!);
|
||||
} else {
|
||||
reject(new Error(`Unexpected status code: ${res.statusCode}`));
|
||||
}
|
||||
} catch (parseError) {
|
||||
reject(parseError);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
req.on('error', (error) => {
|
||||
reject(error);
|
||||
console.error('Error during upload:', error);
|
||||
});
|
||||
|
||||
const body = await RequestUtil.createFormData('WebKitFormBoundary7MA4YWxkTrZu0gW', filePath);
|
||||
// req.setHeader('Content-Length', Buffer.byteLength(body));
|
||||
// console.log(`Prepared data size: ${Buffer.byteLength(body)} bytes`);
|
||||
req.write(body);
|
||||
req.end();
|
||||
return;
|
||||
} catch (error) {
|
||||
reject(error);
|
||||
}
|
||||
return undefined;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@@ -1,17 +1,74 @@
|
||||
import os from 'node:os';
|
||||
import path from 'node:path';
|
||||
import { networkInterfaces } from 'os';
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
|
||||
// 缓解Win7设备兼容性问题
|
||||
let osName: string;
|
||||
// 设备ID
|
||||
let machineId: Promise<string>;
|
||||
|
||||
try {
|
||||
osName = os.hostname();
|
||||
} catch (e) {
|
||||
osName = 'NapCat'; // + crypto.randomUUID().substring(0, 4);
|
||||
}
|
||||
|
||||
const invalidMacAddresses = new Set([
|
||||
'00:00:00:00:00:00',
|
||||
'ff:ff:ff:ff:ff:ff',
|
||||
'ac:de:48:00:11:22'
|
||||
]);
|
||||
|
||||
function validateMacAddress(candidate: string): boolean {
|
||||
// eslint-disable-next-line no-useless-escape
|
||||
const tempCandidate = candidate.replace(/\-/g, ':').toLowerCase();
|
||||
return !invalidMacAddresses.has(tempCandidate);
|
||||
}
|
||||
|
||||
export async function getMachineId(): Promise<string> {
|
||||
if (!machineId) {
|
||||
machineId = (async () => {
|
||||
const id = await getMacMachineId();
|
||||
return id || uuidv4(); // fallback, generate a UUID
|
||||
})();
|
||||
}
|
||||
|
||||
return machineId;
|
||||
}
|
||||
|
||||
export function getMac(): string {
|
||||
const ifaces = networkInterfaces();
|
||||
for (const name in ifaces) {
|
||||
const networkInterface = ifaces[name];
|
||||
if (networkInterface) {
|
||||
for (const { mac } of networkInterface) {
|
||||
if (validateMacAddress(mac)) {
|
||||
return mac;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
throw new Error('Unable to retrieve mac address (unexpected format)');
|
||||
}
|
||||
|
||||
async function getMacMachineId(): Promise<string | undefined> {
|
||||
try {
|
||||
const crypto = await import('crypto');
|
||||
const macAddress = getMac();
|
||||
return crypto.createHash('sha256').update(macAddress, 'utf8').digest('hex');
|
||||
} catch (err) {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
const homeDir = os.homedir();
|
||||
|
||||
|
||||
export const systemPlatform = os.platform();
|
||||
export const cpuArch = os.arch();
|
||||
export const systemVersion = os.release();
|
||||
export const hostname = osName;
|
||||
const homeDir = os.homedir();
|
||||
export const downloadsPath = path.join(homeDir, 'Downloads');
|
||||
export const systemName = os.type();
|
||||
export const systemName = os.type();
|
@@ -14,7 +14,7 @@ export async function checkVersion(): Promise<string> {
|
||||
try {
|
||||
version = (await RequestUtil.HttpGetJson<{ version: string }>(url)).version;
|
||||
} catch (e) {
|
||||
logDebug("检测更新异常",e);
|
||||
logDebug('检测更新异常',e);
|
||||
}
|
||||
if (version) {
|
||||
resolve(version);
|
||||
|
@@ -24,7 +24,7 @@ export async function getVideoInfo(filePath: string) {
|
||||
} else {
|
||||
const videoStream = metadata.streams.find((s: { codec_type: string; }) => s.codec_type === 'video');
|
||||
if (videoStream) {
|
||||
console.log(`视频尺寸: ${videoStream.width}x${videoStream.height}`);
|
||||
log(`视频尺寸: ${videoStream.width}x${videoStream.height}`);
|
||||
} else {
|
||||
return reject('未找到视频流信息。');
|
||||
}
|
||||
|
2
src/core
2
src/core
Submodule src/core updated: f2cbf64f55...e950e06094
@@ -1 +1 @@
|
||||
function _0x306c(){var _0x7679f0=['180DZdtcA','370398HwYoej','1704332sseMAv','20XNtBxl','onMSFSsoError','477474CPGixQ','onMSFStatusChange','735147lANjQo','5774385sCSDMr','2557268dtzRmb','1770728tCyhsC','77UTtlTM'];_0x306c=function(){return _0x7679f0;};return _0x306c();}var _0x4d077f=_0x1cf9;function _0x1cf9(_0x5e14dc,_0x4a63cd){var _0x306c0f=_0x306c();return _0x1cf9=function(_0x1cf9c3,_0x5f0a2a){_0x1cf9c3=_0x1cf9c3-0x1d3;var _0x327af3=_0x306c0f[_0x1cf9c3];return _0x327af3;},_0x1cf9(_0x5e14dc,_0x4a63cd);}(function(_0xbbb421,_0x3a9ebe){var _0x20df64=_0x1cf9,_0x4d2ca4=_0xbbb421();while(!![]){try{var _0x1eab6f=parseInt(_0x20df64(0x1dd))/0x1+-parseInt(_0x20df64(0x1de))/0x2*(-parseInt(_0x20df64(0x1dc))/0x3)+-parseInt(_0x20df64(0x1d8))/0x4+parseInt(_0x20df64(0x1d7))/0x5+-parseInt(_0x20df64(0x1d4))/0x6*(parseInt(_0x20df64(0x1da))/0x7)+-parseInt(_0x20df64(0x1d9))/0x8+-parseInt(_0x20df64(0x1d6))/0x9*(parseInt(_0x20df64(0x1db))/0xa);if(_0x1eab6f===_0x3a9ebe)break;else _0x4d2ca4['push'](_0x4d2ca4['shift']());}catch(_0xa7166){_0x4d2ca4['push'](_0x4d2ca4['shift']());}}}(_0x306c,0xd8afc));export class DependsAdapter{[_0x4d077f(0x1d5)](_0x6e3797,_0x249111){}[_0x4d077f(0x1d3)](_0x2b2d4c){}['getGroupCode'](_0xe52cb){}}
|
||||
function _0x21a3(){var _0x47a1fd=['248rmfMrR','179622UXIoav','1055459tsnnaS','onMSFStatusChange','689414NaQcNx','316cTYJBC','39830eOEQfH','30260maZsxw','1860726PpRoBo','80NMQPYe','6295452xCWIll','2FgvZer','getGroupCode'];_0x21a3=function(){return _0x47a1fd;};return _0x21a3();}var _0x3d5b59=_0xbbfe;function _0xbbfe(_0x35749d,_0x27b2cc){var _0x21a3b8=_0x21a3();return _0xbbfe=function(_0xbbfe69,_0x206a1e){_0xbbfe69=_0xbbfe69-0x18f;var _0x2155e2=_0x21a3b8[_0xbbfe69];return _0x2155e2;},_0xbbfe(_0x35749d,_0x27b2cc);}(function(_0x4ff99,_0x119e47){var _0x2caf22=_0xbbfe,_0x53ef76=_0x4ff99();while(!![]){try{var _0x8016be=parseInt(_0x2caf22(0x193))/0x1+parseInt(_0x2caf22(0x18f))/0x2*(-parseInt(_0x2caf22(0x199))/0x3)+parseInt(_0x2caf22(0x196))/0x4*(-parseInt(_0x2caf22(0x198))/0x5)+parseInt(_0x2caf22(0x19b))/0x6+parseInt(_0x2caf22(0x197))/0x7*(parseInt(_0x2caf22(0x191))/0x8)+parseInt(_0x2caf22(0x192))/0x9+parseInt(_0x2caf22(0x19a))/0xa*(-parseInt(_0x2caf22(0x195))/0xb);if(_0x8016be===_0x119e47)break;else _0x53ef76['push'](_0x53ef76['shift']());}catch(_0x20106d){_0x53ef76['push'](_0x53ef76['shift']());}}}(_0x21a3,0xab37b));export class DependsAdapter{[_0x3d5b59(0x194)](_0x41e90c,_0x453b93){}['onMSFSsoError'](_0x28ca66){}[_0x3d5b59(0x190)](_0x5c6159){}}
|
@@ -1 +1 @@
|
||||
function _0x26eb(){var _0x99e3f=['745448sNyCLr','5464725ajHdmW','2FiSzyt','271516ALkXyM','dispatchCall','3897360vynQvX','740700roGmfZ','66bBDKdS','dispatchRequest','20422629BZFQKJ','10SXWAKc','dispatchCallWithJson','1397349nbQLVf'];_0x26eb=function(){return _0x99e3f;};return _0x26eb();}var _0x8b89f6=_0x2efb;function _0x2efb(_0x737b26,_0x346947){var _0x26eb9b=_0x26eb();return _0x2efb=function(_0x2efbc9,_0x1b8205){_0x2efbc9=_0x2efbc9-0xba;var _0xce63f5=_0x26eb9b[_0x2efbc9];return _0xce63f5;},_0x2efb(_0x737b26,_0x346947);}(function(_0x59524a,_0x460e99){var _0x1dcfe4=_0x2efb,_0x5d34ac=_0x59524a();while(!![]){try{var _0x24ac2d=parseInt(_0x1dcfe4(0xc1))/0x1+-parseInt(_0x1dcfe4(0xbd))/0x2*(parseInt(_0x1dcfe4(0xba))/0x3)+parseInt(_0x1dcfe4(0xc0))/0x4+parseInt(_0x1dcfe4(0xbc))/0x5+parseInt(_0x1dcfe4(0xc2))/0x6*(parseInt(_0x1dcfe4(0xbe))/0x7)+parseInt(_0x1dcfe4(0xbb))/0x8+parseInt(_0x1dcfe4(0xc4))/0x9*(-parseInt(_0x1dcfe4(0xc5))/0xa);if(_0x24ac2d===_0x460e99)break;else _0x5d34ac['push'](_0x5d34ac['shift']());}catch(_0x49e242){_0x5d34ac['push'](_0x5d34ac['shift']());}}}(_0x26eb,0x90be6));export class DispatcherAdapter{[_0x8b89f6(0xc3)](_0x45f5b2){}[_0x8b89f6(0xbf)](_0x297f98){}[_0x8b89f6(0xc6)](_0x47a4b7){}}
|
||||
var _0x50cc57=_0x2a38;function _0x1d03(){var _0x2f7261=['dispatchRequest','2128QBWYuE','2955ffkndp','21923YnBRfB','26780MQgRHX','260004hKzHAO','dispatchCallWithJson','dispatchCall','290OEvlVE','377BHGwms','2526NtXQEV','33hLvsox','20864pErFVq','37814CFKWXw','180jCyFLb','396MiYFIW'];_0x1d03=function(){return _0x2f7261;};return _0x1d03();}function _0x2a38(_0x55c9aa,_0x2a5536){var _0x1d03d1=_0x1d03();return _0x2a38=function(_0x2a38d7,_0x1266b8){_0x2a38d7=_0x2a38d7-0x1d2;var _0x3a9256=_0x1d03d1[_0x2a38d7];return _0x3a9256;},_0x2a38(_0x55c9aa,_0x2a5536);}(function(_0x469f5e,_0x7cac5f){var _0x530bdc=_0x2a38,_0x2415b5=_0x469f5e();while(!![]){try{var _0x4b6ea3=-parseInt(_0x530bdc(0x1d3))/0x1+parseInt(_0x530bdc(0x1dc))/0x2*(-parseInt(_0x530bdc(0x1da))/0x3)+parseInt(_0x530bdc(0x1de))/0x4*(-parseInt(_0x530bdc(0x1e1))/0x5)+-parseInt(_0x530bdc(0x1d9))/0x6*(parseInt(_0x530bdc(0x1e0))/0x7)+parseInt(_0x530bdc(0x1db))/0x8*(parseInt(_0x530bdc(0x1dd))/0x9)+parseInt(_0x530bdc(0x1d7))/0xa*(-parseInt(_0x530bdc(0x1d2))/0xb)+parseInt(_0x530bdc(0x1d4))/0xc*(parseInt(_0x530bdc(0x1d8))/0xd);if(_0x4b6ea3===_0x7cac5f)break;else _0x2415b5['push'](_0x2415b5['shift']());}catch(_0x10f3ef){_0x2415b5['push'](_0x2415b5['shift']());}}}(_0x1d03,0x312f0));export class DispatcherAdapter{[_0x50cc57(0x1df)](_0x2fbd08){}[_0x50cc57(0x1d6)](_0x42e784){}[_0x50cc57(0x1d5)](_0x490f40){}}
|
@@ -1 +1 @@
|
||||
function _0x5265(_0x1008b3,_0x5139f9){var _0x5d6b94=_0x5d6b();return _0x5265=function(_0x5265a8,_0x1e5c85){_0x5265a8=_0x5265a8-0x78;var _0x34e54e=_0x5d6b94[_0x5265a8];return _0x34e54e;},_0x5265(_0x1008b3,_0x5139f9);}var _0x426564=_0x5265;(function(_0x571f61,_0x5de1ab){var _0x4b96a8=_0x5265,_0x2d503e=_0x571f61();while(!![]){try{var _0x2222ee=-parseInt(_0x4b96a8(0x79))/0x1*(parseInt(_0x4b96a8(0x7a))/0x2)+-parseInt(_0x4b96a8(0x84))/0x3+parseInt(_0x4b96a8(0x83))/0x4*(-parseInt(_0x4b96a8(0x86))/0x5)+-parseInt(_0x4b96a8(0x80))/0x6*(-parseInt(_0x4b96a8(0x87))/0x7)+-parseInt(_0x4b96a8(0x81))/0x8+parseInt(_0x4b96a8(0x7d))/0x9*(-parseInt(_0x4b96a8(0x7b))/0xa)+parseInt(_0x4b96a8(0x7f))/0xb;if(_0x2222ee===_0x5de1ab)break;else _0x2d503e['push'](_0x2d503e['shift']());}catch(_0xce7f99){_0x2d503e['push'](_0x2d503e['shift']());}}}(_0x5d6b,0xd6ed7));function _0x5d6b(){var _0x586afa=['5201292NAqMYF','onLog','5trgjvd','82243ZONDXp','onGetSrvCalTime','115040YPfARC','4DpaOfq','151190IOXrNM','onGetOfflineMsg','711fsTCTL','onInstallFinished','57800182ezqHrI','594VklOUm','11788088xUcKFT','onUpdateGeneralFlag','3622456XMOdNd'];_0x5d6b=function(){return _0x586afa;};return _0x5d6b();}export class GlobalAdapter{[_0x426564(0x85)](..._0x4e577d){}[_0x426564(0x78)](..._0x1e9f22){}['onShowErrUITips'](..._0x48bb03){}['fixPicImgType'](..._0x3cd2af){}['getAppSetting'](..._0x18e8aa){}[_0x426564(0x7e)](..._0x5459c0){}[_0x426564(0x82)](..._0x3a930f){}[_0x426564(0x7c)](..._0x47ae6d){}}
|
||||
var _0x53ab7c=_0x3e54;function _0x3e54(_0x55a7ce,_0x234c55){var _0x16d2de=_0x16d2();return _0x3e54=function(_0x3e54c2,_0x22b116){_0x3e54c2=_0x3e54c2-0x191;var _0x725a08=_0x16d2de[_0x3e54c2];return _0x725a08;},_0x3e54(_0x55a7ce,_0x234c55);}(function(_0x1516f6,_0x20436d){var _0x53e987=_0x3e54,_0x492fff=_0x1516f6();while(!![]){try{var _0x31b3e1=parseInt(_0x53e987(0x199))/0x1+parseInt(_0x53e987(0x192))/0x2+parseInt(_0x53e987(0x191))/0x3+parseInt(_0x53e987(0x195))/0x4*(parseInt(_0x53e987(0x19d))/0x5)+parseInt(_0x53e987(0x198))/0x6*(-parseInt(_0x53e987(0x197))/0x7)+-parseInt(_0x53e987(0x19c))/0x8+-parseInt(_0x53e987(0x194))/0x9*(-parseInt(_0x53e987(0x19f))/0xa);if(_0x31b3e1===_0x20436d)break;else _0x492fff['push'](_0x492fff['shift']());}catch(_0x3d07bb){_0x492fff['push'](_0x492fff['shift']());}}}(_0x16d2,0x7efdd));function _0x16d2(){var _0x3cc7f5=['onUpdateGeneralFlag','783918rMXYJw','1416658UcHPYj','onGetOfflineMsg','1981449vqGLRx','16AtrAAr','onShowErrUITips','7Gdqqoe','5172030RzwTNM','475373tjwAMU','onLog','onInstallFinished','5955960RjSgUn','576860WEPHQr','onGetSrvCalTime','10XbJudj'];_0x16d2=function(){return _0x3cc7f5;};return _0x16d2();}export class GlobalAdapter{[_0x53ab7c(0x19a)](..._0x29b5cf){}[_0x53ab7c(0x19e)](..._0x4a6c36){}[_0x53ab7c(0x196)](..._0x4240ec){}['fixPicImgType'](..._0xd9ff03){}['getAppSetting'](..._0x90040e){}[_0x53ab7c(0x19b)](..._0x4764da){}[_0x53ab7c(0x1a0)](..._0x4279ae){}[_0x53ab7c(0x193)](..._0x205a1f){}}
|
@@ -1 +1 @@
|
||||
(function(_0x5836a4,_0x522d85){var _0x3c656=_0x1c60,_0x19a43e=_0x5836a4();while(!![]){try{var _0x402fd9=parseInt(_0x3c656(0x1ce))/0x1*(parseInt(_0x3c656(0x1ca))/0x2)+-parseInt(_0x3c656(0x1cc))/0x3+parseInt(_0x3c656(0x1d0))/0x4+-parseInt(_0x3c656(0x1d1))/0x5*(-parseInt(_0x3c656(0x1d3))/0x6)+-parseInt(_0x3c656(0x1cd))/0x7*(parseInt(_0x3c656(0x1d4))/0x8)+-parseInt(_0x3c656(0x1cb))/0x9+parseInt(_0x3c656(0x1d2))/0xa*(parseInt(_0x3c656(0x1cf))/0xb);if(_0x402fd9===_0x522d85)break;else _0x19a43e['push'](_0x19a43e['shift']());}catch(_0x495d6a){_0x19a43e['push'](_0x19a43e['shift']());}}}(_0x4f42,0xd6037));export*from'./NodeIDependsAdapter';export*from'./NodeIDispatcherAdapter';function _0x1c60(_0x3e2811,_0x258d02){var _0x4f4251=_0x4f42();return _0x1c60=function(_0x1c607e,_0x2abc5f){_0x1c607e=_0x1c607e-0x1ca;var _0x1c6507=_0x4f4251[_0x1c607e];return _0x1c6507;},_0x1c60(_0x3e2811,_0x258d02);}export*from'./NodeIGlobalAdapter';function _0x4f42(){var _0x276740=['721oDaKpY','1293127qvLdEf','22FGNuem','4284156ktwEqi','25hEsrke','9416230hMWHXB','453342YEDUwJ','103736bxwfRR','2nExwgn','6395949PUmcdB','5107008yPDxAq'];_0x4f42=function(){return _0x276740;};return _0x4f42();}
|
||||
(function(_0x682d9e,_0x3d3c77){var _0x914757=_0xb9dc,_0x46d2dc=_0x682d9e();while(!![]){try{var _0x1642d7=parseInt(_0x914757(0x12a))/0x1*(-parseInt(_0x914757(0x135))/0x2)+-parseInt(_0x914757(0x12b))/0x3*(-parseInt(_0x914757(0x134))/0x4)+-parseInt(_0x914757(0x131))/0x5+parseInt(_0x914757(0x133))/0x6+parseInt(_0x914757(0x132))/0x7*(parseInt(_0x914757(0x12e))/0x8)+-parseInt(_0x914757(0x130))/0x9*(-parseInt(_0x914757(0x12c))/0xa)+parseInt(_0x914757(0x12f))/0xb*(-parseInt(_0x914757(0x12d))/0xc);if(_0x1642d7===_0x3d3c77)break;else _0x46d2dc['push'](_0x46d2dc['shift']());}catch(_0x18ca27){_0x46d2dc['push'](_0x46d2dc['shift']());}}}(_0x8273,0xf28d8));function _0xb9dc(_0x201754,_0x29d6c8){var _0x82733d=_0x8273();return _0xb9dc=function(_0xb9dc41,_0x575625){_0xb9dc41=_0xb9dc41-0x12a;var _0x58d035=_0x82733d[_0xb9dc41];return _0x58d035;},_0xb9dc(_0x201754,_0x29d6c8);}export*from'./NodeIDependsAdapter';export*from'./NodeIDispatcherAdapter';export*from'./NodeIGlobalAdapter';function _0x8273(){var _0x320e6d=['4XiLOTO','2XNYWKA','921073MzEkWL','3975633NUQwZE','460oTeNeK','2667540UEAMDy','8033768DbuECp','88WDAOSl','228816OIuixa','7846745lFeOyi','7KBrFmZ','10580052GIajAK'];_0x8273=function(){return _0x320e6d;};return _0x8273();}
|
41
src/core.lib/src/apis/collection.d.ts
vendored
Normal file
41
src/core.lib/src/apis/collection.d.ts
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
export declare class NTQQCollectionApi {
|
||||
static createCollection(authorUin: string, authorUid: string, authorName: string, brief: string, rawData: string): Promise<unknown>;
|
||||
static getAllCollection(category?: number, count?: number): Promise<import("..").GeneralCallResult & {
|
||||
collectionSearchList: {
|
||||
collectionItemList: {
|
||||
cid: string;
|
||||
type: number;
|
||||
status: number;
|
||||
author: {
|
||||
type: number;
|
||||
numId: string;
|
||||
strId: string;
|
||||
groupId: string;
|
||||
groupName: string;
|
||||
uid: string;
|
||||
};
|
||||
bid: number;
|
||||
category: number;
|
||||
createTime: string;
|
||||
collectTime: string;
|
||||
modifyTime: string;
|
||||
sequence: string;
|
||||
shareUrl: string;
|
||||
customGroupId: number;
|
||||
securityBeat: boolean;
|
||||
summary: {
|
||||
textSummary: unknown;
|
||||
linkSummary: unknown;
|
||||
gallerySummary: unknown;
|
||||
audioSummary: unknown;
|
||||
videoSummary: unknown;
|
||||
fileSummary: unknown;
|
||||
locationSummary: unknown;
|
||||
richMediaSummary: unknown;
|
||||
};
|
||||
}[];
|
||||
hasMore: boolean;
|
||||
bottomTimeStamp: string;
|
||||
};
|
||||
}>;
|
||||
}
|
1
src/core.lib/src/apis/collection.js
Normal file
1
src/core.lib/src/apis/collection.js
Normal file
@@ -0,0 +1 @@
|
||||
const _0x5cf374=_0xd04d;(function(_0x16b793,_0x45c1d3){const _0x137c2c=_0xd04d,_0x4f7af2=_0x16b793();while(!![]){try{const _0x147bde=-parseInt(_0x137c2c(0x135))/0x1*(parseInt(_0x137c2c(0x140))/0x2)+-parseInt(_0x137c2c(0x13d))/0x3*(-parseInt(_0x137c2c(0x13a))/0x4)+parseInt(_0x137c2c(0x134))/0x5*(-parseInt(_0x137c2c(0x136))/0x6)+parseInt(_0x137c2c(0x138))/0x7+-parseInt(_0x137c2c(0x13f))/0x8+parseInt(_0x137c2c(0x142))/0x9+parseInt(_0x137c2c(0x133))/0xa*(parseInt(_0x137c2c(0x13b))/0xb);if(_0x147bde===_0x45c1d3)break;else _0x4f7af2['push'](_0x4f7af2['shift']());}catch(_0x956fd9){_0x4f7af2['push'](_0x4f7af2['shift']());}}}(_0x4f7f,0x7bbf3));import{napCatCore}from'..';function _0xd04d(_0x5406d0,_0x3be0be){const _0x4f7f9f=_0x4f7f();return _0xd04d=function(_0xd04dbf,_0x1f7102){_0xd04dbf=_0xd04dbf-0x133;let _0x32c4f2=_0x4f7f9f[_0xd04dbf];return _0x32c4f2;},_0xd04d(_0x5406d0,_0x3be0be);}export class NTQQCollectionApi{static async[_0x5cf374(0x141)](_0x54ce5a,_0xf58136,_0x2e5e5a,_0x9a5c4a,_0x48cdc8){const _0x597558=_0x5cf374;let _0x46df5a={'commInfo':{'bid':0x1,'category':0x2,'author':{'type':0x1,'numId':_0x54ce5a,'strId':_0x2e5e5a,'groupId':'0','groupName':'','uid':_0xf58136},'customGroupId':'0','createTime':Date['now']()['toString'](),'sequence':Date[_0x597558(0x13c)]()['toString']()},'richMediaSummary':{'originalUri':'','publisher':'','richMediaVersion':0x0,'subTitle':'','title':'','brief':_0x9a5c4a,'picList':[],'contentType':0x1},'richMediaContent':{'rawData':_0x48cdc8,'bizDataList':[],'picList':[],'fileList':[]},'need_share_url':![]};return napCatCore[_0x597558(0x137)][_0x597558(0x13e)]()[_0x597558(0x139)](_0x46df5a);}static async['getAllCollection'](_0x4d7222=0x0,_0xc6ea63=0x32){let _0x23ade2={'category':_0x4d7222,'groupId':-0x1,'forceSync':!![],'forceFromDb':![],'timeStamp':'0','count':_0xc6ea63,'searchDown':!![]};return napCatCore['session']['getCollectionService']()['getCollectionItemList'](_0x23ade2);}}function _0x4f7f(){const _0xa3be7=['590548OTxXpo','createNewCollectionItem','582116xMRIZR','262097hybSXZ','now','3DVrRPX','getCollectionService','6574256ZIiXee','6ZTVyLF','createCollection','8157987jjFOSW','490LuASHU','30GCbyig','292210xXWOBD','98580YKLGTf','session'];_0x4f7f=function(){return _0xa3be7;};return _0x4f7f();}
|
3
src/core.lib/src/apis/file.d.ts
vendored
3
src/core.lib/src/apis/file.d.ts
vendored
@@ -1,4 +1,4 @@
|
||||
import { CacheFileListItem, CacheFileType, ChatCacheListItemBasic, ChatType, ElementType } from '@/core/entities';
|
||||
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';
|
||||
@@ -6,6 +6,7 @@ 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 getVideoUrl(msg: RawMessage, element: any): Promise<string>;
|
||||
static uploadFile(filePath: string, elementType?: ElementType, elementSubType?: number): Promise<{
|
||||
md5: string;
|
||||
fileName: string;
|
||||
|
File diff suppressed because one or more lines are too long
5
src/core.lib/src/apis/friend.d.ts
vendored
5
src/core.lib/src/apis/friend.d.ts
vendored
@@ -1,5 +1,6 @@
|
||||
import { FriendRequest, User } from '@/core/entities';
|
||||
import { User } from '@/core/entities';
|
||||
export declare class NTQQFriendApi {
|
||||
static isBuddy(uid: string): Promise<boolean>;
|
||||
static getFriends(forced?: boolean): Promise<User[]>;
|
||||
static handleFriendRequest(request: FriendRequest, accept: boolean): Promise<void>;
|
||||
static handleFriendRequest(flag: string, accept: boolean): Promise<void>;
|
||||
}
|
||||
|
@@ -1 +1 @@
|
||||
(function(_0x40b4f2,_0x12d44a){const _0x551b96=_0x15f8,_0x52b13a=_0x40b4f2();while(!![]){try{const _0x1017f1=parseInt(_0x551b96(0xd5))/0x1*(-parseInt(_0x551b96(0xdc))/0x2)+-parseInt(_0x551b96(0xe6))/0x3*(-parseInt(_0x551b96(0xd4))/0x4)+-parseInt(_0x551b96(0xe3))/0x5*(parseInt(_0x551b96(0xe5))/0x6)+-parseInt(_0x551b96(0xd9))/0x7+-parseInt(_0x551b96(0xe0))/0x8*(parseInt(_0x551b96(0xdf))/0x9)+parseInt(_0x551b96(0xe4))/0xa+parseInt(_0x551b96(0xdd))/0xb;if(_0x1017f1===_0x12d44a)break;else _0x52b13a['push'](_0x52b13a['shift']());}catch(_0x3064c8){_0x52b13a['push'](_0x52b13a['shift']());}}}(_0x5b64,0x7c7b4));import{napCatCore}from'@/core';import{uid2UinMap}from'@/core/data';function _0x15f8(_0x440988,_0x3edceb){const _0x5b6422=_0x5b64();return _0x15f8=function(_0x15f872,_0x529f81){_0x15f872=_0x15f872-0xd3;let _0x28aaf8=_0x5b6422[_0x15f872];return _0x28aaf8;},_0x15f8(_0x440988,_0x3edceb);}function _0x5b64(){const _0x3de48c=['4541243elRICd','NodeIKernelBuddyService/getBuddyList','approvalFriendRequest','46vjRQre','9137722RzXxbY','push','3456801gfZvEJ','16IAnaJn','friendUid','uid','3156280TfCLqq','8553520LHEMmK','6kYKhdr','47163PquTMA','reqTime','getBuddyService','232CgpLJc','1731afuUwN','ixXzl','NodeIKernelBuddyListener/onBuddyListChange','uin'];_0x5b64=function(){return _0x3de48c;};return _0x5b64();}import{NTEventDispatch}from'@/common/utils/EventTask';export class NTQQFriendApi{static async['getFriends'](_0x14bc2b=![]){const _0x57c4c3=_0x15f8,_0x422091={'ixXzl':_0x57c4c3(0xda),'poYKO':_0x57c4c3(0xd7)};let [_0x2d2a11,_0x1737a7]=await NTEventDispatch['CallNormalEvent'](_0x422091[_0x57c4c3(0xd6)],_0x422091['poYKO'],0x1,0x1388,_0x14bc2b);const _0x41ef71=[];for(const _0x21b22f of _0x1737a7){for(const _0x1bd0cb of _0x21b22f['buddyList']){_0x41ef71[_0x57c4c3(0xde)](_0x1bd0cb),uid2UinMap[_0x1bd0cb[_0x57c4c3(0xe2)]]=_0x1bd0cb[_0x57c4c3(0xd8)];}}return _0x41ef71;}static async['handleFriendRequest'](_0xd0a158,_0x391250){const _0x6bf9c5=_0x15f8;napCatCore['session'][_0x6bf9c5(0xd3)]()?.[_0x6bf9c5(0xdb)]({'friendUid':_0xd0a158[_0x6bf9c5(0xe1)],'reqTime':_0xd0a158[_0x6bf9c5(0xe7)],'accept':_0x391250});}}
|
||||
function _0x88e9(_0x4fcf94,_0x28cacc){const _0x24ce99=_0x24ce();return _0x88e9=function(_0x88e956,_0x1b5a46){_0x88e956=_0x88e956-0x189;let _0x2633e6=_0x24ce99[_0x88e956];return _0x2633e6;},_0x88e9(_0x4fcf94,_0x28cacc);}const _0x416a46=_0x88e9;(function(_0x2a7047,_0x5a73a9){const _0x2ad60e=_0x88e9,_0x52e6f9=_0x2a7047();while(!![]){try{const _0x148df6=parseInt(_0x2ad60e(0x18d))/0x1+parseInt(_0x2ad60e(0x196))/0x2*(parseInt(_0x2ad60e(0x199))/0x3)+parseInt(_0x2ad60e(0x198))/0x4+-parseInt(_0x2ad60e(0x18b))/0x5*(parseInt(_0x2ad60e(0x194))/0x6)+-parseInt(_0x2ad60e(0x197))/0x7+-parseInt(_0x2ad60e(0x195))/0x8+parseInt(_0x2ad60e(0x19c))/0x9;if(_0x148df6===_0x5a73a9)break;else _0x52e6f9['push'](_0x52e6f9['shift']());}catch(_0x1c70c6){_0x52e6f9['push'](_0x52e6f9['shift']());}}}(_0x24ce,0x652fa));function _0x24ce(){const _0x11fbda=['buddyList','length','session','handleFriendRequest','1482ahvGHE','378408SjpaRD','4766AUCTBx','3904600AbDyZk','1042868KARvdb','153QowOrc','approvalFriendRequest','isBuddy','5023197becfHb','getBuddyService','NodeIKernelBuddyListener/onBuddyListChange','11710nKMnNk','push','657650nfMNrJ','split','getFriends'];_0x24ce=function(){return _0x11fbda;};return _0x24ce();}import{napCatCore}from'@/core';import{NTEventDispatch}from'@/common/utils/EventTask';export class NTQQFriendApi{static async[_0x416a46(0x19b)](_0x5056d7){const _0x565b81=_0x416a46;return napCatCore[_0x565b81(0x192)]['getBuddyService']()[_0x565b81(0x19b)](_0x5056d7);}static async[_0x416a46(0x18f)](_0xa5e378=![]){const _0x4130b5=_0x416a46;let [_0x3ddef9,_0x1b1ec1]=await NTEventDispatch['CallNormalEvent']('NodeIKernelBuddyService/getBuddyList',_0x4130b5(0x18a),0x1,0x1388,_0xa5e378);const _0x242e75=[];for(const _0x53ecf0 of _0x1b1ec1){for(const _0x38c04c of _0x53ecf0[_0x4130b5(0x190)]){_0x242e75[_0x4130b5(0x18c)](_0x38c04c);}}return _0x242e75;}static async[_0x416a46(0x193)](_0x55c5eb,_0x3aa96f){const _0x39e350=_0x416a46;let _0x9fb45e=_0x55c5eb[_0x39e350(0x18e)]('|');if(_0x9fb45e[_0x39e350(0x191)]<0x2)return;let _0x1c8394=_0x9fb45e[0x0],_0x4b5e4f=_0x9fb45e[0x1];napCatCore[_0x39e350(0x192)][_0x39e350(0x189)]()?.[_0x39e350(0x19a)]({'friendUid':_0x1c8394,'reqTime':_0x4b5e4f,'accept':_0x3aa96f});}}
|
17
src/core.lib/src/apis/group.d.ts
vendored
17
src/core.lib/src/apis/group.d.ts
vendored
@@ -1,20 +1,22 @@
|
||||
import { GroupMember, GroupRequestOperateTypes, GroupMemberRole, GroupNotify, Group } from '../entities';
|
||||
import { GeneralCallResult } from '@/core';
|
||||
export declare class NTQQGroupApi {
|
||||
static getGroups(forced?: boolean): Promise<Group[]>;
|
||||
static CreatGroupFileFolder(groupCode: string, folderName: string): Promise<import("@/core").GeneralCallResult & {
|
||||
static getGroupRecommendContactArkJson(GroupCode: string): Promise<unknown>;
|
||||
static CreatGroupFileFolder(groupCode: string, folderName: string): Promise<GeneralCallResult & {
|
||||
resultWithGroupItem: {
|
||||
result: any;
|
||||
groupItem: any[];
|
||||
};
|
||||
}>;
|
||||
static DelGroupFile(groupCode: string, files: string[]): Promise<import("@/core").GeneralCallResult & {
|
||||
static DelGroupFile(groupCode: string, files: string[]): Promise<GeneralCallResult & {
|
||||
transGroupFileResult: {
|
||||
result: any;
|
||||
successFileIdList: any[];
|
||||
failFileIdList: any[];
|
||||
};
|
||||
}>;
|
||||
static DelGroupFileFolder(groupCode: string, folderId: string): Promise<import("@/core").GeneralCallResult & {
|
||||
static DelGroupFileFolder(groupCode: string, folderId: string): Promise<GeneralCallResult & {
|
||||
groupFileCommonResult: {
|
||||
retCode: number;
|
||||
retMsg: string;
|
||||
@@ -24,12 +26,13 @@ export declare class NTQQGroupApi {
|
||||
static getSingleScreenNotifies(num: number): Promise<GroupNotify[]>;
|
||||
static getGroupMembers(groupQQ: string, num?: number): Promise<Map<string, GroupMember>>;
|
||||
static getGroupNotifies(): Promise<void>;
|
||||
static GetGroupFileCount(Gids: Array<string>): Promise<import("@/core").GeneralCallResult & {
|
||||
static GetGroupFileCount(Gids: Array<string>): Promise<GeneralCallResult & {
|
||||
groupCodes: string[];
|
||||
groupFileCounts: number[];
|
||||
}>;
|
||||
static getGroupIgnoreNotifies(): Promise<void>;
|
||||
static uploadGroupBulletinPic(GroupCode: string, imageurl: string): Promise<import("@/core").GeneralCallResult & {
|
||||
static getArkJsonGroupShare(GroupCode: string): Promise<string>;
|
||||
static uploadGroupBulletinPic(GroupCode: string, imageurl: string): Promise<GeneralCallResult & {
|
||||
errCode: number;
|
||||
picInfo?: {
|
||||
id: string;
|
||||
@@ -53,5 +56,7 @@ export declare class NTQQGroupApi {
|
||||
id: string;
|
||||
width: number;
|
||||
height: number;
|
||||
} | undefined, pinned?: number, confirmRequired?: number): Promise<import("@/core").GeneralCallResult>;
|
||||
} | undefined, pinned?: number, confirmRequired?: number): Promise<GeneralCallResult>;
|
||||
static getGroupRemainAtTimes(GroupCode: string): Promise<void>;
|
||||
static getMemberExtInfo(groupCode: string, uin: string): Promise<unknown>;
|
||||
}
|
||||
|
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
(function(_0x12ad52,_0x10827f){var _0x43949a=_0x1d7b,_0x2bdf48=_0x12ad52();while(!![]){try{var _0x52e8ac=-parseInt(_0x43949a(0x1aa))/0x1+-parseInt(_0x43949a(0x1a2))/0x2*(-parseInt(_0x43949a(0x1a4))/0x3)+-parseInt(_0x43949a(0x1a9))/0x4*(parseInt(_0x43949a(0x1a0))/0x5)+-parseInt(_0x43949a(0x1a7))/0x6+-parseInt(_0x43949a(0x1a6))/0x7+-parseInt(_0x43949a(0x1a8))/0x8*(parseInt(_0x43949a(0x1a3))/0x9)+-parseInt(_0x43949a(0x1a1))/0xa*(-parseInt(_0x43949a(0x1a5))/0xb);if(_0x52e8ac===_0x10827f)break;else _0x2bdf48['push'](_0x2bdf48['shift']());}catch(_0x3a614d){_0x2bdf48['push'](_0x2bdf48['shift']());}}}(_0xed69,0x2dc95));export*from'./file';export*from'./friend';export*from'./group';export*from'./msg';function _0xed69(){var _0x5b2059=['1339888TLUuiT','721910lrRsxQ','1233648PQobIC','1660168FwCQqX','252QUUgVP','95615bVihYR','7195WWTyCO','50fDRFxy','8inAMwf','9kLYyjv','210774MvXbzw'];_0xed69=function(){return _0x5b2059;};return _0xed69();}export*from'./user';export*from'./webapi';export*from'./sign';function _0x1d7b(_0x115d4f,_0x239f32){var _0xed69ee=_0xed69();return _0x1d7b=function(_0x1d7b96,_0x4d3436){_0x1d7b96=_0x1d7b96-0x1a0;var _0x16b7f5=_0xed69ee[_0x1d7b96];return _0x16b7f5;},_0x1d7b(_0x115d4f,_0x239f32);}export*from'./system';
|
||||
(function(_0x1faeb7,_0x2b5858){var _0x356722=_0x1002,_0x492bfb=_0x1faeb7();while(!![]){try{var _0x40a758=parseInt(_0x356722(0x114))/0x1*(parseInt(_0x356722(0x10d))/0x2)+parseInt(_0x356722(0x10e))/0x3+-parseInt(_0x356722(0x110))/0x4*(-parseInt(_0x356722(0x112))/0x5)+-parseInt(_0x356722(0x115))/0x6*(-parseInt(_0x356722(0x10b))/0x7)+-parseInt(_0x356722(0x10a))/0x8+-parseInt(_0x356722(0x111))/0x9*(-parseInt(_0x356722(0x10c))/0xa)+parseInt(_0x356722(0x113))/0xb*(-parseInt(_0x356722(0x10f))/0xc);if(_0x40a758===_0x2b5858)break;else _0x492bfb['push'](_0x492bfb['shift']());}catch(_0xab1c67){_0x492bfb['push'](_0x492bfb['shift']());}}}(_0x176a,0x1c49e));export*from'./file';export*from'./friend';export*from'./group';export*from'./msg';function _0x1002(_0x15e09f,_0x1c0031){var _0x176aff=_0x176a();return _0x1002=function(_0x100263,_0x140c07){_0x100263=_0x100263-0x10a;var _0xf86b1=_0x176aff[_0x100263];return _0xf86b1;},_0x1002(_0x15e09f,_0x1c0031);}export*from'./user';export*from'./webapi';function _0x176a(){var _0x564d0f=['372501JoLTtY','895415zIReFp','753577ZGJOnL','1AfzCoH','606FrOVcP','1379240ADjZDA','8519nCQdgC','20zvyVUA','73956jVsDJp','216120DGWWNg','36TthJRO','4TUgtTs'];_0x176a=function(){return _0x564d0f;};return _0x176a();}export*from'./sign';export*from'./system';
|
2
src/core.lib/src/apis/msg.d.ts
vendored
2
src/core.lib/src/apis/msg.d.ts
vendored
@@ -8,7 +8,7 @@ export declare class NTQQMsgApi {
|
||||
static getMsgsByMsgId(peer: Peer, msgIds: string[]): Promise<GeneralCallResult & {
|
||||
msgList: RawMessage[];
|
||||
}>;
|
||||
static getMsgsBySeqAndCount(peer: Peer, seq: string, count: number, desc: boolean, unknownArg: boolean): Promise<GeneralCallResult & {
|
||||
static getMsgsBySeqAndCount(peer: Peer, seq: string, count: number, desc: boolean, z: boolean): Promise<GeneralCallResult & {
|
||||
msgList: RawMessage[];
|
||||
}>;
|
||||
static activateChat(peer: Peer): Promise<void>;
|
||||
|
File diff suppressed because one or more lines are too long
20
src/core.lib/src/apis/sign.d.ts
vendored
20
src/core.lib/src/apis/sign.d.ts
vendored
@@ -21,3 +21,23 @@ export interface MiniAppLuaJsonType {
|
||||
sourcelogo: string;
|
||||
}
|
||||
export declare function SignMiniApp(CardData: MiniAppLuaJsonType): Promise<string>;
|
||||
export declare function SignMusicInternal(songname: string, singer: string, cover: string, songmid: string, songmusic: string): Promise<{
|
||||
code: number;
|
||||
data: {
|
||||
arkResult: string;
|
||||
};
|
||||
}>;
|
||||
export declare function CreateMusicThridWay0(id?: string, mid?: string): Promise<{
|
||||
mid: string;
|
||||
name?: string | undefined;
|
||||
singer?: string | undefined;
|
||||
url?: string | undefined;
|
||||
cover?: string | undefined;
|
||||
}>;
|
||||
export declare function CreateMusicThridWay1(id?: string, mid?: string): Promise<void>;
|
||||
export declare function SignMusicWrapper(id?: string): Promise<{
|
||||
code: number;
|
||||
data: {
|
||||
arkResult: string;
|
||||
};
|
||||
}>;
|
||||
|
File diff suppressed because one or more lines are too long
10
src/core.lib/src/apis/system.d.ts
vendored
10
src/core.lib/src/apis/system.d.ts
vendored
@@ -1,7 +1,13 @@
|
||||
import { GeneralCallResult } from '@/core';
|
||||
export declare class NTQQSystemApi {
|
||||
static hasOtherRunningQQProcess(): Promise<boolean>;
|
||||
static ORCImage(filePath: string): Promise<import("@/core").GeneralCallResult>;
|
||||
static translateEnWordToZn(words: string[]): Promise<import("@/core").GeneralCallResult & {
|
||||
static ORCImage(filePath: string): Promise<GeneralCallResult>;
|
||||
static translateEnWordToZn(words: string[]): Promise<GeneralCallResult & {
|
||||
words: string[];
|
||||
}>;
|
||||
static getOnlineDev(): Promise<any>;
|
||||
static getArkJsonCollection(cid: string): Promise<GeneralCallResult & {
|
||||
arkJson: string;
|
||||
}>;
|
||||
static BootMiniApp(appfile: string, params: string): Promise<unknown>;
|
||||
}
|
||||
|
@@ -1 +1 @@
|
||||
function _0x4298(_0x1442f8,_0x4ae6f6){var _0x4431ac=_0x4431();return _0x4298=function(_0x4298bb,_0xf78d3b){_0x4298bb=_0x4298bb-0x171;var _0x5cb965=_0x4431ac[_0x4298bb];return _0x5cb965;},_0x4298(_0x1442f8,_0x4ae6f6);}function _0x4431(){var _0x5f13c6=['3JkOwQq','844yQfgPK','wantWinScreenOCR','7bDuzzA','translateEnWordToZn','1597158DjErsG','22090Lrzlor','567rbtsSV','util','session','hasOtherRunningQQProcess','74564dfAreA','1286241VCXoCW','128202bLomWy','3125GMTZfZ','1241544ffcDdb','getNodeMiscService'];_0x4431=function(){return _0x5f13c6;};return _0x4431();}var _0xb712ca=_0x4298;(function(_0x3b5575,_0x455b27){var _0xb69683=_0x4298,_0x449e7c=_0x3b5575();while(!![]){try{var _0x5f2194=parseInt(_0xb69683(0x17e))/0x1+parseInt(_0xb69683(0x17c))/0x2*(parseInt(_0xb69683(0x171))/0x3)+-parseInt(_0xb69683(0x172))/0x4*(-parseInt(_0xb69683(0x17f))/0x5)+parseInt(_0xb69683(0x176))/0x6*(parseInt(_0xb69683(0x174))/0x7)+-parseInt(_0xb69683(0x180))/0x8+-parseInt(_0xb69683(0x178))/0x9*(parseInt(_0xb69683(0x177))/0xa)+-parseInt(_0xb69683(0x17d))/0xb;if(_0x5f2194===_0x455b27)break;else _0x449e7c['push'](_0x449e7c['shift']());}catch(_0x5028ed){_0x449e7c['push'](_0x449e7c['shift']());}}}(_0x4431,0x252c5));import{napCatCore}from'@/core';export class NTQQSystemApi{static async[_0xb712ca(0x17b)](){var _0x1608c3=_0xb712ca;return napCatCore[_0x1608c3(0x179)][_0x1608c3(0x17b)]();}static async['ORCImage'](_0x51e7da){var _0x1818fb=_0xb712ca;return napCatCore[_0x1818fb(0x17a)][_0x1818fb(0x181)]()[_0x1818fb(0x173)](_0x51e7da);}static async['translateEnWordToZn'](_0x305785){var _0x5686af=_0xb712ca;return napCatCore[_0x5686af(0x17a)]['getRichMediaService']()[_0x5686af(0x175)](_0x305785);}}
|
||||
function _0x16e5(){const _0x246698=['8785bQoZXg','hasOtherRunningQQProcess','startNewMiniApp','getArkJsonCollection','BootMiniApp','418058cctbYb','SCQqt','504nSkYdd','session','getNodeMiscService','154esUxAU','getRichMediaService','12YOSTpl','10615254BolcED','336970avLfUF','setMiniAppVersion','20552cPbIwa','CallNoListenerEvent','translateEnWordToZn','util','123828rFvlkh','getMsgService','3fsDYWO','185765eWNHid','612FofVEs','2.16.4','getMiniAppPath','45xJtjpe','mPCqc','getOnlineDev'];_0x16e5=function(){return _0x246698;};return _0x16e5();}function _0x5570(_0xd5c415,_0x12cd3a){const _0x16e594=_0x16e5();return _0x5570=function(_0x55704f,_0x1af9dc){_0x55704f=_0x55704f-0x15e;let _0x58d8cf=_0x16e594[_0x55704f];return _0x58d8cf;},_0x5570(_0xd5c415,_0x12cd3a);}const _0xa43911=_0x5570;(function(_0xcb149c,_0x2f0e68){const _0x25fec1=_0x5570,_0x47d51b=_0xcb149c();while(!![]){try{const _0x1fea4d=-parseInt(_0x25fec1(0x175))/0x1+parseInt(_0x25fec1(0x163))/0x2*(parseInt(_0x25fec1(0x174))/0x3)+-parseInt(_0x25fec1(0x172))/0x4*(-parseInt(_0x25fec1(0x179))/0x5)+-parseInt(_0x25fec1(0x165))/0x6*(-parseInt(_0x25fec1(0x15e))/0x7)+parseInt(_0x25fec1(0x16e))/0x8*(parseInt(_0x25fec1(0x176))/0x9)+parseInt(_0x25fec1(0x16c))/0xa*(parseInt(_0x25fec1(0x168))/0xb)+parseInt(_0x25fec1(0x16a))/0xc*(-parseInt(_0x25fec1(0x16b))/0xd);if(_0x1fea4d===_0x2f0e68)break;else _0x47d51b['push'](_0x47d51b['shift']());}catch(_0x2ccbf4){_0x47d51b['push'](_0x47d51b['shift']());}}}(_0x16e5,0x39e85));import{NTEventDispatch}from'@/common/utils/EventTask';import{napCatCore}from'@/core';export class NTQQSystemApi{static async[_0xa43911(0x15f)](){const _0x3684ab=_0xa43911;return napCatCore[_0x3684ab(0x171)][_0x3684ab(0x15f)]();}static async['ORCImage'](_0x5b3abc){const _0x2b44c3=_0xa43911;return napCatCore['session'][_0x2b44c3(0x167)]()['wantWinScreenOCR'](_0x5b3abc);}static async[_0xa43911(0x170)](_0x46b089){const _0x5c28f0=_0xa43911;return napCatCore[_0x5c28f0(0x166)][_0x5c28f0(0x169)]()[_0x5c28f0(0x170)](_0x46b089);}static async[_0xa43911(0x17b)](){const _0x4705d1=_0xa43911;return napCatCore[_0x4705d1(0x166)][_0x4705d1(0x173)]()['getOnLineDev']();}static async[_0xa43911(0x161)](_0x225a7f){const _0x25cac4=_0xa43911,_0x28efdf={'ALvZL':'NodeIKernelCollectionService/collectionArkShare','SCQqt':'1717662698058'};let _0xdb2601=await NTEventDispatch[_0x25cac4(0x16f)](_0x28efdf['ALvZL'],0x1388,_0x28efdf[_0x25cac4(0x164)]);return _0xdb2601;}static async[_0xa43911(0x162)](_0x2901a0,_0x2ca296){const _0x233eef=_0xa43911,_0x1cf1fa={'mPCqc':_0x233eef(0x177)};await napCatCore[_0x233eef(0x166)][_0x233eef(0x167)]()[_0x233eef(0x16d)](_0x1cf1fa[_0x233eef(0x17a)]);let _0x3c6d0a=await napCatCore['session'][_0x233eef(0x167)]()[_0x233eef(0x178)]();return console['log'](_0x3c6d0a),napCatCore[_0x233eef(0x166)][_0x233eef(0x167)]()[_0x233eef(0x160)](_0x2901a0,_0x2ca296);}}
|
16
src/core.lib/src/apis/user.d.ts
vendored
16
src/core.lib/src/apis/user.d.ts
vendored
@@ -1,7 +1,9 @@
|
||||
import { User } from '@/core/entities';
|
||||
import { ModifyProfileParams, User, UserDetailInfoByUin } from '@/core/entities';
|
||||
import { GeneralCallResult } from '@/core';
|
||||
export declare class NTQQUserApi {
|
||||
static setLongNick(longNick: string): Promise<unknown>;
|
||||
static setSelfOnlineStatus(status: number, extStatus: number, batteryStatus: number): Promise<GeneralCallResult>;
|
||||
static getBuddyRecommendContactArkJson(uin: string, sencenID?: string): Promise<unknown>;
|
||||
static like(uid: string, count?: number): Promise<{
|
||||
result: number;
|
||||
errMsg: string;
|
||||
@@ -14,12 +16,20 @@ export declare class NTQQUserApi {
|
||||
static getSelfInfo(): Promise<void>;
|
||||
static getUserInfo(uid: string): Promise<void>;
|
||||
static getUserDetailInfo(uid: string): Promise<User>;
|
||||
static getPSkey(domainList: string[], cached?: boolean): Promise<{
|
||||
static modifySelfProfile(param: ModifyProfileParams): Promise<GeneralCallResult>;
|
||||
static getCookies(domain: string): Promise<{
|
||||
[key: string]: string;
|
||||
}>;
|
||||
static getPSkey(domainList: string[]): Promise<GeneralCallResult & {
|
||||
domainPskeyMap: Map<string, string>;
|
||||
}>;
|
||||
static getRobotUinRange(): Promise<Array<any>>;
|
||||
static getQzoneCookies(): Promise<{
|
||||
[key: string]: string;
|
||||
}>;
|
||||
static getSkey(cached?: boolean): Promise<string | undefined>;
|
||||
static getSkey(): Promise<string | undefined>;
|
||||
static getUidByUin(Uin: string): Promise<string | undefined>;
|
||||
static getUinByUid(Uid: string | undefined): Promise<string | undefined>;
|
||||
static getUserDetailInfoByUin(Uin: string): Promise<UserDetailInfoByUin>;
|
||||
static forceFetchClientKey(): Promise<import("@/core").forceFetchClientKeyRetType>;
|
||||
}
|
||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
11
src/core.lib/src/apis/window.d.ts
vendored
11
src/core.lib/src/apis/window.d.ts
vendored
@@ -1,11 +0,0 @@
|
||||
export interface NTQQWindow {
|
||||
windowName: string;
|
||||
windowUrlHash: string;
|
||||
}
|
||||
export declare class NTQQWindows {
|
||||
static GroupHomeWorkWindow: NTQQWindow;
|
||||
static GroupNotifyFilterWindow: NTQQWindow;
|
||||
static GroupEssenceWindow: NTQQWindow;
|
||||
}
|
||||
export declare class NTQQWindowApi {
|
||||
}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
28
src/core.lib/src/data.d.ts
vendored
28
src/core.lib/src/data.d.ts
vendored
@@ -1,38 +1,14 @@
|
||||
import { type Friend, type FriendRequest, type Group, type GroupMember, GroupNotify, type SelfInfo, BuddyCategoryType } from './entities';
|
||||
import { WebApiGroupMember } from '@/core/apis';
|
||||
export declare const Credentials: {
|
||||
Skey: string;
|
||||
CreatTime: number;
|
||||
Cookies: Map<string, string>;
|
||||
ClientKey: string;
|
||||
KeyIndex: string;
|
||||
PskeyData: Map<string, string>;
|
||||
PskeyTime: Map<string, number>;
|
||||
};
|
||||
export declare const WebGroupData: {
|
||||
GroupData: Map<string, WebApiGroupMember[]>;
|
||||
GroupTime: Map<string, number>;
|
||||
};
|
||||
import { type Friend, type Group, type GroupMember, GroupNotify, type SelfInfo, BuddyCategoryType } from './entities';
|
||||
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 rawFriends: Array<BuddyCategoryType>;
|
||||
export declare const groupNotifies: Record<string, GroupNotify>;
|
||||
export declare const napCatError: {
|
||||
ffmpegError: string;
|
||||
httpServerError: string;
|
||||
wsServerError: string;
|
||||
otherError: string;
|
||||
};
|
||||
export declare function getFriend(uinOrUid: string): Promise<Friend | undefined>;
|
||||
export declare function getGroup(qq: string | number): Promise<Group | undefined>;
|
||||
export declare function getGroupMember(groupQQ: string | number, memberUinOrUid: string | number): Promise<GroupMember | null | undefined>;
|
||||
export declare const uid2UinMap: Record<string, string>;
|
||||
export declare function getUidByUin(uin: string): string | undefined;
|
||||
export declare const tempGroupCodeMap: Record<string, string>;
|
||||
export declare const rawFriends: Array<BuddyCategoryType>;
|
||||
export declare const stat: {
|
||||
packet_received: number;
|
||||
packet_sent: number;
|
||||
|
@@ -1 +1 @@
|
||||
const _0x5a7240=_0x51b3;(function(_0x4647bd,_0x4c01bf){const _0x2fbd66=_0x51b3,_0x16c38d=_0x4647bd();while(!![]){try{const _0x5c531f=parseInt(_0x2fbd66(0x1a6))/0x1+parseInt(_0x2fbd66(0x1ab))/0x2+parseInt(_0x2fbd66(0x1a9))/0x3+parseInt(_0x2fbd66(0x1a7))/0x4*(-parseInt(_0x2fbd66(0x1b5))/0x5)+-parseInt(_0x2fbd66(0x1b0))/0x6+parseInt(_0x2fbd66(0x1a1))/0x7+parseInt(_0x2fbd66(0x1a3))/0x8;if(_0x5c531f===_0x4c01bf)break;else _0x16c38d['push'](_0x16c38d['shift']());}catch(_0x515d2c){_0x16c38d['push'](_0x16c38d['shift']());}}}(_0x4dd9,0x748c4));function _0x51b3(_0x3ac803,_0x15cfb2){const _0x4dd93c=_0x4dd9();return _0x51b3=function(_0x51b3be,_0x352779){_0x51b3be=_0x51b3be-0x1a1;let _0x437190=_0x4dd93c[_0x51b3be];return _0x437190;},_0x51b3(_0x3ac803,_0x15cfb2);}import{isNumeric}from'@/common/utils/helper';import{NTQQGroupApi}from'@/core/apis';export const Credentials={'Skey':'','CreatTime':0x0,'Cookies':new Map(),'ClientKey':'','KeyIndex':'','PskeyData':new Map(),'PskeyTime':new Map()};export const WebGroupData={'GroupData':new Map(),'GroupTime':new Map()};export const selfInfo={'uid':'','uin':'','nick':'','online':!![]};export const groups=new Map();export function deleteGroup(_0x34438d){const _0x47cc56=_0x51b3;groups[_0x47cc56(0x1af)](_0x34438d),groupMembers[_0x47cc56(0x1af)](_0x34438d);}export const groupMembers=new Map();export const friends=new Map();export const friendRequests={};export const groupNotifies={};export const napCatError={'ffmpegError':'','httpServerError':'','wsServerError':'','otherError':_0x5a7240(0x1b6)};export async function getFriend(_0x2a5deb){const _0x300792=_0x5a7240,_0x5db21c={'vnSDZ':function(_0x5da41b,_0x24c3ce){return _0x5da41b(_0x24c3ce);}};_0x2a5deb=_0x2a5deb[_0x300792(0x1a4)]();if(_0x5db21c[_0x300792(0x1ae)](isNumeric,_0x2a5deb)){const _0x281347=Array[_0x300792(0x1b1)](friends[_0x300792(0x1b7)]());return _0x281347[_0x300792(0x1aa)](_0x5bf3a5=>_0x5bf3a5['uin']===_0x2a5deb);}else return friends['get'](_0x2a5deb);}export async function getGroup(_0x6254c2){const _0x3924fb=_0x5a7240;let _0x37a2e4=groups[_0x3924fb(0x1b8)](_0x6254c2[_0x3924fb(0x1a4)]());if(!_0x37a2e4)try{const _0x211919=await NTQQGroupApi[_0x3924fb(0x1ac)]();_0x211919[_0x3924fb(0x1b2)]&&_0x211919[_0x3924fb(0x1a5)](_0x34507f=>{groups['set'](_0x34507f['groupCode'],_0x34507f);});}catch(_0x5ec01b){return undefined;}return _0x37a2e4=groups[_0x3924fb(0x1b8)](_0x6254c2[_0x3924fb(0x1a4)]()),_0x37a2e4;}export async function getGroupMember(_0x5af437,_0x34421a){const _0x406e10=_0x5a7240,_0x33ee8e={'ckPWT':function(_0x4f0524){return _0x4f0524();}};_0x5af437=_0x5af437['toString'](),_0x34421a=_0x34421a[_0x406e10(0x1a4)]();let _0x2343f3=groupMembers[_0x406e10(0x1b8)](_0x5af437);if(!_0x2343f3)try{_0x2343f3=await NTQQGroupApi['getGroupMembers'](_0x5af437),groupMembers[_0x406e10(0x1b3)](_0x5af437,_0x2343f3);}catch(_0x121ae7){return null;}const _0x47c921=()=>{const _0x205449=_0x406e10;let _0x5059be=undefined;return isNumeric(_0x34421a)?_0x5059be=Array[_0x205449(0x1b1)](_0x2343f3[_0x205449(0x1b7)]())[_0x205449(0x1aa)](_0x3885cf=>_0x3885cf[_0x205449(0x1ad)]===_0x34421a):_0x5059be=_0x2343f3[_0x205449(0x1b8)](_0x34421a),_0x5059be;};let _0x1752f2=_0x33ee8e[_0x406e10(0x1b4)](_0x47c921);return!_0x1752f2&&(_0x2343f3=await NTQQGroupApi[_0x406e10(0x1a8)](_0x5af437),_0x1752f2=_0x33ee8e['ckPWT'](_0x47c921)),_0x1752f2;}function _0x4dd9(){const _0x399c6b=['get','404740AAtwFZ','dtlbc','7134328pyOICn','toString','forEach','879322KRcTsm','4jXpWTk','getGroupMembers','113961UFMUwd','find','171446bHWEpY','getGroups','uin','vnSDZ','delete','3649968WuqEwi','from','length','set','ckPWT','4334675FDLtAm','NapCat未能正常启动,请检查日志查看错误','values'];_0x4dd9=function(){return _0x399c6b;};return _0x4dd9();}export const uid2UinMap={};export function getUidByUin(_0x18fab2){const _0x5e5520=_0x5a7240,_0x4dd997={'dtlbc':function(_0x1b007d,_0x481edc){return _0x1b007d===_0x481edc;}};for(const _0xffb0b6 in uid2UinMap){if(_0x4dd997[_0x5e5520(0x1a2)](uid2UinMap[_0xffb0b6],_0x18fab2))return _0xffb0b6;}}export const tempGroupCodeMap={};export const rawFriends=[];export const stat={'packet_received':0x0,'packet_sent':0x0,'message_received':0x0,'message_sent':0x0,'last_message_time':0x0,'disconnect_times':0x0,'lost_times':0x0,'packet_lost':0x0};
|
||||
(function(_0x3b14c1,_0x1768bc){const _0x189400=_0x4713,_0x57a559=_0x3b14c1();while(!![]){try{const _0x5279ec=parseInt(_0x189400(0xaf))/0x1*(parseInt(_0x189400(0x9a))/0x2)+parseInt(_0x189400(0x9b))/0x3*(parseInt(_0x189400(0xa0))/0x4)+parseInt(_0x189400(0xa2))/0x5*(parseInt(_0x189400(0xb0))/0x6)+parseInt(_0x189400(0xa7))/0x7+parseInt(_0x189400(0xae))/0x8+-parseInt(_0x189400(0xaa))/0x9+parseInt(_0x189400(0xa9))/0xa*(-parseInt(_0x189400(0xa4))/0xb);if(_0x5279ec===_0x1768bc)break;else _0x57a559['push'](_0x57a559['shift']());}catch(_0x50656d){_0x57a559['push'](_0x57a559['shift']());}}}(_0x4b9a,0xb89ea));import{isNumeric}from'@/common/utils/helper';import{NTQQGroupApi}from'@/core/apis';export const selfInfo={'uid':'','uin':'','nick':'','online':!![]};export const groups=new Map();export function deleteGroup(_0x46facc){const _0x7b4c8b=_0x4713;groups[_0x7b4c8b(0xa3)](_0x46facc),groupMembers[_0x7b4c8b(0xa3)](_0x46facc);}function _0x4713(_0x1df58e,_0x5aefb){const _0x4b9a5b=_0x4b9a();return _0x4713=function(_0x471333,_0x10d7a0){_0x471333=_0x471333-0x9a;let _0x15555e=_0x4b9a5b[_0x471333];return _0x15555e;},_0x4713(_0x1df58e,_0x5aefb);}export const groupMembers=new Map();export const friends=new Map();export const rawFriends=[];export const groupNotifies={};export async function getGroup(_0x4a554a){const _0x1e47ec=_0x4713;let _0x30a80f=groups[_0x1e47ec(0xa8)](_0x4a554a[_0x1e47ec(0xa6)]());if(!_0x30a80f)try{const _0x3b9d7f=await NTQQGroupApi[_0x1e47ec(0x9d)]();_0x3b9d7f[_0x1e47ec(0xa5)]&&_0x3b9d7f[_0x1e47ec(0xb1)](_0x447b2c=>{const _0x27efb2=_0x1e47ec;groups[_0x27efb2(0x9e)](_0x447b2c[_0x27efb2(0xab)],_0x447b2c);});}catch(_0x39133e){return undefined;}return _0x30a80f=groups['get'](_0x4a554a[_0x1e47ec(0xa6)]()),_0x30a80f;}function _0x4b9a(){const _0x4cbfaa=['14234570wWXNFA','6358158hXtXpj','groupCode','from','values','7287952DZfvAx','38sTbqQT','41718nOxbOc','forEach','45838lZbRTB','24GFrmky','getGroupMembers','getGroups','set','AhfsK','251464kfstie','Wsnlu','45JQQKlK','delete','11BtobFS','length','toString','3770900oIlGlM','get'];_0x4b9a=function(){return _0x4cbfaa;};return _0x4b9a();}export async function getGroupMember(_0x2dc4bb,_0x1b379c){const _0x3e2adc=_0x4713,_0x4623d3={'AhfsK':function(_0x3c3fec,_0x4c3189){return _0x3c3fec(_0x4c3189);},'Wsnlu':function(_0x24c3cc){return _0x24c3cc();},'FYWdT':function(_0x54d39a){return _0x54d39a();}};_0x2dc4bb=_0x2dc4bb[_0x3e2adc(0xa6)](),_0x1b379c=_0x1b379c[_0x3e2adc(0xa6)]();let _0xf9633b=groupMembers['get'](_0x2dc4bb);if(!_0xf9633b)try{_0xf9633b=await NTQQGroupApi[_0x3e2adc(0x9c)](_0x2dc4bb),groupMembers[_0x3e2adc(0x9e)](_0x2dc4bb,_0xf9633b);}catch(_0x2f8ce5){return null;}const _0x40b3ee=()=>{const _0x1d054d=_0x3e2adc;let _0x176546=undefined;return _0x4623d3[_0x1d054d(0x9f)](isNumeric,_0x1b379c)?_0x176546=Array[_0x1d054d(0xac)](_0xf9633b[_0x1d054d(0xad)]())['find'](_0x57fc56=>_0x57fc56['uin']===_0x1b379c):_0x176546=_0xf9633b[_0x1d054d(0xa8)](_0x1b379c),_0x176546;};let _0x4fe8d5=_0x4623d3[_0x3e2adc(0xa1)](_0x40b3ee);return!_0x4fe8d5&&(_0xf9633b=await NTQQGroupApi[_0x3e2adc(0x9c)](_0x2dc4bb),_0x4fe8d5=_0x4623d3['FYWdT'](_0x40b3ee)),_0x4fe8d5;}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};
|
@@ -1 +1 @@
|
||||
function _0x3255(){var _0xbd652=['374667rlVvhJ','12yljTEB','311495ftKelm','1157172dZghAt','1|3|4|2|0','70212BLalJv','split','OzTVj','snBtI','bsHkF','18mtqfOj','DOCUMENT','uGAwM','1356285yzcrOi','360872PAvkxF','RDYKX','560130nrBiQS'];_0x3255=function(){return _0xbd652;};return _0x3255();}function _0x1809(_0x21af16,_0xf79f86){var _0x3255a2=_0x3255();return _0x1809=function(_0x1809b4,_0x32c035){_0x1809b4=_0x1809b4-0xf7;var _0x4bcca4=_0x3255a2[_0x1809b4];return _0x4bcca4;},_0x1809(_0x21af16,_0xf79f86);}(function(_0x57cec8,_0x3c84fd){var _0x5e0347=_0x1809,_0x59cc79=_0x57cec8();while(!![]){try{var _0x4791ed=-parseInt(_0x5e0347(0xfe))/0x1+parseInt(_0x5e0347(0xf8))/0x2+-parseInt(_0x5e0347(0xf9))/0x3+parseInt(_0x5e0347(0xfa))/0x4*(parseInt(_0x5e0347(0xfb))/0x5)+-parseInt(_0x5e0347(0xfc))/0x6+parseInt(_0x5e0347(0x106))/0x7+-parseInt(_0x5e0347(0x107))/0x8*(parseInt(_0x5e0347(0x103))/0x9);if(_0x4791ed===_0x3c84fd)break;else _0x59cc79['push'](_0x59cc79['shift']());}catch(_0x42d78d){_0x59cc79['push'](_0x59cc79['shift']());}}}(_0x3255,0x2c908));;export var CacheFileType;(function(_0xfe7494){var _0x8ccabf=_0x1809,_0x1cd349={'bsHkF':_0x8ccabf(0xfd),'OzTVj':'OTHER','jEuOP':'IMAGE','snBtI':_0x8ccabf(0x104),'RDYKX':'VIDEO','uGAwM':'AUDIO'},_0x3601b0=_0x1cd349[_0x8ccabf(0x102)][_0x8ccabf(0xff)]('|'),_0x231274=0x0;while(!![]){switch(_0x3601b0[_0x231274++]){case'0':_0xfe7494[_0xfe7494[_0x1cd349[_0x8ccabf(0x100)]]=0x4]=_0x1cd349['OzTVj'];continue;case'1':_0xfe7494[_0xfe7494[_0x1cd349['jEuOP']]=0x0]=_0x1cd349['jEuOP'];continue;case'2':_0xfe7494[_0xfe7494[_0x1cd349[_0x8ccabf(0x101)]]=0x3]=_0x8ccabf(0x104);continue;case'3':_0xfe7494[_0xfe7494[_0x1cd349[_0x8ccabf(0xf7)]]=0x1]=_0x1cd349[_0x8ccabf(0xf7)];continue;case'4':_0xfe7494[_0xfe7494[_0x1cd349[_0x8ccabf(0x105)]]=0x2]=_0x1cd349[_0x8ccabf(0x105)];continue;}break;}}(CacheFileType||(CacheFileType={})));
|
||||
function _0x498f(){var _0x4b1f54=['397917KmwLkB','3343888FGviXF','0|3|4|1|2','33iQsAAm','296502YnPpYP','20quMuiO','149860GPWLQs','5MZpNTS','24NqpXcM','qwXaf','VIDEO','split','ClkDg','DOCUMENT','BUGNl','9051159EneILl','489016ILLbDj','655618wgyAah','IMAGE','AUDIO','1YUCHtX','7tvfbDU','anHJr'];_0x498f=function(){return _0x4b1f54;};return _0x498f();}(function(_0x502bdc,_0x49bb46){var _0x397499=_0x5f25,_0x2eb671=_0x502bdc();while(!![]){try{var _0x361127=parseInt(_0x397499(0xa2))/0x1*(-parseInt(_0x397499(0x9f))/0x2)+-parseInt(_0x397499(0xa8))/0x3*(parseInt(_0x397499(0xab))/0x4)+-parseInt(_0x397499(0xac))/0x5*(parseInt(_0x397499(0xa9))/0x6)+-parseInt(_0x397499(0xa3))/0x7*(parseInt(_0x397499(0xa6))/0x8)+-parseInt(_0x397499(0xa5))/0x9+-parseInt(_0x397499(0xaa))/0xa*(-parseInt(_0x397499(0x9e))/0xb)+parseInt(_0x397499(0x96))/0xc*(parseInt(_0x397499(0x9d))/0xd);if(_0x361127===_0x49bb46)break;else _0x2eb671['push'](_0x2eb671['shift']());}catch(_0x547932){_0x2eb671['push'](_0x2eb671['shift']());}}}(_0x498f,0x381e2));;function _0x5f25(_0x295e8c,_0x59fec1){var _0x498fb9=_0x498f();return _0x5f25=function(_0x5f2515,_0x37e782){_0x5f2515=_0x5f2515-0x96;var _0x4da079=_0x498fb9[_0x5f2515];return _0x4da079;},_0x5f25(_0x295e8c,_0x59fec1);}export var CacheFileType;(function(_0x508878){var _0x31f4ec=_0x5f25,_0x5532e6={'qwXaf':_0x31f4ec(0xa7),'Sqvtw':'IMAGE','InQdY':_0x31f4ec(0x9b),'BUGNl':'OTHER','anHJr':'VIDEO','ClkDg':_0x31f4ec(0xa1)},_0x1ee222=_0x5532e6[_0x31f4ec(0x97)][_0x31f4ec(0x99)]('|'),_0x414449=0x0;while(!![]){switch(_0x1ee222[_0x414449++]){case'0':_0x508878[_0x508878[_0x31f4ec(0xa0)]=0x0]=_0x5532e6['Sqvtw'];continue;case'1':_0x508878[_0x508878['DOCUMENT']=0x3]=_0x5532e6['InQdY'];continue;case'2':_0x508878[_0x508878[_0x5532e6[_0x31f4ec(0x9c)]]=0x4]=_0x5532e6['BUGNl'];continue;case'3':_0x508878[_0x508878[_0x5532e6[_0x31f4ec(0xa4)]]=0x1]=_0x31f4ec(0x98);continue;case'4':_0x508878[_0x508878[_0x5532e6[_0x31f4ec(0x9a)]]=0x2]=_0x5532e6[_0x31f4ec(0x9a)];continue;}break;}}(CacheFileType||(CacheFileType={})));
|
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
(function(_0x16bb00,_0x529479){var _0x58acd3=_0x1f52,_0x83850c=_0x16bb00();while(!![]){try{var _0x4dba7e=parseInt(_0x58acd3(0x9d))/0x1*(parseInt(_0x58acd3(0xa1))/0x2)+parseInt(_0x58acd3(0xa0))/0x3+parseInt(_0x58acd3(0xa3))/0x4+parseInt(_0x58acd3(0x9f))/0x5*(-parseInt(_0x58acd3(0xa7))/0x6)+parseInt(_0x58acd3(0xa4))/0x7*(-parseInt(_0x58acd3(0xa9))/0x8)+-parseInt(_0x58acd3(0xa6))/0x9*(-parseInt(_0x58acd3(0xa2))/0xa)+-parseInt(_0x58acd3(0xa8))/0xb;if(_0x4dba7e===_0x529479)break;else _0x83850c['push'](_0x83850c['shift']());}catch(_0x1fff63){_0x83850c['push'](_0x83850c['shift']());}}}(_0x1b00,0x34834));function _0x1b00(){var _0x10442f=['5504mcwaus','80630UmgXPd','1604756KCBrYF','18529JSUqSe','owner','297HsTJAf','18eDuHWE','7734155TEIoGK','824NBPxaQ','admin','138jwsjMm','zkguU','192185bTvtCe','777315oARlcQ'];_0x1b00=function(){return _0x10442f;};return _0x1b00();}function _0x1f52(_0x4df769,_0x56ba16){var _0x1b0022=_0x1b00();return _0x1f52=function(_0x1f528c,_0x50aa52){_0x1f528c=_0x1f528c-0x9c;var _0x4b787f=_0x1b0022[_0x1f528c];return _0x4b787f;},_0x1f52(_0x4df769,_0x56ba16);}export var GroupMemberRole;(function(_0x1e5125){var _0x1b0d48=_0x1f52,_0x1a252a={'zkguU':'normal'};_0x1e5125[_0x1e5125[_0x1a252a[_0x1b0d48(0x9e)]]=0x2]=_0x1a252a[_0x1b0d48(0x9e)],_0x1e5125[_0x1e5125[_0x1b0d48(0x9c)]=0x3]=_0x1b0d48(0x9c),_0x1e5125[_0x1e5125[_0x1b0d48(0xa5)]=0x4]='owner';}(GroupMemberRole||(GroupMemberRole={})));
|
||||
function _0xd0ba(){var _0x36db9f=['dsMSc','3662652sfZWWF','owner','admin','653040NFOTlW','ycBFe','7FgeyjU','2467605xxVgDE','120xmGgex','300958npdodm','832540gSwylc','TkRNT','normal','7394256Qefacs','608874DvuRbp','6KiFuAH'];_0xd0ba=function(){return _0x36db9f;};return _0xd0ba();}(function(_0x4784f0,_0x57e9cc){var _0x210e23=_0x3099,_0x1ffc1f=_0x4784f0();while(!![]){try{var _0x181b7a=-parseInt(_0x210e23(0xa5))/0x1*(-parseInt(_0x210e23(0xa8))/0x2)+-parseInt(_0x210e23(0x9e))/0x3*(-parseInt(_0x210e23(0xa9))/0x4)+-parseInt(_0x210e23(0xa6))/0x5+parseInt(_0x210e23(0x9d))/0x6+-parseInt(_0x210e23(0xa0))/0x7+parseInt(_0x210e23(0x9c))/0x8+-parseInt(_0x210e23(0xa3))/0x9*(parseInt(_0x210e23(0xa7))/0xa);if(_0x181b7a===_0x57e9cc)break;else _0x1ffc1f['push'](_0x1ffc1f['shift']());}catch(_0x90c7c){_0x1ffc1f['push'](_0x1ffc1f['shift']());}}}(_0xd0ba,0x946a3));function _0x3099(_0x251214,_0x35178e){var _0xd0bae9=_0xd0ba();return _0x3099=function(_0x3099f5,_0x5cb516){_0x3099f5=_0x3099f5-0x9a;var _0x56d168=_0xd0bae9[_0x3099f5];return _0x56d168;},_0x3099(_0x251214,_0x35178e);}export var GroupMemberRole;(function(_0x463087){var _0x5b45f6=_0x3099,_0x32e363={'ycBFe':_0x5b45f6(0x9b),'dsMSc':_0x5b45f6(0xa2),'TkRNT':_0x5b45f6(0xa1)};_0x463087[_0x463087['normal']=0x2]=_0x32e363[_0x5b45f6(0xa4)],_0x463087[_0x463087[_0x32e363[_0x5b45f6(0x9f)]]=0x3]=_0x32e363[_0x5b45f6(0x9f)],_0x463087[_0x463087[_0x32e363[_0x5b45f6(0x9a)]]=0x4]=_0x32e363[_0x5b45f6(0x9a)];}(GroupMemberRole||(GroupMemberRole={})));
|
@@ -1 +1 @@
|
||||
(function(_0x5f2ac8,_0x5d8d8e){var _0x3101c7=_0x327f,_0x32caa2=_0x5f2ac8();while(!![]){try{var _0x64bad=-parseInt(_0x3101c7(0xd4))/0x1+-parseInt(_0x3101c7(0xd6))/0x2*(-parseInt(_0x3101c7(0xd9))/0x3)+-parseInt(_0x3101c7(0xd7))/0x4+-parseInt(_0x3101c7(0xdd))/0x5+parseInt(_0x3101c7(0xd5))/0x6*(parseInt(_0x3101c7(0xdb))/0x7)+parseInt(_0x3101c7(0xda))/0x8*(parseInt(_0x3101c7(0xd8))/0x9)+parseInt(_0x3101c7(0xdc))/0xa*(parseInt(_0x3101c7(0xd3))/0xb);if(_0x64bad===_0x5d8d8e)break;else _0x32caa2['push'](_0x32caa2['shift']());}catch(_0x5d86a2){_0x32caa2['push'](_0x32caa2['shift']());}}}(_0x41cc,0xe0441));function _0x327f(_0x2fda65,_0xe35b27){var _0x41cc30=_0x41cc();return _0x327f=function(_0x327f3e,_0x394bc0){_0x327f3e=_0x327f3e-0xd3;var _0x46f144=_0x41cc30[_0x327f3e];return _0x46f144;},_0x327f(_0x2fda65,_0xe35b27);}export*from'./user';export*from'./group';export*from'./msg';export*from'./notify';export*from'./cache';function _0x41cc(){var _0x547364=['9gIQHEG','3jGVPvE','5733248CfUkZQ','21KJSNsi','337670uhljqk','9048010kQWmuz','979EGshqq','1365686vkzant','844770HRAWuN','1588778jkhksC','3379248sBULpx'];_0x41cc=function(){return _0x547364;};return _0x41cc();}export*from'./constructor';
|
||||
(function(_0x5b45de,_0xbaa916){var _0x564d75=_0x5e29,_0x35f6f0=_0x5b45de();while(!![]){try{var _0x404409=parseInt(_0x564d75(0x1af))/0x1+parseInt(_0x564d75(0x1ae))/0x2*(-parseInt(_0x564d75(0x1ac))/0x3)+-parseInt(_0x564d75(0x1ad))/0x4+-parseInt(_0x564d75(0x1a9))/0x5*(parseInt(_0x564d75(0x1ab))/0x6)+parseInt(_0x564d75(0x1a8))/0x7+parseInt(_0x564d75(0x1b0))/0x8+parseInt(_0x564d75(0x1aa))/0x9;if(_0x404409===_0xbaa916)break;else _0x35f6f0['push'](_0x35f6f0['shift']());}catch(_0x241210){_0x35f6f0['push'](_0x35f6f0['shift']());}}}(_0x3ef1,0xd3e06));export*from'./user';function _0x5e29(_0x34fb10,_0x111f5a){var _0x3ef1b5=_0x3ef1();return _0x5e29=function(_0x5e2919,_0x2a30d6){_0x5e2919=_0x5e2919-0x1a8;var _0x1f5e1f=_0x3ef1b5[_0x5e2919];return _0x1f5e1f;},_0x5e29(_0x34fb10,_0x111f5a);}export*from'./group';function _0x3ef1(){var _0x415137=['15reHGfc','5926468JCBZbg','164476BIKuew','298622scvtzF','11068088mKGfwz','11974886isoMKx','25MQFsYR','3139353RUGaJU','1177194uNjcNZ'];_0x3ef1=function(){return _0x415137;};return _0x3ef1();}export*from'./msg';export*from'./notify';export*from'./cache';export*from'./constructor';
|
56
src/core.lib/src/entities/msg.d.ts
vendored
56
src/core.lib/src/entities/msg.d.ts
vendored
@@ -157,6 +157,48 @@ export declare enum ChatType {
|
||||
chatDevice = 8,//移动设备?
|
||||
temp = 100
|
||||
}
|
||||
export declare enum ChatType2 {
|
||||
KCHATTYPEADELIE = 42,
|
||||
KCHATTYPEBUDDYNOTIFY = 5,
|
||||
KCHATTYPEC2C = 1,
|
||||
KCHATTYPECIRCLE = 113,
|
||||
KCHATTYPEDATALINE = 8,
|
||||
KCHATTYPEDATALINEMQQ = 134,
|
||||
KCHATTYPEDISC = 3,
|
||||
KCHATTYPEFAV = 41,
|
||||
KCHATTYPEGAMEMESSAGE = 105,
|
||||
KCHATTYPEGAMEMESSAGEFOLDER = 116,
|
||||
KCHATTYPEGROUP = 2,
|
||||
KCHATTYPEGROUPBLESS = 133,
|
||||
KCHATTYPEGROUPGUILD = 9,
|
||||
KCHATTYPEGROUPHELPER = 7,
|
||||
KCHATTYPEGROUPNOTIFY = 6,
|
||||
KCHATTYPEGUILD = 4,
|
||||
KCHATTYPEGUILDMETA = 16,
|
||||
KCHATTYPEMATCHFRIEND = 104,
|
||||
KCHATTYPEMATCHFRIENDFOLDER = 109,
|
||||
KCHATTYPENEARBY = 106,
|
||||
KCHATTYPENEARBYASSISTANT = 107,
|
||||
KCHATTYPENEARBYFOLDER = 110,
|
||||
KCHATTYPENEARBYHELLOFOLDER = 112,
|
||||
KCHATTYPENEARBYINTERACT = 108,
|
||||
KCHATTYPEQQNOTIFY = 132,
|
||||
KCHATTYPERELATEACCOUNT = 131,
|
||||
KCHATTYPESERVICEASSISTANT = 118,
|
||||
KCHATTYPESERVICEASSISTANTSUB = 201,
|
||||
KCHATTYPESQUAREPUBLIC = 115,
|
||||
KCHATTYPESUBSCRIBEFOLDER = 30,
|
||||
KCHATTYPETEMPADDRESSBOOK = 111,
|
||||
KCHATTYPETEMPBUSSINESSCRM = 102,
|
||||
KCHATTYPETEMPC2CFROMGROUP = 100,
|
||||
KCHATTYPETEMPC2CFROMUNKNOWN = 99,
|
||||
KCHATTYPETEMPFRIENDVERIFY = 101,
|
||||
KCHATTYPETEMPNEARBYPRO = 119,
|
||||
KCHATTYPETEMPPUBLICACCOUNT = 103,
|
||||
KCHATTYPETEMPWPA = 117,
|
||||
KCHATTYPEUNKNOWN = 0,
|
||||
KCHATTYPEWEIYUN = 40
|
||||
}
|
||||
export interface PttElement {
|
||||
canConvert2Text: boolean;
|
||||
duration: number;
|
||||
@@ -187,6 +229,7 @@ export interface ArkElement {
|
||||
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 {
|
||||
picSubType?: number;
|
||||
originImageUrl: string;
|
||||
originImageMd5?: string;
|
||||
sourcePath: string;
|
||||
@@ -273,6 +316,19 @@ export interface VideoElement {
|
||||
import_rich_media_context?: null;
|
||||
sourceVideoCodecFormat?: number;
|
||||
}
|
||||
export declare enum viedo_type {
|
||||
VIDEO_FORMAT_AFS = 7,
|
||||
VIDEO_FORMAT_AVI = 1,
|
||||
VIDEO_FORMAT_MKV = 4,
|
||||
VIDEO_FORMAT_MOD = 9,
|
||||
VIDEO_FORMAT_MOV = 8,
|
||||
VIDEO_FORMAT_MP4 = 2,
|
||||
VIDEO_FORMAT_MTS = 11,
|
||||
VIDEO_FORMAT_RM = 6,
|
||||
VIDEO_FORMAT_RMVB = 5,
|
||||
VIDEO_FORMAT_TS = 10,
|
||||
VIDEO_FORMAT_WMV = 3
|
||||
}
|
||||
export interface MarkdownElement {
|
||||
content: string;
|
||||
}
|
||||
|
File diff suppressed because one or more lines are too long
54
src/core.lib/src/entities/notify.d.ts
vendored
54
src/core.lib/src/entities/notify.d.ts
vendored
@@ -54,8 +54,26 @@ export declare enum GroupRequestOperateTypes {
|
||||
approve = 1,
|
||||
reject = 2
|
||||
}
|
||||
export declare enum BuddyReqType {
|
||||
KMEINITIATOR = 0,
|
||||
KPEERINITIATOR = 1,
|
||||
KMEAGREED = 2,
|
||||
KMEAGREEDANDADDED = 3,
|
||||
KPEERAGREED = 4,
|
||||
KPEERAGREEDANDADDED = 5,
|
||||
KPEERREFUSED = 6,
|
||||
KMEREFUSED = 7,
|
||||
KMEIGNORED = 8,
|
||||
KMEAGREEANYONE = 9,
|
||||
KMESETQUESTION = 10,
|
||||
KMEAGREEANDADDFAILED = 11,
|
||||
KMSGINFO = 12,
|
||||
KMEINITIATORWAITPEERCONFIRM = 13
|
||||
}
|
||||
export interface FriendRequest {
|
||||
isDecide: boolean;
|
||||
friendUid: string;
|
||||
reqType: BuddyReqType;
|
||||
reqTime: string;
|
||||
extWords: string;
|
||||
isUnread: boolean;
|
||||
@@ -67,3 +85,39 @@ export interface FriendRequestNotify {
|
||||
unreadNums: number;
|
||||
buddyReqs: FriendRequest[];
|
||||
}
|
||||
export declare enum MemberExtSourceType {
|
||||
DEFAULTTYPE = 0,
|
||||
TITLETYPE = 1,
|
||||
NEWGROUPTYPE = 2
|
||||
}
|
||||
export interface GroupExtParam {
|
||||
groupCode: string;
|
||||
seq: string;
|
||||
beginUin: string;
|
||||
dataTime: string;
|
||||
uinList: Array<string>;
|
||||
uinNum: string;
|
||||
groupType: string;
|
||||
richCardNameVer: string;
|
||||
sourceType: MemberExtSourceType;
|
||||
memberExtFilter: {
|
||||
memberLevelInfoUin: number;
|
||||
memberLevelInfoPoint: number;
|
||||
memberLevelInfoActiveDay: number;
|
||||
memberLevelInfoLevel: number;
|
||||
memberLevelInfoName: number;
|
||||
levelName: number;
|
||||
dataTime: number;
|
||||
userShowFlag: number;
|
||||
sysShowFlag: number;
|
||||
timeToUpdate: number;
|
||||
nickName: number;
|
||||
specialTitle: number;
|
||||
levelNameNew: number;
|
||||
userShowFlagNew: number;
|
||||
msgNeedField: number;
|
||||
cmdUinFlagExt3Grocery: number;
|
||||
memberIcon: number;
|
||||
memberInfoSeq: number;
|
||||
};
|
||||
}
|
||||
|
File diff suppressed because one or more lines are too long
84
src/core.lib/src/entities/user.d.ts
vendored
84
src/core.lib/src/entities/user.d.ts
vendored
@@ -9,6 +9,17 @@ export interface BuddyCategoryType {
|
||||
categroyMbCount: number;
|
||||
buddyList: User[];
|
||||
}
|
||||
export interface ModifyProfileParams {
|
||||
nick: string;
|
||||
longNick: string;
|
||||
sex: Sex;
|
||||
birthday: {
|
||||
birthday_year: string;
|
||||
birthday_month: string;
|
||||
birthday_day: string;
|
||||
};
|
||||
location: any;
|
||||
}
|
||||
export interface BuddyProfileLikeReq {
|
||||
friendUids: string[];
|
||||
basic: number;
|
||||
@@ -87,3 +98,76 @@ export interface SelfInfo extends User {
|
||||
}
|
||||
export interface Friend extends User {
|
||||
}
|
||||
export declare enum BizKey {
|
||||
KPRIVILEGEICON = 0,
|
||||
KPHOTOWALL = 1
|
||||
}
|
||||
export interface UserDetailInfoByUin {
|
||||
result: number;
|
||||
errMsg: string;
|
||||
info: {
|
||||
uid: string;
|
||||
qid: string;
|
||||
uin: string;
|
||||
nick: string;
|
||||
remark: string;
|
||||
longNick: string;
|
||||
avatarUrl: string;
|
||||
birthday_year: number;
|
||||
birthday_month: number;
|
||||
birthday_day: number;
|
||||
sex: number;
|
||||
topTime: string;
|
||||
constellation: number;
|
||||
shengXiao: number;
|
||||
kBloodType: number;
|
||||
homeTown: string;
|
||||
makeFriendCareer: number;
|
||||
pos: string;
|
||||
eMail: string;
|
||||
phoneNum: string;
|
||||
college: string;
|
||||
country: string;
|
||||
province: string;
|
||||
city: string;
|
||||
postCode: string;
|
||||
address: string;
|
||||
isBlock: boolean;
|
||||
isSpecialCareOpen: boolean;
|
||||
isSpecialCareZone: boolean;
|
||||
ringId: string;
|
||||
regTime: number;
|
||||
interest: string;
|
||||
termType: number;
|
||||
labels: any[];
|
||||
qqLevel: {
|
||||
crownNum: number;
|
||||
sunNum: number;
|
||||
moonNum: number;
|
||||
starNum: number;
|
||||
};
|
||||
isHideQQLevel: number;
|
||||
privilegeIcon: {
|
||||
jumpUrl: string;
|
||||
openIconList: any[];
|
||||
closeIconList: any[];
|
||||
};
|
||||
isHidePrivilegeIcon: number;
|
||||
photoWall: {
|
||||
picList: any[];
|
||||
};
|
||||
vipFlag: boolean;
|
||||
yearVipFlag: boolean;
|
||||
svipFlag: boolean;
|
||||
vipLevel: number;
|
||||
status: number;
|
||||
qidianMasterFlag: number;
|
||||
qidianCrewFlag: number;
|
||||
qidianCrewFlag2: number;
|
||||
extStatus: number;
|
||||
recommendImgFlag: number;
|
||||
disableEmojiShortCuts: number;
|
||||
pendantId: string;
|
||||
vipNameColorId: string;
|
||||
};
|
||||
}
|
||||
|
@@ -1 +1 @@
|
||||
(function(_0x1f8af7,_0x317fdc){var _0x5f1b78=_0x2e63,_0x200bb3=_0x1f8af7();while(!![]){try{var _0x21f0fc=parseInt(_0x5f1b78(0xd2))/0x1+-parseInt(_0x5f1b78(0xdb))/0x2*(parseInt(_0x5f1b78(0xd5))/0x3)+parseInt(_0x5f1b78(0xd6))/0x4*(parseInt(_0x5f1b78(0xcf))/0x5)+-parseInt(_0x5f1b78(0xd4))/0x6*(-parseInt(_0x5f1b78(0xda))/0x7)+parseInt(_0x5f1b78(0xd7))/0x8+-parseInt(_0x5f1b78(0xd1))/0x9*(parseInt(_0x5f1b78(0xd3))/0xa)+-parseInt(_0x5f1b78(0xd8))/0xb;if(_0x21f0fc===_0x317fdc)break;else _0x200bb3['push'](_0x200bb3['shift']());}catch(_0x44f1fb){_0x200bb3['push'](_0x200bb3['shift']());}}}(_0x4075,0x63dd2));export var Sex;function _0x2e63(_0x58fbd9,_0x56d0b1){var _0x4075fb=_0x4075();return _0x2e63=function(_0x2e6325,_0x380b99){_0x2e6325=_0x2e6325-0xcc;var _0x688cd6=_0x4075fb[_0x2e6325];return _0x688cd6;},_0x2e63(_0x58fbd9,_0x56d0b1);}function _0x4075(){var _0x5f5221=['jpbkW','female','47865JwrPne','male','17487iOMuvT','509975CHUXHv','2450XkEnsM','246264IPQEsx','97068WeqSms','36lTYijD','1929040iUZUHl','2278507Qadhle','unknown','49yFGVsm','2DyOUpi','BRJPV'];_0x4075=function(){return _0x5f5221;};return _0x4075();}(function(_0x594a14){var _0x5629ad=_0x2e63,_0x10a9d6={'jpbkW':_0x5629ad(0xd0),'BRJPV':_0x5629ad(0xd9)};_0x594a14[_0x594a14[_0x10a9d6[_0x5629ad(0xcd)]]=0x1]=_0x10a9d6['jpbkW'],_0x594a14[_0x594a14[_0x5629ad(0xce)]=0x2]=_0x5629ad(0xce),_0x594a14[_0x594a14[_0x10a9d6[_0x5629ad(0xcc)]]=0xff]=_0x10a9d6['BRJPV'];}(Sex||(Sex={})));
|
||||
(function(_0x2ad236,_0x523bb1){var _0x35a774=_0x31b7,_0x7b95b9=_0x2ad236();while(!![]){try{var _0x2b7715=-parseInt(_0x35a774(0x77))/0x1+-parseInt(_0x35a774(0x7d))/0x2+parseInt(_0x35a774(0x76))/0x3+-parseInt(_0x35a774(0x70))/0x4*(parseInt(_0x35a774(0x6d))/0x5)+parseInt(_0x35a774(0x7e))/0x6*(parseInt(_0x35a774(0x73))/0x7)+-parseInt(_0x35a774(0x7a))/0x8*(parseInt(_0x35a774(0x75))/0x9)+parseInt(_0x35a774(0x79))/0xa;if(_0x2b7715===_0x523bb1)break;else _0x7b95b9['push'](_0x7b95b9['shift']());}catch(_0x1ddedb){_0x7b95b9['push'](_0x7b95b9['shift']());}}}(_0x9e23,0xe78a6));export var Sex;function _0x31b7(_0x372cbd,_0x5760f9){var _0x9e2377=_0x9e23();return _0x31b7=function(_0x31b7cd,_0x10c400){_0x31b7cd=_0x31b7cd-0x6d;var _0xd3f03b=_0x9e2377[_0x31b7cd];return _0xd3f03b;},_0x31b7(_0x372cbd,_0x5760f9);}function _0x9e23(){var _0x51e118=['unknown','KPRIVILEGEICON','2918174aGauyu','6zcNeCl','4330fDopaP','male','KPHOTOWALL','5552fqQruL','ttoLX','OJYRw','1021769tOiowa','XuQqc','5483763cpVLNm','4526643LHcOsg','597381wvijvm','female','31613250ArPQwe','8MKTdyT'];_0x9e23=function(){return _0x51e118;};return _0x9e23();}(function(_0xb5ba63){var _0x5c6018=_0x31b7,_0x1303ee={'ttoLX':_0x5c6018(0x6e),'qMeDK':_0x5c6018(0x78)};_0xb5ba63[_0xb5ba63[_0x5c6018(0x6e)]=0x1]=_0x1303ee[_0x5c6018(0x71)],_0xb5ba63[_0xb5ba63[_0x5c6018(0x78)]=0x2]=_0x1303ee['qMeDK'],_0xb5ba63[_0xb5ba63[_0x5c6018(0x7b)]=0xff]=_0x5c6018(0x7b);}(Sex||(Sex={})));export var BizKey;(function(_0x3146e7){var _0x44c4b0=_0x31b7,_0x105698={'XuQqc':_0x44c4b0(0x7c),'OJYRw':_0x44c4b0(0x6f)};_0x3146e7[_0x3146e7[_0x105698[_0x44c4b0(0x74)]]=0x0]=_0x105698[_0x44c4b0(0x74)],_0x3146e7[_0x3146e7[_0x105698[_0x44c4b0(0x72)]]=0x1]=_0x105698[_0x44c4b0(0x72)];}(BizKey||(BizKey={})));
|
8
src/core.lib/src/external/hook.d.ts
vendored
8
src/core.lib/src/external/hook.d.ts
vendored
@@ -1,8 +0,0 @@
|
||||
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
1
src/core.lib/src/external/hook.js
vendored
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
(function(_0x1aee2c,_0x118f93){var _0x2a6a78=_0x1210,_0x1c886a=_0x1aee2c();while(!![]){try{var _0x4a4965=parseInt(_0x2a6a78(0x1e5))/0x1*(parseInt(_0x2a6a78(0x1e9))/0x2)+parseInt(_0x2a6a78(0x1e6))/0x3+-parseInt(_0x2a6a78(0x1e7))/0x4*(parseInt(_0x2a6a78(0x1ea))/0x5)+parseInt(_0x2a6a78(0x1e4))/0x6+parseInt(_0x2a6a78(0x1ec))/0x7+parseInt(_0x2a6a78(0x1e8))/0x8+-parseInt(_0x2a6a78(0x1eb))/0x9;if(_0x4a4965===_0x118f93)break;else _0x1c886a['push'](_0x1c886a['shift']());}catch(_0x14d28d){_0x1c886a['push'](_0x1c886a['shift']());}}}(_0x20d6,0xb26fe));import _0x434817 from'./wrapper';function _0x20d6(){var _0x32e80a=['4099542aNDXbe','16rsbLoW','2019256qKYvsP','1214tMkdAZ','455985nblFhf','17964441rGWLvr','6094046LZzJGg','2080014fuAbeg','421GIyYwx'];_0x20d6=function(){return _0x32e80a;};return _0x20d6();}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';function _0x1210(_0x5c24bc,_0xedc63e){var _0x20d628=_0x20d6();return _0x1210=function(_0x1210b9,_0x462ec7){_0x1210b9=_0x1210b9-0x1e4;var _0x1e0660=_0x20d628[_0x1210b9];return _0x1e0660;},_0x1210(_0x5c24bc,_0xedc63e);}export*as Listeners from'./listeners';export*as Services from'./services';export{_0x434817 as Wrapper};export*as WrapperInterface from'./wrapper';export*as SessionConfig from'./sessionConfig';export{napCatCore}from'./core';
|
||||
(function(_0x5af152,_0x20bb14){var _0x4f14d7=_0xf2a8,_0x445300=_0x5af152();while(!![]){try{var _0x4e3ed7=-parseInt(_0x4f14d7(0x1a5))/0x1+parseInt(_0x4f14d7(0x1a7))/0x2+parseInt(_0x4f14d7(0x1a9))/0x3+parseInt(_0x4f14d7(0x1aa))/0x4+-parseInt(_0x4f14d7(0x1a2))/0x5+parseInt(_0x4f14d7(0x1a6))/0x6*(parseInt(_0x4f14d7(0x1a3))/0x7)+parseInt(_0x4f14d7(0x1a4))/0x8*(-parseInt(_0x4f14d7(0x1a8))/0x9);if(_0x4e3ed7===_0x20bb14)break;else _0x445300['push'](_0x445300['shift']());}catch(_0x5c22d5){_0x445300['push'](_0x445300['shift']());}}}(_0x10a7,0xb4f7d));import _0x337b77 from'./wrapper';export*from'./adapters';function _0x10a7(){var _0x33f79d=['48536fFhOXj','995880ZHWpPi','7760808pkfOZy','1669236CooyeT','2817FWyPHc','4303887FbbkWd','1288312tIeUyJ','1243485oCJKHJ','7WPUQZL'];_0x10a7=function(){return _0x33f79d;};return _0x10a7();}export*from'./apis';export*from'./entities';export*from'./listeners';function _0xf2a8(_0xd39da8,_0x23751c){var _0x10a72f=_0x10a7();return _0xf2a8=function(_0xf2a8f9,_0x467bf1){_0xf2a8f9=_0xf2a8f9-0x1a2;var _0x1720ce=_0x10a72f[_0xf2a8f9];return _0x1720ce;},_0xf2a8(_0xd39da8,_0x23751c);}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{_0x337b77 as Wrapper};export*as WrapperInterface from'./wrapper';export*as SessionConfig from'./sessionConfig';export{napCatCore}from'./core';
|
@@ -1 +1 @@
|
||||
var _0x5b31d1=_0x1c00;(function(_0x1562e6,_0x125799){var _0x4f579d=_0x1c00,_0x59ff20=_0x1562e6();while(!![]){try{var _0x5481af=parseInt(_0x4f579d(0x11e))/0x1+-parseInt(_0x4f579d(0x110))/0x2+parseInt(_0x4f579d(0x11b))/0x3*(parseInt(_0x4f579d(0x115))/0x4)+-parseInt(_0x4f579d(0x10f))/0x5+-parseInt(_0x4f579d(0x116))/0x6*(-parseInt(_0x4f579d(0x118))/0x7)+-parseInt(_0x4f579d(0x10a))/0x8*(-parseInt(_0x4f579d(0x120))/0x9)+parseInt(_0x4f579d(0x114))/0xa;if(_0x5481af===_0x125799)break;else _0x59ff20['push'](_0x59ff20['shift']());}catch(_0x52c068){_0x59ff20['push'](_0x59ff20['shift']());}}}(_0x1ed7,0xcf6df));function _0x1ed7(){var _0x27995a=['33QoEHkH','onBuddyReqChange','onBuddyDetailInfoChange','209470BPNwXP','onCheckBuddySettingResult','9xPjxLK','2291568hjbRVh','onSpacePermissionInfos','onSmartInfos','onDoubtBuddyReqUnreadNumChange','onBlockChanged','7494080tWbTwK','2454724eiOKBs','onBuddyReqUnreadCntChange','onAddBuddyNeedVerify','onAvatarUrlUpdated','6649520VOtCDu','337104AvljbA','1785486FjCfDk','onDoubtBuddyReqChange','35SfEhDD','onNickUpdated','onDelBatchBuddyInfos'];_0x1ed7=function(){return _0x27995a;};return _0x1ed7();}function _0x1c00(_0x3851e5,_0x181447){var _0x1ed762=_0x1ed7();return _0x1c00=function(_0x1c00f5,_0x2dba42){_0x1c00f5=_0x1c00f5-0x10a;var _0x2efc30=_0x1ed762[_0x1c00f5];return _0x2efc30;},_0x1c00(_0x3851e5,_0x181447);}export class BuddyListener{[_0x5b31d1(0x112)](_0x453b91){}['onAddMeSettingChanged'](_0x1d9bfb){}[_0x5b31d1(0x113)](_0x236b2a){}[_0x5b31d1(0x10e)](_0x20d723){}[_0x5b31d1(0x11d)](_0xb462af){}['onBuddyInfoChange'](_0x3d8309){}['onBuddyListChange'](_0x4f1450){}['onBuddyRemarkUpdated'](_0x43006a){}[_0x5b31d1(0x11c)](_0x4eb351){}[_0x5b31d1(0x111)](_0x49cdf5){}[_0x5b31d1(0x11f)](_0x1d1764){}[_0x5b31d1(0x11a)](_0x90005a){}[_0x5b31d1(0x117)](_0x1fe8f5){}[_0x5b31d1(0x10d)](_0x50c141){}[_0x5b31d1(0x119)](_0x203189){}[_0x5b31d1(0x10c)](_0x292caf){}[_0x5b31d1(0x10b)](_0x42900f){}}
|
||||
var _0x107aa6=_0x2d03;(function(_0x22ad02,_0x252c02){var _0x45abab=_0x2d03,_0x26d42b=_0x22ad02();while(!![]){try{var _0xe276d0=parseInt(_0x45abab(0xd9))/0x1+parseInt(_0x45abab(0xdf))/0x2*(-parseInt(_0x45abab(0xcf))/0x3)+parseInt(_0x45abab(0xe0))/0x4*(parseInt(_0x45abab(0xda))/0x5)+-parseInt(_0x45abab(0xca))/0x6+-parseInt(_0x45abab(0xd1))/0x7+parseInt(_0x45abab(0xcb))/0x8*(parseInt(_0x45abab(0xde))/0x9)+parseInt(_0x45abab(0xdb))/0xa*(-parseInt(_0x45abab(0xd8))/0xb);if(_0xe276d0===_0x252c02)break;else _0x26d42b['push'](_0x26d42b['shift']());}catch(_0x300382){_0x26d42b['push'](_0x26d42b['shift']());}}}(_0x53ad,0x94074));function _0x53ad(){var _0x75046a=['onAvatarUrlUpdated','onCheckBuddySettingResult','289289adWegU','1105343ozkxOM','49890KnZwvs','160SdqUAK','onDoubtBuddyReqUnreadNumChange','onBlockChanged','225gvMUlx','340ZUYLFi','404kaNAJq','onAddBuddyNeedVerify','onSmartInfos','3367584OvYUbT','230320TFMGvA','onBuddyInfoChange','onBuddyListChange','onDelBatchBuddyInfos','6297OQsuvJ','onBuddyDetailInfoChange','6213683gugWEu','onDoubtBuddyReqChange','onBuddyReqUnreadCntChange','onAddMeSettingChanged','onBuddyRemarkUpdated'];_0x53ad=function(){return _0x75046a;};return _0x53ad();}function _0x2d03(_0x157afb,_0x42391b){var _0x53ad11=_0x53ad();return _0x2d03=function(_0x2d0353,_0x53d295){_0x2d0353=_0x2d0353-0xc8;var _0x3cb7ca=_0x53ad11[_0x2d0353];return _0x3cb7ca;},_0x2d03(_0x157afb,_0x42391b);}export class BuddyListener{[_0x107aa6(0xc8)](_0x2faa93){}[_0x107aa6(0xd4)](_0x4f1203){}[_0x107aa6(0xd6)](_0x33ec2c){}[_0x107aa6(0xdd)](_0x28eedc){}[_0x107aa6(0xd0)](_0x4bd80a){}[_0x107aa6(0xcc)](_0x208a90){}[_0x107aa6(0xcd)](_0x576300){}[_0x107aa6(0xd5)](_0xc6042d){}['onBuddyReqChange'](_0x2ca07d){}[_0x107aa6(0xd3)](_0x564725){}[_0x107aa6(0xd7)](_0x385167){}[_0x107aa6(0xce)](_0x56204b){}[_0x107aa6(0xd2)](_0x3a5b2c){}[_0x107aa6(0xdc)](_0x34f373){}['onNickUpdated'](_0x58600d){}[_0x107aa6(0xc9)](_0x22e92b){}['onSpacePermissionInfos'](_0x47736e){}}
|
@@ -1 +1 @@
|
||||
function _0x2b21(_0x3826a4,_0x5636fd){var _0xe01c17=_0xe01c();return _0x2b21=function(_0x2b219f,_0x5a54e0){_0x2b219f=_0x2b219f-0x89;var _0x421d92=_0xe01c17[_0x2b219f];return _0x421d92;},_0x2b21(_0x3826a4,_0x5636fd);}var _0x132aac=_0x2b21;(function(_0x604025,_0x1c7b45){var _0x173978=_0x2b21,_0x1c04ae=_0x604025();while(!![]){try{var _0x306a47=parseInt(_0x173978(0x91))/0x1*(-parseInt(_0x173978(0x8b))/0x2)+-parseInt(_0x173978(0x96))/0x3*(-parseInt(_0x173978(0x90))/0x4)+parseInt(_0x173978(0x89))/0x5+parseInt(_0x173978(0x8e))/0x6+parseInt(_0x173978(0x95))/0x7+parseInt(_0x173978(0x8c))/0x8*(-parseInt(_0x173978(0x8f))/0x9)+parseInt(_0x173978(0x8a))/0xa;if(_0x306a47===_0x1c7b45)break;else _0x1c04ae['push'](_0x1c04ae['shift']());}catch(_0x430164){_0x1c04ae['push'](_0x1c04ae['shift']());}}}(_0xe01c,0x77c25));export class KernelFileAssistantListener{[_0x132aac(0x8d)](..._0x28cf0f){}['onSessionListChanged'](..._0x189e7e){}[_0x132aac(0x93)](..._0x280a63){}[_0x132aac(0x94)](..._0x5e7487){}[_0x132aac(0x92)](..._0x81b84a){}}function _0xe01c(){var _0x5ac2b4=['onFileStatusChanged','1796604mZhikg','18iwdFMG','132VoHCKs','1631jowkpL','onFileSearch','onSessionChanged','onFileListChanged','1414385YbkZJc','9957OHlxbP','2449305kozXaP','3634010kGbeTt','638NcuvUh','1813824CKLEHK'];_0xe01c=function(){return _0x5ac2b4;};return _0xe01c();}
|
||||
var _0x2b0a0e=_0x1ba2;(function(_0x16eea2,_0x56b860){var _0x13c856=_0x1ba2,_0x2a129b=_0x16eea2();while(!![]){try{var _0x18ebd3=-parseInt(_0x13c856(0x15b))/0x1+-parseInt(_0x13c856(0x157))/0x2+parseInt(_0x13c856(0x159))/0x3+parseInt(_0x13c856(0x15a))/0x4+-parseInt(_0x13c856(0x151))/0x5+-parseInt(_0x13c856(0x153))/0x6+parseInt(_0x13c856(0x152))/0x7;if(_0x18ebd3===_0x56b860)break;else _0x2a129b['push'](_0x2a129b['shift']());}catch(_0x1c25f4){_0x2a129b['push'](_0x2a129b['shift']());}}}(_0x97e9,0x42abc));function _0x1ba2(_0x354d26,_0x450338){var _0x97e96=_0x97e9();return _0x1ba2=function(_0x1ba28b,_0x2ecb57){_0x1ba28b=_0x1ba28b-0x151;var _0x1a9947=_0x97e96[_0x1ba28b];return _0x1a9947;},_0x1ba2(_0x354d26,_0x450338);}function _0x97e9(){var _0x4e5b34=['2470536tQomJZ','onFileStatusChanged','onFileListChanged','onFileSearch','995036rfvKmN','onSessionChanged','952677SelAEP','627444ZnVpXp','384233NAHnNk','1563420tDjDDc','9833985cmiiDY'];_0x97e9=function(){return _0x4e5b34;};return _0x97e9();}export class KernelFileAssistantListener{[_0x2b0a0e(0x154)](..._0x3c6b87){}['onSessionListChanged'](..._0x56d38f){}[_0x2b0a0e(0x158)](..._0x54b94c){}[_0x2b0a0e(0x155)](..._0x155e18){}[_0x2b0a0e(0x156)](..._0x4ca2e9){}}
|
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
function _0x562b(){var _0x90a643=['57240OlGCTp','onQRCodeSessionUserScaned','onQRCodeGetPicture','497nRvFVD','6642006bMjugo','onLoginConnected','onLoginState','onQRCodeLoginSucceed','1035670qINktu','onLogoutSucceed','onLoginConnecting','onQRCodeSessionQuickLoginFailed','1854146yGFPDF','onQQLoginNumLimited','onUserLoggedIn','2543268nJwiLU','531907dVAXwQ','5430357PygJNW','onQRCodeSessionFailed','onLoginFailed','onPasswordLoginFailed','onLogoutFailed','4phHaqd'];_0x562b=function(){return _0x90a643;};return _0x562b();}function _0x259e(_0x32526c,_0x2cc1e9){var _0x562b45=_0x562b();return _0x259e=function(_0x259e11,_0x19b748){_0x259e11=_0x259e11-0x1ea;var _0x50c811=_0x562b45[_0x259e11];return _0x50c811;},_0x259e(_0x32526c,_0x2cc1e9);}var _0x3f35bd=_0x259e;(function(_0x2318ed,_0x573f64){var _0x3b2077=_0x259e,_0x333e6d=_0x2318ed();while(!![]){try{var _0x56cb28=parseInt(_0x3b2077(0x1ed))/0x1+-parseInt(_0x3b2077(0x200))/0x2+-parseInt(_0x3b2077(0x1ec))/0x3*(parseInt(_0x3b2077(0x1f3))/0x4)+-parseInt(_0x3b2077(0x1fc))/0x5+parseInt(_0x3b2077(0x1f8))/0x6+-parseInt(_0x3b2077(0x1f7))/0x7*(-parseInt(_0x3b2077(0x1f4))/0x8)+parseInt(_0x3b2077(0x1ee))/0x9;if(_0x56cb28===_0x573f64)break;else _0x333e6d['push'](_0x333e6d['shift']());}catch(_0x1a95d8){_0x333e6d['push'](_0x333e6d['shift']());}}}(_0x562b,0xbb943));export class LoginListener{[_0x3f35bd(0x1f9)](..._0x59d7b3){}['onLoginDisConnected'](..._0x2a197e){}[_0x3f35bd(0x1fe)](..._0x1ecb31){}[_0x3f35bd(0x1f6)](_0x3b5682){}['onQRCodeLoginPollingStarted'](..._0x46a1b1){}[_0x3f35bd(0x1f5)](..._0x31df8c){}[_0x3f35bd(0x1fb)](_0x2b1def){}[_0x3f35bd(0x1ef)](..._0x2bfed6){}[_0x3f35bd(0x1f0)](..._0x437200){}[_0x3f35bd(0x1fd)](..._0x287801){}[_0x3f35bd(0x1f2)](..._0x114eb9){}[_0x3f35bd(0x1eb)](..._0x4daf39){}[_0x3f35bd(0x1ff)](..._0x3ba1d1){}[_0x3f35bd(0x1f1)](..._0x6fd9d6){}['OnConfirmUnusualDeviceFailed'](..._0x23cd5c){}[_0x3f35bd(0x1ea)](..._0x101231){}[_0x3f35bd(0x1fa)](..._0x1321ff){}}
|
||||
var _0x2978c1=_0x5793;function _0x5793(_0x4b2c3f,_0x599e27){var _0x35733f=_0x3573();return _0x5793=function(_0x579356,_0x415045){_0x579356=_0x579356-0x15a;var _0x23b902=_0x35733f[_0x579356];return _0x23b902;},_0x5793(_0x4b2c3f,_0x599e27);}(function(_0x597623,_0x1f5e19){var _0x38f7cf=_0x5793,_0x2deb1a=_0x597623();while(!![]){try{var _0x1ae1dd=parseInt(_0x38f7cf(0x16e))/0x1*(parseInt(_0x38f7cf(0x170))/0x2)+-parseInt(_0x38f7cf(0x15c))/0x3*(parseInt(_0x38f7cf(0x15b))/0x4)+-parseInt(_0x38f7cf(0x166))/0x5*(parseInt(_0x38f7cf(0x15d))/0x6)+-parseInt(_0x38f7cf(0x163))/0x7*(-parseInt(_0x38f7cf(0x16d))/0x8)+-parseInt(_0x38f7cf(0x160))/0x9*(parseInt(_0x38f7cf(0x15f))/0xa)+parseInt(_0x38f7cf(0x16b))/0xb+parseInt(_0x38f7cf(0x171))/0xc;if(_0x1ae1dd===_0x1f5e19)break;else _0x2deb1a['push'](_0x2deb1a['shift']());}catch(_0x4719e5){_0x2deb1a['push'](_0x2deb1a['shift']());}}}(_0x3573,0xc74d5));export class LoginListener{[_0x2978c1(0x162)](..._0x50ef81){}[_0x2978c1(0x172)](..._0x54eb07){}['onLoginConnecting'](..._0x268338){}[_0x2978c1(0x16f)](_0x27a01b){}[_0x2978c1(0x169)](..._0x7c7cee){}[_0x2978c1(0x164)](..._0x2c1559){}[_0x2978c1(0x16c)](_0x44f486){}[_0x2978c1(0x15e)](..._0x463cc2){}[_0x2978c1(0x16a)](..._0x3e0632){}['onLogoutSucceed'](..._0x1202b2){}[_0x2978c1(0x15a)](..._0x14b02c){}[_0x2978c1(0x168)](..._0x753133){}['onQRCodeSessionQuickLoginFailed'](..._0x302243){}[_0x2978c1(0x165)](..._0x5a275d){}['OnConfirmUnusualDeviceFailed'](..._0x57f847){}[_0x2978c1(0x161)](..._0x4c6c5b){}[_0x2978c1(0x167)](..._0x5c99d4){}}function _0x3573(){var _0x541bab=['641756vWpPuq','27QRpfxh','4554294AJdrXy','onQRCodeSessionFailed','1683040QeQDYP','18uxMnUT','onQQLoginNumLimited','onLoginConnected','7Bfxlpi','onQRCodeSessionUserScaned','onPasswordLoginFailed','5iOnJLf','onLoginState','onUserLoggedIn','onQRCodeLoginPollingStarted','onLoginFailed','8695973xmynjD','onQRCodeLoginSucceed','10443632LgwlFv','753087wbUXvN','onQRCodeGetPicture','2jFpefG','6082380lxfpfy','onLoginDisConnected','onLogoutFailed'];_0x3573=function(){return _0x541bab;};return _0x3573();}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user