Compare commits

..

1631 Commits

Author SHA1 Message Date
手瓜一十雪
16371c0cc4 fix: 统一消息格式 2024-08-13 21:00:22 +08:00
手瓜一十雪
2256d67e2b release: 2.0.12 2024-08-13 19:34:33 +08:00
手瓜一十雪
0af0bdede6 build: 2.0.12 test 2024-08-13 19:33:29 +08:00
手瓜一十雪
379f31b9de Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-08-13 16:22:24 +08:00
手瓜一十雪
771a524734 add log 2024-08-13 16:21:59 +08:00
Wesley F. Young
560e18a610 fix: no longer require admin when running after initialization 2024-08-13 16:09:15 +08:00
手瓜一十雪
147bdfab95 Revert "fix: 框架启动概率性失败"
This reverts commit 9d92270931.
2024-08-13 15:14:42 +08:00
手瓜一十雪
36b1b0f663 release: 2.0.11 2024-08-13 14:53:18 +08:00
手瓜一十雪
91511e4c3f fix: 某个笨蛋弄错的地方 2024-08-13 14:52:51 +08:00
手瓜一十雪
6a72056b25 release: 2.0.10 2024-08-13 13:58:53 +08:00
手瓜一十雪
62e0c57a50 Merge pull request #243 from cnxysoft/upmain
fix: 框架启动概率性失败
2024-08-13 13:50:08 +08:00
Alen
9d92270931 fix: 框架启动概率性失败
修复框架启动有概率失败的问题
2024-08-13 13:37:19 +08:00
手瓜一十雪
f61321d5a6 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-08-13 13:09:16 +08:00
手瓜一十雪
08ab2f8649 chore: 切换为缓存实现 2024-08-13 13:09:14 +08:00
Wesley F. Young
82962c4b42 docs: copyright 2024-08-13 09:06:46 +08:00
Wesley F. Young
bd24e8a4ad docs: plugin description 2024-08-13 09:02:50 +08:00
手瓜一十雪
6224d9a292 fix: 不合格类型 2024-08-13 00:59:26 +08:00
手瓜一十雪
bbc58f3671 release v2.0.9 2024-08-13 00:53:21 +08:00
手瓜一十雪
fcd620283f fix: 处理边界条件 2024-08-13 00:48:51 +08:00
手瓜一十雪
a78def3d2d chore: 移除异常内容 2024-08-13 00:39:20 +08:00
手瓜一十雪
43e94a5db0 fix: 跳过空消息 2024-08-13 00:38:42 +08:00
手瓜一十雪
e77bcc1267 release: 2.0.8 2024-08-12 23:50:03 +08:00
手瓜一十雪
9b458958b8 Revert "try fix"
This reverts commit 35419ade29.
2024-08-12 23:03:58 +08:00
手瓜一十雪
35419ade29 try fix 2024-08-12 23:01:36 +08:00
手瓜一十雪
15bd2ee887 fix: 2.0.7 2024-08-12 20:51:17 +08:00
手瓜一十雪
9394bafa8e fix 2024-08-12 20:46:28 +08:00
手瓜一十雪
94150a0c48 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-08-12 20:42:10 +08:00
手瓜一十雪
8955fdfc23 release: 2.0.7 2024-08-12 20:41:57 +08:00
手瓜一十雪
c13aa6a545 build: 快速登录修复 2024-08-12 20:34:34 +08:00
手瓜一十雪
c73b50bd4a fix 2024-08-12 20:28:25 +08:00
手瓜一十雪
0a17a38bf1 fix: renderer 2024-08-12 18:25:34 +08:00
手瓜一十雪
0f7bfe1d66 release: 2.0.6 2024-08-12 18:22:36 +08:00
手瓜一十雪
cf3f488663 release: new group 2024-08-12 18:22:06 +08:00
Wesley F. Young
5f536fdb73 Merge remote-tracking branch 'origin/main' 2024-08-12 17:53:45 +08:00
Wesley F. Young
99d0b13cce Merge remote-tracking branch 'origin/main'
# Conflicts:
#	src/onebot/index.ts
2024-08-12 17:53:16 +08:00
手瓜一十雪
b04937f012 chore: v2.0.5 2024-08-12 17:52:41 +08:00
Wesley F. Young
91c9b059cf feat: new message logging using raw msg object 2024-08-12 17:52:27 +08:00
手瓜一十雪
35cc643440 fix 2024-08-12 17:49:09 +08:00
Wesley F. Young
b23bb8c46a Merge remote-tracking branch 'origin/main' 2024-08-12 17:36:10 +08:00
手瓜一十雪
64fdf62c4b Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-08-12 17:17:00 +08:00
手瓜一十雪
1c8a808571 chore: 2.0.4 2024-08-12 17:16:41 +08:00
Version
d8f0295032 chore:version change 2024-08-12 09:15:06 +00:00
手瓜一十雪
d59771ac2f fix: error 2024-08-12 17:14:44 +08:00
Wesley F. Young
45df093fac docs: add correct comments on fields 2024-08-12 17:07:22 +08:00
手瓜一十雪
fba2078fc0 chore: 过滤重复消息 2024-08-12 17:04:32 +08:00
手瓜一十雪
20a37fe2de Merge pull request #239 from clansty/main
fix: revert get_friends_with_category return type
2024-08-12 16:40:41 +08:00
Clansty
8f6d26b65c fix: revert get_friends_with_category return type 2024-08-12 16:35:08 +08:00
Wesley F. Young
b58a194c8a fix: constructor signature mismatch 2024-08-12 16:15:39 +08:00
手瓜一十雪
52f1b0a0ce chore: 鸣谢 2024-08-12 14:57:12 +08:00
手瓜一十雪
c2b8fb223b chore: 鸣谢 2024-08-12 14:56:49 +08:00
手瓜一十雪
20e4eff899 chore: 2.0.1 2024-08-12 14:36:56 +08:00
手瓜一十雪
0efcca36d2 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-08-12 14:20:38 +08:00
手瓜一十雪
ab417802a0 fix 2024-08-12 14:20:27 +08:00
Version
73d68cce4a chore:version change 2024-08-12 06:19:18 +00:00
手瓜一十雪
e4ac2de660 build: v2.0.0 twice 2024-08-12 13:32:12 +08:00
手瓜一十雪
8d1241808a chore: DownloadRichMedia 2024-08-12 13:29:59 +08:00
手瓜一十雪
b810040145 chore: Onebot context 2024-08-12 13:04:24 +08:00
手瓜一十雪
c01d7dae2d build: v2.0.0 twice 2024-08-12 12:45:00 +08:00
手瓜一十雪
dfca3c2483 Revert "fix: make hostname localhost when the configured host is 0.0.0.0"
This reverts commit 21fed5b25f.
2024-08-12 12:43:59 +08:00
手瓜一十雪
1bb4be086f Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-08-12 12:43:03 +08:00
手瓜一十雪
fd226c45f6 chore: Support 多账户 2024-08-12 12:41:59 +08:00
Wesley F. Young
21fed5b25f fix: make hostname localhost when the configured host is 0.0.0.0 2024-08-12 12:33:33 +08:00
Wesley F. Young
dde093d321 fix: hot reload 2024-08-12 12:29:40 +08:00
Wesley F. Young
b99fb247ac fix & refactor: pass actions through constructor 2024-08-12 12:08:53 +08:00
Wesley F. Young
28930fdad4 refactor: type definition for ActionMap 2024-08-12 11:35:17 +08:00
Wesley F. Young
ea4d1d3275 feat: logging for hot reload 2024-08-12 11:20:48 +08:00
Wesley F. Young
62e852d510 feat: hot reload 2024-08-12 11:16:15 +08:00
Wesley F. Young
7ddd4d6461 refactor: change method signature in legacy WebUi 2024-08-12 10:58:52 +08:00
Wesley F. Young
6b9307de2a refactor: move Ob11Adapter to index.ts 2024-08-12 10:45:55 +08:00
Wesley F. Young
234046ce10 fix: remove redundant sleep 2024-08-12 10:43:51 +08:00
手瓜一十雪
73b29cf1e2 chore: 开源许可变更 2024-08-12 10:34:05 +08:00
手瓜一十雪
4b3bf170c0 Update README.md 2024-08-12 10:33:09 +08:00
Wesley F. Young
a7fbaba2d7 docs: 语言中枢,你进化罢 2024-08-12 08:30:18 +08:00
Wesley F. Young
fc79241f3d Merge remote-tracking branch 'origin/main' 2024-08-12 08:20:39 +08:00
Wesley F. Young
a88c37ea56 fix: replace deprecated calls 2024-08-12 08:20:11 +08:00
手瓜一十雪
9b2358b7f1 build: V2.0.0 fast 2024-08-12 02:37:20 +08:00
手瓜一十雪
257135763f fix 2024-08-12 02:27:44 +08:00
手瓜一十雪
610a3499f2 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-08-12 02:23:56 +08:00
手瓜一十雪
69752b8837 fix 2024-08-12 02:23:46 +08:00
Wesley F. Young
610473b57c Merge remote-tracking branch 'origin/main' 2024-08-12 02:22:50 +08:00
Wesley F. Young
1e5721d7d5 fix: sleep before loading 2024-08-12 02:22:20 +08:00
手瓜一十雪
6c2b45679a build: test 2024-08-12 02:21:37 +08:00
Wesley F. Young
6785922379 fix: auto retry of active ws 2024-08-12 02:12:18 +08:00
手瓜一十雪
4e85124aeb build: v2.0.0 nopackage 2024-08-12 01:27:24 +08:00
手瓜一十雪
6b30a03f55 build: v2.0.0 fast 2024-08-12 01:21:14 +08:00
手瓜一十雪
876894d8c6 build: v2.0.0 fast 2024-08-12 01:17:47 +08:00
手瓜一十雪
ea20d94146 build: v2.0.0 fast 2024-08-12 01:15:52 +08:00
手瓜一十雪
c7669777cb Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-08-12 01:15:00 +08:00
手瓜一十雪
3b43bba4a0 build: v2.0.0 fast test 2024-08-12 01:14:38 +08:00
Wesley F. Young
0ab4946bf1 Merge remote-tracking branch 'origin/main' 2024-08-12 01:13:36 +08:00
Wesley F. Young
a7fb18d5c0 chore: clean-up 2024-08-12 01:13:26 +08:00
手瓜一十雪
a0fbb0f861 chore: build 2024-08-12 01:13:03 +08:00
Wesley F. Young
e6c93ab1c0 Merge remote-tracking branch 'origin/main' 2024-08-12 01:12:36 +08:00
Wesley F. Young
7152213344 fix: inherit logging level from config 2024-08-12 01:12:27 +08:00
手瓜一十雪
a8e913cfde build: v2.0.0 test 2024-08-12 01:10:45 +08:00
手瓜一十雪
4ac074f3dd chore: build 2024-08-12 01:09:30 +08:00
Wesley F. Young
436249597d fix: use constructor to pass config name 2024-08-12 01:08:55 +08:00
手瓜一十雪
016a742d90 chore: build 2024-08-12 01:00:26 +08:00
Wesley F. Young
6d863ac29c Merge remote-tracking branch 'origin/main' 2024-08-12 00:50:23 +08:00
Wesley F. Young
ae981fe57d fix & refactor: no longer merge config data and loader; use static imports to represent config struct 2024-08-12 00:49:59 +08:00
手瓜一十雪
0c6a75b722 chore: 日志 2024-08-12 00:35:35 +08:00
手瓜一十雪
bfd9b1b7c7 fix: 异常未使用内容 2024-08-12 00:34:02 +08:00
Wesley F. Young
12f6b1ca45 chore: remove TODO since legacy WebUI has been compatible with shell 2024-08-12 00:32:10 +08:00
Wesley F. Young
04264110ee Merge remote-tracking branch 'origin/main' 2024-08-12 00:27:40 +08:00
Wesley F. Young
e4a112c329 refactor: move default config json files to inner folders 2024-08-12 00:27:14 +08:00
Wesley F. Young
ef4dee8886 refactor: make ConfigBase abstract 2024-08-12 00:26:44 +08:00
手瓜一十雪
e7ee21ca30 chore: 高版本appid 2024-08-12 00:26:37 +08:00
手瓜一十雪
23ee480c4f fix 2024-08-12 00:22:17 +08:00
手瓜一十雪
7816271302 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-08-12 00:22:11 +08:00
手瓜一十雪
b57814f14a chore: log 2024-08-12 00:17:43 +08:00
Wesley F. Young
b18e86f81c fix: core config name 2024-08-12 00:15:51 +08:00
Wesley F. Young
7b1b503703 Merge remote-tracking branch 'origin/main' 2024-08-12 00:14:04 +08:00
手瓜一十雪
32d4febf10 chore: config 2024-08-12 00:12:52 +08:00
Wesley F. Young
814973af58 chore: suppress type merging error 2024-08-12 00:09:05 +08:00
手瓜一十雪
ecee642e10 chore: 日志美化 2024-08-12 00:08:49 +08:00
手瓜一十雪
9afc0f6667 chore: 鉴权和回复 2024-08-11 23:59:58 +08:00
手瓜一十雪
e9e517533a chore: 挂载逻辑 2024-08-11 23:53:12 +08:00
手瓜一十雪
4a531ccea1 fix 2024-08-11 23:39:25 +08:00
手瓜一十雪
fb8e0595c2 fix 2024-08-11 23:37:31 +08:00
手瓜一十雪
d748d6e400 fix: error 2024-08-11 23:34:59 +08:00
手瓜一十雪
6b99fa1f24 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-08-11 23:27:31 +08:00
手瓜一十雪
ca5abc635c chore: 二维码登录与刷新1 2024-08-11 23:27:28 +08:00
手瓜一十雪
35e75be0d0 chore: 快速登录 2024-08-11 23:24:20 +08:00
Wesley F. Young
cf401a659d Merge remote-tracking branch 'origin/main'
# Conflicts:
#	src/onebot/network/active-websocket.ts
2024-08-11 23:15:37 +08:00
Wesley F. Young
bd56968efb Merge remote-tracking branch 'origin/main'
# Conflicts:
#	src/onebot/network/active-websocket.ts
2024-08-11 23:15:13 +08:00
手瓜一十雪
a78bc686cd chore: noThrowError 2024-08-11 23:13:47 +08:00
Wesley F. Young
ad8c962c25 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	src/onebot/network/active-websocket.ts
2024-08-11 23:13:15 +08:00
手瓜一十雪
be91976498 chore: 初步完成 2024-08-11 23:10:56 +08:00
Wesley F. Young
57821b839e feat: implement ActiveHttp.open / close 2024-08-11 23:09:59 +08:00
手瓜一十雪
ad334ed09f Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-08-11 23:09:21 +08:00
Wesley F. Young
a955937e02 feat: complete active websocket 2024-08-11 23:09:00 +08:00
Wesley F. Young
3c42cc17c8 chore: clean-up 2024-08-11 23:08:41 +08:00
手瓜一十雪
deeab036d3 chore: token 2024-08-11 23:05:42 +08:00
Wesley F. Young
a1badcd9a1 Merge remote-tracking branch 'origin/main' 2024-08-11 22:54:40 +08:00
Wesley F. Young
52762438c6 chore: fix indentation 2024-08-11 22:54:24 +08:00
手瓜一十雪
3294079b72 chore: 去除无用链接 2024-08-11 22:50:47 +08:00
Wesley F. Young
1c6bdf20b6 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	.env.production
#	README.md
#	package.json
#	src/common/utils/QQBasicInfo.ts
#	src/core/src/apis/group.ts
#	src/core/src/apis/msg.ts
#	src/core/src/data.ts
#	src/core/src/services/NodeIKernelMsgService.ts
#	src/onebot/action/types.ts
#	src/onebot11/action/extends/CreateCollection.ts
#	src/onebot11/action/extends/Debug.ts
#	src/onebot11/action/extends/FetchEmojioLike.ts
#	src/onebot11/action/extends/GetCollectionList.ts
#	src/onebot11/action/extends/GetRobotUinRange.ts
#	src/onebot11/action/extends/OCRImage.ts
#	src/onebot11/action/extends/SetGroupHeader.ts
#	src/onebot11/action/extends/SetLongNick.ts
#	src/onebot11/action/extends/SetOnlineStatus.ts
#	src/onebot11/action/extends/SetQQAvatar.ts
#	src/onebot11/action/extends/TestApi01.ts
#	src/onebot11/action/extends/TranslateEnWordToZn.ts
#	src/onebot11/action/file/DelGroupFile.ts
#	src/onebot11/action/file/GetFile.ts
#	src/onebot11/action/go-cqhttp/GetForwardMsg.ts
#	src/onebot11/action/go-cqhttp/GetFriendMsgHistory.ts
#	src/onebot11/action/go-cqhttp/GetGroupHonorInfo.ts
#	src/onebot11/action/go-cqhttp/GetStrangerInfo.ts
#	src/onebot11/action/go-cqhttp/SendGroupNotice.ts
#	src/onebot11/action/go-cqhttp/UploadGroupFile.ts
#	src/onebot11/action/go-cqhttp/UploadPrivareFile.ts
#	src/onebot11/action/group/GetGroupEssence.ts
#	src/onebot11/action/group/GetGroupList.ts
#	src/onebot11/action/group/SetEssenceMsg.ts
#	src/onebot11/action/group/SetGroupAddRequest.ts
#	src/onebot11/action/group/SetGroupBan.ts
#	src/onebot11/action/group/SetGroupKick.ts
#	src/onebot11/action/index.ts
#	src/onebot11/action/msg/DeleteMsg.ts
#	src/onebot11/action/msg/ForwardSingleMsg.ts
#	src/onebot11/action/msg/GetMsg.ts
#	src/onebot11/action/msg/SendMsg/create-send-elements.ts
#	src/onebot11/action/msg/SendMsg/handle-forward-node.ts
#	src/onebot11/action/msg/SendMsg/index.ts
#	src/onebot11/action/msg/SendPrivateMsg.ts
#	src/onebot11/action/msg/SetMsgEmojiLike.ts
#	src/onebot11/action/system/GetLoginInfo.ts
#	src/onebot11/action/user/GetFriendList.ts
#	src/onebot11/action/user/SendLike.ts
#	src/onebot11/config.ts
#	src/onebot11/constructor.ts
#	src/onebot11/event/notice/OB11GroupAdminNoticeEvent.ts
#	src/onebot11/event/notice/OB11InputStatusEvent.ts
#	src/onebot11/log.ts
#	src/onebot11/main.ts
#	src/onebot11/version.ts
#	src/webui/ui/NapCat.ts
2024-08-11 22:37:16 +08:00
手瓜一十雪
fac00be995 chore: 移除社交平台 2024-08-11 22:10:39 +08:00
Wesley F. Young
e7e8e99946 refactor: inline getApiContext() 2024-08-11 19:10:42 +08:00
Wesley F. Young
9f9749548a fix: type 2024-08-11 18:41:48 +08:00
Wesley F. Young
db1ac85acf fix: add missing catches 2024-08-11 18:39:23 +08:00
Wesley F. Young
d5eaeb429a feat: initGroupListener 2024-08-11 18:33:23 +08:00
Wesley F. Young
4e7595d8d1 feat: initBuddyListener 2024-08-11 18:11:27 +08:00
手瓜一十雪
f25fdcdc3d fix: webui this丢失 2024-08-11 18:04:31 +08:00
手瓜一十雪
7a4de75e07 chore: Adapter 2024-08-11 17:57:52 +08:00
手瓜一十雪
545b57a57d Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-08-11 17:53:25 +08:00
手瓜一十雪
32c3aa7979 fix: rm log error 2024-08-11 17:53:15 +08:00
Wesley F. Young
013f703241 Merge remote-tracking branch 'origin/main' 2024-08-11 17:52:18 +08:00
Wesley F. Young
c463ad5fd6 refactor: signature of internal methods 2024-08-11 17:44:24 +08:00
手瓜一十雪
412b8473fe Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-08-11 17:44:02 +08:00
手瓜一十雪
02df2132b4 chore: build 2024-08-11 17:43:59 +08:00
Wesley F. Young
a964d5c93f feat: onMsgInfoListUpdate 2024-08-11 17:38:31 +08:00
Wesley F. Young
eafc32a915 fix: remove redundant async calls 2024-08-11 17:24:29 +08:00
手瓜一十雪
df4b84b4b9 补全AT Type 2024-08-11 16:55:08 +08:00
手瓜一十雪
6e094eb4fc chore: 缓存维护 2024-08-11 16:18:34 +08:00
手瓜一十雪
9e7d7bcb4c chore: 防止炸了 2024-08-11 16:03:58 +08:00
手瓜一十雪
63b3cc8c02 chore: 原始脚本 2024-08-11 15:45:49 +08:00
手瓜一十雪
7a88786685 chore: 临时会话 2024-08-11 15:43:13 +08:00
手瓜一十雪
427889f8ca chore: 类型补全 2024-08-11 15:34:52 +08:00
手瓜一十雪
82c9c28439 chore: 开源声明 2024-08-11 14:21:04 +08:00
手瓜一十雪
c84c1f2e96 chore: 移除废弃日志 2024-08-11 13:55:46 +08:00
手瓜一十雪
a3ee8672ed chore: V2 2024-08-11 13:53:45 +08:00
手瓜一十雪
4cfde09016 chore: config保存 2024-08-11 13:52:55 +08:00
手瓜一十雪
0b8dcbebe9 chore: webui 2024-08-11 13:48:26 +08:00
手瓜一十雪
aa12506221 re: old webui 2024-08-11 13:10:31 +08:00
手瓜一十雪
39ed9dea01 chore: 消息post 2024-08-11 12:18:13 +08:00
手瓜一十雪
6f095470ad chore: NETWORK 2024-08-11 11:12:23 +08:00
手瓜一十雪
2a5d2cc146 chore: 鉴权认证优化 2024-08-11 11:07:11 +08:00
手瓜一十雪
b5e8218551 chore: 正向ws测试完成 2024-08-11 10:29:21 +08:00
手瓜一十雪
062cc307fb chore: 正向ws鉴权 2024-08-11 10:20:17 +08:00
手瓜一十雪
e99ff1be35 chore: 心跳 2024-08-11 10:12:53 +08:00
手瓜一十雪
404a213896 chore: 正向WS实现 2024-08-11 09:50:09 +08:00
手瓜一十雪
0a07f16ef6 chore: Server Create 2024-08-11 09:27:47 +08:00
手瓜一十雪
f9bf8f9901 fix 2024-08-11 00:54:26 +08:00
手瓜一十雪
b6ae67bf3e Merge branch 'v2' of https://github.com/NapNeko/NapCatQQ into v2 2024-08-11 00:53:23 +08:00
手瓜一十雪
191ce0798f chore: fix 2024-08-11 00:53:15 +08:00
Wesley F. Young
40362590c8 Merge remote-tracking branch 'origin/v2' into v2
# Conflicts:
#	src/onebot/action/extends/GetFriendWithCategory.ts
2024-08-11 00:46:17 +08:00
Wesley F. Young
87f6dc7c0b fix: reference problems 2024-08-11 00:45:47 +08:00
手瓜一十雪
2f2c1f263a chore:fix 2024-08-11 00:44:37 +08:00
手瓜一十雪
8841cbb3d0 Merge branch 'v2' of https://github.com/NapNeko/NapCatQQ into v2 2024-08-11 00:35:49 +08:00
手瓜一十雪
a2e20a8092 chore: HttpAdapter 2024-08-11 00:35:39 +08:00
Wesley F. Young
6a7c7a0ab5 fix: adapt to breaking changes in event constructor signature 2024-08-11 00:33:49 +08:00
手瓜一十雪
44a8c8e35d chore: network 初步完成 2024-08-11 00:24:00 +08:00
手瓜一十雪
1cbfccc4eb Merge branch 'v2' of https://github.com/NapNeko/NapCatQQ into v2 2024-08-11 00:19:38 +08:00
手瓜一十雪
e12c0b5536 chore: active-websocket 2024-08-11 00:19:28 +08:00
Wesley F. Young
b7a8781308 feat: onInputStatusPush & onRecvMsg 2024-08-11 00:16:26 +08:00
手瓜一十雪
73a8fcd35b chore: 初步完成network 2024-08-11 00:11:51 +08:00
手瓜一十雪
a2ad39f78d chore: websocket 2024-08-11 00:08:52 +08:00
Wesley F. Young
832635d6f5 Merge remote-tracking branch 'origin/v2' into v2 2024-08-11 00:00:58 +08:00
手瓜一十雪
dacb56bc20 Merge branch 'v2' of https://github.com/NapNeko/NapCatQQ into v2 2024-08-11 00:00:42 +08:00
Wesley F. Young
e5a9821027 fix: logMessage & method signature 2024-08-11 00:00:16 +08:00
Wesley F. Young
bbe666eb73 update: EmitEventContent = Message + Event 2024-08-10 23:54:20 +08:00
手瓜一十雪
000cb3d80c chore: Basic Info 2024-08-10 23:53:16 +08:00
Wesley F. Young
40f85dbf5f Revert "feat: logMessage for LogWrapper"
This reverts commit d6646ebadf.
2024-08-10 23:52:42 +08:00
Wesley F. Young
d6646ebadf feat: logMessage for LogWrapper 2024-08-10 23:31:23 +08:00
手瓜一十雪
e02bddc78f fix 2024-08-10 22:40:40 +08:00
手瓜一十雪
08e679184b Merge branch 'v2' of https://github.com/NapNeko/NapCatQQ into v2 2024-08-10 22:35:41 +08:00
手瓜一十雪
5c877e894b chore: GroupCache 2024-08-10 22:35:29 +08:00
Wesley F. Young
5918f03cb1 Merge remote-tracking branch 'origin/v2' into v2 2024-08-10 22:27:05 +08:00
手瓜一十雪
78263d716c Merge branch 'v2' of https://github.com/NapNeko/NapCatQQ into v2 2024-08-10 22:25:38 +08:00
手瓜一十雪
15f4841328 chore: config 2024-08-10 22:25:25 +08:00
Wesley F. Young
ae5d50141b fix: method signature of _handle 2024-08-10 22:22:52 +08:00
Wesley F. Young
8839563ff8 Merge remote-tracking branch 'origin/v2' into v2 2024-08-10 22:12:06 +08:00
Wesley F. Young
6d954b2d5d refactor: add core into all event constructors 2024-08-10 22:11:57 +08:00
手瓜一十雪
6e125f15a4 chore: config 2024-08-10 21:58:37 +08:00
手瓜一十雪
e344921a06 chore: config 2024-08-10 21:56:55 +08:00
手瓜一十雪
4cbaf0dc70 fix 2024-08-10 21:53:08 +08:00
手瓜一十雪
ef7d2f4a82 Merge branch 'v2' of https://github.com/NapNeko/NapCatQQ into v2 2024-08-10 21:48:08 +08:00
手瓜一十雪
5f7d998b0b chore: fix 2024-08-10 21:47:58 +08:00
Wesley F. Young
2c14281168 refactor: specify the arg type of onInputStatusPush 2024-08-10 20:56:46 +08:00
Wesley F. Young
9feab4bc79 chore: make BaseAction abstract 2024-08-10 20:53:29 +08:00
Wesley F. Young
63237bc112 refactor: rename postEvent -> emitEvent to prevent ambiguity 2024-08-10 20:43:50 +08:00
手瓜一十雪
99f4752c89 Merge branch 'v2' of https://github.com/NapNeko/NapCatQQ into v2 2024-08-10 20:28:52 +08:00
手瓜一十雪
ef1ed5aa8b chore: 移除错误日志 2024-08-10 20:28:43 +08:00
Wesley F. Young
1258270ac4 Merge remote-tracking branch 'origin/v2' into v2
# Conflicts:
#	src/core/apis/group.ts
2024-08-10 20:26:42 +08:00
Wesley F. Young
bb7a2f5f6c feat: get group & group member by uin 2024-08-10 20:25:32 +08:00
手瓜一十雪
c865d32d95 chore: add 2024-08-10 20:23:17 +08:00
Wesley F. Young
87c3b24488 chore: run a full eslint 2024-08-10 19:58:31 +08:00
Wesley F. Young
5a5257294b optimize: an ActiveHttpAdapter does not need to register actions 2024-08-10 19:33:34 +08:00
手瓜一十雪
a9ca951854 chore 2024-08-10 18:45:46 +08:00
手瓜一十雪
2a9353ee70 chore: 标准化 2024-08-10 18:18:04 +08:00
手瓜一十雪
18e134b92a chore: 核心缓存位置设计完成 2024-08-10 18:06:40 +08:00
手瓜一十雪
6c87e15a52 fix: 创建OB上下文 2024-08-10 18:03:21 +08:00
手瓜一十雪
a710821c35 chore: log 2024-08-10 17:53:48 +08:00
手瓜一十雪
de4aeedce5 fix: typo 2024-08-10 17:51:25 +08:00
手瓜一十雪
1f71a01453 chore: 调整出包方式 2024-08-10 17:50:23 +08:00
手瓜一十雪
6371d79d33 chore: 针对的并非框架 2024-08-10 17:45:17 +08:00
手瓜一十雪
80d2218aa6 chore: PostEvent 2024-08-10 17:33:17 +08:00
手瓜一十雪
bc636f109c chore: 去除无效代码 2024-08-10 17:31:12 +08:00
手瓜一十雪
76d58af4d8 chore: 小调整 2024-08-10 17:29:24 +08:00
手瓜一十雪
84e5417a8c chore: 管理网络适配器 2024-08-10 17:11:04 +08:00
手瓜一十雪
89188958ec chore: token 2024-08-10 17:07:23 +08:00
手瓜一十雪
b5d24d751d chore: HeartBeat 2024-08-10 16:58:40 +08:00
手瓜一十雪
3269061db4 Revert "chore: network context"
This reverts commit 9f576f43cc.
2024-08-10 16:35:58 +08:00
手瓜一十雪
9f576f43cc chore: network context 2024-08-10 16:28:26 +08:00
手瓜一十雪
505c6e0e0e chore 2024-08-10 16:21:56 +08:00
手瓜一十雪
9936b49ee0 fix: typo 2024-08-10 16:20:44 +08:00
手瓜一十雪
707bc765b9 chore: readme 2024-08-10 16:19:57 +08:00
手瓜一十雪
8780c987ea chore: HttpServer 2024-08-10 16:09:26 +08:00
手瓜一十雪
7aa01f786d feat; 初步完成 2024-08-10 15:52:05 +08:00
Wesley F. Young
340e94d54e feat: a framework of active (reverse, 反向) websocket 2024-08-10 15:13:26 +08:00
手瓜一十雪
509b123064 Merge branch 'v2' of https://github.com/NapNeko/NapCatQQ into v2 2024-08-10 14:42:09 +08:00
Wesley F. Young
8060b1c753 feat: a framework of passive (正向) websocket 2024-08-10 14:40:51 +08:00
Wesley F. Young
33ef3e7d59 update: interface IOB11NetworkAdapter 2024-08-10 14:00:56 +08:00
Wesley F. Young
704e5f7134 fix: typo of Emojio -> Emoji 2024-08-10 13:53:24 +08:00
手瓜一十雪
91bc3ab525 😊史山移出历史长河 2024-08-10 13:52:06 +08:00
Wesley F. Young
2e6bded9d0 fix: typo of Emojio -> Emoji 2024-08-10 13:51:49 +08:00
Wesley F. Young
c6e980ed96 begin refactoring ob11/server 2024-08-10 13:48:27 +08:00
手瓜一十雪
32a932ad5c chore: fix 2024-08-10 13:34:33 +08:00
手瓜一十雪
f6d2bd04e9 chore: 移除延迟 2024-08-10 13:32:38 +08:00
Wesley F. Young
b0266b470f fix: add pathWrapper into NC_LL constructor 2024-08-10 11:56:47 +08:00
Wesley F. Young
0ed969fa3f fix: hook session init when launching as LL plugin 2024-08-10 11:56:23 +08:00
Wesley F. Young
90a7b5e0d3 fix: remove debug info 2024-08-10 08:43:22 +08:00
Wesley F. Young
c5bf656fe7 update: add pathWrapper into instance context 2024-08-09 23:21:17 +08:00
Wesley F. Young
6bce4533a3 fix: login 2024-08-09 23:19:47 +08:00
手瓜一十雪
8a8aa0016e fix 2024-08-09 22:48:13 +08:00
Wesley F. Young
7e4ebd330c Merge remote-tracking branch 'origin/v2' into v2 2024-08-09 22:37:21 +08:00
Wesley F. Young
c304845117 feat: logging in through shell 2024-08-09 22:36:44 +08:00
手瓜一十雪
ee85f3e824 chore: defaultConfig 2024-08-09 22:29:51 +08:00
手瓜一十雪
3f6f1dcd78 chore: config 2024-08-09 22:29:01 +08:00
手瓜一十雪
c271a4b2cb fix 2024-08-09 22:14:45 +08:00
手瓜一十雪
fa07dfb720 feat: 注入OneBot上下文 2024-08-09 21:54:14 +08:00
手瓜一十雪
6f6b258f22 release: 1.8.6 2024-08-09 21:41:56 +08:00
手瓜一十雪
717b246cb6 release: 1.8.5 2024-08-09 21:38:36 +08:00
Wesley F. Young
5990e0c2eb chore: run eslint --fix in onebot module 2024-08-09 20:35:03 +08:00
手瓜一十雪
827df80ec8 fix: error 2024-08-09 20:34:31 +08:00
手瓜一十雪
7117fae2b2 chore: wait for v2 2024-08-09 19:41:40 +08:00
手瓜一十雪
15e9462140 LICENSE: MPL2 To BSD 2024-08-09 19:40:35 +08:00
手瓜一十雪
714f8327ea fix 2024-08-09 19:13:26 +08:00
手瓜一十雪
fedb77e304 chore: fix 2024-08-09 19:04:14 +08:00
手瓜一十雪
06d2884a88 chore config 2024-08-09 18:44:14 +08:00
手瓜一十雪
b50556802c chore: action基本就绪 2024-08-09 18:28:05 +08:00
手瓜一十雪
b18dfdb9ba chore: sendMsg 2024-08-09 18:23:37 +08:00
手瓜一十雪
173f83808e chore Api 2024-08-09 18:17:45 +08:00
手瓜一十雪
fbe2d78331 fix: 大部分异常 2024-08-09 18:06:11 +08:00
手瓜一十雪
e5fd9c6366 chore: sendMsg 2024-08-09 17:53:06 +08:00
手瓜一十雪
3623b991ff CHORE 2024-08-09 17:49:51 +08:00
手瓜一十雪
2cabd7879c chore: GroupApi Finish 2024-08-09 17:37:17 +08:00
手瓜一十雪
a1a378d6f5 chore: gocq接口完成 2024-08-09 17:27:44 +08:00
手瓜一十雪
b016268fdb refactor: 初步fileApi就绪 2024-08-09 17:12:57 +08:00
手瓜一十雪
dfb31b78d9 chore: 所有扩展接口就绪 2024-08-09 17:01:29 +08:00
手瓜一十雪
4eed603d36 chore: context 2024-08-09 16:52:03 +08:00
手瓜一十雪
cdc10d6c4b chore: server 2024-08-09 16:49:40 +08:00
手瓜一十雪
cb03501eff chore: http 2024-08-09 16:40:54 +08:00
手瓜一十雪
c2e28ab5a6 chore: version Api 2024-08-09 16:35:28 +08:00
手瓜一十雪
24a166cb94 chore 2024-08-09 16:30:54 +08:00
手瓜一十雪
1d3ac0c9b3 chore: actionMap 2024-08-09 16:28:38 +08:00
手瓜一十雪
ff29b62398 chore: OBAPI 2024-08-09 16:22:35 +08:00
手瓜一十雪
d9e016db8b chore:action 2024-08-09 16:15:17 +08:00
手瓜一十雪
6cfd50a7b8 Merge branch 'v2' of https://github.com/NapNeko/NapCatQQ into v2 2024-08-09 16:04:38 +08:00
手瓜一十雪
6605d3812a chore: obApi 2024-08-09 16:04:28 +08:00
Wesley F. Young
be71abe580 chore: fix indentation in files 2024-08-09 15:58:40 +08:00
手瓜一十雪
518ff48e97 chore: Action 2024-08-09 15:50:17 +08:00
手瓜一十雪
8a4add257f chore: OneBotApi 2024-08-09 15:44:45 +08:00
手瓜一十雪
7842cd0bc0 chore: NTApi Finish 2024-08-09 15:35:00 +08:00
手瓜一十雪
ffe480ad44 fix: 小问题 2024-08-09 15:31:41 +08:00
手瓜一十雪
e4d3f95257 Merge branch 'v2' of https://github.com/NapNeko/NapCatQQ into v2 2024-08-09 15:30:33 +08:00
手瓜一十雪
245eabe85f chore: 屏蔽部分代码 2024-08-09 15:30:04 +08:00
Wesley F. Young
22e7eb1ffc refactor: fix typo and add comments in WebHonorType 2024-08-09 15:22:34 +08:00
Wesley F. Young
d663a58d65 Merge remote-tracking branch 'origin/v2' into v2 2024-08-09 15:14:31 +08:00
Wesley F. Young
fa5d5f1bcc refactor: shared logic in webapi.ts 2024-08-09 15:14:11 +08:00
手瓜一十雪
7178095aef Merge branch 'v2' of https://github.com/NapNeko/NapCatQQ into v2 2024-08-09 14:39:27 +08:00
手瓜一十雪
4704faa011 chore: file utils 2024-08-09 14:39:06 +08:00
Wesley F. Young
0f77d9df1f Merge remote-tracking branch 'origin/v2' into v2 2024-08-09 14:32:43 +08:00
Wesley F. Young
e02c3fca8b fix: typo of lastest -> latest 2024-08-09 14:32:32 +08:00
手瓜一十雪
abe0838a63 fix: signApi 2024-08-09 14:24:48 +08:00
手瓜一十雪
6583e3d0c9 fix: system api 2024-08-09 14:14:45 +08:00
手瓜一十雪
2093d68bfb Merge branch 'v2' of https://github.com/NapNeko/NapCatQQ into v2 2024-08-09 14:12:11 +08:00
手瓜一十雪
d3a55d50c0 Merge branch 'v2' of https://github.com/NapNeko/NapCatQQ into v2 2024-08-09 14:11:59 +08:00
Wesley F. Young
471733b243 chore: add .prettierrc.json 2024-08-09 14:11:24 +08:00
手瓜一十雪
47fa717bce fix: webapi 2024-08-09 14:10:10 +08:00
Wesley F. Young
cfc68e70b6 chore: fix indentation and semi in core 2024-08-09 14:09:42 +08:00
手瓜一十雪
bd9ee62118 fix rkeyManager 2024-08-09 14:05:47 +08:00
手瓜一十雪
aaa874b099 chore: api 2024-08-09 13:58:26 +08:00
手瓜一十雪
958709faf2 chore: ntapi 2024-08-09 13:52:15 +08:00
手瓜一十雪
52ab93013c chore: NTAPI 2024-08-09 13:42:04 +08:00
手瓜一十雪
9203fa3df2 Merge pull request #230 from canxin121/main
Fix typo in eventType field name
2024-08-09 13:35:45 +08:00
手瓜一十雪
9ef3edabce chore: NTAPI 2024-08-09 13:33:58 +08:00
canxin121
c771d75a00 Fix typo in eventType field name 2024-08-09 13:12:11 +08:00
手瓜一十雪
1db27ab0e3 chore: 改成实例 2024-08-09 13:01:02 +08:00
手瓜一十雪
cd45f7051c chore: NTAPI 2024-08-09 12:58:00 +08:00
Wesley F. Young
588ea7978e rollback: use legacy event wrapper 2024-08-09 11:34:18 +08:00
手瓜一十雪
946f12cf6a remove: core不要干多余的事情 2024-08-09 11:11:45 +08:00
Wesley F. Young
7e49bfa984 refactor: make selfInfo a 'runtime info' 2024-08-09 11:03:25 +08:00
手瓜一十雪
7b10d75aeb chore: 1.8.4 2024-08-09 10:48:13 +08:00
手瓜一十雪
34e4963ccd Merge branch 'v2' of https://github.com/NapNeko/NapCatQQ into v2 2024-08-09 10:44:59 +08:00
手瓜一十雪
9fc9ed805c chore: type 2024-08-09 10:42:03 +08:00
Wesley F. Young
db4c5bc3a3 chore: fix indentation and semi in files 2024-08-09 10:37:09 +08:00
Wesley F. Young
024faa2561 Merge branch 'main' into v2 2024-08-08 23:20:15 +08:00
Wesley F. Young
b46459de5f docs: 给 v2 引流 2024-08-08 23:15:28 +08:00
Wesley F. Young
ac7f025223 docs: 进化的语言中枢 2024-08-08 23:13:21 +08:00
Wesley F. Young
e4343650c6 fix: remove debug log 2024-08-08 22:12:07 +08:00
Wesley F. Young
80c5259b05 feat: shell 2024-08-08 22:10:55 +08:00
Wesley F. Young
004a65d933 Merge remote-tracking branch 'origin/v2' into v2 2024-08-08 21:46:14 +08:00
手瓜一十雪
38289918c2 chore: requests 2024-08-08 21:42:34 +08:00
Wesley F. Young
0e46f9f213 chore: make indent 4 in .editorconfig 2024-08-08 21:40:09 +08:00
手瓜一十雪
be03b973e5 chore: docs 2024-08-08 21:34:25 +08:00
手瓜一十雪
a0bf2b3d3d chore: remove sleep 2024-08-08 21:31:00 +08:00
手瓜一十雪
755ab36e83 chore: loadfinish 2024-08-08 21:23:14 +08:00
手瓜一十雪
30975f7360 chore: onRecv 2024-08-08 21:19:42 +08:00
手瓜一十雪
828307fc52 Merge branch 'v2' of https://github.com/NapNeko/NapCatQQ into v2 2024-08-08 21:12:33 +08:00
手瓜一十雪
e79ca4fa4c chore: build
Co-Authored-By: Wesley F. Young <25684570+Wesley-Young@users.noreply.github.com>
2024-08-08 21:12:23 +08:00
Wesley F. Young
43288eb5c0 chore: make indent 4 in eslint 2024-08-08 21:06:27 +08:00
手瓜一十雪
9518595e48 chore: build
Co-Authored-By: Wesley F. Young <25684570+Wesley-Young@users.noreply.github.com>
2024-08-08 20:59:18 +08:00
手瓜一十雪
3c4cd3743f build: liteloader
Co-Authored-By: Wesley F. Young <25684570+Wesley-Young@users.noreply.github.com>
2024-08-08 20:57:10 +08:00
手瓜一十雪
b39cbffe14 chore: build
Co-Authored-By: Wesley F. Young <25684570+Wesley-Young@users.noreply.github.com>
2024-08-08 20:43:36 +08:00
手瓜一十雪
f588d3f35b chore: build
Co-Authored-By: Wesley F. Young <25684570+Wesley-Young@users.noreply.github.com>
2024-08-08 20:42:09 +08:00
手瓜一十雪
54b06872eb chore: old webui
Co-Authored-By: Wesley F. Young <25684570+Wesley-Young@users.noreply.github.com>
2024-08-08 20:21:44 +08:00
手瓜一十雪
0786c608a4 chore: vite build
Co-Authored-By: Wesley F. Young <25684570+Wesley-Young@users.noreply.github.com>
2024-08-08 19:26:27 +08:00
手瓜一十雪
c70b2eaa30 chore: 进度提交 2024-08-08 17:51:15 +08:00
手瓜一十雪
c417a95e1f chore: 改造为后初始化 2024-08-08 15:13:58 +08:00
手瓜一十雪
5ae9be0291 chore: 补全基础框架 2024-08-08 14:36:59 +08:00
手瓜一十雪
e2a6e3ea58 chore: 类型补全 2024-08-08 14:29:29 +08:00
手瓜一十雪
8fd5fa185b chore: Wrapper声明 2024-08-08 14:21:34 +08:00
手瓜一十雪
66707661e9 chore: refactor 2024-08-08 12:59:21 +08:00
手瓜一十雪
4e18ec5951 refactor: init 2024-08-08 12:44:10 +08:00
手瓜一十雪
05b77b5042 build: test 2024-08-08 11:11:38 +08:00
手瓜一十雪
d6cfe11d97 build: test 2024-08-08 10:59:49 +08:00
手瓜一十雪
dd4d59e4e7 build: test 2024-08-08 10:50:36 +08:00
手瓜一十雪
7cb8626e16 build:test 2024-08-08 10:29:53 +08:00
手瓜一十雪
89b5202adb Merge pull request #224 from NapNeko/newold
build: test
2024-08-08 10:28:19 +08:00
手瓜一十雪
40ae0c1449 build: test 2024-08-08 10:26:49 +08:00
手瓜一十雪
81a8115c56 release:1.8.3 2024-08-07 01:32:48 +08:00
手瓜一十雪
0ddd26bd51 release: 1.8.3 2024-08-07 01:28:22 +08:00
手瓜一十雪
69e2133a27 chore: BootWay05Script 2024-08-07 01:25:02 +08:00
手瓜一十雪
b04f85949b docs: todo 2024-08-06 23:42:21 +08:00
手瓜一十雪
667dba01ae build: OB11InputStatusEvent 2024-08-06 23:39:22 +08:00
手瓜一十雪
85a8cef628 chore: 移除部分无用内容 2024-08-06 21:14:11 +08:00
手瓜一十雪
3099acfd00 DOCS:TODO 2024-08-06 20:46:17 +08:00
手瓜一十雪
b00fe0b5f8 docs: 标记TODO和兜底接口 2024-08-06 20:38:49 +08:00
手瓜一十雪
9a64b8bdb6 release:1.8.2 2024-08-06 20:10:01 +08:00
手瓜一十雪
c01e493bd2 feat: 多层合并完成 2024-08-06 18:55:36 +08:00
手瓜一十雪
890236af23 chore: 去除风控延迟 2024-08-06 18:01:36 +08:00
手瓜一十雪
ea678d805d chore: 多层合并转发初步可用 2024-08-06 17:58:48 +08:00
手瓜一十雪
29699418ff fix: 对漏掉的部分加入 2024-08-06 17:02:26 +08:00
手瓜一十雪
87bb36c39f refactor: SendMessageContext 2024-08-06 17:00:27 +08:00
手瓜一十雪
7cb85ed73c fix: 再次优化nodeid 2024-08-06 16:43:06 +08:00
手瓜一十雪
c647771a6d fix: 合并转发Node节点异常问题 2024-08-06 16:27:06 +08:00
手瓜一十雪
6c3d737219 fix: 合并reply 2024-08-06 16:00:25 +08:00
手瓜一十雪
a1f38fed7a release: v1.8.1 2024-08-06 15:55:59 +08:00
手瓜一十雪
c36bb77286 feat: 合并消息初步解析完成 2024-08-06 14:48:20 +08:00
手瓜一十雪
1a1acdc3c9 feat: 转发着色 2024-08-06 11:40:36 +08:00
手瓜一十雪
ef8e60c405 build: 180test 2024-08-06 11:31:48 +08:00
手瓜一十雪
31c1cc47bf build: 180 2024-08-06 11:30:35 +08:00
手瓜一十雪
351fed7359 fix #102 2024-08-06 11:30:12 +08:00
手瓜一十雪
f49e7cbe57 chore: log 2024-08-06 11:15:44 +08:00
手瓜一十雪
7da8ea5e99 style:lint 2024-08-06 11:12:25 +08:00
手瓜一十雪
8fa6a12a7c build: 181test 2024-08-06 11:07:37 +08:00
手瓜一十雪
1070278eaf release: 1.8.0 2024-08-06 09:13:03 +08:00
手瓜一十雪
16b1a6b153 release: 1.7.9 2024-08-05 21:04:49 +08:00
手瓜一十雪
096a7534e0 build: 1.7.9-test 2024-08-05 20:36:08 +08:00
手瓜一十雪
b0897187d2 feat: fetch_emoji_like 2024-08-05 20:33:24 +08:00
手瓜一十雪
885d94882d remove: 😢意外加入的文件 2024-08-05 18:40:39 +08:00
手瓜一十雪
11a3341e13 feat: GetRecentContact 私有标准 2024-08-05 18:39:02 +08:00
手瓜一十雪
231890f78a refactor: msgRandom控制 2024-08-05 17:42:07 +08:00
手瓜一十雪
a272feda6a release: 1.7.8 2024-08-05 13:52:34 +08:00
手瓜一十雪
bc936a0ca7 build: 178发言时间与加入时间完全兜底 2024-08-05 13:45:07 +08:00
手瓜一十雪
28030c2d13 chore: test 2024-08-05 13:01:26 +08:00
手瓜一十雪
7fe9176286 feat: richmsg failed 2024-08-05 12:45:06 +08:00
手瓜一十雪
1105f9b8d6 docs: 补充 2024-08-05 01:11:11 +08:00
手瓜一十雪
e4653defa8 LICENSE: break 2024-08-05 00:48:41 +08:00
Alen
1c62a1e839 Merge pull request #208 from cnxysoft/main
BUG修复
2024-08-05 00:20:17 +08:00
Alen
3a3bbfe201 BUG修复
修复(群聊/私聊)转发合并消息错误的问题
2024-08-05 00:18:42 +08:00
手瓜一十雪
1c38833998 fix: 177 2024-08-04 23:26:51 +08:00
手瓜一十雪
38894177ee fix: get_stranger_info 2024-08-04 22:21:24 +08:00
手瓜一十雪
dce8416942 fix: 177 2024-08-04 21:40:44 +08:00
手瓜一十雪
14219e9b42 release: v1.7.7 2024-08-04 21:23:55 +08:00
手瓜一十雪
7b459e7502 refactor: get_group_member_list 2024-08-04 21:21:36 +08:00
手瓜一十雪
31824c0504 refactor: get_group_list 2024-08-04 20:56:49 +08:00
手瓜一十雪
e203abae85 refactor: /get_group_member_info 2024-08-04 20:53:23 +08:00
手瓜一十雪
faf83b680b 《NTQQ参数全解》 2024-08-04 20:19:34 +08:00
手瓜一十雪
67dcbcb842 refactor: 开始重构群成员信息获取 2024-08-04 20:10:21 +08:00
手瓜一十雪
6533a25404 chore: 移除调试代码 2024-08-04 19:12:18 +08:00
手瓜一十雪
4dc760b0e9 feat: shareDigest 2024-08-04 19:11:44 +08:00
手瓜一十雪
25933b9043 chore: 移除旧代码 2024-08-04 18:50:40 +08:00
手瓜一十雪
a53aaa456e fix: 一处很久很久的看错的的问题 2024-08-04 18:49:40 +08:00
手瓜一十雪
e8a7ea07a5 refactor: Id转换 2024-08-04 18:45:00 +08:00
手瓜一十雪
8817dc6b10 refactor: Uid/Uin转换V2版本 2024-08-04 18:01:31 +08:00
手瓜一十雪
491ec04b46 fix: 准备第二次重构uid/uin 2024-08-04 16:50:23 +08:00
手瓜一十雪
8a5d4a683b feat: getBuddyV2ExWithCate 2024-08-04 16:45:14 +08:00
手瓜一十雪
dfc7c7357a Refactor Api: GetFriendsWithCategory 2024-08-04 16:37:15 +08:00
手瓜一十雪
690a2f7d34 refctor: getBuddyV2 支持分类 2024-08-04 16:27:25 +08:00
手瓜一十雪
58f22b24e4 refactor: api getbuddyv2 2024-08-04 16:05:07 +08:00
手瓜一十雪
3cce9f528b build: 1.7.7 2024-08-04 15:16:45 +08:00
手瓜一十雪
20fd5ac8cb chore: Todo 2024-08-04 15:12:55 +08:00
手瓜一十雪
9e05e086eb fix: 初始化问题 2024-08-04 15:01:43 +08:00
手瓜一十雪
056e0adddf build: 1.7.7-refactor 2024-08-04 14:39:45 +08:00
手瓜一十雪
b36388200d Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-08-04 14:35:47 +08:00
手瓜一十雪
9793e5741a refactor: Appid的获取 2024-08-04 14:35:26 +08:00
手瓜一十雪
143380c012 Merge pull request #206 from pohgxz/main
修复webui快捷登录失败
2024-08-04 14:15:53 +08:00
手瓜一十雪
4b92254945 chore: 订正类型 2024-08-04 14:15:40 +08:00
手瓜一十雪
f9c1d8b4a6 build: 1.7.7 refactor 2024-08-04 14:06:30 +08:00
手瓜一十雪
c0c469339b refactor: versionGet 2024-08-04 14:03:28 +08:00
Nepenthe
0ca6343ed7 修复webui快捷登录失败 2024-08-04 13:04:31 +08:00
手瓜一十雪
3db74c3427 refactor: BuddyList 2024-08-04 12:26:55 +08:00
手瓜一十雪
48d5cb53bd release: 1.7.6 2024-08-03 22:45:36 +08:00
手瓜一十雪
fd7d2dbf53 release: 1.7.5 2024-08-03 20:48:13 +08:00
手瓜一十雪
6609697752 release: 1.7.5 2024-08-03 20:47:05 +08:00
手瓜一十雪
dcd6e1973e build:1.7.5For9.9.15 2024-08-03 16:23:55 +08:00
手瓜一十雪
3614a6e932 chore: 9.9.15 support 2024-08-03 16:08:23 +08:00
手瓜一十雪
931a0210e5 chore: 兼容9.915 信息获取 2024-08-03 15:36:56 +08:00
手瓜一十雪
f9e7de4b42 build: 1.7.5For9.9.15 2024-08-03 15:07:51 +08:00
手瓜一十雪
8e0b79594e style: lint 2024-08-03 15:06:02 +08:00
手瓜一十雪
17122c4360 feat: 精简历史获取 2024-08-03 15:03:41 +08:00
手瓜一十雪
154f7b6a30 chore: 清除老旧代码 2024-08-03 14:57:24 +08:00
手瓜一十雪
52e5543d0b chore: queryEmoticonMsgs 2024-08-03 14:44:48 +08:00
手瓜一十雪
3c304bd2ae feat: 补全类型 开始对9.9.15针对优化 2024-08-03 14:25:26 +08:00
手瓜一十雪
26609bb8fd chore: 9.9.15兼容sendmsg 2024-08-03 13:11:25 +08:00
手瓜一十雪
de3fa9aaa4 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-08-03 12:28:41 +08:00
手瓜一十雪
788665f84c chore: support win 9.9.15 2024-08-03 12:28:25 +08:00
手瓜一十雪
3943782971 Merge pull request #201 from idranme/main
feat: at segment add name
2024-08-03 07:08:25 +08:00
idranme
8f899c40f2 chore 2024-08-02 15:49:01 +00:00
idranme
a1f582399e feat: at segment add name 2024-08-02 15:45:37 +00:00
手瓜一十雪
440b63f662 release: v1.7.4 2024-08-01 23:35:35 +08:00
手瓜一十雪
7d2cc3b56b fix: 多次上报自身消息 2024-08-01 22:00:40 +08:00
手瓜一十雪
5fe3422469 #176 revert 2024-08-01 21:48:17 +08:00
手瓜一十雪
6c02cedb1e build: 1.7.4 2024-08-01 19:44:28 +08:00
手瓜一十雪
3cc2f1dcad fix #183 2024-08-01 19:43:29 +08:00
手瓜一十雪
773cdc5877 build: test 2024-08-01 17:14:15 +08:00
手瓜一十雪
361a7329d7 Revert "build(deps-dev): bump @typescript-eslint/eslint-plugin"
This reverts commit 2562a38fa1.
2024-08-01 17:13:54 +08:00
手瓜一十雪
29910f1236 build: test api 2024-08-01 17:12:56 +08:00
手瓜一十雪
4a164016f5 chore: test 2024-08-01 17:08:22 +08:00
手瓜一十雪
cebd3e62a4 Merge pull request #192 from NapNeko/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-8.0.0
build(deps-dev): bump @typescript-eslint/eslint-plugin from 7.18.0 to 8.0.0
2024-08-01 16:26:50 +08:00
dependabot[bot]
2562a38fa1 build(deps-dev): bump @typescript-eslint/eslint-plugin
Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 7.18.0 to 8.0.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.0.0/packages/eslint-plugin)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-01 08:22:34 +00:00
手瓜一十雪
d46c922bbf Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-08-01 13:11:19 +08:00
手瓜一十雪
66b59982f7 补充类型 移除无用代码 2024-08-01 13:11:09 +08:00
手瓜一十雪
ad397ccf7f Merge pull request #188 from Fripine/feat/FriendAddNoticeEvent
feat: support FriendAddNoticeEvent
2024-08-01 08:46:50 +08:00
Fripine
bdef80ede7 feat: support FriendAddNoticeEvent 2024-08-01 01:03:33 +08:00
手瓜一十雪
385dcbc75a fix #186 2024-07-31 22:23:12 +08:00
手瓜一十雪
74cf501c8f release: 1.7.3 2024-07-31 22:21:23 +08:00
手瓜一十雪
0c200d6748 build: 1.7.2 beta0 2024-07-31 22:20:39 +08:00
手瓜一十雪
e65a36c517 chore: Ver2SendMsg 2024-07-31 22:19:35 +08:00
手瓜一十雪
126b54ad40 fix #186 2024-07-31 21:46:12 +08:00
手瓜一十雪
78637751af fix #187 2024-07-31 21:41:31 +08:00
手瓜一十雪
f96526ee3a fix #184 2024-07-31 21:36:13 +08:00
手瓜一十雪
b3c7a91f3d refactor: getfile 2024-07-31 16:40:34 +08:00
手瓜一十雪
b8daeef0c4 fix #173 2024-07-31 16:02:08 +08:00
手瓜一十雪
2b662944cf typo fix #178 2024-07-31 15:58:27 +08:00
手瓜一十雪
3d516df01e try fix #183 2024-07-31 15:52:28 +08:00
手瓜一十雪
26b4a9b15b chore: 兼容wt 2024-07-31 14:21:05 +08:00
手瓜一十雪
0f8af273ae release: 1.7.2 2024-07-31 10:51:12 +08:00
手瓜一十雪
fa29a31da9 release: 1.7.2 2024-07-31 10:46:23 +08:00
手瓜一十雪
9e0d2606d8 build: 1.7.2 no log 2024-07-31 10:35:53 +08:00
手瓜一十雪
338dedd6e0 build: 1.7.1 双消息队列 2024-07-31 10:33:38 +08:00
手瓜一十雪
1f893b1393 build: 1.7.2 消息队列重构 2024-07-31 10:25:46 +08:00
手瓜一十雪
b783d6f928 refatcor: sendmsg 2024-07-31 01:12:46 +08:00
手瓜一十雪
8ca0d40f05 fix: error 2024-07-30 23:34:29 +08:00
手瓜一十雪
2f40a80434 fix: error 2024-07-30 23:33:32 +08:00
手瓜一十雪
812d8eb5bb feat: 对msgId兜底 2024-07-30 23:31:42 +08:00
手瓜一十雪
bf5f548349 fix: msghash性能问题 2024-07-30 23:06:58 +08:00
手瓜一十雪
ebf90e72b9 Merge pull request #180 from cnxysoft/main
BW5启动脚本修改
2024-07-30 22:30:04 +08:00
Alen
31d7d42edf BW5启动脚本修复
修改脚本为 UTF-8 with BOM 格式,解决添加注释后执行报错的问题
2024-07-30 19:56:17 +08:00
Alen
833875b42f Merge remote-tracking branch 'upstream/main' 2024-07-30 17:56:48 +08:00
Alen
b901c10f3c 修改BW5启动脚本
支持脚本自动提权
自动覆盖dbghelp.dll
修改默认启用UTF8
修改不再从新窗口运行NC
2024-07-30 17:56:28 +08:00
手瓜一十雪
8ab678bd97 chore: remove log 2024-07-30 16:45:03 +08:00
手瓜一十雪
55d5072f46 fix: setMsg 2024-07-30 16:34:33 +08:00
手瓜一十雪
a379ffd0f2 Merge pull request #175 from pohgxz/main
修复Way05无法带参
2024-07-30 09:12:15 +08:00
Nepenthe
4501d73134 修复Way05无法带参 2024-07-29 23:32:34 +08:00
手瓜一十雪
5f15774ec7 fix: script 2024-07-29 20:58:27 +08:00
手瓜一十雪
c9e057599e fix: error 2024-07-29 20:49:35 +08:00
手瓜一十雪
66851f5625 fix 2024-07-29 20:39:01 +08:00
手瓜一十雪
b33c235b4d release: 1.7.1 2024-07-29 20:13:09 +08:00
手瓜一十雪
d6693b6114 Merge pull request #171 from NapNeko/dependabot/npm_and_yarn/types/node-22.0.0
build(deps-dev): bump @types/node from 20.14.13 to 22.0.0
2024-07-29 17:23:02 +08:00
dependabot[bot]
36b4d26c78 build(deps-dev): bump @types/node from 20.14.13 to 22.0.0
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.14.13 to 22.0.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-29 08:23:55 +00:00
手瓜一十雪
617592d90a fix: 多次post 2024-07-29 11:32:55 +08:00
手瓜一十雪
15a77b8070 fix: bug 2024-07-29 10:24:02 +08:00
手瓜一十雪
606eccd22b refactor: 精简逻辑 2024-07-29 10:12:41 +08:00
手瓜一十雪
5613450313 refactor: 回复 2024-07-29 10:07:59 +08:00
手瓜一十雪
c59b5564af release: 1.7.0 2024-07-29 09:24:17 +08:00
手瓜一十雪
330b086b8b fix #98 2024-07-29 09:10:52 +08:00
手瓜一十雪
9837ef4f36 fix #125 2024-07-29 08:59:26 +08:00
手瓜一十雪
add46b3251 chore: 落地标准化 2024-07-29 08:43:37 +08:00
手瓜一十雪
e169199107 feat: #162 2024-07-29 08:29:24 +08:00
手瓜一十雪
92fe654850 fix #157 2024-07-29 08:12:49 +08:00
手瓜一十雪
b257486404 fix #158 2024-07-29 08:02:18 +08:00
手瓜一十雪
bdf2e33f40 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-07-29 07:51:28 +08:00
手瓜一十雪
224d361923 fix #167 2024-07-29 07:51:18 +08:00
手瓜一十雪
3452fa56df build: 😭版本满天飞版本 2024-07-29 00:39:34 +08:00
手瓜一十雪
cd256235da refactor: selfMsgPost 2024-07-29 00:16:24 +08:00
手瓜一十雪
361a164f2a fix: typo 2024-07-28 23:54:50 +08:00
手瓜一十雪
0e60d4b198 fix: 延迟调整 2024-07-28 23:53:45 +08:00
手瓜一十雪
67b47e39b4 fix: typo 2024-07-28 23:49:04 +08:00
手瓜一十雪
8f54310f63 refactor: reply 2024-07-28 23:35:58 +08:00
手瓜一十雪
c7a7494d7e fix: 保证NC回复的消息一致性 2024-07-28 22:33:50 +08:00
手瓜一十雪
af88b3166d build: 169-test 2024-07-28 17:55:34 +08:00
手瓜一十雪
b7837b2a14 chore:test 2024-07-28 17:38:48 +08:00
手瓜一十雪
950ddc749e chore: 🥹LocalMsg不会写入数据库 2024-07-28 16:23:56 +08:00
手瓜一十雪
df081ef0cf chore: 移除调试代码 2024-07-28 15:40:44 +08:00
手瓜一十雪
7b24f90d9f rector: 离线文件重构初步完成 2024-07-28 15:37:34 +08:00
手瓜一十雪
f2e4579fd8 feat: 缓存文件 2024-07-28 15:34:08 +08:00
手瓜一十雪
97cb351827 fix: typo 2024-07-28 14:55:30 +08:00
手瓜一十雪
c1ec53fdbb refactor: fileget 2024-07-28 14:25:13 +08:00
手瓜一十雪
98214aa429 refactor: video element 2024-07-28 13:36:03 +08:00
手瓜一十雪
ce7deac2dd refactor: video element 2024-07-28 13:28:21 +08:00
手瓜一十雪
612092b867 build: 170 re 2024-07-28 13:15:14 +08:00
手瓜一十雪
92579d5949 Merge pull request #163 from cnxysoft/main
修复提交疏漏
2024-07-28 13:00:12 +08:00
手瓜一十雪
9ab07060ae fix: default 2024-07-28 12:59:20 +08:00
手瓜一十雪
0d45125d79 fix: uid && latestMsg 2024-07-28 09:56:00 +08:00
手瓜一十雪
9ced152778 fix: 修复uid转换异常问题 2024-07-28 09:24:03 +08:00
Alen
3685ab2e3e Merge remote-tracking branch 'upstream/main' 2024-07-27 15:01:23 +08:00
Alen
be605f11f2 修复提交疏漏
修改在查询群历史消息时,如未提供msg_seq,则返回最新消息
2024-07-27 15:01:08 +08:00
手瓜一十雪
8cca8df976 Merge pull request #159 from cnxysoft/main
bug修复和标准兼容
2024-07-27 06:46:25 +08:00
Alen
990a31e961 标准兼容
根据GOCQ标准将获取群历史消息中的msg_seq改为非必要参数,默认为0
2024-07-27 04:10:01 +08:00
Alen
5db201c342 BUG修复
修复创建reply消息体时向NTQQMsgApi.getMsgsByMsgId提交空值查询会导致QQ崩溃的BUG
2024-07-27 04:01:22 +08:00
手瓜一十雪
a625e30dd4 fix: search file 2024-07-26 17:37:04 +08:00
手瓜一十雪
b236cdd060 refactor: search file 2024-07-26 17:15:28 +08:00
手瓜一十雪
2db9899184 chore: type 2024-07-26 16:26:47 +08:00
手瓜一十雪
fe5d6db986 chore: wait release 1.7.0 2024-07-26 16:10:05 +08:00
手瓜一十雪
7c7bf8fecf chore: 类型+++++ 2024-07-26 16:08:28 +08:00
手瓜一十雪
76e3a46378 fix: type 2024-07-26 16:02:23 +08:00
手瓜一十雪
16f3897fec chore: 类型补全计划 2024-07-26 15:55:05 +08:00
手瓜一十雪
045e120854 refactor: type 2024-07-26 15:38:43 +08:00
Version
2b7fcce9b2 chore:version change 2024-07-26 05:25:49 +00:00
手瓜一十雪
9685931694 fix: uint 2024-07-26 13:25:19 +08:00
手瓜一十雪
1dc844435a Merge pull request #153 from Guation/main
feat: WebUI支持放置到二级目录中
2024-07-26 13:04:26 +08:00
手瓜一十雪
18892379de fix: search file 2024-07-26 12:27:02 +08:00
手瓜一十雪
620d61c8dc docs: v1.6.8 2024-07-26 11:59:18 +08:00
手瓜一十雪
9f91398875 build: 再次优化发送速度 2024-07-26 11:30:04 +08:00
挂神
a29b1154a9 feat: WebUI支持放置到二级目录中 2024-07-26 11:12:09 +08:00
手瓜一十雪
34d19a471a refactor: 回滚 2024-07-26 10:58:56 +08:00
手瓜一十雪
2ef6477d7c build: log info 2024-07-25 20:22:03 +08:00
手瓜一十雪
26e6800836 fix: 退群推送 2024-07-25 18:08:49 +08:00
手瓜一十雪
9dbbcf3872 build: 1.6.8 - parse appid 2024-07-25 17:57:39 +08:00
手瓜一十雪
6b3343e1e4 build: 1.6.8 beta6 2024-07-25 10:59:06 +08:00
手瓜一十雪
ef48f754a5 docs: 整理当前进度 2024-07-25 10:44:53 +08:00
手瓜一十雪
3be1ede847 refactor: sendtime/join time 2024-07-25 10:32:44 +08:00
手瓜一十雪
7bff1b61e8 refactor: SendTime 2024-07-25 10:02:16 +08:00
手瓜一十雪
6affd0eb68 feat: GetSendTime 2024-07-24 17:49:03 +08:00
手瓜一十雪
0a112d15e0 fix: typo 2024-07-24 15:37:23 +08:00
手瓜一十雪
4e03f582bb fix: richmeida name 2024-07-24 14:43:10 +08:00
手瓜一十雪
8f186c1c5e chore: action clean 2024-07-24 14:37:48 +08:00
手瓜一十雪
cd1bae9a1f fix: setGroupAvatar 2024-07-24 14:35:12 +08:00
手瓜一十雪
60796c26ca Merge pull request #147 from serfend/default-config
fix[config]support overwrite by user #145
2024-07-24 14:28:42 +08:00
汉广
28927f950d fix[config]support overwrite by user 2024-07-24 14:25:58 +08:00
手瓜一十雪
95f16ebc8c Merge pull request #144 from Guation/main
feat: http与ws允许监听同一端口,快速登录允许自动选择QQ号,允许禁用webUI
2024-07-24 14:09:19 +08:00
挂神
25bca8385d feat: http与ws共站支持热重载 2024-07-24 13:14:35 +08:00
手瓜一十雪
965c7f23b4 feat: 群头像设置 2024-07-24 11:37:12 +08:00
手瓜一十雪
33082af9cc feat: searchFile 2024-07-24 11:23:27 +08:00
手瓜一十雪
1f7f3565b0 build: 1.6.8 beta05 2024-07-24 10:45:11 +08:00
手瓜一十雪
f784363696 refactor: UUID 2024-07-24 10:44:55 +08:00
手瓜一十雪
37bd51e138 refactor: getUserInfo 2024-07-24 10:42:22 +08:00
手瓜一十雪
c367728c43 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-07-24 10:23:48 +08:00
手瓜一十雪
61f0f5d884 refactor: 改造接口调用 2024-07-24 10:23:41 +08:00
手瓜一十雪
5f2ebeead7 docs: update 2024-07-23 18:32:07 +08:00
手瓜一十雪
7646037fc7 docs: 砍掉 2024-07-23 18:21:19 +08:00
手瓜一十雪
eac6d285ff chore: debug 2024-07-23 17:39:00 +08:00
手瓜一十雪
b921d5e734 refactor: downloadMedia 2024-07-23 16:15:23 +08:00
手瓜一十雪
831d808e63 chore: remove 2024-07-23 16:03:06 +08:00
手瓜一十雪
451b88d7e3 refactor: video type 2024-07-23 15:51:57 +08:00
手瓜一十雪
f916682a71 build: 1.6.8 beta07 2024-07-23 15:38:41 +08:00
手瓜一十雪
2d76bcf0cf refactor: message id 2024-07-23 15:10:39 +08:00
手瓜一十雪
8db294efe6 refactor: 转发消息修复 2024-07-23 14:54:05 +08:00
手瓜一十雪
5cc5149aed fix: 合并转发 2024-07-23 14:19:26 +08:00
手瓜一十雪
7ecb01dc9f docs: 规划 2024-07-23 12:34:20 +08:00
手瓜一十雪
8bf1a545d9 chore: remove debug 2024-07-23 10:12:20 +08:00
手瓜一十雪
efb2be2f94 fix: timeout 2024-07-23 09:50:31 +08:00
手瓜一十雪
bd2edda494 refactor: sendMsg 2024-07-23 09:45:00 +08:00
手瓜一十雪
991172eae4 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-07-23 09:21:36 +08:00
手瓜一十雪
fc7631f9aa refactor: sendmsg 2024-07-23 09:21:22 +08:00
手瓜一十雪
a21efb7d2f Merge pull request #145 from serfend/default-config
fix[default-config]config name check #138
2024-07-22 21:36:54 +08:00
汉广
03bc844ad0 fix[default-config]config name check 2024-07-22 20:12:24 +08:00
挂神
f7bdc35ed6 feat: http与ws允许监听同一端口,快速登录允许自动选择QQ号,允许禁用webUI 2024-07-22 19:47:23 +08:00
手瓜一十雪
0efdffd857 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-07-22 18:49:36 +08:00
手瓜一十雪
6a16a42d0c feat: refactor send 2024-07-22 18:49:25 +08:00
手瓜一十雪
e9c00c72b1 Merge pull request #138 from serfend/main
feat[config]support use default-template
2024-07-22 18:22:49 +08:00
手瓜一十雪
ab22f36b8a refactor: NTEvent Checker 2024-07-22 18:21:29 +08:00
手瓜一十雪
c57497cd91 feat: remove debug 2024-07-22 18:17:33 +08:00
手瓜一十雪
ba123236e5 feat:msgid generate 2024-07-22 18:17:03 +08:00
手瓜一十雪
338b6e4607 fix: QRCode 2024-07-22 15:46:48 +08:00
手瓜一十雪
f88c717560 build: 1.6.8-beta03 2024-07-22 15:40:41 +08:00
手瓜一十雪
f8ffc92db5 feat: remove LineDev&&Protobuf 2024-07-22 15:40:23 +08:00
手瓜一十雪
98c23c172c build: 1.6.8-无数据库版本 2024-07-22 15:13:38 +08:00
手瓜一十雪
781c107d8c feat: 拉取重启消息 2024-07-22 15:12:25 +08:00
手瓜一十雪
186668c075 fix: Login 2024-07-22 14:18:04 +08:00
手瓜一十雪
cf9f785193 style: lint 2024-07-22 14:12:03 +08:00
手瓜一十雪
72d2d3f224 feat: 破坏file/db相关接口 2024-07-22 14:09:37 +08:00
手瓜一十雪
087c76b394 refactor: msgId stage-2 2024-07-22 11:34:18 +08:00
手瓜一十雪
4f9fb2c8c3 Merge pull request #141 from cnxysoft/main
修复提交疏漏
2024-07-22 11:15:28 +08:00
手瓜一十雪
334e43e764 refactor: MsgId 2024-07-22 11:15:01 +08:00
Alen
7843256402 修复提交疏漏
修复变量类型未断言的问题
2024-07-22 11:07:33 +08:00
手瓜一十雪
0522ba35fe refactor: jest test 2024-07-22 10:24:55 +08:00
手瓜一十雪
24d3b52e0b refactor: Message Unique 2024-07-22 09:56:08 +08:00
手瓜一十雪
3177110f0f feat: RecentContact 2024-07-22 09:24:16 +08:00
手瓜一十雪
e1b8243a67 Merge pull request #140 from cnxysoft/main
BUG修复
2024-07-22 08:40:21 +08:00
Alen
b1c6ce3885 BUG修复
1.尝试让所有人能收到group_admin事件
2.修复请求API: delete_msg(POST请求网址传参)将负数判定为文本导致无法调用的问题
2024-07-22 01:22:38 +08:00
手瓜一十雪
0b4b25a11e feat: LineDev for Develop-0 2024-07-21 19:31:13 +08:00
手瓜一十雪
1176fe984a add: RecentListener 2024-07-21 19:01:47 +08:00
汉广
6ca768c3ee feat[config]support use default-template 2024-07-20 23:43:32 +08:00
手瓜一十雪
3da1659c8d fix: buddylike 2024-07-20 20:16:45 +08:00
手瓜一十雪
9aa4cd319c release: 1.6.7 2024-07-20 19:52:39 +08:00
手瓜一十雪
5af866cdca fix: error 2024-07-20 19:31:59 +08:00
手瓜一十雪
2b421fa447 release: 1.6.7 2024-07-20 17:43:56 +08:00
手瓜一十雪
30ec964325 feat: new api 2024-07-20 17:33:26 +08:00
手瓜一十雪
714d7d72eb feat: raw api add 2024-07-20 17:09:38 +08:00
手瓜一十雪
687aa0f363 chore: remove debug 2024-07-20 16:37:16 +08:00
手瓜一十雪
8363ab07a7 feat: 支持精华消息 2024-07-20 16:17:02 +08:00
手瓜一十雪
c46a757339 fix: error 2024-07-20 16:14:02 +08:00
手瓜一十雪
557864395b feat: support essence 2024-07-20 16:09:44 +08:00
手瓜一十雪
3f7a85d80b feat: essence get_sender 2024-07-20 16:00:01 +08:00
手瓜一十雪
8d18d2ce1f refactor: 标准化 2024-07-20 15:55:26 +08:00
手瓜一十雪
7141ba1587 refactor: essence and together listener 2024-07-20 15:53:39 +08:00
手瓜一十雪
44d350a225 docs: todo 2024-07-20 15:37:57 +08:00
手瓜一十雪
239b8e72d9 Merge pull request #134 from serfend/main
fix[group]handle_request reason empty
2024-07-20 15:24:39 +08:00
手瓜一十雪
279bdb6fb1 Merge pull request #135 from pohgxz/main
群戳一戳增加原始信息
2024-07-20 15:24:27 +08:00
Nepenthe
a0cea819da 群戳一戳增加原始信息
群消息log增加视频解析
2024-07-20 14:51:50 +08:00
汉广
9ab7f60544 fix[group]handle_request reason empty 2024-07-20 14:16:07 +08:00
手瓜一十雪
aaf7191bf3 build: 1.6.7-beta03 2024-07-20 10:45:26 +08:00
手瓜一十雪
628c9be0c8 feat: 2401 for 群精华设置 2024-07-20 10:44:57 +08:00
手瓜一十雪
733052720c build: 1.6.6-build02 2024-07-20 10:28:47 +08:00
手瓜一十雪
a10f007194 build: 1.6.7-beta0 2024-07-20 10:21:16 +08:00
手瓜一十雪
6fa50c58d3 feat: 优化接口转换速度 避免频繁读写 2024-07-17 15:03:10 +08:00
手瓜一十雪
c54a58d6e4 release: v1.6.6 2024-07-16 15:55:25 +08:00
手瓜一十雪
34cb1ea3fd Merge pull request #126 from cnxysoft/main
修复戳一戳
2024-07-16 15:52:39 +08:00
Alen
f640b0ca91 修复戳一戳 2024-07-16 15:47:23 +08:00
手瓜一十雪
60e16da42e Merge pull request #121 from pohgxz/main
增加winQQ-9912一键启动脚本
2024-07-14 08:44:55 +08:00
Nepenthe
0cdceb95d6 增加winQQ-9912一键启动脚本 2024-07-13 16:09:14 +00:00
手瓜一十雪
70bd22d925 fix: typo 2024-07-13 20:27:18 +08:00
手瓜一十雪
82462dd647 docs: 规划 2024-07-13 20:21:48 +08:00
手瓜一十雪
c0466e943d build: test 2024-07-13 19:37:39 +08:00
手瓜一十雪
b187b4695d refactor: uin<->uid 2024-07-13 19:37:02 +08:00
手瓜一十雪
b1956d2a37 refactor: poke 2024-07-13 19:10:47 +08:00
手瓜一十雪
590b622e5f build: test 2024-07-13 18:58:52 +08:00
手瓜一十雪
3d8174396a feat: LinuxQQ版本25765 2024-07-13 18:58:29 +08:00
手瓜一十雪
b8dc6e9bd9 feat: 再次提升版本 25765 2024-07-13 18:56:42 +08:00
手瓜一十雪
8ee99109dc chore: 整理代码 2024-07-13 18:20:44 +08:00
手瓜一十雪
902041d4ee refactor: 新增启动脚本 2024-07-13 18:15:00 +08:00
手瓜一十雪
cc34aef47e style: code lint 2024-07-13 18:12:38 +08:00
手瓜一十雪
0afbbe7c7a refactor: 废弃部分代码 2024-07-13 18:10:41 +08:00
手瓜一十雪
8004553ba7 refactor: groupNotifies 2024-07-13 18:04:55 +08:00
手瓜一十雪
0023b2846a feat: 第二次大致整理 2024-07-13 17:23:05 +08:00
手瓜一十雪
34775c1816 fix: 整理常量 2024-07-12 18:08:45 +08:00
手瓜一十雪
e0759e704b feat:大部分消息元素 2024-07-12 18:01:48 +08:00
手瓜一十雪
0aa225ca78 fix: typo 2024-07-12 17:04:28 +08:00
手瓜一十雪
b43b4ee5c0 feat: test code 2024-07-12 16:59:08 +08:00
手瓜一十雪
0cdb8cecbf feat: 群精华 代码未测试 2024-07-12 11:02:10 +08:00
手瓜一十雪
fd6a306742 feat: 懒得写了 2024-07-12 10:54:01 +08:00
手瓜一十雪
7f3b3d2277 feat: 群精华 2024-07-12 10:46:57 +08:00
手瓜一十雪
8be5b977bf Merge pull request #117 from po-lan/main
对缓存进一步优化
2024-07-12 09:52:17 +08:00
po-lan
d7ddb15f9c 对缓存进一步优化
LRUCache 将所有被移除的缓存数据作为事件参数传递给事件处理程序。

在数据库操作部分,优化了读写流程,以确保每个群组至多执行三次数据库操作:

读取:先判断缓存中是否存在用户记录,若不存在则读取数据库。
创建:如果用户记录在数据库中不存在,则新增记录。
修改:如果用户记录在数据库中存在,则进行修改。
即使单个群组内有大量用户,每种操作也只会执行一次。
2024-07-12 00:46:03 +08:00
手瓜一十雪
9a6a1798d0 build: poke能用25493 2024-07-11 12:44:42 +08:00
手瓜一十雪
14196fd349 build: 移除调试代码 2024-07-11 12:31:00 +08:00
手瓜一十雪
941b89a523 feat: uin转换优化&poke支持重写 2024-07-11 12:28:11 +08:00
手瓜一十雪
a5f9e5f8c0 Merge pull request #113 from idranme/main
perf: audio
2024-07-11 09:49:56 +08:00
idranme
80c3356c8f perf: audio 2024-07-10 17:44:17 +00:00
手瓜一十雪
914136b750 refactor: 移除异常代码 2024-07-10 21:39:03 +08:00
手瓜一十雪
f9a60795f5 feat: uid转换优化 2024-07-10 21:33:31 +08:00
手瓜一十雪
19640927c7 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-07-10 21:11:43 +08:00
手瓜一十雪
22faac7e36 fix: friend uid 异常 2024-07-10 21:11:28 +08:00
手瓜一十雪
30d260ab32 Merge pull request #111 from idranme/main
fix: error catch
2024-07-10 11:55:53 +08:00
idranme
115120d066 Update file.ts 2024-07-10 11:35:55 +08:00
idranme
1327844736 fix: error catch 2024-07-10 03:25:25 +00:00
手瓜一十雪
29904f3cb7 feat: 164 way03启动脚本补充 2024-07-06 13:23:31 +08:00
手瓜一十雪
50395594b7 Merge pull request #106 from jetjinser/fix-editorconfig
fix: `.editorconfig` wrong pair `end_of_line`
2024-07-05 22:43:23 +08:00
Jinser Kafka
9360af88b3 fix: .editorconfig 2024-07-05 19:36:32 +08:00
手瓜一十雪
376370336c release: 1.6.5 2024-07-05 16:50:57 +08:00
手瓜一十雪
70df6e3302 Merge pull request #105 from po-lan/main
对缓存小优化
2024-07-05 16:49:30 +08:00
手瓜一十雪
0a1fc2dc12 feat: 1.6.5 2024-07-05 16:49:16 +08:00
手瓜一十雪
9857f6e437 feat: 优化载入流程 2024-07-05 16:47:08 +08:00
手瓜一十雪
56d6ebe916 refactor: 迁移到新库 2024-07-05 15:48:03 +08:00
po-lan
81134ea2d4 Update LRUCache.ts 2024-07-05 12:13:24 +08:00
po-lan
a9f3e7fc54 Update db.ts
通过读取缓存修复刚说话缺无法获取发言时间的问题
2024-07-05 12:12:40 +08:00
po-lan
eb84e2f8c9 Update LRUCache.ts
Add a get function to the cache
2024-07-05 12:09:59 +08:00
手瓜一十雪
61cfa0e86d release: 1.6.4 2024-07-03 14:30:55 +08:00
手瓜一十雪
0a01b8ade9 Merge pull request #97 from cnxysoft/main
修改下载函数
2024-07-02 10:13:15 +08:00
Alen
1457efa9a4 修改下载函数
为默认Headers增加Host,解决一些网站无法下载文件的问题
2024-07-02 01:07:30 +08:00
手瓜一十雪
fa5c7add7a refactor: new core 2024-07-01 18:45:48 +08:00
手瓜一十雪
d644eba4d1 refactor: napcat 2024-07-01 18:24:36 +08:00
手瓜一十雪
9c422c1a8f Merge pull request #95 from ahjsrhj/main
feat: ws反代请求添加UA: OneBot/11
2024-07-01 13:20:47 +08:00
手瓜一十雪
b6db37202f feat: core code 2024-07-01 13:18:59 +08:00
手瓜一十雪
4ca3891089 refactor: core 2024-07-01 13:18:19 +08:00
ahjsrhj
4c7ed01776 feat: ws反代请求添加UA: OneBot/11 2024-07-01 11:19:15 +08:00
手瓜一十雪
45c922c377 release: 1.6.3 2024-06-28 14:00:15 +08:00
手瓜一十雪
f854c258bd fix: 清除旧的反向ws 2024-06-28 13:42:09 +08:00
手瓜一十雪
a643fac073 refactor: msg context 2024-06-28 13:38:03 +08:00
手瓜一十雪
861f105bea fix: uid->uin 临时修复方案
uid uin转换需要优化
2024-06-28 13:11:06 +08:00
手瓜一十雪
bf10ce9f1e fix: error 2024-06-26 18:40:08 +08:00
手瓜一十雪
ccf521d0a8 feat: win ia32支持 2024-06-26 18:13:55 +08:00
手瓜一十雪
6075d98eaa release: v1.6.2 2024-06-26 18:09:41 +08:00
手瓜一十雪
a3801fc243 fix: script 2024-06-26 17:17:33 +08:00
手瓜一十雪
a1f0c05f3a chore: build script 2024-06-26 17:16:54 +08:00
手瓜一十雪
a568c96929 chore: build script 2024-06-26 17:15:46 +08:00
手瓜一十雪
d58bcf3c0e refactor: error catch 2024-06-26 17:14:23 +08:00
手瓜一十雪
985f2e6436 fix: 还原修改 2024-06-25 17:24:42 +08:00
手瓜一十雪
ad441fa793 docs: update 2024-06-24 21:38:28 +08:00
手瓜一十雪
316300cc86 Merge pull request #86 from NapNeko/dependabot/npm_and_yarn/types/uuid-10.0.0
build(deps-dev): bump @types/uuid from 9.0.8 to 10.0.0
2024-06-24 17:44:25 +08:00
dependabot[bot]
5c4f37b234 build(deps-dev): bump @types/uuid from 9.0.8 to 10.0.0
Bumps [@types/uuid](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/uuid) from 9.0.8 to 10.0.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/uuid)

---
updated-dependencies:
- dependency-name: "@types/uuid"
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-24 08:14:47 +00:00
手瓜一十雪
77b51a072d fix: 增加容错 2024-06-24 12:03:49 +08:00
手瓜一十雪
2536e1ae6a release: v1.6.1 2024-06-22 10:54:58 +08:00
手瓜一十雪
14822c9599 style&fix: lint & poke 2024-06-21 23:04:56 +08:00
手瓜一十雪
e53c37adc9 release: v1.6.0 2024-06-21 22:43:19 +08:00
手瓜一十雪
c37539354c docs: update 2024-06-21 22:35:10 +08:00
手瓜一十雪
ae0277f33c release: 1.5.8 2024-06-19 23:34:09 +08:00
手瓜一十雪
b863896249 refactor: log file limit 2024-06-19 23:26:05 +08:00
手瓜一十雪
5b42f8b743 refactor: qqmusic card & requests 2024-06-19 23:06:57 +08:00
手瓜一十雪
3883fab614 remove: debug 2024-06-19 21:37:13 +08:00
手瓜一十雪
61d6bcec4b refactor: qqmusic card & requests 2024-06-19 21:33:31 +08:00
手瓜一十雪
3b5902b033 refactor: requests 2024-06-19 16:45:20 +08:00
手瓜一十雪
3a88c21a3b refactor: 整理action & data 2024-06-19 13:35:42 +08:00
手瓜一十雪
91a5055dee refactor: qqmusic sign & http post 2024-06-19 13:20:52 +08:00
手瓜一十雪
7befd1469f Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-06-19 10:01:37 +08:00
手瓜一十雪
c72ebe495c refactor: remove debug 2024-06-19 10:01:24 +08:00
手瓜一十雪
19e06b97e6 docs: update 2024-06-18 23:57:47 +08:00
手瓜一十雪
7519825303 refactor: test 2024-06-18 23:23:19 +08:00
手瓜一十雪
d9315bf309 refactor: project 2024-06-18 22:49:06 +08:00
手瓜一十雪
8c36c809a0 docs: extend 2024-06-18 11:22:35 +08:00
手瓜一十雪
8138aa3cb2 docs: v1.5.8 2024-06-18 11:21:52 +08:00
手瓜一十雪
87aef3ca78 feat: Util HttpUploadFile 2024-06-18 11:17:09 +08:00
手瓜一十雪
a3f1d26d6b feat: refactor miniapp 2024-06-18 11:08:51 +08:00
手瓜一十雪
06cebc5670 build: try support ia32 2024-06-17 10:03:59 +08:00
手瓜一十雪
867fd62d77 fix: typo 2024-06-16 20:54:52 +08:00
手瓜一十雪
650cdf2916 feat: test 2024-06-16 19:24:42 +08:00
手瓜一十雪
ebf461f2fd feat: 加了一些暂时不能使用的代码 2024-06-16 16:35:09 +08:00
手瓜一十雪
27fa319b2a release: LinuxAppid 24568 2024-06-14 18:43:56 +08:00
手瓜一十雪
d95ac894f4 release: 1.5.6-复活下win 2024-06-14 17:00:35 +08:00
手瓜一十雪
ae84a8dd11 docs: v1.5.6 change 2024-06-14 16:53:26 +08:00
手瓜一十雪
2fc963f986 build: v1.5.6-紧急测试 2024-06-14 16:43:32 +08:00
手瓜一十雪
be1f938ebd fix 2024-06-14 16:42:39 +08:00
手瓜一十雪
cccf4d503d docs: v1.5.6 2024-06-14 15:50:22 +08:00
手瓜一十雪
9dad2a8ac6 remove: debug 2024-06-11 18:11:32 +08:00
手瓜一十雪
75af104f07 release: v1.5.5 2024-06-11 18:10:22 +08:00
手瓜一十雪
76ecba245b fix: error 2024-06-11 18:09:46 +08:00
手瓜一十雪
3697c2ced8 refactor: 移除无缝升级函数 2024-06-11 15:46:27 +08:00
手瓜一十雪
b9d1d84716 release: v1.5.4 2024-06-11 15:20:11 +08:00
手瓜一十雪
64b2d547ce refactor: friend 2024-06-11 12:34:04 +08:00
手瓜一十雪
d8d2ff7e4e chore:appid 2024-06-10 19:00:05 +08:00
手瓜一十雪
8aa5dc6482 Merge pull request #62 from NapNeko/dependabot/npm_and_yarn/uuid-10.0.0
build(deps): bump uuid from 9.0.1 to 10.0.0
2024-06-10 16:46:05 +08:00
dependabot[bot]
474ba20e61 build(deps): bump uuid from 9.0.1 to 10.0.0
Bumps [uuid](https://github.com/uuidjs/uuid) from 9.0.1 to 10.0.0.
- [Changelog](https://github.com/uuidjs/uuid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/uuidjs/uuid/compare/v9.0.1...v10.0.0)

---
updated-dependencies:
- dependency-name: uuid
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-10 08:12:09 +00:00
手瓜一十雪
bdea2d02a9 release: v1.5.3 2024-06-09 20:09:14 +08:00
手瓜一十雪
c4307481f1 build: 1.5.3-beta4 2024-06-09 19:47:16 +08:00
手瓜一十雪
b8ac1b28bd build: v1.5.3-beta3 2024-06-09 19:41:27 +08:00
手瓜一十雪
24038cda95 refactor: video url 2024-06-09 19:40:34 +08:00
手瓜一十雪
86c82e9608 build: 1.5.3-beta2 2024-06-09 19:14:27 +08:00
手瓜一十雪
daab5d150b refactor: friend add 2024-06-09 19:13:49 +08:00
手瓜一十雪
9ff82bdb90 feat: support SetLongNick 2024-06-09 18:28:09 +08:00
手瓜一十雪
c6d70ef1cf build: 1.5.3-beta1 2024-06-09 17:46:32 +08:00
手瓜一十雪
15d4bb3c76 feat: new api 2024-06-09 17:30:30 +08:00
手瓜一十雪
3e698981fd chore: sync core 2024-06-09 14:26:02 +08:00
手瓜一十雪
9d45c934a5 chore: sync core 2024-06-08 22:13:05 +08:00
手瓜一十雪
c2bf9cf93e chore: sync core 2024-06-08 12:11:04 +08:00
手瓜一十雪
b3c6fd7f26 chore: sync core 2024-06-07 17:59:33 +08:00
手瓜一十雪
ccd155de71 feat: 推荐联系人ArkJson 2024-06-07 17:57:33 +08:00
手瓜一十雪
1f90d2e46b feat: 支持专属头衔获取 2024-06-07 17:26:00 +08:00
手瓜一十雪
4c5d974c22 feat: 支持专属头衔获取 2024-06-07 17:25:34 +08:00
手瓜一十雪
392eda1cbc fix: typo 2024-06-07 13:19:22 +08:00
手瓜一十雪
a9da3279e8 docs: change 2024-06-07 13:01:15 +08:00
手瓜一十雪
1ce8351180 docs: develop 2024-06-07 09:49:31 +08:00
手瓜一十雪
96c334478a docs: todo 2024-06-07 00:39:09 +08:00
手瓜一十雪
f1b0875b05 feat: ArkJsonGroupShare 2024-06-06 17:20:34 +08:00
手瓜一十雪
cea9e11c83 docs: add 2024-06-06 14:31:45 +08:00
手瓜一十雪
f098b39200 refactor: uins 2024-06-06 13:34:05 +08:00
手瓜一十雪
012d948b59 chore: sync 2024-06-06 13:23:15 +08:00
手瓜一十雪
3334cd0a71 docs: change 2024-06-06 12:18:17 +08:00
手瓜一十雪
d63d53fd88 docs: move 2024-06-06 11:05:30 +08:00
手瓜一十雪
a7fa39b2fd fix: message_id error 2024-06-06 11:03:29 +08:00
Version
40bb42e193 chore:version change 2024-06-05 10:30:26 +00:00
手瓜一十雪
9c382c639b build: v1.5.2-api兼容 2024-06-05 15:04:04 +08:00
手瓜一十雪
a43cde38f1 refactor: SetMsgEmojiLike 2024-06-05 15:03:14 +08:00
手瓜一十雪
c35d2e08cd refactor: reboot req params 2024-06-05 14:25:21 +08:00
手瓜一十雪
3377c383c1 build: v1.5.2 - GetMsg兼容 2024-06-05 12:14:41 +08:00
手瓜一十雪
c00e6d95cd build: v1.5.2-beta3 2024-06-05 11:23:42 +08:00
手瓜一十雪
725fccf4ed refactor: GoCQHTTP_GetStrangerInfo 2024-06-05 11:19:34 +08:00
手瓜一十雪
13129bd219 build: v1.5.2-beta2 2024-06-05 10:41:40 +08:00
手瓜一十雪
4561977bcf chore: sync core 2024-06-05 10:36:39 +08:00
手瓜一十雪
40be8a91f5 fix 2024-06-05 10:33:36 +08:00
手瓜一十雪
2a04d5830b fix: kick member 2024-06-04 23:52:46 +08:00
手瓜一十雪
82a38574f3 build: v1.5.2-beta 2024-06-04 23:16:33 +08:00
手瓜一十雪
fea3a33c2b refactor: Uid <-> Uin & Remove Cached 2024-06-04 23:13:18 +08:00
手瓜一十雪
9a502cdf6f refactor: uin - > uid 2024-06-04 23:06:53 +08:00
手瓜一十雪
4b616299cf refactor: uin -> uid 2024-06-04 22:50:16 +08:00
手瓜一十雪
102243e064 sync: core 2024-06-04 21:15:29 +08:00
手瓜一十雪
4b21ac5ebe fix: nt event 2024-06-04 21:09:19 +08:00
手瓜一十雪
4dd7363dd3 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-06-04 12:39:08 +08:00
手瓜一十雪
3d5e5ab78f release: v1.5.1 2024-06-04 12:38:54 +08:00
手瓜一十雪
73045a1b21 Merge pull request #57 from Icexbb/main
fix: 整理日志、添加颜色、使用统一的日志函数以提高日志可读性
2024-06-04 12:37:54 +08:00
手瓜一十雪
871173a7cf fix: 二维码显示 2024-06-04 12:37:35 +08:00
手瓜一十雪
0002313093 Merge branch 'main' into pr/57 2024-06-04 12:31:43 +08:00
手瓜一十雪
948cf5cca6 refactror: cpmoudle
此处非NC运行时的代码 用于打包时运行
2024-06-04 12:26:19 +08:00
手瓜一十雪
d40230879c fix: 玄学的问题 2024-06-04 12:20:42 +08:00
XBB
ab22b775f1 fix: 整理日志、添加颜色、使用统一的日志函数以提高日志可读性 2024-06-04 02:59:35 +08:00
手瓜一十雪
42c85224ba build: v1.5.1-beta1 2024-06-03 21:18:24 +08:00
手瓜一十雪
e57444a353 sync: core 2024-06-03 21:11:21 +08:00
手瓜一十雪
3c6503d495 feat: support SetSelfProfile 2024-06-03 21:02:43 +08:00
手瓜一十雪
149b518f48 release: v1.5.0 2024-06-03 17:15:43 +08:00
手瓜一十雪
74621447ff fix: 提高兼容性 2024-06-03 17:12:53 +08:00
手瓜一十雪
3280952931 fix: 提高Api兼容性 2024-06-03 17:09:23 +08:00
手瓜一十雪
9e670e2736 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-06-03 16:56:28 +08:00
手瓜一十雪
9fc6347a2f fix: 进一步标准化 2024-06-03 16:56:08 +08:00
Version
ec7a15a192 chore:version change 2024-06-03 08:50:25 +00:00
手瓜一十雪
7f99982810 release: v1.4.9 2024-06-03 16:49:08 +08:00
Version
935d83aaf8 chore:version change 2024-06-02 13:01:32 +00:00
手瓜一十雪
0ff6edd546 style: lint 2024-06-02 20:49:09 +08:00
手瓜一十雪
94f629585a build: v1.4.8-beta2 2024-06-02 20:40:41 +08:00
手瓜一十雪
89c04be02f fix 2024-06-02 13:58:51 +08:00
手瓜一十雪
3151965ea8 build: 1.3.8-beta1 2024-06-02 13:45:48 +08:00
手瓜一十雪
bdf5159be1 refactor: guid 2024-06-02 13:38:33 +08:00
手瓜一十雪
0499ebbea3 release: v1.4.7 2024-06-01 15:52:06 +08:00
手瓜一十雪
d5843b7236 refactor: v1.4.6 2024-06-01 14:09:16 +08:00
手瓜一十雪
1c9c574a90 refactor: v1.4.6 2024-06-01 14:08:10 +08:00
手瓜一十雪
39acf20e48 release: v1.4.6 2024-06-01 14:05:44 +08:00
手瓜一十雪
52eb6ed5ab refactor: group call 2024-06-01 14:02:43 +08:00
手瓜一十雪
ee78d2d59d fix: type hint 2024-06-01 12:14:37 +08:00
手瓜一十雪
60dc5c4a38 refactor: re groupList 2024-06-01 12:10:50 +08:00
手瓜一十雪
50a0dc0355 refactor: GroupListGet 2024-06-01 11:38:50 +08:00
手瓜一十雪
3f681ec914 refactor:NT Event Finish 2024-05-31 23:33:23 +08:00
手瓜一十雪
0bf499f191 release: v1.4.5 2024-05-31 21:25:47 +08:00
手瓜一十雪
389695a0d6 fix: 1.4.5 2024-05-31 21:22:17 +08:00
手瓜一十雪
07f1afb312 fix 2024-05-31 21:03:00 +08:00
手瓜一十雪
ae91e61304 refactor:NTEvent 2024-05-31 21:02:39 +08:00
手瓜一十雪
6248991b01 refactor: NTEvent 2024-05-31 20:38:31 +08:00
手瓜一十雪
7f2d57ef62 refactor: event 2024-05-31 20:29:01 +08:00
手瓜一十雪
31f8f884f1 refactor: NTEvent 2024-05-31 19:09:03 +08:00
手瓜一十雪
4f4af5985a fix: type check & type output 2024-05-31 18:55:18 +08:00
手瓜一十雪
a716fdf6d4 refactor:NTEventDispatch 2024-05-31 14:07:35 +08:00
手瓜一十雪
9717f64abd refactor:NTEvent 2024-05-31 13:55:28 +08:00
手瓜一十雪
adf239183a docs: change 2024-05-31 10:12:59 +08:00
手瓜一十雪
6cf209c79c release: v1.4.4 2024-05-30 22:45:57 +08:00
手瓜一十雪
decc5fb3c0 refactor: checkDate 2024-05-30 22:41:51 +08:00
手瓜一十雪
1e0820d613 refactor: send rate 2024-05-30 22:38:02 +08:00
手瓜一十雪
70124d5177 refactor: GoCQHTTPUploadGroupFile 2024-05-30 22:32:09 +08:00
手瓜一十雪
269de65201 fix: undel 2024-05-30 20:53:58 +08:00
手瓜一十雪
1d11abbfb6 refactor: NTEvent 2024-05-30 19:40:40 +08:00
手瓜一十雪
700f308d6e feat: wrap NT-Event 2024-05-30 17:28:08 +08:00
手瓜一十雪
21b6928ca6 chore: sync core 2024-05-30 16:24:09 +08:00
手瓜一十雪
998c67a649 release: v1.4.3 2024-05-30 16:21:39 +08:00
Version
fb99e878b0 chore:version change 2024-05-30 04:36:42 +00:00
手瓜一十雪
1619adfc27 release: v1.4.2 2024-05-30 12:36:15 +08:00
手瓜一十雪
5510fb473f fix: typo 2024-05-30 12:02:47 +08:00
手瓜一十雪
be1878cb2b build: 1.4.2-fix:file list 2024-05-30 11:01:34 +08:00
手瓜一十雪
15ab121cbd fix: config 2024-05-29 14:26:45 +08:00
手瓜一十雪
aa79b0e861 fix: ocr 2024-05-29 14:18:43 +08:00
手瓜一十雪
b80e550bcd docs: 1.4.2 2024-05-29 12:14:17 +08:00
手瓜一十雪
dbc40b5814 release:1.4.1 2024-05-29 11:38:57 +08:00
Version
0d5696a644 chore:version change 2024-05-29 03:36:54 +00:00
手瓜一十雪
ceffa05802 fix 2024-05-29 11:36:04 +08:00
手瓜一十雪
d5668920b6 release: 1.4.1 2024-05-29 11:34:55 +08:00
手瓜一十雪
516f2da144 feat: en2zh 2024-05-29 10:25:13 +08:00
手瓜一十雪
33c94e1888 docs: 1.4.1 todo 2024-05-29 00:34:44 +08:00
手瓜一十雪
51ab58cd91 fix: webui 2024-05-29 00:07:05 +08:00
手瓜一十雪
aa7798d1d1 feat: wait fix 2024-05-29 00:00:48 +08:00
手瓜一十雪
9067a1fc92 refactor: info record local 2024-05-28 23:24:54 +08:00
手瓜一十雪
4024b6c564 Merge pull request #46 from po-lan/main
Update GetGroupMemberList.ts
2024-05-28 23:20:11 +08:00
po-lan
d39730928b Update GetGroupMemberList.ts
fix
2024-05-28 23:17:39 +08:00
手瓜一十雪
e1f049229c Merge pull request #45 from po-lan/main
对 get_group_member_list 增强
2024-05-28 22:49:21 +08:00
po-lan
8f2676ec19 Update main.ts 2024-05-28 22:43:41 +08:00
po-lan
32d26248dc Update main.ts 2024-05-28 22:41:40 +08:00
po-lan
16f926401b Update db.ts 2024-05-28 22:30:26 +08:00
po-lan
66d60d3599 Update main.ts 2024-05-28 22:27:12 +08:00
po-lan
5a35ab6c34 Update OB11GroupIncreaseEvent.ts 2024-05-28 22:26:02 +08:00
手瓜一十雪
ba1542bd31 Merge pull request #44 from po-lan/main
对 get_group_member_list 增强
2024-05-28 21:49:26 +08:00
po-lan
453060945a Update OB11GroupIncreaseEvent.ts 2024-05-28 21:47:05 +08:00
po-lan
c8351be461 Update config.ts 2024-05-28 21:45:36 +08:00
po-lan
9954da22a6 Update db.ts 2024-05-28 21:44:30 +08:00
手瓜一十雪
907b5611eb chore: sync core 2024-05-28 21:02:57 +08:00
手瓜一十雪
5f075de212 refactor: Info 2024-05-28 20:50:29 +08:00
手瓜一十雪
8fcf3c5079 refactor: GroupInfo 2024-05-28 20:43:16 +08:00
手瓜一十雪
07cee90c7a refactor: MemberInfo-1 2024-05-28 20:08:40 +08:00
手瓜一十雪
75ad495b98 refactor: remove some log 2024-05-28 19:32:08 +08:00
手瓜一十雪
0bb7288ad2 Merge pull request #40 from po-lan/main
对 get_group_member_list 增强
2024-05-28 19:21:25 +08:00
po-lan
ad72415532 对 get_group_member_list 增强开关 2024-05-27 17:11:26 +08:00
po-lan
0ad0353fc0 对 get_group_member_list 增强
监听每一条群聊消息准备写入数据库
2024-05-27 17:09:27 +08:00
po-lan
9fa0dcd7aa 对 get_group_member_list 增强
非管理员的Bot可以通过本地数据库获取到最近的发言时间
2024-05-27 17:07:23 +08:00
po-lan
1f2e80cd39 对 get_group_member_list 增强
一个基于LRU思想写出来的缓存结构
来降低写入数据库的次数
2024-05-27 17:05:28 +08:00
po-lan
6cb6034d43 对 get_group_member_list 增强 2024-05-27 17:01:24 +08:00
手瓜一十雪
25134c6ac6 fix: vite-env 2024-05-26 20:38:18 +08:00
手瓜一十雪
92bf42878a chore: sync core 2024-05-26 11:42:12 +08:00
手瓜一十雪
9f4582d158 docs: update 2024-05-25 19:30:48 +08:00
手瓜一十雪
68af73970e release: 1.4.0 2024-05-25 19:22:52 +08:00
手瓜一十雪
b6ed8d4975 docs: change 2024-05-25 16:55:02 +08:00
手瓜一十雪
d07d3645ce fix: typo 2024-05-25 13:42:10 +08:00
手瓜一十雪
123759ab17 fix: typo 2024-05-25 13:39:49 +08:00
手瓜一十雪
f2f1f893d8 feat: ocr image 2024-05-25 13:38:19 +08:00
手瓜一十雪
db93a8eed2 feat: /get_online_clients 2024-05-25 13:09:47 +08:00
手瓜一十雪
12ab6d4a7d fix 2024-05-25 12:48:13 +08:00
手瓜一十雪
add759e889 feat: try support get_online_clients 2024-05-25 12:02:09 +08:00
手瓜一十雪
f315f7977d feat: support card miniapp 2024-05-25 11:35:08 +08:00
手瓜一十雪
f2f6701ebd feat: support qzone.qq.com Cookies 2024-05-25 11:07:05 +08:00
手瓜一十雪
1a92794d33 chore: sync core 2024-05-24 23:25:14 +08:00
手瓜一十雪
7640deb798 feat: support mini app sign 2024-05-24 23:24:10 +08:00
手瓜一十雪
f1e8ef1cf6 fix: 紧急修复DetailInfo 2024-05-24 18:31:01 +08:00
手瓜一十雪
5e5ac0162e build: 1.3.8 2024-05-24 18:11:32 +08:00
手瓜一十雪
0c013820f0 chore: sync core 2024-05-24 13:51:40 +08:00
手瓜一十雪
4b3a9e5847 release: 1.3.8 2024-05-24 13:47:25 +08:00
手瓜一十雪
e4982256a4 fix: typo 2024-05-24 11:39:46 +08:00
手瓜一十雪
babc4927a8 feat: 注释解码 2024-05-24 11:28:43 +08:00
手瓜一十雪
6dd84cf469 build: 1.4.0-beta8 2024-05-24 11:21:34 +08:00
手瓜一十雪
a8800e3899 feat: 1.4.0-beta8 2024-05-24 11:18:32 +08:00
手瓜一十雪
5f03496046 build: 1.4.0-beta7 2024-05-24 10:45:12 +08:00
手瓜一十雪
41500c17a2 try: fix 2024-05-24 10:42:21 +08:00
手瓜一十雪
2dcfde8b9a build: 1.4.0-beta6 2024-05-23 18:23:11 +08:00
手瓜一十雪
5c3305d8fa Revert "feat: try support LiteLoader"
This reverts commit 8101d17482.
2024-05-23 18:10:18 +08:00
手瓜一十雪
0d1fe99f53 Merge pull request #32 from xihan123/main
fix: set_group_add_request reason 字段错误
2024-05-23 16:48:43 +08:00
xihan123
4c03ffeec7 fix: set_group_add_request reason 字段错误 2024-05-23 16:45:41 +08:00
手瓜一十雪
8101d17482 feat: try support LiteLoader 2024-05-23 16:30:29 +08:00
手瓜一十雪
bc7b4dcc2a build: 1.4.0-beta5 2024-05-23 15:16:35 +08:00
手瓜一十雪
3db8b9078d docs: change 2024-05-23 11:14:42 +08:00
手瓜一十雪
943dbbefd3 build: 1.4.0-beta4-兼容9.7.x换行符 2024-05-23 11:10:31 +08:00
手瓜一十雪
480abcb853 fix: HandlersClear 2024-05-23 10:23:37 +08:00
手瓜一十雪
60aaaff58e fix: UserDetail 2024-05-23 10:19:45 +08:00
手瓜一十雪
e3b889bbe8 fix: test 2024-05-22 21:44:12 +08:00
手瓜一十雪
ac5506a43b style: lint 2024-05-22 20:58:49 +08:00
手瓜一十雪
b29f533a3b feat: 1.4.0 2024-05-22 20:36:38 +08:00
手瓜一十雪
a8ee86b09e build: test 2024-05-22 20:31:16 +08:00
手瓜一十雪
0238c53302 build: 1.4.0-beta2 2024-05-22 20:19:28 +08:00
手瓜一十雪
665e3c806f build: 1.4.0 - beta2 2024-05-22 20:16:24 +08:00
手瓜一十雪
8c96838441 refactor: cjs to es 2024-05-22 20:13:18 +08:00
手瓜一十雪
4a722daec6 chore: sync core 2024-05-22 19:59:36 +08:00
手瓜一十雪
4e0cdbcb91 feat: 破坏性更新 cjs to es 2024-05-22 19:58:45 +08:00
手瓜一十雪
08976624cd feat: debug 2024-05-22 17:30:40 +08:00
手瓜一十雪
fdeba94653 chore: sync core 2024-05-22 16:11:01 +08:00
手瓜一十雪
d3b100b7e5 refactor: member info 2024-05-22 12:52:49 +08:00
手瓜一十雪
1de3e18b08 fix: remove unuse 2024-05-21 19:32:17 +08:00
手瓜一十雪
d5c3c95682 chore: sync core 2024-05-21 19:28:26 +08:00
手瓜一十雪
dabe1e29ed feat: GroupMemberDetailInfo 2024-05-21 19:27:59 +08:00
手瓜一十雪
203d1c0cfc release: v1.3.5 2024-05-20 21:24:11 +08:00
手瓜一十雪
7edd8601be fix 2024-05-20 18:11:13 +08:00
手瓜一十雪
a4423247f4 fix 2024-05-20 18:05:00 +08:00
手瓜一十雪
4834b203a0 fix: stop express 2024-05-20 17:56:36 +08:00
手瓜一十雪
bbabb32d13 fix: 移除调试代码 2024-05-20 17:49:15 +08:00
手瓜一十雪
95112d6bdf fix: 热重载问题 2024-05-20 17:47:13 +08:00
手瓜一十雪
36cdca5a3e fix: 热重载 2024-05-20 16:58:24 +08:00
手瓜一十雪
6980a9f3fc refactor: webui config 2024-05-20 16:56:34 +08:00
手瓜一十雪
7b09479cd2 fix: 拦截错误 2024-05-20 16:26:42 +08:00
手瓜一十雪
5825fd6f36 fix: 拦截异常 2024-05-20 12:35:50 +08:00
手瓜一十雪
2d5b45dd82 feat: test 2024-05-20 12:10:48 +08:00
手瓜一十雪
52dda1d1fe refactor: SysMessage Proto 2024-05-19 22:29:02 +08:00
手瓜一十雪
420624bee4 build: 1.3.5-catch error 2024-05-19 21:48:52 +08:00
手瓜一十雪
8abde7b7d0 Revert "build: 1.3.5-re"
This reverts commit 9e5b1ba28e.
2024-05-19 21:41:57 +08:00
手瓜一十雪
9e5b1ba28e build: 1.3.5-re 2024-05-19 21:18:33 +08:00
手瓜一十雪
b9c7d3c18e build: 1.3.5-re 2024-05-19 21:04:24 +08:00
手瓜一十雪
10aeccbbe5 build: 1.3.5 2024-05-19 20:46:02 +08:00
手瓜一十雪
15d351ebc2 build: 1.3.5-re 2024-05-19 13:30:42 +08:00
手瓜一十雪
7194f31cb6 build: 1.3.5-re 2024-05-19 13:18:29 +08:00
手瓜一十雪
84b7e82446 build: 1.4.0-beta1 2024-05-19 12:36:56 +08:00
手瓜一十雪
8264423b1a fix: 上报问题 2024-05-19 12:36:40 +08:00
手瓜一十雪
37f897f3bf feat: 上报戳一戳 2024-05-19 12:35:15 +08:00
手瓜一十雪
fe3efac145 feat: 解析戳一戳 2024-05-19 12:29:40 +08:00
手瓜一十雪
9773aebefc feat: sys msg decode 2024-05-19 12:12:03 +08:00
手瓜一十雪
06f2b8c371 docs: change init 2024-05-19 11:08:42 +08:00
手瓜一十雪
e8f0bb8350 build: fix check type 2024-05-18 20:48:06 +08:00
手瓜一十雪
9bfa6b827b build: 1.3.5 2024-05-18 20:36:16 +08:00
手瓜一十雪
b21bc17a58 build: 1.3.5 2024-05-18 20:28:35 +08:00
手瓜一十雪
f4d5d417d0 build: 1.3.5 2024-05-18 20:09:33 +08:00
手瓜一十雪
91fc83621e build: 1.3.5 2024-05-18 19:46:53 +08:00
手瓜一十雪
461feca0ca Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-05-18 19:33:24 +08:00
手瓜一十雪
5e9afab3f7 fix: workflow 2024-05-18 18:18:08 +08:00
Version
2599ca6450 chore:version change 2024-05-18 10:15:09 +00:00
手瓜一十雪
fc99ad3a39 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-05-18 18:08:29 +08:00
手瓜一十雪
10e1c3e72c build: 1.3.5-beta38 2024-05-18 18:08:18 +08:00
手瓜一十雪
af5dedd4d4 docs: change 2024-05-18 18:00:40 +08:00
手瓜一十雪
3b986c1076 build: 1.3.5-beta37 2024-05-18 17:58:09 +08:00
手瓜一十雪
72f77e8b7c feat: support get_group_system_msg 2024-05-18 17:57:42 +08:00
手瓜一十雪
e893bf676f build: 1.3.5-beta36
get_group_system_msg 未标准化
2024-05-18 17:37:10 +08:00
手瓜一十雪
80eb34f611 feat: try add get_group_system_msg 2024-05-18 16:58:46 +08:00
手瓜一十雪
5d01947552 feat: 快速操作msg默认reply模式回应 2024-05-18 16:27:53 +08:00
手瓜一十雪
d3a025ef7b build: 1.3.5-beta35 2024-05-18 14:40:46 +08:00
手瓜一十雪
c466df841e build: 1.3.5-beta34 2024-05-18 14:36:52 +08:00
手瓜一十雪
b3c6e2a0f3 feat: QuickHandle From LLOB 2024-05-18 14:35:24 +08:00
手瓜一十雪
076c9cfed7 feat: send timeout predict 2024-05-18 14:09:57 +08:00
手瓜一十雪
c3f3d12f83 build: 1.3.5-beta33 2024-05-18 13:35:57 +08:00
手瓜一十雪
44974034ec build: 1.3.5-beta32 2024-05-18 12:56:03 +08:00
手瓜一十雪
d6175acd38 feat: check action data 3 2024-05-18 12:40:41 +08:00
手瓜一十雪
62eee5f05c feat: check action data 2 2024-05-18 12:23:15 +08:00
手瓜一十雪
d4e5201913 feat: action check data 2024-05-18 11:48:38 +08:00
手瓜一十雪
f4d584765a build: 1.3.5-beta30 2024-05-17 21:58:48 +08:00
手瓜一十雪
26e224f852 fix: 热重载容错 2024-05-17 21:44:52 +08:00
手瓜一十雪
252358ed66 build: 1.3.5-beta29 2024-05-17 21:41:07 +08:00
手瓜一十雪
475afeb7c8 build: 1.3.5-beta28 2024-05-17 21:30:37 +08:00
手瓜一十雪
7cbbb846eb build: 1.3.5-beta27 2024-05-17 21:26:32 +08:00
手瓜一十雪
25f947968c fix: typo 2024-05-17 19:55:12 +08:00
手瓜一十雪
cad824dcbc refactor: powershell script 2024-05-17 19:22:36 +08:00
手瓜一十雪
e506f50b00 build: 1.3.5-beta24 2024-05-17 18:51:31 +08:00
手瓜一十雪
96ec149a98 fix: webui 2024-05-17 18:23:50 +08:00
手瓜一十雪
8c913512f6 fix: webui 2024-05-17 18:21:03 +08:00
手瓜一十雪
4cc307299d build: 1.3.5-beta23 2024-05-17 18:12:41 +08:00
手瓜一十雪
407c6b4c5f fix: webui 2024-05-17 18:11:53 +08:00
手瓜一十雪
8f87070434 build: 1.3.5-beta22 2024-05-17 17:17:49 +08:00
手瓜一十雪
4a63996ee2 docs: change 2024-05-17 17:08:01 +08:00
手瓜一十雪
0358fe7620 feat: UpdateConfig 2024-05-17 17:03:48 +08:00
手瓜一十雪
55e64395ed build: 1.3.5-beta20 2024-05-17 15:39:31 +08:00
手瓜一十雪
ff5fb18e14 chore: sync core 2024-05-16 20:47:12 +08:00
手瓜一十雪
52dd960857 build: 1.3.5-beta19 2024-05-16 20:24:49 +08:00
手瓜一十雪
430221c2de fix: check msgElement 2024-05-16 20:23:36 +08:00
手瓜一十雪
217bdf8f92 build: 1.3.5-beta17 2024-05-16 12:53:33 +08:00
手瓜一十雪
38c6c869bf docs: change 2024-05-16 12:52:45 +08:00
手瓜一十雪
84d46da67e fix: ws心跳问题 2024-05-16 12:46:27 +08:00
手瓜一十雪
eb9d6240d7 chore: move 2024-05-16 11:57:02 +08:00
linyuchen
2d44a871b0 chore: Sync core 2024-05-15 23:08:57 +08:00
手瓜一十雪
3f89f350ff fix: 移除umami 2024-05-15 22:18:05 +08:00
手瓜一十雪
1a8407a782 refactor: requests 2024-05-15 21:13:41 +08:00
手瓜一十雪
cf288a3f73 feat: 迁移配置辅助函数 2024-05-15 20:55:09 +08:00
手瓜一十雪
f1f37fb180 Merge pull request #23 from Wesley-Young/main
Refactoring onebot11/action/msg/SendMsg
2024-05-15 19:47:37 +08:00
手瓜一十雪
fb0dd079fd Merge branch 'main' into pr/23 2024-05-15 19:47:19 +08:00
手瓜一十雪
a6c584c85c Merge branch 'main' of https://github.com/Wesley-Young/NapCatQQ.Patch into pr/23 2024-05-15 19:46:46 +08:00
手瓜一十雪
77adf35a30 fix: export problem 2024-05-15 19:45:27 +08:00
linyuchen
dc6951c2a9 Merge remote-tracking branch 'origin/main' 2024-05-15 17:55:20 +08:00
linyuchen
d14ba3f0f7 feat: Cache decorator 2024-05-15 17:55:03 +08:00
Wesley F. Young
78ddf36e35 refactor: split types.ts into separate files 2024-05-15 17:02:24 +08:00
Wesley F. Young
d42734624d refactor: move checkSendMessage and handleForwardNode to separate files 2024-05-15 16:43:21 +08:00
Wesley F. Young
b5dbd9d59b refactor: rename function convertMessage2List to normalize 2024-05-15 16:33:15 +08:00
手瓜一十雪
bed3e1289b chore: sync core 2024-05-15 16:11:01 +08:00
手瓜一十雪
b11ca4e60e Merge branch 'main' into pr/23 2024-05-15 16:10:11 +08:00
Wesley F. Young
4fcf3aa2bd refactor: better type inferring; move createSendElement into another file 2024-05-15 14:53:58 +08:00
手瓜一十雪
dc39da8ca5 build: 1.3.5-beta15 2024-05-15 12:13:39 +08:00
手瓜一十雪
c10c87d28e build: 1.3.5-beta14 2024-05-15 12:10:52 +08:00
手瓜一十雪
c6fe6f1cc5 Merge pull request #22 from SherkeyXD/main
refactor: 重构 Onebot 配置格式,增强可读性
2024-05-15 12:07:46 +08:00
手瓜一十雪
1c2bbeb26d fix: webui renderer 2024-05-15 12:06:17 +08:00
SherkeyXD
17ed3692d0 refactor: webui 跟进 Onebot 配置重构 2024-05-15 11:43:20 +08:00
手瓜一十雪
966a00f41e chore: sync code 2024-05-15 11:40:25 +08:00
手瓜一十雪
fd8d8f89aa Merge branch 'main' into pr/22 2024-05-15 11:32:26 +08:00
手瓜一十雪
305bb74072 chore: sync core 2024-05-15 11:00:24 +08:00
手瓜一十雪
7f4dcdd134 Merge branch 'main' into pr/22 2024-05-15 10:59:46 +08:00
手瓜一十雪
aac37dcce1 docs: typo 2024-05-15 09:35:01 +08:00
手瓜一十雪
f539c662a5 docs: todo 2024-05-15 09:32:05 +08:00
SherkeyXD
c82f346dd0 refactor: 重构 Onebot 配置格式,增强可读性 2024-05-15 00:17:59 +08:00
手瓜一十雪
21b4a87837 docs: change 2024-05-14 23:05:01 +08:00
手瓜一十雪
ae73bcf24b chore: sync core 2024-05-14 22:56:24 +08:00
手瓜一十雪
2a3b56bde1 build: 1.3.5-beta12 2024-05-14 22:53:26 +08:00
手瓜一十雪
b8ebededd8 fix: Member Kick Event 2024-05-14 22:48:43 +08:00
手瓜一十雪
227c4c422c build: 1.3.5-beta11 2024-05-14 20:44:04 +08:00
手瓜一十雪
652bfb93cc docs: change 2024-05-14 17:24:17 +08:00
手瓜一十雪
c2278e3536 build: v1.3.5-beta10 2024-05-14 16:40:23 +08:00
手瓜一十雪
caa2fca4e8 refactor: http requests 2024-05-14 15:31:53 +08:00
手瓜一十雪
745cb0175c refactor: requests 2024-05-14 15:19:37 +08:00
手瓜一十雪
e5165a780f feat: 新增群荣誉信息 2024-05-14 14:08:57 +08:00
手瓜一十雪
b4b91af02b feat: 新增群荣誉信息 2024-05-14 14:02:29 +08:00
手瓜一十雪
5649ff9c2e chore: sync core 2024-05-14 11:38:39 +08:00
手瓜一十雪
5b4bf6c62a chore: sync core 2024-05-14 10:20:27 +08:00
手瓜一十雪
93cb662282 refactor: scipt and request 2024-05-14 10:16:30 +08:00
手瓜一十雪
00a8715e58 chore: sync core 2024-05-13 21:24:47 +08:00
手瓜一十雪
7ecd479b3e refactor: webapi http 2024-05-13 21:22:20 +08:00
手瓜一十雪
8fe7d3aaec refactor: sign music 2024-05-13 21:14:48 +08:00
手瓜一十雪
f32a693393 feat: 配置热重载 2024-05-13 21:07:19 +08:00
手瓜一十雪
17ebc01597 fix: linux script env 2024-05-13 18:39:59 +08:00
手瓜一十雪
827fb698e1 chore: version 2024-05-13 18:25:34 +08:00
手瓜一十雪
32bdf10fd2 refactor: check version 2024-05-13 18:13:52 +08:00
手瓜一十雪
b795e6c3d2 refactor: umami 2024-05-13 18:08:46 +08:00
手瓜一十雪
42ba524e4e refactor: HttpGetJson 2024-05-13 17:53:50 +08:00
手瓜一十雪
317c6d96e3 refactor: http_util 2024-05-13 17:41:10 +08:00
手瓜一十雪
3692d1499f refactor: boot script 2024-05-13 17:26:22 +08:00
手瓜一十雪
b21fbad8a3 refactor: boot scipt 2024-05-13 16:57:03 +08:00
手瓜一十雪
743334a68a refactor: version check 2024-05-13 16:46:40 +08:00
手瓜一十雪
951413eb38 docs: change 2024-05-13 16:44:30 +08:00
手瓜一十雪
32dcdef853 fix: build script 2024-05-13 16:43:16 +08:00
手瓜一十雪
34c9254d4a fix: typo 2024-05-13 16:39:24 +08:00
手瓜一十雪
14012a4668 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-05-13 16:38:19 +08:00
手瓜一十雪
575debca63 fix: reboot on win 2024-05-13 16:37:48 +08:00
linyuchen
763cac8532 Merge remote-tracking branch 'origin/main' 2024-05-13 16:32:52 +08:00
linyuchen
43faacd7a7 doc: changelog history 2024-05-13 16:32:40 +08:00
Version
1d4e307e96 chore:version change 2024-05-13 08:09:02 +00:00
linyuchen
7f8933b0de doc: changelog 2024-05-13 16:05:35 +08:00
手瓜一十雪
81608ff025 docs:change 2024-05-13 13:56:36 +08:00
手瓜一十雪
db63675b8e fix: 修复重启 但win无法及时结束父进程 2024-05-13 13:44:23 +08:00
linyuchen
f74a83bc46 doc: changelog 2024-05-13 12:53:44 +08:00
linyuchen
bc1deba3e4 style: eslint 2024-05-13 12:53:30 +08:00
手瓜一十雪
d6113a8f0a fix: 尝试修复 但仍然无法使用reboot 2024-05-13 12:35:15 +08:00
手瓜一十雪
2062cd48ea fix: RebootNormol 2024-05-13 09:33:00 +08:00
手瓜一十雪
1c965ef515 feat: api Extend RebootNormol 2024-05-13 09:32:25 +08:00
linyuchen
58291b7156 update core 2024-05-13 08:52:55 +08:00
linyuchen
afd1648d80 refactor: GetUserDetailInfo auto map uid2uin 2024-05-13 08:41:48 +08:00
linyuchen
21814ffa9a Merge remote-tracking branch 'origin/main' 2024-05-13 01:28:23 +08:00
手瓜一十雪
9d3522da54 fix: OnGroupNotifiesUpdated catch getUserDetailInfo 2024-05-13 01:28:11 +08:00
手瓜一十雪
e07a76755e docs: todo 2024-05-12 23:22:53 +08:00
手瓜一十雪
ba46bcdeae docs: change 2024-05-12 23:21:48 +08:00
手瓜一十雪
8d7e44314c build: 1.3.5-beta8 2024-05-12 23:18:59 +08:00
手瓜一十雪
35a67498c7 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-05-12 23:18:39 +08:00
手瓜一十雪
90dd934f95 feat: limit sendMsg 2024-05-12 23:18:27 +08:00
手瓜一十雪
4087045542 docs: change 2024-05-12 22:59:30 +08:00
手瓜一十雪
d11cef5907 build: 1.3.5-beta7 2024-05-12 22:57:32 +08:00
手瓜一十雪
76c91d226c build: 1.3.5-beta6 2024-05-12 22:23:27 +08:00
手瓜一十雪
c2b4dd2afd feat: Reboot Api(未经测试) 2024-05-12 22:19:03 +08:00
手瓜一十雪
25b39cb39a Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-05-12 22:12:13 +08:00
手瓜一十雪
35dcb7b88b feat: reboot util 2024-05-12 22:11:47 +08:00
手瓜一十雪
e5f7e7c26e docs: change 2024-05-12 22:05:07 +08:00
手瓜一十雪
c5c11fd6a6 docs: change 2024-05-12 22:04:49 +08:00
手瓜一十雪
8134083419 build: 1.3.5-beta5 2024-05-12 22:00:18 +08:00
linyuchen
a87e624198 build: fix fetch ua 2024-05-12 21:50:50 +08:00
linyuchen
e4c62d20b4 build: Fix http UA 2024-05-12 21:49:39 +08:00
手瓜一十雪
fa195d9e55 docs: change 2024-05-12 21:48:38 +08:00
linyuchen
5ef5773d23 update core 2024-05-12 21:48:30 +08:00
linyuchen
6eea52afdf Merge remote-tracking branch 'origin/main' 2024-05-12 21:46:27 +08:00
linyuchen
80e64af30f fix: Fetch miss ua 2024-05-12 21:46:13 +08:00
手瓜一十雪
563b6ddc36 refactor: rm SetGroupNotice 2024-05-12 21:24:22 +08:00
手瓜一十雪
c051ab9dc4 fix: rm exist GoCQHTTP_SendGroupNotice 2024-05-12 20:52:40 +08:00
linyuchen
87737a8bdb refactor: Remove random os hostname 2024-05-12 20:41:45 +08:00
linyuchen
94273d80b0 refactor: Random os hostname 2024-05-12 20:32:36 +08:00
手瓜一十雪
a08ec2a4bd docs: CHANGELOG 2024-05-12 18:41:28 +08:00
linyuchen
d246c556f4 update core.lib 2024-05-12 18:00:56 +08:00
linyuchen
65aa365e38 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	src/core.lib/src/adapters/NodeIDependsAdapter.js
#	src/core.lib/src/adapters/NodeIDispatcherAdapter.js
#	src/core.lib/src/adapters/NodeIGlobalAdapter.js
#	src/core.lib/src/adapters/index.js
#	src/core.lib/src/apis/file.js
#	src/core.lib/src/apis/friend.js
#	src/core.lib/src/apis/group.js
#	src/core.lib/src/apis/index.js
#	src/core.lib/src/apis/msg.js
#	src/core.lib/src/apis/sign.js
#	src/core.lib/src/apis/user.js
#	src/core.lib/src/apis/webapi.js
#	src/core.lib/src/core.js
#	src/core.lib/src/data.js
#	src/core.lib/src/entities/cache.js
#	src/core.lib/src/entities/constructor.js
#	src/core.lib/src/entities/group.js
#	src/core.lib/src/entities/index.js
#	src/core.lib/src/entities/msg.js
#	src/core.lib/src/entities/notify.js
#	src/core.lib/src/entities/user.js
#	src/core.lib/src/external/hook.js
#	src/core.lib/src/index.js
#	src/core.lib/src/listeners/NodeIKernelBuddyListener.js
#	src/core.lib/src/listeners/NodeIKernelFileAssistantListener.js
#	src/core.lib/src/listeners/NodeIKernelGroupListener.js
#	src/core.lib/src/listeners/NodeIKernelLoginListener.js
#	src/core.lib/src/listeners/NodeIKernelMsgListener.js
#	src/core.lib/src/listeners/NodeIKernelProfileListener.js
#	src/core.lib/src/listeners/NodeIKernelRobotListener.js
#	src/core.lib/src/listeners/NodeIKernelSessionListener.js
#	src/core.lib/src/listeners/NodeIKernelStorageCleanListener.js
#	src/core.lib/src/listeners/index.js
#	src/core.lib/src/services/common.js
#	src/core.lib/src/services/index.js
#	src/core.lib/src/sessionConfig.js
#	src/core.lib/src/utils/config.js
#	src/core.lib/src/utils/db.js
#	src/core.lib/src/utils/rkey.js
#	src/core.lib/src/wrapper.js
2024-05-12 18:00:42 +08:00
linyuchen
eeeae449b4 update core.lib 2024-05-12 18:00:23 +08:00
linyuchen
17c10a7ba2 update core.lib 2024-05-12 17:59:25 +08:00
手瓜一十雪
69f4383678 feat: try add reboot 2024-05-12 17:56:57 +08:00
linyuchen
07852a7295 fix: Log filename add milliseconds 2024-05-12 17:56:42 +08:00
手瓜一十雪
20b7e9b6b5 fix:build error 2024-05-12 16:59:03 +08:00
手瓜一十雪
75f43ccea4 chore: sync core 2024-05-12 16:56:07 +08:00
手瓜一十雪
59e5785e93 fix: build 2024-05-12 16:55:01 +08:00
手瓜一十雪
b38f52dba9 chore: sync core 2024-05-12 16:46:35 +08:00
手瓜一十雪
2a6b17a48e fix: try support win7 2024-05-12 16:21:04 +08:00
手瓜一十雪
a6c056a894 fix: SendGroupNotice Image Unlink 2024-05-12 15:49:53 +08:00
手瓜一十雪
5c3442a71f feat: 扩展SendGroupNotice 2024-05-12 15:27:02 +08:00
手瓜一十雪
390253242f build: 1.3.5-beta1 2024-05-12 15:21:35 +08:00
手瓜一十雪
9ab80fe1ac feat: Api SendGroupNotice 2024-05-12 12:07:51 +08:00
手瓜一十雪
91fdd09e7a docs: 2024-05-12 00:41:06 +08:00
手瓜一十雪
db5bd5c8a4 chore: 1.3.2 version 2024-05-11 14:42:49 +08:00
手瓜一十雪
ef94c2fe7c chore: remove debug code 2024-05-11 14:30:36 +08:00
手瓜一十雪
72a25ed8e1 docs: change fix image recv 2024-05-11 14:24:11 +08:00
手瓜一十雪
eb065e218f build: 1.3.2-beta7 2024-05-11 14:23:36 +08:00
手瓜一十雪
33426736fc docs: change 2024-05-11 13:51:01 +08:00
手瓜一十雪
896658d5ce build: 1.3.2-beta6 2024-05-11 13:45:41 +08:00
linyuchen
b14135ed72 refactor: Use remote rkey 2024-05-11 13:43:07 +08:00
linyuchen
a1baf2e32d Merge remote-tracking branch 'origin/main'
# Conflicts:
#	src/onebot11/action/extends/GetFriendWithCategory.ts
#	src/onebot11/action/types.ts
2024-05-11 13:42:05 +08:00
linyuchen
f9aa2d3bce refactor: Use remote rkey 2024-05-11 13:41:09 +08:00
手瓜一十雪
c95d0e0696 build: 1.3.2-beta5 2024-05-11 13:34:04 +08:00
手瓜一十雪
ad4b84d446 build: 1.3.2-beta3 2024-05-11 13:10:34 +08:00
手瓜一十雪
3e27d5fcb0 fix:roboot file 2024-05-11 13:06:35 +08:00
手瓜一十雪
48a100f49a feat: reboot-uncomplete 2024-05-11 10:51:07 +08:00
linyuchen
698649f981 Merge remote-tracking branch 'origin/main' 2024-05-11 10:45:22 +08:00
手瓜一十雪
780078c3aa build: 1.3.0-beta2 2024-05-11 10:15:08 +08:00
手瓜一十雪
4c25e4ddee build: 1.3.2-beta1 2024-05-10 23:52:18 +08:00
手瓜一十雪
c0a5ac2ac5 feat: ServerRkeyWrapper 2024-05-10 23:40:07 +08:00
student_2333
0435409870 fix 2024-05-10 21:41:06 +08:00
student_2333
c521269409 fix: custom music card content 2024-05-10 21:38:39 +08:00
linyuchen
1e252b7e4c Merge remote-tracking branch 'origin/main'
# Conflicts:
#	src/core.lib/src/adapters/NodeIDependsAdapter.js
#	src/core.lib/src/adapters/NodeIDispatcherAdapter.js
#	src/core.lib/src/adapters/NodeIGlobalAdapter.js
#	src/core.lib/src/adapters/index.js
#	src/core.lib/src/apis/file.js
#	src/core.lib/src/apis/friend.js
#	src/core.lib/src/apis/group.js
#	src/core.lib/src/apis/index.js
#	src/core.lib/src/apis/msg.js
#	src/core.lib/src/apis/sign.js
#	src/core.lib/src/apis/user.js
#	src/core.lib/src/apis/webapi.js
#	src/core.lib/src/core.js
#	src/core.lib/src/data.js
#	src/core.lib/src/entities/cache.js
#	src/core.lib/src/entities/constructor.js
#	src/core.lib/src/entities/group.js
#	src/core.lib/src/entities/index.js
#	src/core.lib/src/entities/msg.js
#	src/core.lib/src/entities/notify.js
#	src/core.lib/src/entities/user.js
#	src/core.lib/src/external/hook.js
#	src/core.lib/src/index.js
#	src/core.lib/src/listeners/NodeIKernelBuddyListener.js
#	src/core.lib/src/listeners/NodeIKernelFileAssistantListener.js
#	src/core.lib/src/listeners/NodeIKernelGroupListener.js
#	src/core.lib/src/listeners/NodeIKernelLoginListener.js
#	src/core.lib/src/listeners/NodeIKernelMsgListener.js
#	src/core.lib/src/listeners/NodeIKernelProfileListener.js
#	src/core.lib/src/listeners/NodeIKernelRobotListener.js
#	src/core.lib/src/listeners/NodeIKernelSessionListener.js
#	src/core.lib/src/listeners/NodeIKernelStorageCleanListener.js
#	src/core.lib/src/listeners/index.js
#	src/core.lib/src/services/common.js
#	src/core.lib/src/services/index.js
#	src/core.lib/src/sessionConfig.js
#	src/core.lib/src/utils/config.js
#	src/core.lib/src/utils/db.js
#	src/core.lib/src/wrapper.js
2024-05-10 21:35:49 +08:00
linyuchen
d72b1edc48 chore: build core.lib 2024-05-10 21:35:14 +08:00
手瓜一十雪
f7307e8e01 chore: sync core 2024-05-10 21:32:22 +08:00
手瓜一十雪
127905f04b docs: change 2024-05-10 20:29:37 +08:00
手瓜一十雪
261c6dabd5 feat: 扩展GetFriendCategory Api 2024-05-10 20:27:38 +08:00
手瓜一十雪
cae84bbf02 style: rename DataRuntime to WebUiDataRuntime 2024-05-10 17:55:29 +08:00
手瓜一十雪
cdb2bc52fa feat: add BuddyProfileLikeReq Type 2024-05-09 23:17:33 +08:00
手瓜一十雪
cd2972eee0 chore: sync core 2024-05-09 23:15:32 +08:00
手瓜一十雪
4036aa8d0e chore: version 2024-05-09 23:06:55 +08:00
手瓜一十雪
52c6927c44 chore: release script 2024-05-09 18:46:32 +08:00
Version
a16e0a21a2 chore:version change 2024-05-09 10:42:30 +00:00
手瓜一十雪
e796b21157 chore: version 2024-05-09 17:50:20 +08:00
手瓜一十雪
1c6bc478b4 build: 1.3.0-beta5 2024-05-09 17:05:11 +08:00
手瓜一十雪
98f39c6388 docs: change 2024-05-09 17:00:38 +08:00
手瓜一十雪
570c83571b build: 1.3.0-beta4 2024-05-09 16:55:38 +08:00
手瓜一十雪
c0c38d89e0 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-05-09 16:55:12 +08:00
手瓜一十雪
b866cfc03c fix: Group Into Member Info 2024-05-09 16:54:32 +08:00
手瓜一十雪
28c2755b37 docs: change thank list 2024-05-09 15:29:31 +08:00
手瓜一十雪
57bfc5c73a docs: change version 2024-05-09 12:48:25 +08:00
手瓜一十雪
0f3f7d53a3 docs: change 2024-05-09 00:10:41 +08:00
手瓜一十雪
529e50fd7f build: 1.3.0-beta3 2024-05-08 22:34:01 +08:00
手瓜一十雪
2fa283f91d buid: 1.3.0-beta3 2024-05-08 22:33:00 +08:00
手瓜一十雪
029a9ade93 build: 1.3.0-beta2 2024-05-08 21:42:23 +08:00
手瓜一十雪
f1ca8b15c8 feat:webui finish 2024-05-08 21:40:30 +08:00
手瓜一十雪
4d8edd5da9 fix:webui config some value 2024-05-08 21:29:40 +08:00
手瓜一十雪
6c63990653 fix: redirect html 2024-05-08 21:12:03 +08:00
手瓜一十雪
5b521409c6 fix: asset not load 2024-05-08 21:00:53 +08:00
手瓜一十雪
3268fc1014 fix: QQ Login Check 2024-05-08 20:54:43 +08:00
手瓜一十雪
19afb4941b feat: webui auth 2024-05-08 20:33:48 +08:00
手瓜一十雪
40e5111d41 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-05-08 20:11:30 +08:00
手瓜一十雪
a3a40e1e74 feat: webui finish without auth 2024-05-08 20:10:33 +08:00
手瓜一十雪
101caa6826 docs: add qrcode expired 2024-05-08 20:01:19 +08:00
手瓜一十雪
875fed8d77 fix: qrcode expired try 2024-05-08 19:59:42 +08:00
手瓜一十雪
69e28eb000 feat: qrcode expired try 2024-05-08 19:43:33 +08:00
手瓜一十雪
e5d3a8360c fix:config 2024-05-08 18:45:45 +08:00
手瓜一十雪
4545d9285b feat: webui finish!! 2024-05-08 18:37:11 +08:00
手瓜一十雪
6702024805 fix: webui getConfig 2024-05-08 18:31:30 +08:00
手瓜一十雪
78bad4842b style: webui 2024-05-08 18:24:24 +08:00
手瓜一十雪
b9a913cfed feat: Ui Config 2024-05-08 18:11:38 +08:00
手瓜一十雪
6f5a6f353f feat: get config 2024-05-08 15:42:22 +08:00
手瓜一十雪
790c4f589d feat: Login HeartBeat 2024-05-08 15:07:20 +08:00
手瓜一十雪
cd1bd3461f fix: GetQuickList 2024-05-08 14:46:51 +08:00
手瓜一十雪
0280dcd6a8 fix: webui Confi&webui Login 2024-05-08 14:29:18 +08:00
手瓜一十雪
fc337292bc feat: add QQLogin 2024-05-07 22:51:43 +08:00
手瓜一十雪
fb1daa0e21 fix 2024-05-07 22:45:36 +08:00
手瓜一十雪
579b9dc0c2 fix: WebUiConfig 2024-05-07 22:44:55 +08:00
手瓜一十雪
dedd0be352 feat:QQLogin Api 2024-05-07 22:35:15 +08:00
手瓜一十雪
1c7d9c3513 fix:webui login 2024-05-07 22:26:17 +08:00
手瓜一十雪
0c7dfe2af4 fix 2024-05-07 22:16:11 +08:00
手瓜一十雪
8d1351a8a3 fix:login 2024-05-07 22:15:07 +08:00
手瓜一十雪
e6e68a6036 feat: signCredential 2024-05-07 22:11:52 +08:00
手瓜一十雪
24658edc45 fix:webui auth ratelimit 2024-05-07 22:04:21 +08:00
手瓜一十雪
09eaa3116a feat:fix 2024-05-07 21:47:52 +08:00
手瓜一十雪
e9bff466b5 fix:port use 2024-05-07 21:24:49 +08:00
手瓜一十雪
5d77f50160 feat:webui-test 2024-05-07 21:17:31 +08:00
手瓜一十雪
2ab91e363f feat: auth api router 2024-05-07 21:06:04 +08:00
手瓜一十雪
34d881426f fear: webui quick login 2024-05-07 20:50:25 +08:00
手瓜一十雪
13ecaa0ad4 feat:webui log 2024-05-07 20:08:59 +08:00
手瓜一十雪
ce6185b1f7 feat: webui set config 2024-05-07 19:57:23 +08:00
手瓜一十雪
2cfde6b75a fix: webui not login get config 2024-05-07 19:55:11 +08:00
手瓜一十雪
37d0354751 feat: webui OB11Config 2024-05-07 19:48:25 +08:00
linyuchen
0a0edcf203 build: v1.3.0-beta1 2024-05-07 16:28:28 +08:00
linyuchen
d6aad2ea28 build-1.3.0-beta1 2024-05-07 16:27:26 +08:00
linyuchen
63084506ee chore(build): Update core.lib 2024-05-07 16:26:52 +08:00
手瓜一十雪
c5d313574f feat: webui OB11Config 2024-05-07 12:31:30 +08:00
手瓜一十雪
caab998212 feat: webui getQrcode 2024-05-07 12:23:58 +08:00
linyuchen
aa037cc3d9 doc: Update changelog 2024-05-07 08:42:48 +08:00
linyuchen
642bffe374 chore: rollback version 2024-05-07 08:13:56 +08:00
linyuchen
d682b154fc build: fix auto download image, fix rkey error 2024-05-07 08:12:12 +08:00
手瓜一十雪
d4a06d98cf Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-05-06 23:02:26 +08:00
手瓜一十雪
856b5e16b1 feat: webui LoginStatus 2024-05-06 23:02:00 +08:00
linyuchen
a0aa208860 Merge remote-tracking branch 'origin/main' 2024-05-06 22:53:53 +08:00
linyuchen
037a11e04f chore: Update submodule core 2024-05-06 22:53:38 +08:00
手瓜一十雪
bd8a1d715f feat: login handler 2024-05-06 22:52:57 +08:00
手瓜一十雪
54ab1dc091 feat: webui Login Router 2024-05-06 22:40:21 +08:00
手瓜一十雪
9471e63857 feat: webui login limit 2024-05-06 22:24:27 +08:00
手瓜一十雪
fa4a403f38 feat: webui auth helper 2024-05-06 22:11:13 +08:00
手瓜一十雪
d608d65bf4 fix:useport try 2024-05-06 21:46:43 +08:00
手瓜一十雪
c0f2df172a feat: webui config 2024-05-06 21:34:17 +08:00
手瓜一十雪
788ef5d81c chore: web ui/api move 2024-05-06 21:12:34 +08:00
手瓜一十雪
1c6b5cffe1 feat: webuiapi init 2024-05-06 21:10:37 +08:00
手瓜一十雪
c04382b623 chore: sync core repo 2024-05-06 20:59:30 +08:00
linyuchen
0bbe51f8fd fix: rkey cached 2024-05-06 19:45:20 +08:00
linyuchen
ff7d7d15a0 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	src/core
2024-05-06 19:44:50 +08:00
linyuchen
4b3d083d3a fix: rkey cached 2024-05-06 19:44:36 +08:00
linyuchen
a566dd390b fix: rkey cached 2024-05-06 19:44:25 +08:00
手瓜一十雪
7d1442da04 build: 1.3.0-disable webui 2024-05-06 17:49:12 +08:00
手瓜一十雪
17fc982f55 build: 1.3.0-beta2 2024-05-06 17:01:16 +08:00
手瓜一十雪
ba417e2274 build: 1.3.0-beta1 2024-05-06 16:06:16 +08:00
手瓜一十雪
d345094b75 fix:rkey 2024-05-06 16:05:15 +08:00
手瓜一十雪
6da477480d feat: sync core 2024-05-06 16:04:29 +08:00
手瓜一十雪
e274088c06 feat:webui index 2024-05-06 15:12:27 +08:00
手瓜一十雪
1bcaa73c5c fix: webui style 2024-05-06 12:36:02 +08:00
手瓜一十雪
ca94e8f621 fix: webui ui 2024-05-06 12:32:21 +08:00
手瓜一十雪
1c4e198f59 fix 2024-05-06 12:30:26 +08:00
手瓜一十雪
fdd13f9c66 fix:Login 2024-05-05 22:49:56 +08:00
手瓜一十雪
4333ab624e fix: version check 2024-05-05 21:41:36 +08:00
手瓜一十雪
9fe1eb3a42 remove: webui log 2024-05-05 21:29:09 +08:00
linyuchen
ad251a7682 fix: http download filename special character 2024-05-05 20:05:52 +08:00
linyuchen
1fa740de2d refactor: OB11Message add filed message_seq 2024-05-05 19:40:26 +08:00
linyuchen
466b89064a Merge remote-tracking branch 'origin/main' 2024-05-05 19:25:37 +08:00
linyuchen
2748cb0ba3 refactor: Moehoo和QQ版本绑定,不再兼容多个版本 2024-05-05 19:25:17 +08:00
手瓜一十雪
aef0d5bdde Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-05-05 15:51:39 +08:00
手瓜一十雪
c71e8f024a chore:sync core 2024-05-05 15:51:23 +08:00
手瓜一十雪
9411f07321 fix:docs 2024-05-05 15:45:05 +08:00
手瓜一十雪
9b2a5c9bbf feat: ChangeLog 2024-05-05 15:44:38 +08:00
手瓜一十雪
2b275523a0 fix: webui api 2024-05-05 15:34:07 +08:00
手瓜一十雪
31fe2f6da4 fix: webui build 2024-05-05 15:17:17 +08:00
手瓜一十雪
f95db623a5 feat: webui style 2024-05-05 14:39:16 +08:00
手瓜一十雪
a46313e483 fix:webui-style 2024-05-05 14:35:49 +08:00
手瓜一十雪
31c330826e feat: webui-test-0 2024-05-05 14:32:48 +08:00
手瓜一十雪
c4cf800142 fix: webui-10 2024-05-05 14:14:27 +08:00
手瓜一十雪
b64a2b0006 fix:webui-9 2024-05-05 14:11:51 +08:00
手瓜一十雪
a3702f2270 fix: webapi config 2024-05-05 14:04:29 +08:00
手瓜一十雪
d221b1d470 fix: webui - 8 2024-05-05 13:49:08 +08:00
手瓜一十雪
0b22a6bc1d fix: webui-7 2024-05-05 13:45:44 +08:00
手瓜一十雪
07e8acd003 fix: remove unuse 2024-05-05 13:42:43 +08:00
手瓜一十雪
9fce617c57 fix: webui-6 2024-05-05 13:40:54 +08:00
手瓜一十雪
8d5c736975 fix: webui-6 2024-05-05 13:36:53 +08:00
手瓜一十雪
4ccec05186 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-05-05 13:28:30 +08:00
手瓜一十雪
a4f456f002 fix: webui-5 2024-05-05 13:28:16 +08:00
linyuchen
fbdb941c27 Merge remote-tracking branch 'origin/main' 2024-05-05 13:26:52 +08:00
linyuchen
a41cd42e8d build-1.2.1-beta1,fix: webapi群成员列表加入缓存,表情回应兼容int类型emoji_id 2024-05-05 13:26:33 +08:00
手瓜一十雪
77521e4627 feat: webui-4 2024-05-05 13:23:05 +08:00
手瓜一十雪
b6a1242bac feat:webui-3 2024-05-05 13:03:56 +08:00
手瓜一十雪
2f325cfe26 feat:webui-2 2024-05-05 13:01:23 +08:00
手瓜一十雪
193b0ad0f0 feat: webui-1 2024-05-05 12:57:32 +08:00
手瓜一十雪
ed476b7793 fix 2024-05-05 12:43:32 +08:00
linyuchen
720fd94b7f Merge remote-tracking branch 'origin/main' 2024-05-04 23:24:41 +08:00
linyuchen
ff87da105c fix: /get_cookies return 2024-05-04 23:24:32 +08:00
手瓜一十雪
a875e65536 doc: change 2024-05-04 23:23:45 +08:00
手瓜一十雪
0b2c6bb662 style&feat: cache cookies&group member 2024-05-04 23:22:21 +08:00
手瓜一十雪
e44e2fbbb7 fix 2024-05-04 22:41:37 +08:00
手瓜一十雪
b3c93644fd fix 2024-05-04 22:32:22 +08:00
手瓜一十雪
a56b7ff636 fix 2024-05-04 22:26:36 +08:00
linyuchen
c724236930 fix: Get group member list no_cache 2024-05-04 22:09:46 +08:00
linyuchen
4853320b2b Update submodule 2024-05-04 22:02:08 +08:00
linyuchen
ba1acb6ac1 Merge remote-tracking branch 'origin/main' 2024-05-04 21:57:02 +08:00
linyuchen
f32a6320fc remove webapi get group members 2024-05-04 21:56:45 +08:00
手瓜一十雪
9f914ce36a change: toDo 2024-05-04 18:13:30 +08:00
手瓜一十雪
b037644e5a chore: release script 2024-05-03 21:51:42 +08:00
linyuchen
afd8c59f83 style: eslint 2024-05-03 21:34:16 +08:00
linyuchen
8aa4af3e91 Merge remote-tracking branch 'origin/main' 2024-05-03 21:29:30 +08:00
linyuchen
630a8a2b97 doc: update 2024-05-03 21:29:14 +08:00
手瓜一十雪
dc34c4d00c fix 2024-05-03 21:22:16 +08:00
linyuchen
fb42729dec doc: update 2024-05-03 21:06:50 +08:00
手瓜一十雪
b06989216a fix 2024-05-03 21:03:13 +08:00
手瓜一十雪
e5144f08cd fix 2024-05-03 21:00:17 +08:00
手瓜一十雪
c4a60190e8 fix 2024-05-03 20:44:04 +08:00
手瓜一十雪
efe9e4fa4c fix 2024-05-03 20:34:32 +08:00
Version
45800b1559 chore:version change 2024-05-03 12:29:17 +00:00
linyuchen
b0b2b8104f build: update core.lib 2024-05-03 20:27:46 +08:00
linyuchen
8dbc012825 Merge remote-tracking branch 'origin/main' 2024-05-03 20:26:55 +08:00
手瓜一十雪
a434176063 docs: change 2024-05-03 20:26:25 +08:00
linyuchen
a013f750c7 fix: Sync get_group_notice return structure to gocq 2024-05-03 20:24:25 +08:00
手瓜一十雪
aa1f49d02f build: 1.2.0-beta18 2024-05-03 20:16:37 +08:00
手瓜一十雪
7125a26309 update: appid 2024-05-03 20:13:08 +08:00
手瓜一十雪
329a35ebf0 docs: change 2024-05-03 18:06:05 +08:00
手瓜一十雪
d30043f595 build: 1.2.0-beta17 2024-05-03 16:59:10 +08:00
手瓜一十雪
745dfa1911 build: 1.2.0-beta16 2024-05-03 14:36:39 +08:00
手瓜一十雪
76203f49a7 fix 2024-05-03 14:06:23 +08:00
手瓜一十雪
870a915377 fix 2024-05-03 14:02:40 +08:00
linyuchen
c174fce227 chore: update submodule core 2024-05-03 13:04:49 +08:00
linyuchen
2b6e42e919 Merge remote-tracking branch 'origin/main' 2024-05-03 13:04:19 +08:00
linyuchen
df73e1e5a3 refactor: ordered onebot11.json keys 2024-05-03 13:04:02 +08:00
手瓜一十雪
3e902311d4 docs: change 2024-05-03 12:58:15 +08:00
linyuchen
64a0037265 update core.lib 2024-05-03 12:34:35 +08:00
linyuchen
bcd4e38093 Merge remote-tracking branch 'origin/main' 2024-05-03 12:32:04 +08:00
linyuchen
181a77d627 fix: Unset other admin notice not work 2024-05-03 12:31:35 +08:00
手瓜一十雪
b353595ba9 build: 1.2.0-beta15 2024-05-03 12:24:39 +08:00
linyuchen
75e3bb4f17 docs: update README.md 2024-05-03 11:12:36 +08:00
linyuchen
d2fa9192d4 chore: build core 2024-05-03 10:00:29 +08:00
linyuchen
4bcadc2de4 chore: build core 2024-05-03 09:59:25 +08:00
linyuchen
8ddff74260 update submodule core 2024-05-03 01:18:27 +08:00
linyuchen
95940fdb64 update core.lib 2024-05-03 01:01:05 +08:00
linyuchen
9cd5708948 feat: forward single msg
feat: statistic sent receive msg count by api get_status
2024-05-03 00:59:07 +08:00
linyuchen
d361683d79 Merge remote-tracking branch 'origin/main' 2024-05-02 23:29:35 +08:00
手瓜一十雪
9ad17a01f7 fix 2024-05-02 23:06:57 +08:00
手瓜一十雪
22ca1d443c fix 2024-05-02 23:05:14 +08:00
linyuchen
2662e875ca refactor: send music card
feat: send mface
2024-05-02 22:23:59 +08:00
手瓜一十雪
8ae0d07ec1 chore: sync core to core.lib 2024-05-02 21:42:13 +08:00
手瓜一十雪
76a9edb7f5 build: 1.2.0-beta14 2024-05-02 21:34:38 +08:00
手瓜一十雪
0ccb464e5b feat: add log 2024-05-02 21:26:14 +08:00
手瓜一十雪
bef600efa2 fix 2024-05-02 21:25:29 +08:00
手瓜一十雪
58a182cd33 docs: change 2024-05-02 20:55:54 +08:00
手瓜一十雪
aa43334f41 Build: 1.2.0-beta12 2024-05-02 20:47:29 +08:00
手瓜一十雪
a2a4c97f6c fix: sync core 2024-05-02 18:47:01 +08:00
手瓜一十雪
4217ba99fd build: 1.2.0-beta12 2024-05-02 18:33:52 +08:00
linyuchen
589725f5cc build: v1.2.0.beta11.修复linux图链 2024-05-02 18:23:44 +08:00
linyuchen
3fea4602f8 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	src/core
#	src/core.lib/src/adapters/NodeIDependsAdapter.js
#	src/core.lib/src/adapters/NodeIDispatcherAdapter.js
#	src/core.lib/src/adapters/NodeIGlobalAdapter.js
#	src/core.lib/src/adapters/index.js
#	src/core.lib/src/apis/file.js
#	src/core.lib/src/apis/friend.js
#	src/core.lib/src/apis/group.js
#	src/core.lib/src/apis/index.js
#	src/core.lib/src/apis/msg.js
#	src/core.lib/src/apis/sign.js
#	src/core.lib/src/apis/user.js
#	src/core.lib/src/apis/webapi.js
#	src/core.lib/src/apis/window.js
#	src/core.lib/src/core.js
#	src/core.lib/src/data.js
#	src/core.lib/src/entities/cache.js
#	src/core.lib/src/entities/constructor.js
#	src/core.lib/src/entities/group.js
#	src/core.lib/src/entities/index.js
#	src/core.lib/src/entities/msg.js
#	src/core.lib/src/entities/notify.js
#	src/core.lib/src/entities/user.js
#	src/core.lib/src/external/hook.js
#	src/core.lib/src/index.js
#	src/core.lib/src/listeners/NodeIKernelBuddyListener.js
#	src/core.lib/src/listeners/NodeIKernelFileAssistantListener.js
#	src/core.lib/src/listeners/NodeIKernelGroupListener.js
#	src/core.lib/src/listeners/NodeIKernelLoginListener.js
#	src/core.lib/src/listeners/NodeIKernelMsgListener.js
#	src/core.lib/src/listeners/NodeIKernelProfileListener.js
#	src/core.lib/src/listeners/NodeIKernelRobotListener.js
#	src/core.lib/src/listeners/NodeIKernelSessionListener.js
#	src/core.lib/src/listeners/NodeIKernelStorageCleanListener.js
#	src/core.lib/src/listeners/index.js
#	src/core.lib/src/services/common.js
#	src/core.lib/src/services/index.js
#	src/core.lib/src/sessionConfig.js
#	src/core.lib/src/utils/config.js
#	src/core.lib/src/utils/db.js
#	src/core.lib/src/wrapper.js
2024-05-02 18:20:52 +08:00
linyuchen
8ea6aae875 build: v1.2.0.beta11.修复linux图链 2024-05-02 18:17:41 +08:00
linyuchen
2c70b2af68 build: v1.2.0.beta11.修复linux图链 2024-05-02 18:17:33 +08:00
手瓜一十雪
54a2cbcb42 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-05-02 18:16:19 +08:00
手瓜一十雪
fdef821c60 style: lint 2024-05-02 18:16:03 +08:00
手瓜一十雪
dfa798a35d fix 2024-05-02 18:15:26 +08:00
手瓜一十雪
39b8eb6ff1 script: mail change 2024-05-02 18:13:32 +08:00
手瓜一十雪
6cf71f67a9 update: core.lib 2024-05-02 18:11:59 +08:00
手瓜一十雪
f2e919725e build: 1.2.0-beta11 2024-05-02 18:08:26 +08:00
linyuchen
869599126e Update README.md 2024-05-02 03:33:29 +08:00
linyuchen
3b1b200f6f Update README.md 2024-05-02 01:28:24 +08:00
linyuchen
93c646e3e4 Update README.md 2024-05-02 01:27:37 +08:00
手瓜一十雪
3552f80a21 fix 2024-05-01 23:56:43 +08:00
linyuchen
66d3a63998 build: v1.2.0.beta10 2024-05-01 19:12:30 +08:00
linyuchen
6447825978 build: v1.2.0.beta10 2024-05-01 18:48:47 +08:00
linyuchen
18b7df9fca feat: get_group_list, get_friend_list no_cache 2024-05-01 18:46:13 +08:00
linyuchen
c3781cab96 Merge remote-tracking branch 'origin/main' 2024-05-01 18:35:57 +08:00
linyuchen
776098dba6 fix: listener crash 2024-05-01 18:35:40 +08:00
linyuchen
8d1b4f61e7 fix: listener crash 2024-05-01 18:35:16 +08:00
手瓜一十雪
c13e2bdb96 build: 1.2.0-beta9 2024-05-01 17:24:32 +08:00
手瓜一十雪
4682254157 build: 1.2.0-beta.8 2024-05-01 16:14:13 +08:00
linyuchen
d7ca6b9213 refactor AsyncQueue 2024-05-01 16:04:23 +08:00
linyuchen
4a76afbde8 refactor AsyncQueue 2024-05-01 16:03:53 +08:00
手瓜一十雪
a68349c23a build: 1.2.0-beta 2024-05-01 14:18:36 +08:00
linyuchen
920e005366 build: v1.2.0.beta7 2024-05-01 12:22:48 +08:00
linyuchen
659f339020 build: v1.2.0.beta7 2024-05-01 12:19:50 +08:00
linyuchen
3ee2d463af Merge remote-tracking branch 'origin/main'
# Conflicts:
#	src/core
2024-05-01 12:18:07 +08:00
linyuchen
686ddb5460 优化rkey获取 2024-05-01 12:17:30 +08:00
linyuchen
e5d62488b7 优化rkey获取 2024-05-01 12:17:25 +08:00
linyuchen
eb93dd5005 fix: no_cache param of api get_group_list 2024-04-30 18:49:55 +08:00
手瓜一十雪
6999d02d2d fix 2024-04-30 12:11:28 +08:00
手瓜一十雪
790e2b1427 docs: change 2024-04-29 21:08:26 +08:00
手瓜一十雪
a29c7cdfe4 build: 1.2.0-beta 2024-04-29 20:53:52 +08:00
手瓜一十雪
6b7cd692a6 build: 1.2.0-beta 2024-04-29 20:50:50 +08:00
手瓜一十雪
4d3925872a fix 2024-04-29 20:49:31 +08:00
linyuchen
2bd0f6934a update core.lib 2024-04-29 20:35:22 +08:00
linyuchen
51783f17ed Merge remote-tracking branch 'origin/main' 2024-04-29 20:32:59 +08:00
linyuchen
ce3aef3526 update core.lib 2024-04-29 20:32:39 +08:00
手瓜一十雪
ee70afdfbb build: 1.2.0-beta 2024-04-29 20:22:30 +08:00
手瓜一十雪
d96c4a56a2 fix 2024-04-29 20:21:36 +08:00
手瓜一十雪
9a39513dea fix 2024-04-29 17:57:11 +08:00
手瓜一十雪
8f22d63315 build: 1.2.0-beta 2024-04-29 16:58:07 +08:00
手瓜一十雪
7f2a5bb95e fix 2024-04-29 16:46:16 +08:00
手瓜一十雪
0118dbd5fb fix 2024-04-29 16:21:21 +08:00
手瓜一十雪
09405de26c fix 2024-04-29 15:55:28 +08:00
手瓜一十雪
efa5ee0e57 fix 2024-04-29 15:48:50 +08:00
手瓜一十雪
80d558f37a fix 2024-04-29 15:37:12 +08:00
linyuchen
901adc3fc7 update submodule core ref 2024-04-29 15:17:41 +08:00
linyuchen
01417be954 refactor: optimize msg db 2024-04-29 15:17:24 +08:00
linyuchen
43b780cbe6 refactor: show quick login error 2024-04-29 11:46:03 +08:00
linyuchen
e83f36a12f refactor: show quick login error 2024-04-29 11:45:43 +08:00
linyuchen
77e3fc4ab0 refactor: get image url 2024-04-29 11:45:26 +08:00
linyuchen
eafd1adaba build: test music sign 2024-04-29 00:24:52 +08:00
linyuchen
6b53abb7c9 Merge remote-tracking branch 'origin/main' 2024-04-29 00:24:26 +08:00
linyuchen
f994c5d284 build: test music sign 2024-04-29 00:24:12 +08:00
手瓜一十雪
6fda220107 fix: typo 2024-04-29 00:14:50 +08:00
手瓜一十雪
da290ed1c3 fix: typo 2024-04-29 00:14:12 +08:00
手瓜一十雪
7e9cd80a1c fix 2024-04-29 00:13:39 +08:00
linyuchen
379b7413d8 refactor: music sign 2024-04-29 00:11:58 +08:00
linyuchen
9181a4df16 Merge remote-tracking branch 'origin/main' 2024-04-29 00:11:51 +08:00
linyuchen
df982afd51 refactor: music sign 2024-04-29 00:11:32 +08:00
手瓜一十雪
5c2c3b4317 build: 1.2.0-beta 2024-04-28 23:11:48 +08:00
手瓜一十雪
92d1309103 fix 2024-04-28 22:26:28 +08:00
手瓜一十雪
c43ee3c1d6 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-04-28 22:15:32 +08:00
手瓜一十雪
e0726e5283 fix 2024-04-28 21:58:23 +08:00
手瓜一十雪
5f3775584b fix 2024-04-28 21:55:22 +08:00
手瓜一十雪
77873d63c5 fix 2024-04-28 21:44:43 +08:00
手瓜一十雪
9e6b09765e fix 2024-04-28 21:43:41 +08:00
手瓜一十雪
1ad6ea4049 add: GetEssenceMsg 2024-04-28 21:43:15 +08:00
手瓜一十雪
7c41da1cb9 docs:change 2024-04-28 21:32:49 +08:00
linyuchen
adcf4bfc53 build: test prod 2024-04-28 21:05:30 +08:00
linyuchen
7a6321a9c1 Merge remote-tracking branch 'origin/main' 2024-04-28 21:03:11 +08:00
linyuchen
d56b27a7b0 build: test prod 2024-04-28 21:02:56 +08:00
手瓜一十雪
ed7657ab5f build: 1.2.0-beta 2024-04-28 20:55:24 +08:00
手瓜一十雪
a414838416 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-04-28 20:54:21 +08:00
手瓜一十雪
93646577dc fix:ref to main 2024-04-28 20:53:34 +08:00
linyuchen
46db66038e build: test core.lib 2024-04-28 20:49:54 +08:00
linyuchen
efc4e9ce56 build: pre-release 2024-04-28 20:40:37 +08:00
linyuchen
8d5eac7f80 Merge remote-tracking branch 'origin/main' 2024-04-28 20:39:33 +08:00
linyuchen
7b94e49b81 fix: log send msg group name 2024-04-28 20:39:16 +08:00
手瓜一十雪
c35fd4bdc8 build:test 2024-04-28 20:38:44 +08:00
手瓜一十雪
98590e2d90 fix 2024-04-28 20:36:52 +08:00
手瓜一十雪
e6da0e5dd5 fix 2024-04-28 20:36:30 +08:00
手瓜一十雪
cb2baf747d fix 2024-04-28 20:32:37 +08:00
手瓜一十雪
a2f2eb03ce Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-04-28 20:30:56 +08:00
手瓜一十雪
5c6acbb780 fix 2024-04-28 20:30:53 +08:00
linyuchen
1be7031199 update core 2024-04-28 19:46:09 +08:00
linyuchen
ed6399bde9 Merge remote-tracking branch 'origin/main' 2024-04-28 19:40:44 +08:00
linyuchen
6709893781 refactor: sent msg log 2024-04-28 19:40:28 +08:00
手瓜一十雪
686a426cda fix 2024-04-28 19:37:26 +08:00
linyuchen
4f90bc7813 refactor: sent msg log 2024-04-28 19:34:16 +08:00
linyuchen
e307b289ae Merge remote-tracking branch 'origin/main' 2024-04-28 18:54:03 +08:00
手瓜一十雪
3baeff61a7 chore: 新增手动打包测试 2024-04-28 18:44:32 +08:00
手瓜一十雪
93ab9d12ee fix 2024-04-28 18:42:04 +08:00
手瓜一十雪
36e1317792 fix 2024-04-28 18:32:12 +08:00
手瓜一十雪
fa3e90a021 fix 2024-04-28 18:23:59 +08:00
手瓜一十雪
782a69cf13 fix 2024-04-28 18:22:58 +08:00
linyuchen
d495f351c0 Merge remote-tracking branch 'origin/main' 2024-04-28 18:22:27 +08:00
linyuchen
30bd3d2d52 refactor: ws log 2024-04-28 18:22:17 +08:00
手瓜一十雪
ff5a21cca5 fix 2024-04-28 18:21:36 +08:00
linyuchen
f8abb73c92 refactor: get friends, get groups, get group members, get group member 2024-04-28 18:14:21 +08:00
linyuchen
e97f323d9a Update musicSignUrl to docs & onebot11 config 2024-04-28 13:08:56 +08:00
linyuchen
3d27a4c05d doc: typo 2024-04-28 12:58:34 +08:00
linyuchen
9dbc13dbe4 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	CHANGELOG.md
2024-04-28 12:57:38 +08:00
linyuchen
c46a4c75b1 feat: Music sign 2024-04-28 12:56:51 +08:00
手瓜一十雪
0bded73f16 fix 2024-04-28 12:50:24 +08:00
手瓜一十雪
1333733684 build: change 2024-04-28 12:49:04 +08:00
手瓜一十雪
003be934de fix 2024-04-28 12:40:43 +08:00
手瓜一十雪
93ef20d358 fix 2024-04-28 12:34:13 +08:00
手瓜一十雪
94e1a6f0ba fix 2024-04-28 12:30:03 +08:00
手瓜一十雪
8661d09d57 fix 2024-04-28 11:19:09 +08:00
手瓜一十雪
0e5e21dc4e fix 2024-04-28 10:13:39 +08:00
linyuchen
3b25c4987c Merge remote-tracking branch 'origin/main' 2024-04-28 09:18:26 +08:00
linyuchen
2212eb17aa optimize: send record msg error 2024-04-28 09:18:04 +08:00
手瓜一十雪
768bac1db8 fix: remove darwin build 2024-04-28 00:02:26 +08:00
手瓜一十雪
3aef75085f build: new 2024-04-27 23:51:09 +08:00
手瓜一十雪
ce8bef638a fix:token workflow 2024-04-27 23:50:34 +08:00
手瓜一十雪
f0a0c90304 feat:设置自身在线状态 2024-04-27 23:18:03 +08:00
手瓜一十雪
cd6c32b21d docs:CHANGELOG 2024-04-27 22:54:05 +08:00
手瓜一十雪
b31876d2d1 fix 2024-04-27 22:52:57 +08:00
手瓜一十雪
ebab8a190e fix 2024-04-27 22:10:54 +08:00
手瓜一十雪
1b7ce8e7a5 fix 2024-04-27 22:10:07 +08:00
linyuchen
646bb6bd79 doc: change log 2024-04-27 21:21:52 +08:00
linyuchen
5a84b97ca9 fix: first get image rkey 2024-04-27 21:15:24 +08:00
linyuchen
6d41b5a4a1 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	src/core
2024-04-27 21:07:32 +08:00
linyuchen
a8bce36f3b fix: first get image rkey 2024-04-27 21:06:58 +08:00
手瓜一十雪
ac2132f8ba fix 2024-04-27 20:50:28 +08:00
手瓜一十雪
cab4b57abe fix 2024-04-27 20:49:41 +08:00
手瓜一十雪
938fb30359 fix 2024-04-27 20:49:00 +08:00
linyuchen
62346d7d9d Merge remote-tracking branch 'origin/main' 2024-04-27 20:14:26 +08:00
linyuchen
cf1e5ca64b doc: changelog 2024-04-27 20:13:59 +08:00
手瓜一十雪
7d2d683d96 fix 2024-04-27 20:12:42 +08:00
手瓜一十雪
fe5042f1c3 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-04-27 20:11:53 +08:00
手瓜一十雪
a1dd76aee0 fix 2024-04-27 20:09:08 +08:00
linyuchen
d1c91be167 feat: 表情回应api和上报 2024-04-27 19:51:59 +08:00
linyuchen
9748d99f34 optimize: log 2024-04-27 19:21:54 +08:00
linyuchen
c90ffbeb62 refactor: config使用QQ号区分 2024-04-27 19:06:39 +08:00
linyuchen
eb7fafeabf optimize: 不支持的消息类型提示 2024-04-27 19:06:08 +08:00
linyuchen
3e50629462 optimize: log 2024-04-27 18:41:03 +08:00
linyuchen
65281a4554 optimize: log 2024-04-27 18:40:45 +08:00
手瓜一十雪
454ec09d6a fix 2024-04-27 17:58:00 +08:00
手瓜一十雪
60e3c6858d build: test 2024-04-27 17:53:31 +08:00
手瓜一十雪
f911f5b4fc fix:update win appid to 23159 2024-04-27 17:49:00 +08:00
手瓜一十雪
ad1694d291 fix 2024-04-27 17:42:28 +08:00
手瓜一十雪
1130965f26 fix 2024-04-27 17:41:49 +08:00
linyuchen
fe1f28998b fix: listener proxy 2024-04-27 17:05:43 +08:00
linyuchen
45727fce05 Merge remote-tracking branch 'origin/main' 2024-04-27 17:05:16 +08:00
linyuchen
d5c23e5add fix: listener proxy 2024-04-27 17:05:09 +08:00
linyuchen
e3a8285f6c fix: listener proxy 2024-04-27 17:04:53 +08:00
手瓜一十雪
a791221cf6 fix 2024-04-27 16:28:43 +08:00
手瓜一十雪
b954d9b403 fix 2024-04-27 16:05:59 +08:00
手瓜一十雪
5e7e24a271 chore: script move 2024-04-27 15:13:53 +08:00
手瓜一十雪
ffb1e598f6 fix 2024-04-27 15:06:59 +08:00
linyuchen
bc2da8a645 fix: log config 2024-04-27 12:20:28 +08:00
linyuchen
6f2be3ed30 fix: log config 2024-04-27 12:20:17 +08:00
linyuchen
033a7bffb3 refactor: log 2024-04-27 11:45:24 +08:00
linyuchen
f2b2ea61a1 refactor: core 2024-04-27 01:03:13 +08:00
linyuchen
6f0783acc4 refactor: core 2024-04-27 01:02:58 +08:00
linyuchen
ce60aa3823 Merge remote-tracking branch 'origin/main' 2024-04-27 00:53:01 +08:00
linyuchen
8075e70606 refactor: core 2024-04-27 00:51:10 +08:00
linyuchen
4402fc2d0a refactor: core 2024-04-27 00:50:08 +08:00
手瓜一十雪
3e3ecda551 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-04-26 22:56:49 +08:00
手瓜一十雪
50beb8f346 fix: Linux Script CRLF to LF 2024-04-26 22:56:38 +08:00
手瓜一十雪
8e033e3e06 fix 2024-04-26 22:53:46 +08:00
linyuchen
dc029a318b refactor: core addListener 2024-04-26 20:21:41 +08:00
手瓜一十雪
8e91bc2c8e fix 2024-04-26 18:46:12 +08:00
linyuchen
0ff5b4e90b refactor: core 2024-04-26 13:55:35 +08:00
手瓜一十雪
20dec19bfe Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-04-26 11:30:51 +08:00
手瓜一十雪
d261fbff26 fix 2024-04-26 11:30:05 +08:00
手瓜一十雪
6594b33bcc docs: change 2024-04-26 08:09:15 +08:00
linyuchen
a1bb6cc1b1 refactor: mface url 2024-04-26 00:16:36 +08:00
linyuchen
7ce195b68e Merge remote-tracking branch 'origin/main'
# Conflicts:
#	src/onebot11/index.ts
2024-04-25 22:11:10 +08:00
手瓜一十雪
16d8d04aaa fix 2024-04-25 20:40:32 +08:00
手瓜一十雪
59565f7d90 fix 2024-04-25 18:34:40 +08:00
手瓜一十雪
43784a2495 fix 2024-04-25 18:29:31 +08:00
手瓜一十雪
3811d7469e fix 2024-04-25 18:15:40 +08:00
手瓜一十雪
c72b40a1e1 fix 2024-04-25 18:15:03 +08:00
linyuchen
f00933969d refactor: get image rkey 2024-04-25 15:13:26 +08:00
linyuchen
759adc45e3 refactor: mark msg as read 2024-04-25 15:13:11 +08:00
linyuchen
27ecf78372 refactor: mark msg as read 2024-04-25 15:12:53 +08:00
手瓜一十雪
c91b83a7ba docs: change 2024-04-25 10:38:01 +08:00
手瓜一十雪
39373ee63a Merge pull request #8 from Fripine/feat/add_FriendAddNoticeEvent
feat: add FriendAddNoticeEvent
2024-04-25 10:27:01 +08:00
Fripine
2db64c69ae Update constructor.ts 2024-04-25 00:54:36 +08:00
linyuchen
a699b71c02 fix: check rkey 2024-04-24 21:05:51 +08:00
linyuchen
6c07d22cda Merge remote-tracking branch 'origin/main'
# Conflicts:
#	package.json
2024-04-24 21:04:34 +08:00
linyuchen
a2ee900ed5 fix: check rkey 2024-04-24 21:03:47 +08:00
Fripine
e709f31b99 Update constructor.ts 2024-04-24 19:19:36 +08:00
Fripine
35afb12756 Update constructor.ts 2024-04-24 18:48:03 +08:00
Fripine
9bed9fe162 Update constructor.ts 2024-04-24 17:47:01 +08:00
Fripine
4ff5553804 construct FriendAddEvent 2024-04-24 17:38:35 +08:00
Fripine
32213be7a7 add FriendAddEvent 2024-04-24 17:34:22 +08:00
Fripine
84894a73e1 Create OB11FriendAddNoticeEvent.ts 2024-04-24 17:32:31 +08:00
手瓜一十雪
b6ea185ce7 build: test 2024-04-24 15:31:51 +08:00
手瓜一十雪
814ac0f731 fix:package 2024-04-24 12:20:41 +08:00
手瓜一十雪
a40bb29da3 fix: build 2024-04-24 12:19:30 +08:00
手瓜一十雪
e9b90079c0 fix 2024-04-24 12:13:34 +08:00
手瓜一十雪
dba383c27e fix 2024-04-24 12:09:26 +08:00
手瓜一十雪
42059b5817 fix 2024-04-24 12:01:32 +08:00
手瓜一十雪
f92a17c01b fix 2024-04-24 12:00:13 +08:00
手瓜一十雪
d6552ce333 fix: native hook debug to release 2024-04-24 10:19:28 +08:00
手瓜一十雪
0db89bde5a docs: noify CQCode 2024-04-24 10:14:27 +08:00
手瓜一十雪
56a12185d4 Merge pull request #7 from initialencounter/patch-1
feat(onebot11):  Improve error handling in JSON parsing
2024-04-24 00:07:55 +08:00
风宝宝
c40170db5d feat(onebot11): Improve error handling in JSON parsing
发生错误直接被 catch 掉了,没有提示,[使用docker启动后,请求被重置](https://github.com/NapNeko/NapCat-Docker/issues/8)
2024-04-23 21:33:09 +08:00
linyuchen
1df3e9c414 doc: update 2024-04-23 18:58:51 +08:00
linyuchen
b1570df8b9 update core 2024-04-23 18:39:58 +08:00
linyuchen
023fd1ce36 Merge remote-tracking branch 'origin/main' 2024-04-23 18:38:44 +08:00
linyuchen
a7fe74bc0c fix: rkey 2024-04-23 18:38:13 +08:00
手瓜一十雪
26c9abd9da docs: rf install with build
移除编译安装教程 因不指定参数编译和下载到的一样 指定后编译需要编译环境 例如msvc/gcc
2024-04-21 19:17:22 +08:00
linyuchen
a5e34645c5 fix: ffmpeg path for video.ts 2024-04-20 08:21:48 +08:00
linyuchen
b2831c0a19 doc: update 2024-04-20 08:21:03 +08:00
linyuchen
648c1ea0f9 fix: reading qq version 2024-04-19 11:31:47 +08:00
linyuchen
9cd927e06a doc: update README.md 2024-04-19 10:28:20 +08:00
linyuchen
4272413f55 Merge remote-tracking branch 'origin/main' 2024-04-19 10:27:40 +08:00
linyuchen
e1711b7af6 doc: update README.md 2024-04-19 10:27:26 +08:00
Version
f7d3f27d45 chore:version change 2024-04-18 12:17:53 +00:00
linyuchen
3a7a47f82d style: eslint 2024-04-18 20:17:06 +08:00
linyuchen
cc211706d5 fix: check version catch 2024-04-18 20:10:09 +08:00
linyuchen
22f74be4cd try send markdown 2024-04-18 18:23:20 +08:00
linyuchen
5a00d14f94 Merge remote-tracking branch 'origin/main' 2024-04-18 17:44:06 +08:00
linyuchen
ecb4e7bf9f fix: ws token not work 2024-04-18 17:43:43 +08:00
linyuchen
56e5b546e1 Update README.md 2024-04-17 21:44:40 +08:00
linyuchen
272f5a2f4f Update README.md 2024-04-17 21:33:25 +08:00
linyuchen
ddcbe78a01 chore: release.yml 2024-04-17 18:40:49 +08:00
linyuchen
00b6c964e2 chore: release not need git submodule 2024-04-17 18:37:11 +08:00
linyuchen
d7d2b06ecc chore: change action token 2024-04-17 18:27:08 +08:00
Version
fafc59360d chore:version change 2024-04-17 09:50:56 +00:00
linyuchen
19e105785e update core 2024-04-17 17:38:02 +08:00
linyuchen
b87ac09e43 update core 2024-04-17 17:37:23 +08:00
linyuchen
af9092d7c7 fix: send forward msg 2024-04-17 17:35:14 +08:00
linyuchen
24a1ffd652 fix: http server cors 2024-04-17 17:06:24 +08:00
linyuchen
662813cc58 fix: postLoginStatus on error 2024-04-17 17:01:29 +08:00
linyuchen
d890b78290 refactor: auto_escape of send msg 2024-04-16 23:22:37 +08:00
linyuchen
58747d7d4a fix: delete group 2024-04-16 23:10:29 +08:00
linyuchen
0773a4f39c feat: Support post url params 2024-04-16 23:09:56 +08:00
linyuchen
66cc7f8a1f feat: http heart 2024-04-16 20:58:29 +08:00
linyuchen
01ab40bf4a Merge remote-tracking branch 'origin/main' 2024-04-16 20:28:26 +08:00
linyuchen
4c09147fd1 fix: cq code auto escape
fix: get groups no cache
2024-04-16 20:28:05 +08:00
手瓜一十雪
f9f426d788 build:friend history 2024-04-16 18:50:39 +08:00
手瓜一十雪
ff8fa1bf31 fix 2024-04-16 18:39:15 +08:00
手瓜一十雪
59f99e4f6a fix 2024-04-16 18:36:51 +08:00
手瓜一十雪
7449ce9c3b fix 2024-04-16 18:32:02 +08:00
手瓜一十雪
f6bc8f0a1f fix 2024-04-16 18:26:50 +08:00
手瓜一十雪
4d10b8cdee Revert "chore:version change"
This reverts commit 36ce3b08fe.
2024-04-16 14:13:22 +08:00
手瓜一十雪
5a61c5de09 limit:workflow 2024-04-16 14:10:31 +08:00
手瓜一十雪
f84d0db811 fix 2024-04-16 14:01:05 +08:00
Version
36ce3b08fe chore:version change 2024-04-16 05:57:37 +00:00
手瓜一十雪
da8ea5b545 Revert "chore:version change"
This reverts commit 034d12c347.
2024-04-16 13:57:04 +08:00
手瓜一十雪
fad3dbf4cd fix 2024-04-16 13:56:07 +08:00
Version
034d12c347 chore:version change 2024-04-16 05:54:20 +00:00
手瓜一十雪
c94dbf1d9a fix:workflow 2024-04-16 13:53:14 +08:00
手瓜一十雪
e516687a9e fix 2024-04-16 13:50:01 +08:00
手瓜一十雪
4a2f77b0a6 fix 2024-04-16 13:49:32 +08:00
手瓜一十雪
7b29ecba71 fix 2024-04-16 13:47:42 +08:00
手瓜一十雪
11241b8e07 Revert "chore:version change"
This reverts commit 52bbd1f20b.
2024-04-16 13:44:22 +08:00
Version
52bbd1f20b chore:version change 2024-04-16 05:42:48 +00:00
手瓜一十雪
4044750515 fix 2024-04-16 13:42:22 +08:00
手瓜一十雪
b670c546b9 Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-04-16 13:38:00 +08:00
手瓜一十雪
f37bbf93cb fix 2024-04-16 13:37:42 +08:00
linyuchen
87311ab41a Merge remote-tracking branch 'origin/main' 2024-04-16 13:28:15 +08:00
linyuchen
ecb4d1845c update core 2024-04-16 13:28:05 +08:00
手瓜一十雪
35c232ab25 fix 2024-04-16 13:27:33 +08:00
linyuchen
df0be2e251 Merge remote-tracking branch 'origin/main' 2024-04-16 13:25:25 +08:00
linyuchen
871b3a102b refactor: recall get_group_list if groups is empty 2024-04-16 13:25:12 +08:00
手瓜一十雪
02299e3892 fix 2024-04-16 13:17:30 +08:00
手瓜一十雪
6af4d6f5b8 fix 2024-04-16 13:14:09 +08:00
手瓜一十雪
4fb5700367 fix 2024-04-16 13:12:33 +08:00
手瓜一十雪
8579276381 fix 2024-04-16 13:10:07 +08:00
手瓜一十雪
7ba60b22c5 fix 2024-04-16 13:06:07 +08:00
linyuchen
031932f41c Merge remote-tracking branch 'origin/main' 2024-04-16 13:00:02 +08:00
linyuchen
079d0a89b1 fix: tsconfig path alias 2024-04-16 12:59:52 +08:00
手瓜一十雪
c4fdce6d64 fix 2024-04-16 12:55:16 +08:00
手瓜一十雪
5604c2b29f Merge branch 'main' of https://github.com/NapNeko/NapCatQQ 2024-04-16 12:55:05 +08:00
手瓜一十雪
74b5ab2b47 fix 2024-04-16 12:53:37 +08:00
linyuchen
c29cbfe123 Merge remote-tracking branch 'origin/main' 2024-04-16 12:51:42 +08:00
手瓜一十雪
6fe5cb1ffd remove 2024-04-16 12:51:12 +08:00
linyuchen
7edd5a7a8e Merge remote-tracking branch 'origin/main' 2024-04-16 12:50:22 +08:00
linyuchen
c1edc1b99b fix: Send empty forward msg 2024-04-16 12:50:14 +08:00
手瓜一十雪
4d1d890f72 fix 2024-04-16 12:47:36 +08:00
手瓜一十雪
fe0f82fa2b fix:checkVesion 2024-04-16 12:46:37 +08:00
手瓜一十雪
84083a65a8 fix:checkVesion 2024-04-16 12:45:07 +08:00
手瓜一十雪
fc91c6bc08 fix 2024-04-16 12:43:39 +08:00
467 changed files with 26287 additions and 8248 deletions

View File

@@ -15,7 +15,7 @@ charset = utf-8
# 2 space indentation
[*.{cjs,mjs,js,jsx,ts,tsx,css,scss,sass,html,json}]
indent_style = space
indent_size = 2
indent_size = 4
# Unfortunately, EditorConfig doesn't support space configuration inside import braces directly.
# You'll need to rely on your linter/formatter like ESLint or Prettier for that.

View File

@@ -1 +0,0 @@
VITE_BUILD_TYPE = Development

2
.env.framework Normal file
View File

@@ -0,0 +1,2 @@
VITE_BUILD_TYPE = Production
VITE_BUILD_PLATFORM = Framework

View File

@@ -1 +0,0 @@
VITE_BUILD_TYPE = Production

2
.env.shell Normal file
View File

@@ -0,0 +1,2 @@
VITE_BUILD_TYPE = Production
VITE_BUILD_PLATFORM = Shell

View File

@@ -1,67 +1,64 @@
module.exports = {
'env': {
'es2021': true,
'node': true
},
'ignorePatterns': ['src/core/', 'src/core.lib/'],
'extends': [
'eslint:recommended',
'plugin:@typescript-eslint/recommended'
],
'overrides': [
{
'env': {
'env': {
'browser': true,
'es2021': true,
'node': true
},
'files': [
'.eslintrc.{js,cjs}'
],
'parserOptions': {
'sourceType': 'script'
}
}
],
'parser': '@typescript-eslint/parser',
'parserOptions': {
'ecmaVersion': 'latest',
'sourceType': 'module'
},
'plugins': [
'@typescript-eslint',
'import'
],
'settings': {
'import/parsers': {
'@typescript-eslint/parser': ['.ts']
},
'import/resolver': {
'typescript': {
'alwaysTryTypes': true
}
'ignorePatterns': ['src/proto/'],
'extends': [
'eslint:recommended',
'plugin:@typescript-eslint/recommended'
],
'overrides': [
{
'env': {
'node': true
},
'files': [
'.eslintrc.{js,cjs}'
],
'parserOptions': {
'sourceType': 'script'
}
}
],
'parser': '@typescript-eslint/parser',
'parserOptions': {
'ecmaVersion': 'latest',
'sourceType': 'module'
},
'plugins': [
'@typescript-eslint',
'import'
],
'settings': {
'import/parsers': {
'@typescript-eslint/parser': ['.ts']
},
'import/resolver': {
'typescript': {
'alwaysTryTypes': true
}
}
},
'rules': {
'indent': [
'error',
4
],
'linebreak-style': [
'error',
'unix'
],
'semi': [
'error',
'always'
],
'no-unused-vars': 'off',
'no-async-promise-executor': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-unused-vars': 'off',
'@typescript-eslint/no-var-requires': 'off',
'object-curly-spacing': ['error', 'always'],
}
},
'rules': {
'indent': [
'error',
2
],
'linebreak-style': [
'error',
'unix'
],
'quotes': [
'error',
'single'
],
'semi': [
'error',
'always'
],
'no-unused-vars': 'off',
'no-async-promise-executor': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-unused-vars': 'off',
'@typescript-eslint/no-var-requires': 'off',
'object-curly-spacing': ['error', 'always'],
}
};

View File

@@ -1,67 +1,66 @@
name: "Build"
name: "Build Action"
on:
workflow_dispatch:
push:
branches:
- main
permissions: write-all
jobs:
build-linux:
Build-LiteLoader:
if: ${{ startsWith(github.event.head_commit.message, 'build:') }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
target_platform: [linux,darwin]
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
- name: Build NuCat Framework
run: |
npm i --arch=${{ matrix.target_arch }} --platform=${{ matrix.target_platform }}
npm run build:prod
npm i
npm run build:framework
cd dist
npm i --omit=dev --arch=${{ matrix.target_arch }} --platform=${{ matrix.target_platform }}
npm i --omit=dev
rm package-lock.json
cd ..
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: NapCat.${{ matrix.target_platform }}.${{ matrix.target_arch }}
name: NapCat.Framework
path: dist
build-win32:
Build-Shell:
if: ${{ startsWith(github.event.head_commit.message, 'build:') }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
target_platform: [win32]
target_arch: [x64]
steps:
- name: Clone Main Repository
uses: actions/checkout@v4
with:
repository: 'NapNeko/NapCatQQ'
submodules: true
ref: main
token: ${{ secrets.NAPCAT_BUILD }}
- name: Use Node.js 20.X
uses: actions/setup-node@v4
with:
node-version: 20.x
- name: Build NuCat Linux
- name: Build NuCat LiteLoader
run: |
npm i --arch=${{ matrix.target_arch }} --platform=${{ matrix.target_platform }}
npm run build:prod
npm i
npm run build:shell
cd dist
npm i --omit=dev --arch=${{ matrix.target_arch }} --platform=${{ matrix.target_platform }}
npm i --omit=dev
rm package-lock.json
cd ..
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: NapCat.${{ matrix.target_platform }}.${{ matrix.target_arch }}
name: NapCat.Shell
path: dist

View File

@@ -1,4 +1,4 @@
name: "release"
name: "Build Release"
on:
push:
@@ -14,6 +14,7 @@ jobs:
- name: Clone Repository
uses: actions/checkout@v4
with:
ref: main
token: ${{ secrets.GITHUB_TOKEN }}
- name: Extract version from tag
@@ -27,52 +28,46 @@ jobs:
- name: Check Version
run: |
ls
node ./script/checkVersion.js
node ./script/checkVersion.cjs
sh ./checkVersion.sh
build-linux:
Build-LiteLoader:
needs: [check-version]
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
target_platform: [linux,darwin]
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
- name: Build NuCat Framework
run: |
npm i --arch=${{ matrix.target_arch }} --platform=${{ matrix.target_platform }}
npm run build:prod
npm i
npm run build:framework
cd dist
npm i --omit=dev --arch=${{ matrix.target_arch }} --platform=${{ matrix.target_platform }}
npm i --omit=dev
cd ..
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: NapCat.${{ matrix.target_platform }}.${{ matrix.target_arch }}
name: NapCat.Framework
path: dist
build-win32:
Build-Shell:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
target_platform: [win32]
target_arch: [x64]
needs: [check-version]
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
@@ -80,22 +75,22 @@ jobs:
with:
node-version: 20.x
- name: Build NuCat Linux
- name: Build NuCat Shell
run: |
npm i --arch=${{ matrix.target_arch }} --platform=${{ matrix.target_platform }}
npm run build:prod
npm i
npm run build:shell
cd dist
npm i --omit=dev --arch=${{ matrix.target_arch }} --platform=${{ matrix.target_platform }}
npm i --omit=dev
cd ..
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: NapCat.${{ matrix.target_platform }}.${{ matrix.target_arch }}
name: NapCat.Shell
path: dist
release-napcat:
needs: [build-win32,build-linux]
needs: [Build-LiteLoader,Build-Shell]
runs-on: ubuntu-latest
steps:
- name: Download All Artifact
@@ -107,16 +102,22 @@ jobs:
base=$(basename "$dir")
zip -r "${base}.zip" "$dir"
done
- name: Extract version from tag
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
- name: Clone Changes Log
run: curl -o CHANGELOG.md https://fastly.jsdelivr.net/gh/NapNeko/NapCatQQ@main/docs/changelogs/CHANGELOG.v${{ env.VERSION }}.md
- name: Create Release Draft and Upload Artifacts
uses: softprops/action-gh-release@v1
with:
name: NapCat V0.0.0
token: ${{ secrets.NAPCAT_BUILD }}
name: NapCat V${{ env.VERSION }}
token: ${{ secrets.GITHUB_TOKEN }}
body_path: CHANGELOG.md
files: |
NapCat.win32.x64.zip
NapCat.linux.x64.zip
NapCat.linux.arm64.zip
NapCat.darwin.x64.zip
NapCat.darwin.arm64.zip
NapCat.Framework.zip
NapCat.Shell.zip
# NapCat.darwin.x64.zip
# NapCat.darwin.arm64.zip
draft: true

8
.gitignore vendored
View File

@@ -1,11 +1,11 @@
# Logs
# Develop
node_modules/
package-lock.json
pnpm-lock.yaml
out/
dist/
src/core.lib/common/
/src/core.lib/common/
/localdebug/
# Editor
.vscode/*
@@ -14,3 +14,5 @@ src/core.lib/common/
# Build
*.db
checkVersion.sh
bun.lockb

4
.gitmodules vendored
View File

@@ -1,4 +0,0 @@
[submodule "src/core"]
path = src/core
url = https://github.com/NapNeko/core.git
branch = master

10
.prettierrc.json Normal file
View File

@@ -0,0 +1,10 @@
{
"trailingComma": "es5",
"tabWidth": 4,
"semi": true,
"singleQuote": true,
"bracketSpacing": true,
"arrowParens": "always",
"printWidth": 120,
"endOfLine": "auto"
}

352
LICENSE
View File

@@ -1,21 +1,339 @@
MIT License
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (c) 2024 NapCatQQ
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
Preamble
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

169
README.md
View File

@@ -2,164 +2,33 @@
<img src="https://socialify.git.ci/NapNeko/NapCatQQ/image?description=1&language=1&logo=https%3A%2F%2Fraw.githubusercontent.com%2FNapNeko%2FNapCatQQ%2Fmain%2Flogo.png&name=1&stargazers=1&theme=Auto" alt="NapCatQQ" width="640" height="320" />
</div>
---
## 项目介绍
NapCatQQ 是现代化的基于 NTQQ 的 Bot 协议端实现。
NapCatQQ瞌睡猫QQ不准叫我NCQQ像睡着了一样在后台低占用运行的无头(没有界面)的NTQQ
## 项目优势
- [x] **多种启动方式**支持以无头、LiteLoader 插件、仅 QQ GUI 三种方式启动
- [x] **低占用**:无头模式占用资源极低,适合在服务器上运行
- [x] **WebUI**:自带 WebUI 支持,远程管理更加便捷
目前测试在 Windows 上表现优秀,最低可达只占用内存 **20M**左右
## 如何使用
由于 Linux 上的 QQ 图形依赖较多,会导致内存占用小高,大约 **100+M**,目前正在研究如何优化
可前往 [Release](https://github.com/NapNeko/NapCatQQ/releases/) 页面下载最新版本
具体占用会因人而异QQ 群、好友越多占用越高
**首次使用**请务必前往[官方文档](https://napneko.github.io/)查看使用教程。
## 下载
前往 Release 页面下载最新版本
## 启动
NapCat 是基于 官方NTQQ 实现的Bot框架因此先需要安装官方QQ**注意同个账号不能同时登录原版 QQ 和 NapCatQQ**
*如果没有安装 QQ 请往后翻查看安装方法*
修改 `config/onebot11.json`内容,并重名为 `onebot11_<你的QQ号>.json`,如`onebot11_1234567.json`
json 配置内容参数解释:
```json5
{
// 是否启用http服务如果启用可以通过http接口发送消息
"enableHttp": false,
// http服务端口
"httpPort": 3000,
// 是否启用正向websocket服务
"enableWs": false,
// 正向websocket服务端口
"wsPort": 3001,
// 是否启用反向websocket服务
"enableWsReverse": false,
// 反向websocket对接的地址, 如["ws://127.0.0.1:8080/onebot/v11/ws"]
"wsReverseUrls": [],
// 是否启用http上报服务
"enableHttpPost": false,
// http上报地址, 如["http://127.0.0.1:8080/onebot/v11/http"]
"httpPostUrls": [],
// http上报密钥可为空
"httpSecret": "",
// 消息上报格式array为消息组string为cq码字符串
"messagePostFormat": "array",
// 是否上报自己发送的消息
"reportSelfMessage": false,
// 是否开启调试模式开启后上报消息会携带一个raw字段为原始消息内容
"debug": false,
// 调用get_file接口时如果获取不到url则使用base64字段返回文件内容
"enableLocalFile2Url": true,
// ws心跳间隔单位毫秒
"heartInterval": 30000,
// access_token可以为空
"token": ""
}
```
### Windows 启动
运行`powershell ./napcat.ps1`, 或者 `napcat.bat`,如果出现乱码,可以尝试运行`napcat-utf8.ps1``napcat-utf8.bat`
*如果出现 powershell 运行不了,以管理员身份打开 powershell输入 `Set-ExecutionPolicy RemoteSigned`*
### Linux 启动
运行`napcat.sh`
## 使用无需扫码快速登录
前提是你已经成功登录过QQ可以加参数` -q <你的QQ>` 进行登录,如`napcat.sh -q 1234567`
## 安装
### Linux安装
#### 安装 Linux QQ(22741),已经安装了的可以跳过
目前还在研究怎么精简安装暂时只能安装官方QQ整体依赖
下载QQ
[deb x86版本](https://dldir1.qq.com/qqfile/qq/QQNT/Linux/QQ_3.2.7_240403_amd64_01.deb)
[deb arm版本](https://dldir1.qq.com/qqfile/qq/QQNT/Linux/QQ_3.2.7_240403_arm64_01.deb)
[rpm x86版本](https://dldir1.qq.com/qqfile/qq/QQNT/Linux/QQ_3.2.7_240403_x86_64_01.rpm)
[rpm arm版本](https://dldir1.qq.com/qqfile/qq/QQNT/Linux/QQ_3.2.7_240403_aarch64_01.rpm)
```bash
sudo apt install ./qq.deb
```
```bash
安装QQ的依赖
sudo apt install libgbm1 libasound2
```
### Windows 安装
#### 安装Windows QQ(22741),已经安装了的可以跳过
[Windows版本QQ下载](https://dldir1.qq.com/qqfile/qq/QQNT/Windows/QQ_9.9.9_240403_x64_01.exe)
### 编译安装 NapCat
**如果你是直接下载编译好的版本,可以跳过这一步**
准备环境 [node18.18](https://nodejs.org/download/release/v18.18.2/)
```
export NODE_ENV=production
npm install
```
## 常见问题
### 二维码无法扫描
NapCat 会自动保存二维码到目录,可以手动打开图片扫描
如果没有条件访问本地目录,可以将二维码解析的 url 复制到二维码生成网站上生成二维码然后手机QQ扫描
### 语音、视频发送失败
需要配置 ffmpeg将 ffmpeg 目录加入环境变量,如果仍未生效,可以修改 napcat 启动脚本加入 FFMPEG_PATH 变量指定到 ffmpeg
程序的完整路径
如 Windows 上修改 napcat.ps1在第一行加入
```powershell
$env:FFMPEG_PATH="d:\ffmpeg\bin\ffmpeg.exe"
```
### 出现 error code v2:-1 之类的提示
不用管,这是正常现象,是因为 QQ 本身的问题,不影响使用
## API 文档
参考 [LLOneBot](https://llonebot.github.io/zh-CN/develop/api) 的文档
<!--
QQ群545402644
-->
## 声明
* 请不要在无关地方宣传NapCatQQ本项目只是用于学习 node 相关知识,切勿用于违法用途
* NapCat 不会收集用户隐私信息,但是未来可能会为了更好的利于 NapCat 的优化会收集一些设备信息,如 cpu 架构,系统版本等
## 相关链接
[TG群](https://t.me/+nLZEnpne-pQ1OWFl)
[Telegram Link](https://t.me/+nLZEnpne-pQ1OWFl)
## 鸣谢名单
[OpenShamrock]()
感谢 [LLOneBot](https://github.com/LLOneBot/LLOneBot) 提供初始版本基础
[Lagrange]()
感谢 [Lagrange](https://github.com/LagrangeDev/Lagrange.Core) 对本项目的大力支持
---
## 使用许可
任何使用本仓库代码的地方,都应当严格遵守[本仓库开源许可](./LICENSE)。**此外,禁止任何项目未经授权二次分发或基于 [core](./src/core) 部分代码开发。**

33
manifest.json Normal file
View File

@@ -0,0 +1,33 @@
{
"manifest_version": 4,
"type": "extension",
"name": "NapCat",
"slug": "NapCat",
"description": "现代化的 OneBot 11 协议实现",
"version": "2.0.13",
"icon": "./logo.png",
"authors": [
{
"name": "MliKiowa",
"link": "https://github.com/MliKiowa"
},
{
"name": "Young",
"link": "https://github.com/Wesley-Young"
}
],
"repository": {
"repo": "NapNeko/NapCatQQ",
"branch": "main"
},
"platform": [
"win32",
"linux",
"darwin"
],
"injects": {
"renderer": "./renderer.js",
"main": "./liteloader.cjs",
"preload": "./preload.cjs"
}
}

View File

@@ -1,63 +1,65 @@
{
"name": "napcat",
"private": true,
"type": "module",
"version": "1.0.2",
"scripts": {
"watch:dev": "vite --mode development",
"watch:prod": "vite --mode production",
"build:dev": "vite build --mode development",
"build:prod": "vite build --mode production",
"build": "npm run build:dev",
"build:core": "cd ./src/core && vite build --mode production",
"watch": "npm run watch:dev",
"debug-win": "powershell dist/napcat.ps1",
"lint": "eslint --fix src/**/*.{js,ts}",
"release": "npm run build:prod",
"depend": "cd dist && npm install --omit=dev"
},
"devDependencies": {
"@log4js-node/log4js-api": "^1.0.2",
"@rollup/plugin-commonjs": "^25.0.7",
"@rollup/plugin-node-resolve": "^15.2.3",
"@rollup/plugin-typescript": "^11.1.6",
"@types/express": "^4.17.21",
"@types/figlet": "^1.5.8",
"@types/fluent-ffmpeg": "^2.1.24",
"@types/node": "^20.11.30",
"@types/qrcode-terminal": "^0.12.2",
"@types/uuid": "^9.0.8",
"@types/ws": "^8.5.10",
"@typescript-eslint/eslint-plugin": "^7.4.0",
"@typescript-eslint/parser": "^7.4.0",
"eslint": "^8.57.0",
"eslint-import-resolver-typescript": "^3.6.1",
"eslint-plugin-import": "^2.29.1",
"i": "^0.3.7",
"javascript-obfuscator": "^4.1.0",
"protobufjs-cli": "^1.1.2",
"rollup": "^4.13.2",
"rollup-plugin-dts": "^6.1.0",
"rollup-plugin-obfuscator": "^1.1.0",
"typescript": "^5.3.3",
"vite": "^5.2.6",
"vite-plugin-cp": "^4.0.8",
"vite-plugin-dts": "^3.8.2",
"vite-tsconfig-paths": "^4.3.2"
},
"dependencies": {
"commander": "^12.0.0",
"express": "^5.0.0-beta.2",
"file-type": "^19.0.0",
"fluent-ffmpeg": "^2.1.2",
"image-size": "^1.1.1",
"log4js": "^6.9.1",
"protobufjs": "^7.2.6",
"qrcode-terminal": "^0.12.0",
"silk-wasm": "^3.3.4",
"sqlite3": "^5.1.7",
"uuid": "^9.0.1",
"ws": "^8.16.0",
"yaml": "^2.4.1"
}
}
{
"name": "napcat",
"private": true,
"type": "module",
"version": "2.0.13",
"scripts": {
"build:framework": "vite build --mode framework",
"build:shell": "vite build --mode shell",
"build:webui": "cd ./src/webui && vite build",
"lint": "eslint --fix src/**/*.{js,ts}",
"depend": "cd dist && npm install --omit=dev"
},
"devDependencies": {
"@babel/core": "^7.24.7",
"@babel/plugin-proposal-class-properties": "^7.18.6",
"@babel/plugin-proposal-decorators": "^7.24.7",
"@babel/preset-typescript": "^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",
"@types/express": "^4.17.21",
"@types/figlet": "^1.5.8",
"@types/fluent-ffmpeg": "^2.1.24",
"@types/jest": "^29.5.12",
"@types/node": "^22.0.1",
"@types/qrcode-terminal": "^0.12.2",
"@types/ws": "^8.5.12",
"@typescript-eslint/eslint-plugin": "^7.4.0",
"@typescript-eslint/parser": "^7.4.0",
"eslint": "^8.57.0",
"eslint-import-resolver-typescript": "^3.6.1",
"eslint-plugin-import": "^2.29.1",
"i": "^0.3.7",
"javascript-obfuscator": "^4.1.0",
"rollup": "^4.13.2",
"rollup-plugin-dts": "^6.1.0",
"rollup-plugin-obfuscator": "^1.1.0",
"typescript": "^5.3.3",
"vite": "^5.2.6",
"vite-plugin-babel": "^1.2.0",
"vite-plugin-cp": "^4.0.8",
"vite-plugin-dts": "^3.8.2",
"vite-tsconfig-paths": "^4.3.2"
},
"dependencies": {
"ajv": "^8.13.0",
"async-mutex": "^0.5.0",
"chalk": "^5.3.0",
"commander": "^12.1.0",
"cors": "^2.8.5",
"express": "^5.0.0-beta.2",
"fast-xml-parser": "^4.3.6",
"file-type": "^19.0.0",
"fluent-ffmpeg": "^2.1.2",
"image-size": "^1.1.1",
"json-schema-to-ts": "^3.1.0",
"log4js": "^6.9.1",
"qrcode-terminal": "^0.12.0",
"silk-wasm": "^3.6.1",
"strtok3": "8.0.1",
"ws": "^8.18.0"
}
}

45
script/BootWay.03.ps1 Normal file
View File

@@ -0,0 +1,45 @@
# Dont Use This Script
# 2024.7.3
function Get-QQpath {
try {
$key = Get-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ"
$uninstallString = $key.UninstallString
return [System.IO.Path]::GetDirectoryName($uninstallString) + "\QQ.exe"
}
catch {
throw "get QQ path error: $_"
}
}
function Select-QQPath {
Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()
$dialogTitle = "Select QQ.exe"
$filePicker = New-Object System.Windows.Forms.OpenFileDialog
$filePicker.Title = $dialogTitle
$filePicker.Filter = "Executable Files (*.exe)|*.exe|All Files (*.*)|*.*"
$filePicker.FilterIndex = 1
$null = $filePicker.ShowDialog()
if (-not ($filePicker.FileName)) {
throw "User did not select an .exe file."
}
return $filePicker.FileName
}
$params = $args -join " "
Try {
$QQpath = Get-QQpath
}
Catch {
$QQpath = Select-QQPath
}
if (!(Test-Path $QQpath)) {
throw "provided QQ path is invalid: $QQpath"
}
$Bootfile = Join-Path $PSScriptRoot "napcat.mjs"
$env:ELECTRON_RUN_AS_NODE = 1
$commandInfo = Get-Command $QQpath -ErrorAction Stop
Start-Process powershell -ArgumentList "-noexit", "-noprofile", "-command &{& chcp 65001;& '$($commandInfo.Path)' --enable-logging }"

90
script/BootWay05.bat Normal file
View File

@@ -0,0 +1,90 @@
@echo off
REM 检查当前会话是否具有管理员权限
openfiles >nul 2>&1
if %errorlevel% neq 0 (
REM 如果不是管理员,则重新启动脚本以管理员模式运行
echo 请求管理员权限...
powershell -Command "Start-Process cmd -ArgumentList '/c %~f0 %*' -Verb RunAs"
exit /b
)
REM 设置当前工作目录
cd /d %~dp0
REM 获取当前目录路径
set currentPath=%cd%
set currentPath=%currentPath:\=/%
REM 生成JavaScript代码
set "jsCode=(async () =^>await import('file:///%currentPath%/napcat.mjs'))();"
REM 将JavaScript代码保存到文件中
echo %jsCode% > loadScript.js
echo JavaScript code has been generated and saved to loadScript.js
REM 设置NAPCAT_PATH环境变量为 当前目录的loadScript.js地址
set NAPCAT_PATH=%cd%\loadScript.js
REM 获取QQ路径
:loop_read
for /f "tokens=2*" %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ" /v "UninstallString"') do (
set RetString=%%b
goto :napcat_boot
)
:napcat_boot
for %%a in (%RetString%) do (
set "pathWithoutUninstall=%%~dpa"
)
SET QQPath=%pathWithoutUninstall%QQ.exe
REM 拿不到QQ路径则退出
if not exist "%QQpath%" (
echo provided QQ path is invalid: %QQpath%
pause
exit /b
)
REM 收集dbghelp.dll路径和HASH信息
set QQdir=%~dp0
set oldDllPath=%QQdir%dbghelp.dll
set newDllPath=%currentPath%\dbghelp.dll
for /f "tokens=*" %%A in ('certutil -hashfile "%oldDllPath%" MD5') do (
if not defined oldDllHash set oldDllHash=%%A
)
for /f "tokens=*" %%A in ('certutil -hashfile "%newDllPath%" MD5') do (
if not defined newDllHash set newDllHash=%%A
)
REM 如果文件一致则跳过
if "%oldDllHash%" neq "%newDllHash%" (
tasklist /fi "imagename eq QQ.exe" 2>nul | find /i "QQ.exe" >nul
if %errorlevel% equ 0 (
REM 文件占用则退出
echo dbghelp.dll is in use, cannot continue.
) else (
REM 文件未占用则尝试覆盖
copy /y "%newDllPath%" "%oldDllPath%"
if %errorlevel% neq 0 (
echo Failed to copy dbghelp.dll
pause
exit /b
) else (
echo dbghelp.dll has been copied to %QQdir%
)
)
)
REM 带参数启动QQ
REM 判断wt是否存在存在则通过wt启动不存在则通过cmd启动
REM %QQPath% --enable-logging %*
where wt >nul 2>nul
if %errorlevel% equ 0 (
wt "cmd" /c "%QQPath%" --enable-logging %*
) else (
"%QQPath%" --enable-logging %*
)

123
script/BootWay05.ps1 Normal file
View File

@@ -0,0 +1,123 @@
# 检查当前会话是否具有管理员权限
function Test-Administrator {
$user = [Security.Principal.WindowsIdentity]::GetCurrent()
(New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}
if (-not (Test-Administrator)) {
# 如果不是管理员,则重新启动脚本以管理员模式运行
$scriptPath = $myInvocation.MyCommand.Path
if (-not $scriptPath) {
$scriptPath = $PSCommandPath
}
$newProcess = New-Object System.Diagnostics.ProcessStartInfo "powershell";
$newProcess.Arguments = "-File `"$scriptPath`" $args"
$newProcess.Verb = "runas";
[System.Diagnostics.Process]::Start($newProcess);
exit
}
function Get-QQpath {
try {
$key = Get-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ"
$uninstallString = $key.UninstallString
return [System.IO.Path]::GetDirectoryName($uninstallString) + "\QQ.exe"
}
catch {
throw "get QQ path error: $_"
}
}
function Select-QQPath {
Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()
$dialogTitle = "Select QQ.exe"
$filePicker = New-Object System.Windows.Forms.OpenFileDialog
$filePicker.Title = $dialogTitle
$filePicker.Filter = "Executable Files (*.exe)|*.exe|All Files (*.*)|*.*"
$filePicker.FilterIndex = 1
$null = $filePicker.ShowDialog()
if (-not ($filePicker.FileName)) {
throw "User did not select an .exe file."
}
return $filePicker.FileName
}
# 设置当前工作目录
$scriptDirectory = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
Set-Location $scriptDirectory
# 获取当前目录路径
$currentPath = Get-Location
# 替换\为/
$currentPath = $currentPath -replace '\\', '/'
# 生成JavaScript代码
$jsCode = @"
(async () => {
await import('file:///$currentPath/napcat.mjs');
})();
"@
# 将JavaScript代码保存到文件中
$jsFilePath = Join-Path $currentPath "loadScript.js"
$jsCode | Out-File -FilePath $jsFilePath -Encoding UTF8
Write-Output "JavaScript code has been generated and saved to $jsFilePath"
# 设置NAPCAT_PATH环境变量为 当前目录的loadScript.js地址
$env:NAPCAT_PATH = $jsFilePath
$params = $args -join " "
Try {
$QQpath = Get-QQpath
}
Catch {
$QQpath = Select-QQPath
}
# 拿不到QQ路径则退出
if (!(Test-Path $QQpath)) {
Write-Output "provided QQ path is invalid: $QQpath"
Read-Host "Press any key to continue..."
exit
}
$commandInfo = Get-Command $QQpath -ErrorAction Stop
# 收集dbghelp.dll路径和HASH信息
$QQpath = Split-Path $QQpath
$oldDllPath = Join-Path $QQpath "dbghelp.dll"
$oldDllHash = Get-FileHash $oldDllPath -Algorithm MD5
$newDllPath = Join-Path $currentPath "dbghelp.dll"
$newDllHash = Get-FileHash $newDllPath -Algorithm MD5
# 如果文件一致则跳过
if ($oldDllHash.Hash -ne $newDllHash.Hash) {
$processes = Get-Process -Name QQ -ErrorAction SilentlyContinue
if ($processes) {
# 文件占用则退出
Write-Output "dbghelp.dll is in use by the following processes:"
$processes | ForEach-Object { Write-Output "$($_.Id) $($_.Name) $($_.Path)" }
Write-Output "dbghelp.dll is in use, cannot continue."
Read-Host "Press any key to continue..."
exit
} else {
# 文件未占用则尝试覆盖
try {
Copy-Item -Path "$newDllPath" -Destination "$oldDllPath" -Force
Write-Output "dbghelp.dll has been copied to $QQpath"
} catch {
Write-Output "Failed to copy dbghelp.dll: $_"
Read-Host "Press any key to continue..."
exit
}
}
}
# 带参数启动QQ
try {
Start-Process powershell -ArgumentList '-noexit', '-noprofile', "-command &{& chcp 65001;& '$($commandInfo.Path)' --enable-logging $params}" -NoNewWindow -ErrorAction Stop
} catch {
Write-Output "Failed to start process as administrator: $_"
Read-Host "Press any key to continue..."
}

93
script/BootWay05.utf8.bat Normal file
View File

@@ -0,0 +1,93 @@
@echo off
REM 检查当前会话是否具有管理员权限
openfiles >nul 2>&1
if %errorlevel% neq 0 (
REM 如果不是管理员,则重新启动脚本以管理员模式运行
echo 请求管理员权限...
where wt >nul 2>nul
if %errorlevel% equ 0 (
powershell -Command "Start-Process cmd -ArgumentList ' /c %~f0 %*' -Verb RunAs"
) else (
powershell -Command "Start-Process wt -ArgumentList 'cmd /c %~f0 %*' -Verb RunAs"
)
REM wt "cmd" /c "%~f0 %*"
exit /b
)
REM 设置当前工作目录
cd /d %~dp0
REM 获取当前目录路径
set currentPath=%cd%
set currentPath=%currentPath:\=/%
REM 生成JavaScript代码
set "jsCode=(async () =^>await import('file:///%currentPath%/napcat.mjs'))();"
REM 将JavaScript代码保存到文件中
echo %jsCode% > loadScript.js
echo JavaScript code has been generated and saved to loadScript.js
REM 设置NAPCAT_PATH环境变量为 当前目录的loadScript.js地址
set NAPCAT_PATH=%cd%\loadScript.js
REM 获取QQ路径
:loop_read
for /f "tokens=2*" %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ" /v "UninstallString"') do (
set RetString=%%b
goto :napcat_boot
)
:napcat_boot
for %%a in (%RetString%) do (
set "pathWithoutUninstall=%%~dpa"
)
SET QQPath=%pathWithoutUninstall%QQ.exe
REM 拿不到QQ路径则退出
if not exist "%QQpath%" (
echo provided QQ path is invalid: %QQpath%
pause
exit /b
)
REM 收集dbghelp.dll路径和HASH信息
set QQdir=%~dp0
set oldDllPath=%QQdir%dbghelp.dll
set newDllPath=%currentPath%\dbghelp.dll
for /f "tokens=*" %%A in ('certutil -hashfile "%oldDllPath%" MD5') do (
if not defined oldDllHash set oldDllHash=%%A
)
for /f "tokens=*" %%A in ('certutil -hashfile "%newDllPath%" MD5') do (
if not defined newDllHash set newDllHash=%%A
)
REM 如果文件一致则跳过
if "%oldDllHash%" neq "%newDllHash%" (
tasklist /fi "imagename eq QQ.exe" 2>nul | find /i "QQ.exe" >nul
if %errorlevel% equ 0 (
REM 文件占用则退出
echo dbghelp.dll is in use, cannot continue.
) else (
REM 文件未占用则尝试覆盖
copy /y "%newDllPath%" "%oldDllPath%"
if %errorlevel% neq 0 (
echo Failed to copy dbghelp.dll
pause
exit /b
) else (
echo dbghelp.dll has been copied to %QQdir%
)
)
)
REM 带参数启动QQ
REM 判断wt是否存在存在则通过wt启动不存在则通过cmd启动
REM %QQPath% --enable-logging %*
chcp 65001
"%QQPath%" --enable-logging %*

77
script/BootWay05_init.bat Normal file
View File

@@ -0,0 +1,77 @@
@echo off
REM Check if the script is running as administrator
openfiles >nul 2>&1
if %errorlevel% neq 0 (
REM If not, restart the script in administrator mode
echo Requesting administrator privileges...
powershell -Command "Start-Process cmd -ArgumentList '/c %~f0 %*' -Verb RunAs"
exit /b
)
cd /d %~dp0
set currentPath=%cd%
set currentPath=%currentPath:\=/%
REM Generate JavaScript code
set "jsCode=(async () =^>await import('file:///%currentPath%/napcat.mjs'))();"
REM Save JavaScript code to a file
echo %jsCode% > loadScript.js
echo JavaScript code has been generated and saved to loadScript.js
REM Set NAPCAT_PATH environment variable to the address of loadScript.js in the current directory
set NAPCAT_PATH=%cd%\loadScript.js
REM Get QQ path and cache it
:loop_read
for /f "tokens=2*" %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ" /v "UninstallString"') do (
set "RetString=%%b"
)
set "pathWithoutUninstall=%RetString:Uninstall.exe=%"
SET QQPath=%pathWithoutUninstall%QQ.exe
echo %QQPath%>qq_path_cache.txt
echo QQ path %QQPath% has been cached to qq_path_cache.txt
REM Exit if QQ path is invalid
if not exist "%QQpath%" (
echo provided QQ path is invalid: %QQpath%
pause
exit /b
)
REM Collect dbghelp.dll path and HASH information
set QQdir=%~dp0
set oldDllPath=%QQdir%dbghelp.dll
set newDllPath=%currentPath%\dbghelp.dll
for /f "tokens=*" %%A in ('certutil -hashfile "%oldDllPath%" MD5') do (
if not defined oldDllHash set oldDllHash=%%A
)
for /f "tokens=*" %%A in ('certutil -hashfile "%newDllPath%" MD5') do (
if not defined newDllHash set newDllHash=%%A
)
REM Compare the HASH of the old and new dbghelp.dll, and replace the old one if they are different
if "%oldDllHash%" neq "%newDllHash%" (
tasklist /fi "imagename eq QQ.exe" 2>nul | find /i "QQ.exe" >nul
if %errorlevel% equ 0 (
REM If the file is in use, prompt the user to close QQ
echo dbghelp.dll is in use, please close QQ first.
) else (
copy /y "%newDllPath%" "%oldDllPath%"
if %errorlevel% neq 0 (
echo Copy dbghelp.dll failed, please check and try again.
pause
exit /b
) else (
echo dbghelp.dll has been updated.
echo Please run BootWay05_run.bat to start QQ.
echo If you update QQ in the future, please run BootWay05_init.bat again.
pause
exit /b
)
)
)

10
script/BootWay05_run.bat Normal file
View File

@@ -0,0 +1,10 @@
@echo off
set /p QQPath=<qq_path_cache.txt
echo QQ path %QQPath% has been read from qq_path_cache.txt
echo If failed to start QQ, please try running this script in administrator mode.
set NAPCAT_PATH=%cd%\loadScript.js
REM Launch QQ.exe with params provided
"%QQPath%" --enable-logging %*

View File

@@ -0,0 +1,13 @@
@echo off
chcp 65001
set /p QQPath=<qq_path_cache.txt
echo QQ path %QQPath% has been read from qq_path_cache.txt
echo If failed to start QQ, please try running this script in administrator mode.
set NAPCAT_PATH=%cd%\loadScript.js
REM Launch QQ.exe with params provided
"%QQPath%" --enable-logging %*

42
script/checkVersion.cjs Normal file
View File

@@ -0,0 +1,42 @@
const fs = require("fs");
const process = require("process");
console.log("[NapCat] [CheckVersion] 开始检测当前仓库版本...");
try {
const packageJson = require("../package.json");
const currentVersion = packageJson.version;
const targetVersion = process.env.VERSION;
console.log("[NapCat] [CheckVersion] currentVersion:", currentVersion, "targetVersion:", targetVersion);
// 验证 targetVersion 格式
if (!targetVersion || typeof targetVersion !== 'string') {
console.log("[NapCat] [CheckVersion] 目标版本格式不正确或未设置!");
return;
}
// 写入脚本文件的统一函数
const writeScriptToFile = (content) => {
fs.writeFileSync("./checkVersion.sh", content, { flag: 'w' });
console.log("[NapCat] [CheckVersion] checkVersion.sh 文件已更新。");
};
if (currentVersion === targetVersion) {
// 不需要更新版本,写入一个简单的脚本
const simpleScript = "#!/bin/bash\necho \"CheckVersion Is Done\"";
writeScriptToFile(simpleScript);
} else {
// 更新版本构建安全的sed命令
const safeScriptContent = `
#!/bin/bash
git config --global user.email "bot@test.wumiao.wang"
git config --global user.name "Version"
sed -i "s/\\\"version\\\": \\\"${currentVersion}\\\"/\\\"version\\\": \\\"${targetVersion}\\\"/g" package.json
git add .
git commit -m "chore:version change"
git push -u origin main`;
writeScriptToFile(safeScriptContent);
}
} catch (error) {
console.log("[NapCat] [CheckVersion] 检测过程中发生错误:", error);
}

View File

@@ -1,16 +0,0 @@
let fs = require("fs");
let process = require("process")
console.log("[NapCat] [CheckVersion] 开始检测当前仓库版本...");
let currentVersion = require("./package.json").version;
let targetVersion = process.env.VERSION;
console.log("[NapCat] [CheckVersion] currentVersion:", currentVersion, " targetVersion:", targetVersion);
// 借用dist目录输出脚本
fs.mkdir("./dist");
if (currentVersion === targetVersion) {
fs.appendFileSync("./checkVersion.sh", "#!/bin/bashe\necho \"CheckVersion Is Done\"")
} else {
let packageJson = JSON.parse(fs.readFileSync("./package.json"));
packageJson.version = targetVersion;
fs.writeFileSync("./package.json", JSON.stringify(packageJson));
fs.appendFileSync("./checkVersion.sh", "#!/bin/bashe\ngit add .\n git commit -m \"chore:version change\"\n git push")
}

BIN
script/dbghelp.dll Normal file

Binary file not shown.

View File

@@ -1,15 +0,0 @@
function Get-QQpath {
try {
$key = Get-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ"
$uninstallString = $key.UninstallString
return [System.IO.Path]::GetDirectoryName($uninstallString) + "\QQ.exe"
}
catch {
throw "Error getting UninstallString: $_"
}
}
$params = $args -join " "
$QQpath = Get-QQpath
$Bootfile = Join-Path (Get-Location) "\dist\inject.cjs"
$env:ELECTRON_RUN_AS_NODE = 1
Start-Process powershell -ArgumentList "-noexit", "-noprofile", "-command &{& '$QQpath' --expose-gc $Bootfile $params}"

View File

@@ -1,21 +0,0 @@
import fs from 'fs'
import path from 'path'
import { version } from '../src/onebot11/version'
const manifestPath = path.join(__dirname, '../package.json')
function readManifest (): any {
if (fs.existsSync(manifestPath)) {
return JSON.parse(fs.readFileSync(manifestPath, 'utf-8'))
}
}
function writeManifest (manifest: any) {
fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2))
}
const manifest = readManifest()
if (version !== manifest.version) {
manifest.version = version
writeManifest(manifest)
}

View File

@@ -1,3 +0,0 @@
chcp 65001
set ELECTRON_RUN_AS_NODE=1
"H:\Program Files\QQNT最新版\QQ.exe" %~dp0/napcat.cjs %*

View File

@@ -1,17 +0,0 @@
function Get-QQpath {
try {
$key = Get-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ"
$uninstallString = $key.UninstallString
return [System.IO.Path]::GetDirectoryName($uninstallString) + "\QQ.exe"
}
catch {
return "D:\QQ.exe"
}
}
$params = $args -join " "
$QQpath = Get-QQpath
$Bootfile = Join-Path $PSScriptRoot "napcat.cjs"
$env:ELECTRON_RUN_AS_NODE = 1
$argumentList = '-noexit', '-noprofile', "-command `"$QQpath`" `"$Bootfile`" $params"
Start-Process powershell -ArgumentList $argumentList -RedirectStandardOutput "log.txt" -RedirectStandardError "error.txt"
powershell Get-Content -Wait -Encoding UTF8 log.txt

View File

@@ -1,18 +0,0 @@
@echo off
setlocal enabledelayedexpansion
chcp 65001
:loop_read
for /f "tokens=2*" %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ" /v "UninstallString"') do (
set "RetString=%%b"
goto :napcat_boot
)
:napcat_boot
for %%a in ("!RetString!") do (
set "pathWithoutUninstall=%%~dpa"
)
set "QQPath=!pathWithoutUninstall!QQ.exe"
set ELECTRON_RUN_AS_NODE=1
echo !QQPath!
"!QQPath!" ./napcat.cjs %*

View File

@@ -1,15 +0,0 @@
function Get-QQpath {
try {
$key = Get-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ"
$uninstallString = $key.UninstallString
return [System.IO.Path]::GetDirectoryName($uninstallString) + "\QQ.exe"
}
catch {
return "D:\QQ.exe"
}
}
$params = $args -join " "
$QQpath = Get-QQpath
$Bootfile = Join-Path $PSScriptRoot "napcat.cjs"
$env:ELECTRON_RUN_AS_NODE = 1
Start-Process powershell -ArgumentList "-noexit", "-noprofile", "-command &{& chcp 65001;& '$QQpath' $Bootfile $params}"

View File

@@ -1,17 +0,0 @@
@echo off
setlocal enabledelayedexpansion
:loop_read
for /f "tokens=2*" %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ" /v "UninstallString"') do (
set "RetString=%%b"
goto :napcat_boot
)
:napcat_boot
for %%a in ("!RetString!") do (
set "pathWithoutUninstall=%%~dpa"
)
set "QQPath=!pathWithoutUninstall!QQ.exe"
set ELECTRON_RUN_AS_NODE=1
echo !QQPath!
"!QQPath!" ./napcat.cjs %*

View File

@@ -1,15 +0,0 @@
function Get-QQpath {
try {
$key = Get-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ"
$uninstallString = $key.UninstallString
return [System.IO.Path]::GetDirectoryName($uninstallString) + "\QQ.exe"
}
catch {
return "D:\QQ.exe"
}
}
$params = $args -join " "
$QQpath = Get-QQpath
$Bootfile = Join-Path $PSScriptRoot "napcat.cjs"
$env:ELECTRON_RUN_AS_NODE = 1
Start-Process powershell -ArgumentList "-noexit", "-noprofile", "-command &{& '$QQpath' $Bootfile $params}"

View File

@@ -1,4 +0,0 @@
#!/bin/bash
SCRIPT_DIR=$(realpath $(dirname "${BASH_SOURCE[0]}"))
export ELECTRON_RUN_AS_NODE=1
/opt/QQ/qq ${SCRIPT_DIR}/napcat.cjs $@

View File

@@ -1,85 +0,0 @@
import {
type Friend,
type FriendRequest,
type Group,
type GroupMember, GroupNotify,
type SelfInfo
} from '@/core/qqnt/entities';
import { isNumeric } from './utils/helper';
import { log } from '@/common/utils/log';
export const selfInfo: SelfInfo = {
uid: '',
uin: '',
nick: '',
online: true
};
// groupCode -> Group
export const groups: Map<string, Group> = new Map<string, Group>();
// 群号 -> 群成员map(uid=>GroupMember)
export const groupMembers: Map<string, Map<string, GroupMember>> = new Map<string, Map<string, GroupMember>>();
// uid -> Friend
export const friends: Map<string, Friend> = new Map<string, Friend>();
export const friendRequests: Record<string, FriendRequest> = {}; // flag->FriendRequest
export const groupNotifies: Record<string, GroupNotify> = {}; // flag->GroupNotify
export const napCatError = {
ffmpegError: '',
httpServerError: '',
wsServerError: '',
otherError: 'NapCat未能正常启动请检查日志查看错误'
};
export async function getFriend(uinOrUid: string): Promise<Friend | undefined> {
uinOrUid = uinOrUid.toString();
if (isNumeric(uinOrUid)) {
const friendList = Array.from(friends.values());
return friendList.find(friend => friend.uin === uinOrUid);
} else {
return friends.get(uinOrUid);
}
}
export async function getGroup(qq: string): Promise<Group | undefined> {
const group = groups.get(qq.toString());
return group;
}
export async function getGroupMember(groupQQ: string | number, memberUinOrUid: string | number) {
groupQQ = groupQQ.toString();
memberUinOrUid = memberUinOrUid.toString();
const members = groupMembers.get(groupQQ);
if (!members) {
return null;
}
// log('getGroupMember', members);
if (isNumeric(memberUinOrUid)) {
return Array.from(members.values()).find(member => member.uin === memberUinOrUid);
} else {
return members.get(memberUinOrUid);
}
}
export async function refreshGroupMembers(groupQQ: string) {
// const group = groups.find(group => group.groupCode === groupQQ)
// if (group) {
// group.members = await NTQQGroupApi.getGroupMembers(groupQQ)
// }
}
export const uid2UinMap: Record<string, string> = {}; // 一串加密的字符串(uid) -> qq号
export function getUidByUin(uin: string) {
for (const uid in uid2UinMap) {
if (uid2UinMap[uid] === uin) {
return uid;
}
}
}
export const tempGroupCodeMap: Record<string, string> = {}; // peerUid => 群号

View File

@@ -0,0 +1,263 @@
import { NodeIQQNTWrapperSession } from '@/core/wrapper/wrapper';
import { randomUUID } from 'crypto';
interface Internal_MapKey {
timeout: number;
createtime: number;
func: (...arg: any[]) => any;
checker: ((...args: any[]) => boolean) | undefined;
}
export type ListenerClassBase = Record<string, string>;
export interface ListenerIBase {
// eslint-disable-next-line @typescript-eslint/no-misused-new
new(listener: any): ListenerClassBase;
}
export class LegacyNTEventWrapper {
private listenerMapping: Record<string, ListenerIBase>; //ListenerName-Unique -> Listener构造函数
private WrapperSession: NodeIQQNTWrapperSession | undefined; //WrapperSession
private listenerManager: 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(
listenerMapping: Record<string, ListenerIBase>,
wrapperSession: NodeIQQNTWrapperSession,
) {
this.listenerMapping = listenerMapping;
this.WrapperSession = wrapperSession;
}
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);
},
},
);
}
createEventFunction<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;
}
}
createListenerFunction<T>(listenerMainName: string, uniqueCode: string = ''): T {
const ListenerType = this.listenerMapping![listenerMainName];
let Listener = this.listenerManager.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.createEventFunction<(listener: T) => number>(Service);
addfunc!(Listener as T);
//console.log(addfunc!(Listener as T));
this.listenerManager.set(listenerMainName + uniqueCode, Listener);
}
return Listener as T;
}
//统一回调清理事件
async dispatcherListener(ListenerMainName: string, ListenerSubName: string, ...args: any[]) {
//console.log("[EventDispatcher]",ListenerMainName, ListenerSubName, ...args);
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;
}
if (task.checker && task.checker(...args)) {
task.func(...args);
}
});
}
async callNoListenerEvent<EventType extends (...args: any[]) => Promise<any> | any>(
EventName = '',
timeout: number = 3000,
...args: Parameters<EventType>
) {
return new Promise<Awaited<ReturnType<EventType>>>(async (resolve, reject) => {
const EventFunc = this.createEventFunction<EventType>(EventName);
let complete = false;
setTimeout(() => {
if (!complete) {
reject(new Error('NTEvent EventName:' + EventName + ' timeout'));
}
}, timeout);
const retData = await EventFunc!(...args);
complete = true;
resolve(retData);
});
}
async RegisterListen<ListenerType extends (...args: any[]) => void>(
ListenerName = '',
waitTimes = 1,
timeout = 5000,
checker: (...args: Parameters<ListenerType>) => boolean,
) {
return new Promise<Parameters<ListenerType>>((resolve, reject) => {
const ListenerNameList = ListenerName.split('/');
const ListenerMainName = ListenerNameList[0];
const ListenerSubName = ListenerNameList[1];
const id = randomUUID();
let complete = 0;
let retData: Parameters<ListenerType> | undefined = undefined;
const databack = () => {
if (complete == 0) {
reject(new Error(' ListenerName:' + ListenerName + ' timeout'));
} else {
resolve(retData!);
}
};
const timeoutRef = setTimeout(databack, timeout);
const eventCallbak = {
timeout: timeout,
createtime: Date.now(),
checker: checker,
func: (...args: Parameters<ListenerType>) => {
complete++;
retData = args;
if (complete >= waitTimes) {
clearTimeout(timeoutRef);
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.createListenerFunction(ListenerMainName);
});
}
async CallNormalEvent<
EventType extends (...args: any[]) => Promise<any>,
ListenerType extends (...args: any[]) => void
>(
EventName = '',
ListenerName = '',
waitTimes = 1,
timeout: number = 3000,
checker: (...args: Parameters<ListenerType>) => boolean,
...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 == 0) {
reject(
new Error(
'Timeout: NTEvent EventName:' +
EventName +
' ListenerName:' +
ListenerName +
' EventRet:\n' +
JSON.stringify(retEvent, null, 4) +
'\n',
),
);
} else {
resolve([retEvent as Awaited<ReturnType<EventType>>, ...retData!]);
}
};
const ListenerNameList = ListenerName.split('/');
const ListenerMainName = ListenerNameList[0];
const ListenerSubName = ListenerNameList[1];
const Timeouter = setTimeout(databack, timeout);
const eventCallbak = {
timeout: timeout,
createtime: Date.now(),
checker: checker,
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.createListenerFunction(ListenerMainName);
const EventFunc = this.createEventFunction<EventType>(EventName);
retEvent = await EventFunc!(...(args as any[]));
},
);
}
}
// 示例代码 快速创建事件
// 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) });

View File

@@ -0,0 +1,140 @@
import type { NodeIQQNTWrapperSession, WrapperNodeApi } from '@/core/wrapper/wrapper';
import EventEmitter from 'node:events';
export type ListenerClassBase = Record<string, string>;
export interface ListenerIBase {
// eslint-disable-next-line @typescript-eslint/no-misused-new
new(listener: any): ListenerClassBase;
}
export class NTEventChannel extends EventEmitter {
private wrapperApi: WrapperNodeApi;
private wrapperSession: NodeIQQNTWrapperSession;
private listenerRefStorage = new Map<string, ListenerIBase>();
constructor(WrapperApi: WrapperNodeApi, WrapperSession: NodeIQQNTWrapperSession) {
super();
this.on('error', () => {
});
this.wrapperApi = WrapperApi;
this.wrapperSession = WrapperSession;
}
dispatcherListener(ListenerEvent: string, ...args: any[]) {
this.emit(ListenerEvent, ...args);
}
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) {
return (...args: any[]) => {
current.dispatcherListener.apply(current, [ListenerMainName + '/' + prop, ...args]);
};
},
});
}
async getOrInitListener<T>(listenerMainName: string): Promise<T> {
const ListenerType = this.wrapperApi[listenerMainName];
//获取NTQQ 外部 Listener包装
if (!ListenerType) throw new Error('Init Listener not found');
let Listener = this.listenerRefStorage.get(listenerMainName);
//判断是否已创建 创建则跳过
if (!Listener && ListenerType) {
Listener = new ListenerType(this.createProxyDispatch(listenerMainName));
if (!Listener) throw new Error('Init Listener failed');
//实例化NTQQ Listener外包装
const ServiceSubName = listenerMainName.match(/^NodeIKernel(.*?)Listener$/)![1];
const Service = 'NodeIKernel' + ServiceSubName + 'Service/addKernel' + ServiceSubName + 'Listener';
const addfunc = this.createEventFunction<(listener: T) => number>(Service);
//添加Listener到NTQQ
addfunc!(Listener as T);
this.listenerRefStorage.set(listenerMainName, Listener);
//保存Listener实例
}
return Listener as T;
}
async createEventWithListener<EventType extends (...args: any) => any, ListenerType extends (...args: any) => any>
(
eventName: string,
listenerName: string,
waitTimes = 1,
timeout: number = 3000,
checker: (...args: Parameters<ListenerType>) => boolean,
...eventArg: Parameters<EventType>
) {
return new Promise<[EventRet: Awaited<ReturnType<EventType>>, ...Parameters<ListenerType>]>(async (resolve, reject) => {
const ListenerNameList = listenerName.split('/');
const ListenerMainName = ListenerNameList[0];
//const ListenerSubName = ListenerNameList[1];
this.getOrInitListener<ListenerType>(ListenerMainName);
let complete = 0;
const retData: Parameters<ListenerType> | undefined = undefined;
let retEvent: any = {};
const databack = () => {
if (complete == 0) {
reject(new Error('Timeout: NTEvent EventName:' + eventName + ' ListenerName:' + listenerName + ' EventRet:\n' + JSON.stringify(retEvent, null, 4) + '\n'));
} else {
resolve([retEvent as Awaited<ReturnType<EventType>>, ...retData!]);
}
};
const Timeouter = setTimeout(databack, timeout);
const callback = (...args: Parameters<ListenerType>) => {
if (checker(...args)) {
complete++;
if (complete >= waitTimes) {
clearTimeout(Timeouter);
this.removeListener(listenerName, callback);
databack();
}
}
};
this.on(listenerName, callback);
const EventFunc = this.createEventFunction<EventType>(eventName);
retEvent = await EventFunc!(...(eventArg as any[]));
});
}
private createEventFunction<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]();
const event = services[eventName]
//重新绑定this
.bind(services);
if (event) {
return event as T;
}
return undefined;
}
}
async callEvent<EventType extends (...args: any[]) => Promise<any> | any>(
EventName = '', timeout: number = 3000, ...args: Parameters<EventType>) {
return new Promise<Awaited<ReturnType<EventType>>>(async (resolve, reject) => {
const EventFunc = this.createEventFunction<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);
});
}
}
//NTEvent2.0

View File

@@ -0,0 +1,30 @@
import path, { dirname } from 'path';
import { fileURLToPath } from 'url';
import fs from 'fs';
export const napcat_version = '2.0.13';
export class NapCatPathWrapper {
binaryPath: string;
logsPath: string;
configPath: string;
cachePath: string;
staticPath: string;
constructor(mainPath: string = dirname(fileURLToPath(import.meta.url))) {
this.binaryPath = mainPath;
this.logsPath = path.join(this.binaryPath, 'logs');
this.configPath = path.join(this.binaryPath, 'config');
this.cachePath = path.join(this.binaryPath, 'cache');
this.staticPath = path.join(this.binaryPath, 'static');
if (fs.existsSync(this.logsPath)) {
fs.mkdirSync(this.logsPath, { recursive: true });
}
if (fs.existsSync(this.configPath)) {
fs.mkdirSync(this.configPath, { recursive: true });
}
if (fs.existsSync(this.cachePath)) {
fs.mkdirSync(this.cachePath, { recursive: true });
}
}
}

View File

@@ -1,113 +0,0 @@
import express, { Express, Request, Response } from 'express';
import http from 'http';
import { log } from '../utils/log';
import { ob11Config } from '@/onebot11/config';
type RegisterHandler = (res: Response, payload: any) => Promise<any>
export abstract class HttpServerBase {
name: string = 'LLOneBot';
private readonly expressAPP: Express;
private server: http.Server | null = null;
constructor() {
this.expressAPP = express();
this.expressAPP.use(express.urlencoded({ extended: true, limit: '5000mb' }));
this.expressAPP.use((req, res, next) => {
// 兼容处理没有带content-type的请求
// log("req.headers['content-type']", req.headers['content-type'])
req.headers['content-type'] = 'application/json';
const originalJson = express.json({ limit: '5000mb' });
// 调用原始的express.json()处理器
originalJson(req, res, (err) => {
if (err) {
log('Error parsing JSON:', err);
return res.status(400).send('Invalid JSON');
}
next();
});
});
}
authorize(req: Request, res: Response, next: () => void) {
const serverToken = ob11Config.token;
let clientToken = '';
const authHeader = req.get('authorization');
if (authHeader) {
clientToken = authHeader.split('Bearer ').pop() || '';
log('receive http header token', clientToken);
} else if (req.query.access_token) {
if (Array.isArray(req.query.access_token)) {
clientToken = req.query.access_token[0].toString();
} else {
clientToken = req.query.access_token.toString();
}
log('receive http url token', clientToken);
}
if (serverToken && clientToken != serverToken) {
return res.status(403).send(JSON.stringify({ message: 'token verify failed!' }));
}
next();
}
start(port: number) {
try {
this.expressAPP.get('/', (req: Request, res: Response) => {
res.send(`${this.name}已启动`);
});
this.listen(port);
} catch (e: any) {
log('HTTP服务启动失败', e.toString());
// llonebotError.httpServerError = "HTTP服务启动失败, " + e.toString()
}
}
stop() {
// llonebotError.httpServerError = ""
if (this.server) {
this.server.close();
this.server = null;
}
}
restart(port: number) {
this.stop();
this.start(port);
}
abstract handleFailed(res: Response, payload: any, err: any): void
registerRouter(method: 'post' | 'get' | string, url: string, handler: RegisterHandler) {
if (!url.startsWith('/')) {
url = '/' + url;
}
// @ts-expect-error wait fix
if (!this.expressAPP[method]) {
const err = `${this.name} register router failed${method} not exist`;
log(err);
throw err;
}
// @ts-expect-error wait fix
this.expressAPP[method](url, this.authorize, async (req: Request, res: Response) => {
let payload = req.body;
if (method == 'get') {
payload = req.query;
}
log('收到http请求', url, payload);
try {
res.send(await handler(res, payload));
} catch (e: any) {
this.handleFailed(res, payload, e.stack.toString());
}
});
}
protected listen(port: number) {
this.server = this.expressAPP.listen(port, '0.0.0.0', () => {
const info = `${this.name} started 0.0.0.0:${port}`;
log(info);
});
}
}

View File

@@ -1,99 +0,0 @@
import { WebSocket, WebSocketServer } from 'ws';
import urlParse from 'url';
import { IncomingMessage } from 'node:http';
import { log } from '@/common/utils/log';
class WebsocketClientBase {
private wsClient: WebSocket | undefined;
constructor() {
}
send(msg: string) {
if (this.wsClient && this.wsClient.readyState == WebSocket.OPEN) {
this.wsClient.send(msg);
}
}
onMessage(msg: string) {
}
}
export class WebsocketServerBase {
private ws: WebSocketServer | null = null;
public token: string = '';
constructor() {
}
start(port: number) {
try {
this.ws = new WebSocketServer({ port });
} catch (e: any) {
throw Error('ws服务启动失败, ' + e.toString());
}
this.ws.on('connection', (wsClient, req) => {
const url: string = req.url!.split('?').shift() || '/';
this.authorize(wsClient, req);
this.onConnect(wsClient, url, req);
wsClient.on('message', async (msg) => {
this.onMessage(wsClient, url, msg.toString());
});
});
}
stop() {
this.ws && this.ws.close((err) => {
log('ws server close failed!', err);
});
this.ws = null;
}
restart(port: number) {
this.stop();
this.start(port);
}
authorize(wsClient: WebSocket, req: IncomingMessage) {
const url = req.url!.split('?').shift();
log('ws connect', url);
let clientToken: string = '';
const authHeader = req.headers['authorization'];
if (authHeader) {
clientToken = authHeader.split('Bearer ').pop() || '';
log('receive ws header token', clientToken);
} else {
const parsedUrl = urlParse.parse(req.url || '/', true);
const urlToken = parsedUrl.query.access_token;
if (urlToken) {
if (Array.isArray(urlToken)) {
clientToken = urlToken[0];
} else {
clientToken = urlToken;
}
log('receive ws url token', clientToken);
}
}
if (this.token && clientToken != this.token) {
this.authorizeFailed(wsClient);
return wsClient.close();
}
}
authorizeFailed(wsClient: WebSocket) {
}
onConnect(wsClient: WebSocket, url: string, req: IncomingMessage) {
}
onMessage(wsClient: WebSocket, url: string, msg: string) {
}
sendHeart() {
}
}

View File

@@ -0,0 +1,67 @@
import path from 'node:path';
import fs from 'node:fs';
import type { NapCatCore } from '@/core';
export abstract class ConfigBase<T> {
name: string;
coreContext: NapCatCore;
configPath: string;
configData: T = {} as T;
protected constructor(name: string, coreContext: NapCatCore, configPath: string) {
this.name = name;
this.coreContext = coreContext;
this.configPath = configPath;
fs.mkdirSync(this.configPath, { recursive: true });
this.read();
}
protected getKeys(): string[] | null {
// 决定 key 在json配置文件中的顺序
return null;
}
getConfigPath(pathName: string | undefined): string {
const suffix = pathName ? `_${pathName}` : '';
const filename = `${this.name}${suffix}.json`;
return path.join(this.configPath, filename);
}
read(): T {
const logger = this.coreContext.context.logger;
const configPath = this.getConfigPath(this.coreContext.selfInfo.uin);
if (!fs.existsSync(configPath)) {
try {
fs.writeFileSync(configPath, fs.readFileSync(this.getConfigPath(undefined), 'utf-8'));
logger.log(`[Core] [Config] 配置文件创建成功!\n`);
} catch (e: any) {
logger.logError(`[Core] [Config] 创建配置文件时发生错误:`, e.message);
}
}
try {
this.configData = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
logger.logDebug(`[Core] [Config] 配置文件${configPath}加载`, this.configData);
return this.configData;
} catch (e: any) {
if (e instanceof SyntaxError) {
logger.logError(`[Core] [Config] 配置文件格式错误,请检查配置文件:`, e.message);
} else {
logger.logError(`[Core] [Config] 读取配置文件时发生错误:`, e.message);
}
return {} as T;
}
}
save(newConfigData: T = this.configData as T) {
const logger = this.coreContext.context.logger;
const selfInfo = this.coreContext.selfInfo;
this.configData = newConfigData;
const configPath = this.getConfigPath(selfInfo.uin);
try {
fs.writeFileSync(configPath, JSON.stringify(newConfigData, this.getKeys(), 2));
} catch (e: any) {
logger.logError(`保存配置文件 ${configPath} 时发生错误:`, e.message);
}
}
}

31
src/common/utils/LRU.ts Normal file
View File

@@ -0,0 +1,31 @@
export class LRUCache<K, V> {
private capacity: number;
private cache: Map<K, V>;
constructor(capacity: number) {
this.capacity = capacity;
this.cache = new Map<K, V>();
}
public get(key: K): V | undefined {
const value = this.cache.get(key);
if (value !== undefined) {
// Move the accessed key to the end to mark it as most recently used
this.cache.delete(key);
this.cache.set(key, value);
}
return value;
}
public put(key: K, value: V): void {
if (this.cache.has(key)) {
// If the key already exists, move it to the end to mark it as most recently used
this.cache.delete(key);
} else if (this.cache.size >= this.capacity) {
// If the cache is full, remove the least recently used key (the first one in the map)
const firstKey = this.cache.keys().next().value;
this.cache.delete(firstKey);
}
this.cache.set(key, value);
}
}

View File

@@ -0,0 +1,150 @@
import { Peer } from '@/core';
import crypto from 'crypto';
export class LimitedHashTable<K, V> {
private keyToValue: Map<K, V> = new Map();
private valueToKey: Map<V, K> = new Map();
private maxSize: number;
constructor(maxSize: number) {
this.maxSize = maxSize;
}
resize(count: number) {
this.maxSize = count;
}
set(key: K, value: V): void {
// const isExist = this.keyToValue.get(key);
// if (isExist && isExist === value) {
// return;
// }
this.keyToValue.set(key, value);
this.valueToKey.set(value, key);
while (this.keyToValue.size !== this.valueToKey.size) {
//console.log('keyToValue.size !== valueToKey.size Error Atom');
this.keyToValue.clear();
this.valueToKey.clear();
}
// console.log('---------------');
// console.log(this.keyToValue);
// console.log(this.valueToKey);
// console.log('---------------');
while (this.keyToValue.size > this.maxSize || this.valueToKey.size > this.maxSize) {
//console.log(this.keyToValue.size > this.maxSize, this.valueToKey.size > this.maxSize);
const oldestKey = this.keyToValue.keys().next().value;
this.valueToKey.delete(this.keyToValue.get(oldestKey)!);
this.keyToValue.delete(oldestKey);
}
}
getValue(key: K): V | undefined {
return this.keyToValue.get(key);
}
getKey(value: V): K | undefined {
return this.valueToKey.get(value);
}
deleteByValue(value: V): void {
const key = this.valueToKey.get(value);
if (key !== undefined) {
this.keyToValue.delete(key);
this.valueToKey.delete(value);
}
}
deleteByKey(key: K): void {
const value = this.keyToValue.get(key);
if (value !== undefined) {
this.keyToValue.delete(key);
this.valueToKey.delete(value);
}
}
getKeyList(): K[] {
return Array.from(this.keyToValue.keys());
}
//获取最近刚写入的几个值
getHeads(size: number): { key: K; value: V }[] | undefined {
const keyList = this.getKeyList();
if (keyList.length === 0) {
return undefined;
}
const result: { key: K; value: V }[] = [];
const listSize = Math.min(size, keyList.length);
for (let i = 0; i < listSize; i++) {
const key = keyList[listSize - i];
result.push({ key, value: this.keyToValue.get(key)! });
}
return result;
}
}
class MessageUniqueWrapper {
private msgDataMap: LimitedHashTable<string, number>;
private msgIdMap: LimitedHashTable<string, number>;
constructor(maxMap: number = 1000) {
this.msgIdMap = new LimitedHashTable<string, number>(maxMap);
this.msgDataMap = new LimitedHashTable<string, number>(maxMap);
}
getRecentMsgIds(Peer: Peer, size: number): string[] {
const heads = this.msgIdMap.getHeads(size);
if (!heads) {
return [];
}
const data = heads.map((t) => MessageUnique.getMsgIdAndPeerByShortId(t.value));
const ret = data.filter((t) => t?.Peer.chatType === Peer.chatType && t?.Peer.peerUid === Peer.peerUid);
return ret.map((t) => t?.MsgId).filter((t) => t !== undefined);
}
createMsg(peer: Peer, msgId: string): number | undefined {
const key = `${msgId}|${peer.chatType}|${peer.peerUid}`;
const hash = crypto.createHash('md5').update(key).digest();
//设置第一个bit为0 保证shortId为正数
hash[0] &= 0x7f;
const shortId = hash.readInt32BE(0);
//减少性能损耗
// const isExist = this.msgIdMap.getKey(shortId);
// if (isExist && isExist === msgId) {
// return shortId;
// }
this.msgIdMap.set(msgId, shortId);
this.msgDataMap.set(key, shortId);
return shortId;
}
getMsgIdAndPeerByShortId(shortId: number): { MsgId: string; Peer: Peer } | undefined {
const data = this.msgDataMap.getKey(shortId);
if (data) {
const [msgId, chatTypeStr, peerUid] = data.split('|');
const peer: Peer = {
chatType: parseInt(chatTypeStr),
peerUid,
guildId: '',
};
return { MsgId: msgId, Peer: peer };
}
return undefined;
}
getShortIdByMsgId(msgId: string): number | undefined {
return this.msgIdMap.getValue(msgId);
}
getPeerByMsgId(msgId: string) {
const shortId = this.msgIdMap.getValue(msgId);
if (!shortId) return undefined;
return this.getMsgIdAndPeerByShortId(shortId);
}
resize(maxSize: number): void {
this.msgIdMap.resize(maxSize);
this.msgDataMap.resize(maxSize);
}
}
export const MessageUnique: MessageUniqueWrapper = new MessageUniqueWrapper();

View File

@@ -1,60 +1,81 @@
import path from 'node:path';
import fs from 'node:fs';
import os from 'node:os';
import { systemPlatform } from '@/common/utils/system';
import { getDefaultQQVersionConfigInfo, getQQVersionConfigPath } from './helper';
import AppidTable from '@/core/external/appid.json';
import { LogWrapper } from './log';
export const exePath = process.execPath;
export class QQBasicInfoWrapper {
QQMainPath: string | undefined;
QQPackageInfoPath: string | undefined;
QQVersionConfigPath: string | undefined;
isQuickUpdate: boolean | undefined;
QQVersionConfig: QQVersionConfigType | undefined;
QQPackageInfo: QQPackageInfoType | undefined;
QQVersionAppid: string | undefined;
QQVersionQua: string | undefined;
context: { logger: LogWrapper };
export const pkgInfoPath = path.join(path.dirname(exePath), 'resources', 'app', 'package.json');
let configVersionInfoPath;
constructor(context: { logger: LogWrapper }) {
//基础目录获取
this.context = context;
this.QQMainPath = process.execPath;
this.QQPackageInfoPath = path.join(path.dirname(this.QQMainPath), 'resources', 'app', 'package.json');
this.QQVersionConfigPath = getQQVersionConfigPath(this.QQMainPath);
if (os.platform() !== 'linux') {
configVersionInfoPath = path.join(path.dirname(exePath), 'resources', 'app', 'versions', 'config.json');
} else {
const userPath = os.homedir();
const appDataPath = path.resolve(userPath, './.config/QQ');
configVersionInfoPath = path.resolve(appDataPath, './versions/config.json');
//基础信息获取 无快更则启用默认模板填充
this.isQuickUpdate = !!this.QQVersionConfigPath;
this.QQVersionConfig = this.isQuickUpdate
? JSON.parse(fs.readFileSync(this.QQVersionConfigPath!).toString())
: getDefaultQQVersionConfigInfo();
this.QQPackageInfo = JSON.parse(fs.readFileSync(this.QQPackageInfoPath).toString());
const { appid: IQQVersionAppid, qua: IQQVersionQua } = this.getAppidV2();
this.QQVersionAppid = IQQVersionAppid;
this.QQVersionQua = IQQVersionQua;
}
//基础函数
getQQBuildStr() {
return this.isQuickUpdate ? this.QQVersionConfig?.buildId : this.QQPackageInfo?.buildVersion;
}
getFullQQVesion() {
const version = this.isQuickUpdate ? this.QQVersionConfig?.curVersion : this.QQPackageInfo?.version;
if (!version) throw new Error('QQ版本获取失败');
return version;
}
requireMinNTQQBuild(buildStr: string) {
const currentBuild = parseInt(this.getQQBuildStr() || '0');
if (currentBuild == 0) throw new Error('QQBuildStr获取失败');
return currentBuild >= parseInt(buildStr);
}
//此方法不要直接使用
getQUAInternal() {
return systemPlatform === 'linux'
? `V1_LNX_NQ_${this.getFullQQVesion()}_${this.getQQBuildStr()}_GW_B`
: `V1_WIN_NQ_${this.getFullQQVesion()}_${this.getQQBuildStr()}_GW_B`;
}
getAppidV2(): { appid: string; qua: string } {
const appidTbale = AppidTable as unknown as QQAppidTableType;
try {
const fullVersion = this.getFullQQVesion();
if (!fullVersion) throw new Error('QQ版本获取失败');
const data = appidTbale[fullVersion];
if (data) {
return data;
}
} catch (e) {
this.context.logger.log(`[QQ版本兼容性检测] 获取Appid异常 请检测NapCat/QQNT是否正常`);
}
// 以下是兜底措施
this.context.logger.log(
`[QQ版本兼容性检测] ${this.getFullQQVesion()} 版本兼容性不佳,可能会导致一些功能无法正常使用`,
);
return { appid: systemPlatform === 'linux' ? '537237950' : '537237765', qua: this.getQUAInternal() };
}
}
if (typeof configVersionInfoPath !== 'string') {
throw new Error('Something went wrong when load QQ info path');
}
export { configVersionInfoPath };
type QQPkgInfo = {
version: string;
buildVersion: string;
platform: string;
eleArch: string;
}
type QQVersionConfigInfo = {
baseVersion: string;
curVersion: string;
prevVersion: string;
onErrorVersions: Array<any>;
buildId: string;
}
let _qqVersionConfigInfo: QQVersionConfigInfo = {
'baseVersion': '9.9.9-22578',
'curVersion': '9.9.9-22578',
'prevVersion': '',
'onErrorVersions': [],
'buildId': '22578'
};
if (fs.existsSync(configVersionInfoPath)) {
_qqVersionConfigInfo = JSON.parse(fs.readFileSync(configVersionInfoPath).toString());
}
export const qqVersionConfigInfo: QQVersionConfigInfo = _qqVersionConfigInfo;
export const qqPkgInfo: QQPkgInfo = require(pkgInfoPath);
let _appid: string = '537213335'; // 默认为 Windows 平台的 appid
if (systemPlatform === 'linux') {
_appid = '537213710';
}
// todo: mac 平台的 appid
export const appid = _appid;
export let QQBasicInfo: QQBasicInfoWrapper | undefined;

View File

@@ -1,135 +1,90 @@
import fs from 'fs';
import { encode, getDuration, getWavFileInfo, isWav } from 'silk-wasm';
import { encode, getDuration, getWavFileInfo, isSilk, isWav } from 'silk-wasm';
import fsPromise from 'fs/promises';
import { log } from './log';
import path from 'node:path';
import { v4 as uuidv4 } from 'uuid';
import { randomUUID } from 'crypto';
import { spawn } from 'node:child_process';
import { getTempDir } from '@/common/utils/file';
import { LogWrapper } from './log';
export async function encodeSilk(filePath: string, TEMP_DIR: string, logger: LogWrapper) {
async function guessDuration(pttPath: string) {
const pttFileInfo = await fsPromise.stat(pttPath);
let duration = pttFileInfo.size / 1024 / 3; // 3kb/s
duration = Math.floor(duration);
duration = Math.max(1, duration);
logger.log('通过文件大小估算语音的时长:', duration);
return duration;
}
let TEMP_DIR = './';
setTimeout(() => {
TEMP_DIR = getTempDir();
}, 100);
export async function encodeSilk(filePath: string) {
function getFileHeader(filePath: string) {
// 定义要读取的字节数
const bytesToRead = 7;
try {
const buffer = fs.readFileSync(filePath, {
encoding: null,
flag: 'r',
});
const fileHeader = buffer.toString('hex', 0, bytesToRead);
return fileHeader;
} catch (err) {
console.error('读取文件错误:', err);
return;
}
}
async function isWavFile(filePath: string) {
return isWav(fs.readFileSync(filePath));
}
async function guessDuration(pttPath: string) {
const pttFileInfo = await fsPromise.stat(pttPath);
let duration = pttFileInfo.size / 1024 / 3; // 3kb/s
duration = Math.floor(duration);
duration = Math.max(1, duration);
log('通过文件大小估算语音的时长:', duration);
return duration;
}
// function verifyDuration(oriDuration: number, guessDuration: number) {
// // 单位都是秒
// if (oriDuration - guessDuration > 10) {
// return guessDuration
// }
// oriDuration = Math.max(1, oriDuration)
// return oriDuration
// }
// async function getAudioSampleRate(filePath: string) {
// try {
// const mm = await import('music-metadata');
// const metadata = await mm.parseFile(filePath);
// log(`${filePath}采样率`, metadata.format.sampleRate);
// return metadata.format.sampleRate;
// } catch (error) {
// log(`${filePath}采样率获取失败`, error.stack);
// // console.error(error);
// }
// }
try {
const pttPath = path.join(TEMP_DIR, uuidv4());
if (getFileHeader(filePath) !== '02232153494c4b') {
log(`语音文件${filePath}需要转换成silk`);
const _isWav = await isWavFile(filePath);
const pcmPath = pttPath + '.pcm';
let sampleRate = 0;
const convert = () => {
return new Promise<Buffer>((resolve, reject) => {
// todo: 通过配置文件获取ffmpeg路径
const ffmpegPath = process.env.FFMPEG_PATH || 'ffmpeg';
const cp = spawn(ffmpegPath, ['-y', '-i', filePath, '-ar', '24000', '-ac', '1', '-f', 's16le', pcmPath]);
cp.on('error', err => {
log('FFmpeg处理转换出错: ', err.message);
return reject(err);
});
cp.on('exit', (code, signal) => {
const EXIT_CODES = [0, 255];
if (code == null || EXIT_CODES.includes(code)) {
sampleRate = 24000;
const data = fs.readFileSync(pcmPath);
fs.unlink(pcmPath, (err) => {
});
return resolve(data);
const file = await fsPromise.readFile(filePath);
const pttPath = path.join(TEMP_DIR, randomUUID());
if (!isSilk(file)) {
logger.log(`语音文件${filePath}需要转换成silk`);
const _isWav = isWav(file);
const pcmPath = pttPath + '.pcm';
let sampleRate = 0;
const convert = () => {
return new Promise<Buffer>((resolve, reject) => {
// todo: 通过配置文件获取ffmpeg路径
const ffmpegPath = process.env.FFMPEG_PATH || 'ffmpeg';
const cp = spawn(ffmpegPath, ['-y', '-i', filePath, '-ar', '24000', '-ac', '1', '-f', 's16le', pcmPath]);
cp.on('error', err => {
logger.log('FFmpeg处理转换出错: ', err.message);
return reject(err);
});
cp.on('exit', (code, signal) => {
const EXIT_CODES = [0, 255];
if (code == null || EXIT_CODES.includes(code)) {
sampleRate = 24000;
const data = fs.readFileSync(pcmPath);
fs.unlink(pcmPath, (err) => {
});
return resolve(data);
}
logger.log(`FFmpeg exit: code=${code ?? 'unknown'} sig=${signal ?? 'unknown'}`);
reject(Error('FFmpeg处理转换失败'));
});
});
};
let input: Buffer;
if (!_isWav) {
input = await convert();
} else {
input = file;
const allowSampleRate = [8000, 12000, 16000, 24000, 32000, 44100, 48000];
const { fmt } = getWavFileInfo(input);
// log(`wav文件信息`, fmt)
if (!allowSampleRate.includes(fmt.sampleRate)) {
input = await convert();
}
}
const silk = await encode(input, sampleRate);
fs.writeFileSync(pttPath, silk.data);
logger.log(`语音文件${filePath}转换成功!`, pttPath, '时长:', silk.duration);
return {
converted: true,
path: pttPath,
duration: silk.duration / 1000,
};
} else {
const silk = file;
let duration = 0;
try {
duration = getDuration(silk) / 1000;
} catch (e: any) {
logger.log('获取语音文件时长失败, 使用文件大小推测时长', filePath, e.stack);
duration = await guessDuration(filePath);
}
log(`FFmpeg exit: code=${code ?? 'unknown'} sig=${signal ?? 'unknown'}`);
reject(Error('FFmpeg处理转换失败'));
});
});
};
let input: Buffer;
if (!_isWav) {
input = await convert();
} else {
input = fs.readFileSync(filePath);
const allowSampleRate = [8000, 12000, 16000, 24000, 32000, 44100, 48000];
const { fmt } = getWavFileInfo(input);
// log(`wav文件信息`, fmt)
if (!allowSampleRate.includes(fmt.sampleRate)) {
input = await convert();
}
}
const silk = await encode(input, sampleRate);
fs.writeFileSync(pttPath, silk.data);
log(`语音文件${filePath}转换成功!`, pttPath, '时长:', silk.duration);
return {
converted: true,
path: pttPath,
duration: silk.duration / 1000
};
} else {
const silk = fs.readFileSync(filePath);
let duration = 0;
try {
duration = getDuration(silk) / 1000;
} catch (e: any) {
log('获取语音文件时长失败, 使用文件大小推测时长', filePath, e.stack);
duration = await guessDuration(filePath);
}
return {
converted: false,
path: filePath,
duration,
};
return {
converted: false,
path: filePath,
duration,
};
}
} catch (error: any) {
logger.logError('convert silk failed', error.stack);
return {};
}
} catch (error: any) {
log('convert silk failed', error.stack);
return {};
}
}

View File

@@ -1,323 +0,0 @@
import { ElementType, FileElement, PicElement, PttElement, RawMessage, VideoElement } from '@/core/qqnt/entities';
import sqlite3 from 'sqlite3';
import { log } from '@/common/utils/log';
type DBMsg = {
id: number,
longId: string,
seq: number,
peerUid: string,
msg: string
}
type DBFile = {
name: string; // 文件名
path: string;
url: string;
size: number;
uuid: string;
msgId: string;
elementId: string;
element: PicElement | VideoElement | FileElement | PttElement;
elementType: ElementType.PIC | ElementType.VIDEO | ElementType.FILE | ElementType.PTT;
}
class DBUtilBase {
protected db: sqlite3.Database | undefined;
createConnection(dbPath: string) {
if (this.db) {
return;
}
this.db = new sqlite3.Database(dbPath, sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, (err) => {
if (err) {
log('Could not connect to database', err);
return;
}
this.createTable();
});
}
protected createTable() {
throw new Error('Method not implemented.');
}
close() {
this.db?.close();
}
}
class DBUtil extends DBUtilBase {
private msgCache: Map<string, RawMessage> = new Map<string, RawMessage>();
constructor() {
super();
const interval = 1000 * 60 * 10; // 10分钟清理一次缓存
setInterval(() => {
log('清理消息缓存');
this.msgCache.forEach((msg, key) => {
if ((Date.now() - parseInt(msg.msgTime) * 1000) > interval) {
this.msgCache.delete(key);
}
});
}, interval);
}
protected createTable() {
// 消息记录
const createTableSQL = `
CREATE TABLE IF NOT EXISTS msgs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
long_id TEXT NOT NULL UNIQUE,
seq INTEGER NOT NULL,
peer_uid TEXT NOT NULL,
msg TEXT NOT NULL
)`;
this.db!.run(createTableSQL, function (err) {
if (err) {
log('Could not create table', err);
}
});
// 文件缓存
const createFileTableSQL = `
CREATE TABLE IF NOT EXISTS files (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
path TEXT NOT NULL,
url TEXT,
size INTEGER NOT NULL,
uuid TEXT,
elementType INTEGER,
element TEXT NOT NULL,
elementId TEXT NOT NULL,
msgId TEXT NOT NULL
)`;
this.db!.run(createFileTableSQL, function (err) {
if (err) {
log('Could not create table files', err);
}
});
// 接收到的临时会话消息uid
const createTempUinTableSQL = `
CREATE TABLE IF NOT EXISTS temp_uins (
id INTEGER PRIMARY KEY AUTOINCREMENT,
uid TEXT,
uin TEXT
)`;
this.db!.run(createTempUinTableSQL, function (err) {
if (err) {
log('Could not create table temp_uins', err);
}
});
}
private async getMsg(query: string, params: any[]) {
const stmt = this.db!.prepare(query);
return new Promise<RawMessage | null>((resolve, reject) => {
stmt.get(...params, (err: any, row: DBMsg) => {
// log("getMsg", row, err);
if (err) {
log('Could not get msg by short id', err);
resolve(null);
}
try {
const msg = JSON.parse(row.msg);
msg.id = row.id;
return resolve(msg);
} catch (e) {
return resolve(null);
}
});
});
}
async getMsgByShortId(shortId: number): Promise<RawMessage | null> {
const getStmt = 'SELECT * FROM msgs WHERE id = ?';
return this.getMsg(getStmt, [shortId]);
}
async getMsgByLongId(longId: string): Promise<RawMessage | null> {
if (this.msgCache.has(longId)) {
return this.msgCache.get(longId)!;
}
return this.getMsg('SELECT * FROM msgs WHERE long_id = ?', [longId]);
}
async getMsgBySeq(peerUid: string, seq: string): Promise<RawMessage | null> {
const stmt = 'SELECT * FROM msgs WHERE peer_uid = ? AND seq = ?';
return this.getMsg(stmt, [peerUid, seq]);
}
async addMsg(msg: RawMessage, update = true): Promise<number> {
log('正在记录消息到数据库', msg.msgId);
const existMsg = await this.getMsgByLongId(msg.msgId);
if (existMsg) {
// log('消息已存在,更新数据库', msg.msgId);
if (update) this.updateMsg(msg).then();
return existMsg.id!;
}
const stmt = this.db!.prepare('INSERT INTO msgs (long_id, seq, peer_uid, msg) VALUES (?, ?, ?, ?)');
// const runAsync = promisify(stmt.run.bind(stmt));
return new Promise((resolve, reject) => {
// eslint-disable-next-line @typescript-eslint/no-this-alias
const dbInstance = this;
stmt.run(msg.msgId, msg.msgSeq, msg.peerUid, JSON.stringify(msg), function (err: any) {
if (err) {
if (err.errno === 19) {
// log('消息已存在,更新数据库', msg.msgId);
dbInstance.getMsgByLongId(msg.msgId).then((msg: RawMessage | null) => {
if (msg) {
dbInstance.msgCache.set(msg.msgId, msg);
// log('获取消息短id成功', msg.id);
resolve(msg.id!);
} else {
log('db could not get msg by long id', err);
resolve(-1);
}
});
} else {
log('db could not add msg', err);
resolve(-1);
}
} else {
// log("addMsg", this);
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error
msg.id = this.lastID;
dbInstance.msgCache.set(msg.msgId, msg);
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// log('获取消息短id成功', this.lastID);
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error
resolve(this.lastID);
}
});
});
}
async updateMsg(msg: RawMessage) {
const existMsg = this.msgCache.get(msg.msgId);
if (existMsg) {
Object.assign(existMsg, msg);
}
const stmt = this.db!.prepare('UPDATE msgs SET msg = ?, seq = ? WHERE long_id = ?');
try {
stmt.run(JSON.stringify(msg), msg.msgSeq, msg.msgId);
} catch (e) {
log('updateMsg db error', e);
}
}
async addFileCache(file: DBFile) {
const stmt = this.db!.prepare('INSERT INTO files (name, path, url, size, uuid, elementType ,element, elementId, msgId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)');
return new Promise((resolve, reject) => {
stmt.run(file.name, file.path, file.url, file.size, file.uuid,
file.elementType,
JSON.stringify(file.element),
file.elementId,
file.msgId,
function (err: any) {
if (err) {
log('db could not add file', err);
reject(err);
}
resolve(null);
});
});
}
private async getFileCache(query: string, params: any[]) {
const stmt = this.db!.prepare(query);
return new Promise<DBFile | null>((resolve, reject) => {
stmt.get(...params, (err: any, row: DBFile & { element: string }) => {
if (err) {
log('db could not get file cache', err);
reject(err);
}
if (row) {
row.element = JSON.parse(row.element);
}
resolve(row);
});
});
}
async getFileCacheByName(name: string): Promise<DBFile | null> {
return this.getFileCache('SELECT * FROM files WHERE name = ?', [name]);
}
async getFileCacheByUuid(uuid: string): Promise<DBFile | null> {
return this.getFileCache('SELECT * FROM files WHERE uuid = ?', [uuid]);
}
// todo: 是否所有的文件都有uuid语音消息有没有uuid
async updateFileCache(file: DBFile) {
const stmt = this.db!.prepare('UPDATE files SET path = ?, url = ? WHERE uuid = ?');
return new Promise((resolve, reject) => {
stmt.run(file.path, file.url, function (err: any) {
if (err) {
log('db could not update file cache', err);
reject(err);
}
resolve(null);
});
});
}
// 被动收到的临时会话消息uin->uid
async getReceivedTempUinMap() {
const stmt = 'SELECT * FROM temp_uins';
return new Promise<Record<string, string>>((resolve, reject) => {
this.db!.all(stmt, (err, rows: { uin: string, uid: string }[]) => {
if (err) {
log('db could not get temp uin map', err);
reject(err);
}
const map: Record<string, string> = {};
rows.forEach(row => {
map[row.uin] = row.uid;
});
resolve(map);
});
});
}
// 通过uin获取临时会话消息uid
async getUidByTempUin(uid: string) {
const stmt = 'SELECT * FROM temp_uins WHERE uin = ?';
return new Promise<string>((resolve, reject) => {
this.db!.get(stmt, [uid], (err, row: { uin: string, uid: string }) => {
if (err) {
log('db could not get temp uin map', err);
reject(err);
}
resolve(row?.uid);
});
});
}
async addTempUin(uin: string, uid: string) {
const existUid = await this.getUidByTempUin(uin);
if (!existUid) {
const stmt = this.db!.prepare('INSERT INTO temp_uins (uin, uid) VALUES (?, ?)');
return new Promise((resolve, reject) => {
stmt.run(uin, uid, function (err: any) {
if (err) {
log('db could not add temp uin', err);
reject(err);
}
resolve(null);
});
});
}
}
}
export const dbUtil = new DBUtil();

View File

@@ -1,272 +1,301 @@
import fs from 'fs';
import fsPromise from 'fs/promises';
import crypto from 'crypto';
import fsPromise, { stat } from 'fs/promises';
import crypto, { randomUUID } from 'crypto';
import util from 'util';
import path from 'node:path';
import { log } from './log';
import { dbUtil } from './db';
import * as fileType from 'file-type';
import { v4 as uuidv4 } from 'uuid';
import { napCatCore } from '@/core';
export const getNapCatDir = () => {
const p = path.join(napCatCore.wrapper.dataPath, 'NapCat');
fs.mkdirSync(p, { recursive: true });
return p;
};
export const getTempDir = () => {
const p = path.join(getNapCatDir(), 'temp');
// 创建临时目录
if (!fs.existsSync(p)) {
fs.mkdirSync(p, { recursive: true });
}
return p;
};
import { LogWrapper } from './log';
export function isGIF(path: string) {
const buffer = Buffer.alloc(4);
const fd = fs.openSync(path, 'r');
fs.readSync(fd, buffer, 0, 4, 0);
fs.closeSync(fd);
return buffer.toString() === 'GIF8';
const buffer = Buffer.alloc(4);
const fd = fs.openSync(path, 'r');
fs.readSync(fd, buffer, 0, 4, 0);
fs.closeSync(fd);
return buffer.toString() === 'GIF8';
}
// 定义一个异步函数来检查文件是否存在
export function checkFileReceived(path: string, timeout: number = 3000): Promise<void> {
return new Promise((resolve, reject) => {
const startTime = Date.now();
return new Promise((resolve, reject) => {
const startTime = Date.now();
function check() {
if (fs.existsSync(path)) {
resolve();
} else if (Date.now() - startTime > timeout) {
reject(new Error(`文件不存在: ${path}`));
} else {
setTimeout(check, 100);
}
function check() {
if (fs.existsSync(path)) {
resolve();
} else if (Date.now() - startTime > timeout) {
reject(new Error(`文件不存在: ${path}`));
} else {
setTimeout(check, 100);
}
}
check();
});
}
// 定义一个异步函数来检查文件是否存在
export async function 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;
}
}
check();
});
// 如果文件存在则无需做任何事情Promise 解决resolve自身
}
export async function file2base64(path: string) {
const readFile = util.promisify(fs.readFile);
const result = {
err: '',
data: ''
};
try {
// 读取文件内容
// if (!fs.existsSync(path)){
// path = path.replace("\\Ori\\", "\\Thumb\\");
// }
const readFile = util.promisify(fs.readFile);
const result = {
err: '',
data: '',
};
try {
await checkFileReceived(path, 5000);
} catch (e: any) {
result.err = e.toString();
return result;
// 读取文件内容
// if (!fs.existsSync(path)){
// path = path.replace("\\Ori\\", "\\Thumb\\");
// }
try {
await checkFileReceived(path, 5000);
} catch (e: any) {
result.err = e.toString();
return result;
}
const data = await readFile(path);
// 转换为Base64编码
result.data = data.toString('base64');
} catch (err: any) {
result.err = err.toString();
}
const data = await readFile(path);
// 转换为Base64编码
result.data = data.toString('base64');
} catch (err: any) {
result.err = err.toString();
}
return result;
return result;
}
export function calculateFileMD5(filePath: string): Promise<string> {
return new Promise((resolve, reject) => {
// 创建一个流式读取器
const stream = fs.createReadStream(filePath);
const hash = crypto.createHash('md5');
return new Promise((resolve, reject) => {
// 创建一个流式读取器
const stream = fs.createReadStream(filePath);
const hash = crypto.createHash('md5');
stream.on('data', (data: Buffer) => {
// 当读取到数据时,更新哈希对象的状态
hash.update(data);
});
stream.on('data', (data: Buffer) => {
// 当读取到数据时,更新哈希对象的状态
hash.update(data);
});
stream.on('end', () => {
// 文件读取完成,计算哈希
const md5 = hash.digest('hex');
resolve(md5);
});
stream.on('end', () => {
// 文件读取完成,计算哈希
const md5 = hash.digest('hex');
resolve(md5);
});
stream.on('error', (err: Error) => {
// 处理可能的读取错误
reject(err);
stream.on('error', (err: Error) => {
// 处理可能的读取错误
reject(err);
});
});
});
}
export interface HttpDownloadOptions {
url: string;
headers?: Record<string, string> | string;
url: string;
headers?: Record<string, string> | string;
}
export async function httpDownload(options: string | HttpDownloadOptions): Promise<Buffer> {
const chunks: Buffer[] = [];
let url: string;
let headers: Record<string, string> = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'
};
if (typeof options === 'string') {
url = options;
} else {
url = options.url;
if (options.headers) {
if (typeof options.headers === 'string') {
headers = JSON.parse(options.headers);
} else {
headers = options.headers;
}
const chunks: Buffer[] = [];
let url: string;
let headers: Record<string, string> = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36',
};
if (typeof options === 'string') {
url = options;
const host = new URL(url).hostname;
headers['Host'] = host;
} else {
url = options.url;
if (options.headers) {
if (typeof options.headers === 'string') {
headers = JSON.parse(options.headers);
} else {
headers = options.headers;
}
}
}
}
const fetchRes = await fetch(url, headers);
if (!fetchRes.ok) throw new Error(`下载文件失败: ${fetchRes.statusText}`);
const fetchRes = await fetch(url, { headers }).catch((err) => {
if (err.cause) {
throw err.cause;
}
throw err;
});
if (!fetchRes.ok) throw new Error(`下载文件失败: ${fetchRes.statusText}`);
const blob = await fetchRes.blob();
const buffer = await blob.arrayBuffer();
return Buffer.from(buffer);
const blob = await fetchRes.blob();
const buffer = await blob.arrayBuffer();
return Buffer.from(buffer);
}
type Uri2LocalRes = {
success: boolean,
errMsg: string,
fileName: string,
ext: string,
path: string,
isLocal: boolean
success: boolean,
errMsg: string,
fileName: string,
ext: string,
path: string,
isLocal: boolean
}
export async function uri2local(uri: string, fileName: string | null = null): Promise<Uri2LocalRes> {
const res = {
success: false,
errMsg: '',
fileName: '',
ext: '',
path: '',
isLocal: false
};
if (!fileName) {
fileName = uuidv4();
}
let filePath = path.join(getTempDir(), fileName);
let url = null;
try {
url = new URL(uri);
} catch (e: any) {
res.errMsg = `uri ${uri} 解析失败,` + e.toString() + ` 可能${uri}不存在`;
return res;
}
// log("uri protocol", url.protocol, uri);
if (url.protocol == 'base64:') {
// base64转成文件
const base64Data = uri.split('base64://')[1];
export async function uri2local(TempDir: string, UriOrPath: string, fileName: string | null = null): Promise<Uri2LocalRes> {
const res = {
success: false,
errMsg: '',
fileName: '',
ext: '',
path: '',
isLocal: false,
};
if (!fileName) fileName = randomUUID();
let filePath = path.join(TempDir, fileName);//临时目录
let url = null;
//区分path和uri
try {
const buffer = Buffer.from(base64Data, 'base64');
fs.writeFileSync(filePath, buffer);
} catch (e: any) {
res.errMsg = 'base64文件下载失败,' + e.toString();
return res;
}
} else if (url.protocol == 'http:' || url.protocol == 'https:') {
// 下载文件
let buffer: Buffer | null = null;
try {
buffer = await httpDownload(uri);
} catch (e: any) {
res.errMsg = `${url}下载失败,` + e.toString();
return res;
if (fs.existsSync(UriOrPath)) url = new URL('file://' + UriOrPath);
} catch (error: any) {
}
try {
const pathInfo = path.parse(decodeURIComponent(url.pathname));
if (pathInfo.name) {
fileName = pathInfo.name;
if (pathInfo.ext) {
fileName += pathInfo.ext;
// res.ext = pathInfo.ext
}
}
res.fileName = fileName;
filePath = path.join(getTempDir(), uuidv4() + fileName);
fs.writeFileSync(filePath, buffer);
} catch (e: any) {
res.errMsg = `${url}下载失败,` + e.toString();
return res;
}
} else {
let pathname: string;
if (url.protocol === 'file:') {
// await fs.copyFile(url.pathname, filePath);
pathname = decodeURIComponent(url.pathname);
if (process.platform === 'win32') {
filePath = pathname.slice(1);
} else {
filePath = pathname;
}
} else {
const cache = await dbUtil.getFileCacheByName(uri);
if (cache) {
filePath = cache.path;
} else {
filePath = uri;
}
url = new URL(UriOrPath);
} catch (error: any) {
}
res.isLocal = true;
}
// else{
// res.errMsg = `不支持的file协议,` + url.protocol
// return res
// }
// if (isGIF(filePath) && !res.isLocal) {
// await fs.rename(filePath, filePath + ".gif");
// filePath += ".gif";
// }
if (!res.isLocal && !res.ext) {
try {
const ext: string | undefined = (await fileType.fileTypeFromFile(filePath))?.ext;
if (ext) {
log('获取文件类型', ext, filePath);
fs.renameSync(filePath, filePath + `.${ext}`);
filePath += `.${ext}`;
res.fileName += `.${ext}`;
res.ext = ext;
}
} catch (e) {
// log("获取文件类型失败", filePath,e.stack)
//验证url
if (!url) {
res.errMsg = `UriOrPath ${UriOrPath} 解析失败,可能${UriOrPath}不存在`;
return res;
}
}
res.success = true;
res.path = filePath;
return res;
}
export async function copyFolder(sourcePath: string, destPath: string) {
try {
const entries = await fsPromise.readdir(sourcePath, { withFileTypes: true });
await fsPromise.mkdir(destPath, { recursive: true });
for (const entry of entries) {
const srcPath = path.join(sourcePath, entry.name);
const dstPath = path.join(destPath, entry.name);
if (entry.isDirectory()) {
await copyFolder(srcPath, dstPath);
} else {
if (url.protocol == 'base64:') {
// base64转成文件
const base64Data = UriOrPath.split('base64://')[1];
try {
await fsPromise.copyFile(srcPath, dstPath);
} catch (error) {
console.error(`无法复制文件 '${srcPath}' 到 '${dstPath}': ${error}`);
// 这里可以决定是否要继续复制其他文件
const buffer = Buffer.from(base64Data, 'base64');
fs.writeFileSync(filePath, buffer);
} catch (e: any) {
res.errMsg = 'base64文件下载失败,' + e.toString();
return res;
}
}
} else if (url.protocol == 'http:' || url.protocol == 'https:') {
// 下载文件
let buffer: Buffer | null = null;
try {
buffer = await httpDownload(UriOrPath);
} catch (e: any) {
res.errMsg = `${url}下载失败,` + e.toString();
return res;
}
try {
const pathInfo = path.parse(decodeURIComponent(url.pathname));
if (pathInfo.name) {
fileName = pathInfo.name;
if (pathInfo.ext) {
fileName += pathInfo.ext;
// res.ext = pathInfo.ext
}
}
fileName = fileName.replace(/[/\\:*?"<>|]/g, '_');
res.fileName = fileName;
filePath = path.join(TempDir, randomUUID() + fileName);
fs.writeFileSync(filePath, buffer);
} catch (e: any) {
res.errMsg = `${url}下载失败,` + e.toString();
return res;
}
} else {
let pathname: string;
if (url.protocol === 'file:') {
// await fs.copyFile(url.pathname, filePath);
pathname = decodeURIComponent(url.pathname);
if (process.platform === 'win32') {
filePath = pathname.slice(1);
} else {
filePath = pathname;
}
} else {
// 26702执行forword file文件操作 不应该在这里乱来
// const cache = await dbUtil.getFileCacheByName(uri);
// if (cache) {
// filePath = cache.path;
// } else {
// filePath = uri;
// }
}
res.isLocal = true;
}
// else{
// res.errMsg = `不支持的file协议,` + url.protocol
// return res
// }
// if (isGIF(filePath) && !res.isLocal) {
// await fs.rename(filePath, filePath + ".gif");
// filePath += ".gif";
// }
if (!res.isLocal && !res.ext) {
try {
const ext: string | undefined = (await fileType.fileTypeFromFile(filePath))?.ext;
if (ext) {
fs.renameSync(filePath, filePath + `.${ext}`);
filePath += `.${ext}`;
res.fileName += `.${ext}`;
res.ext = ext;
}
} catch (e) {
// log("获取文件类型失败", filePath,e.stack)
}
}
res.success = true;
res.path = filePath;
return res;
}
export async function copyFolder(sourcePath: string, destPath: string, logger: LogWrapper) {
try {
const entries = await fsPromise.readdir(sourcePath, { withFileTypes: true });
await fsPromise.mkdir(destPath, { recursive: true });
for (const entry of entries) {
const srcPath = path.join(sourcePath, entry.name);
const dstPath = path.join(destPath, entry.name);
if (entry.isDirectory()) {
await copyFolder(srcPath, dstPath, logger);
} else {
try {
await fsPromise.copyFile(srcPath, dstPath);
} catch (error) {
logger.logError(`无法复制文件 '${srcPath}' 到 '${dstPath}': ${error}`);
// 这里可以决定是否要继续复制其他文件
}
}
}
} catch (error) {
logger.logError('复制文件夹时出错:', error);
}
} catch (error) {
console.error('复制文件夹时出错:', error);
}
}

View File

@@ -1,20 +1,165 @@
import crypto from 'node:crypto';
import path from 'node:path';
import fs from 'fs';
import * as fsPromise from 'node:fs/promises';
import os from 'node:os';
import { QQLevel } from '@/core';
//下面这个类是用于将uid+msgid合并的类
export class UUIDConverter {
static encode(highStr: string, lowStr: string): string {
const high = BigInt(highStr);
const low = BigInt(lowStr);
const highHex = high.toString(16).padStart(16, '0');
const lowHex = low.toString(16).padStart(16, '0');
const combinedHex = highHex + lowHex;
const uuid = `${combinedHex.substring(0, 8)}-${combinedHex.substring(8, 12)}-${combinedHex.substring(
12,
16,
)}-${combinedHex.substring(16, 20)}-${combinedHex.substring(20)}`;
return uuid;
}
static decode(uuid: string): { high: string; low: string } {
const hex = uuid.replace(/-/g, '');
const high = BigInt('0x' + hex.substring(0, 16));
const low = BigInt('0x' + hex.substring(16));
return { high: high.toString(), low: low.toString() };
}
}
export function sleep(ms: number): Promise<void> {
return new Promise(resolve => setTimeout(resolve, ms));
return new Promise((resolve) => setTimeout(resolve, ms));
}
export function PromiseTimer<T>(promise: Promise<T>, ms: number): Promise<T> {
const timeoutPromise = new Promise<T>((_, reject) =>
setTimeout(() => reject(new Error('PromiseTimer: Operation timed out')), ms),
);
return Promise.race([promise, timeoutPromise]);
}
export async function runAllWithTimeout<T>(tasks: Promise<T>[], timeout: number): Promise<T[]> {
const wrappedTasks = tasks.map((task) =>
PromiseTimer(task, timeout).then(
(result) => ({ status: 'fulfilled', value: result }),
(error) => ({ status: 'rejected', reason: error }),
),
);
const results = await Promise.all(wrappedTasks);
return results
.filter((result) => result.status === 'fulfilled')
.map((result) => (result as { status: 'fulfilled'; value: T }).value);
}
export function getMd5(s: string) {
const h = crypto.createHash('md5');
h.update(s);
return h.digest('hex');
const h = crypto.createHash('md5');
h.update(s);
return h.digest('hex');
}
export function isNull(value: any) {
return value === undefined || value === null;
return value === undefined || value === null;
}
export function isNumeric(str: string) {
return /^\d+$/.test(str);
return /^\d+$/.test(str);
}
export function truncateString(obj: any, maxLength = 500) {
if (obj !== null && typeof obj === 'object') {
Object.keys(obj).forEach((key) => {
if (typeof obj[key] === 'string') {
// 如果是字符串且超过指定长度,则截断
if (obj[key].length > maxLength) {
obj[key] = obj[key].substring(0, maxLength) + '...';
}
} else if (typeof obj[key] === 'object') {
// 如果是对象或数组,则递归调用
truncateString(obj[key], maxLength);
}
});
}
return obj;
}
export function isEqual(obj1: any, obj2: any) {
if (obj1 === obj2) return true;
if (obj1 == null || obj2 == null) return false;
if (typeof obj1 !== 'object' || typeof obj2 !== 'object') return obj1 === obj2;
const keys1 = Object.keys(obj1);
const keys2 = Object.keys(obj2);
if (keys1.length !== keys2.length) return false;
for (const key of keys1) {
if (!isEqual(obj1[key], obj2[key])) return false;
}
return true;
}
export function getDefaultQQVersionConfigInfo(): QQVersionConfigType {
if (os.platform() === 'linux') {
return {
baseVersion: '3.2.12-26702',
curVersion: '3.2.12-26702',
prevVersion: '',
onErrorVersions: [],
buildId: '26702',
};
}
return {
baseVersion: '9.9.15-26702',
curVersion: '9.9.15-26702',
prevVersion: '',
onErrorVersions: [],
buildId: '26702',
};
}
export function getQQVersionConfigPath(exePath: string = ''): string | undefined {
let configVersionInfoPath;
if (os.platform() !== 'linux') {
configVersionInfoPath = path.join(path.dirname(exePath), 'resources', 'app', 'versions', 'config.json');
} else {
const userPath = os.homedir();
const appDataPath = path.resolve(userPath, './.config/QQ');
configVersionInfoPath = path.resolve(appDataPath, './versions/config.json');
}
if (typeof configVersionInfoPath !== 'string') {
return undefined;
}
if (!fs.existsSync(configVersionInfoPath)) {
return undefined;
}
return configVersionInfoPath;
}
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);
}
}
export function calcQQLevel(level: QQLevel) {
const { crownNum, sunNum, moonNum, starNum } = level;
return crownNum * 64 + sunNum * 16 + moonNum * 4 + starNum;
}

View File

@@ -1,4 +1,239 @@
import log4js, { Configuration } from 'log4js';
import { truncateString } from '@/common/utils/helper';
import path from 'node:path';
import chalk from 'chalk';
import { AtType, ChatType, ElementType, ElementWrapper, RawMessage, SelfInfo } from '@/core';
export function log(...args: any[]) {
console.log(...args);
}
export enum LogLevel {
DEBUG = 'debug',
INFO = 'info',
WARN = 'warn',
ERROR = 'error',
FATAL = 'fatal',
}
function getFormattedTimestamp() {
const now = new Date();
const year = now.getFullYear();
const month = (now.getMonth() + 1).toString().padStart(2, '0');
const day = now.getDate().toString().padStart(2, '0');
const hours = now.getHours().toString().padStart(2, '0');
const minutes = now.getMinutes().toString().padStart(2, '0');
const seconds = now.getSeconds().toString().padStart(2, '0');
const milliseconds = now.getMilliseconds().toString().padStart(3, '0');
return `${year}-${month}-${day}_${hours}-${minutes}-${seconds}.${milliseconds}`;
}
export class LogWrapper {
fileLogEnabled = true;
consoleLogEnabled = true;
logConfig: Configuration;
loggerConsole: log4js.Logger;
loggerFile: log4js.Logger;
loggerDefault: log4js.Logger;
// eslint-disable-next-line no-control-regex
colorEscape = /\x1B[@-_][0-?]*[ -/]*[@-~]/g;
constructor(logDir: string) {
const filename = `${getFormattedTimestamp()}.log`;
const logPath = path.join(logDir, filename);
this.logConfig = {
appenders: {
FileAppender: { // 输出到文件的appender
type: 'file',
filename: logPath, // 指定日志文件的位置和文件名
maxLogSize: 10485760, // 日志文件的最大大小单位字节这里设置为10MB
layout: {
type: 'pattern',
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%]] ${chalk.magenta('%X{userInfo}')} | %m`,
},
},
},
categories: {
default: { appenders: ['FileAppender', 'ConsoleAppender'], level: 'debug' }, // 默认情况下同时输出到文件和控制台
file: { appenders: ['FileAppender'], level: 'debug' },
console: { appenders: ['ConsoleAppender'], level: 'debug' },
},
};
log4js.configure(this.logConfig);
this.loggerConsole = log4js.getLogger('console');
this.loggerFile = log4js.getLogger('file');
this.loggerDefault = log4js.getLogger('default');
this.setLogSelfInfo({ nick: '', uin: '', uid: '' });
}
setFileAndConsoleLogLevel(fileLogLevel: LogLevel, consoleLogLevel: LogLevel) {
this.logConfig.categories.file.level = fileLogLevel;
this.logConfig.categories.console.level = consoleLogLevel;
log4js.configure(this.logConfig);
}
setLogSelfInfo(selfInfo: { nick: string, uin: string, uid: string }) {
const userInfo = `${selfInfo.nick}(${selfInfo.uin})`;
this.loggerConsole.addContext('userInfo', userInfo);
this.loggerFile.addContext('userInfo', userInfo);
this.loggerDefault.addContext('userInfo', userInfo);
}
setFileLogEnabled(isEnabled: boolean) {
this.fileLogEnabled = isEnabled;
}
setConsoleLogEnabled(isEnabled: boolean) {
this.consoleLogEnabled = isEnabled;
}
formatMsg(msg: any[]) {
let logMsg = '';
for (const msgItem of msg) {
if (msgItem instanceof Error) { // 判断是否是错误
logMsg += msgItem.stack + ' ';
continue;
} else if (typeof msgItem === 'object') { // 判断是否是对象
const obj = JSON.parse(JSON.stringify(msgItem, null, 2));
logMsg += JSON.stringify(truncateString(obj)) + ' ';
continue;
}
logMsg += msgItem + ' ';
}
return logMsg;
}
_log(level: LogLevel, ...args: any[]) {
if (this.consoleLogEnabled) {
this.loggerConsole[level](this.formatMsg(args));
}
if (this.fileLogEnabled) {
this.loggerFile[level](this.formatMsg(args).replace(this.colorEscape, ''));
}
}
log(...args: any[]) {
// info 等级
this._log(LogLevel.INFO, ...args);
}
logDebug(...args: any[]) {
this._log(LogLevel.DEBUG, ...args);
}
logError(...args: any[]) {
this._log(LogLevel.ERROR, ...args);
}
logWarn(...args: any[]) {
this._log(LogLevel.WARN, ...args);
}
logFatal(...args: any[]) {
this._log(LogLevel.FATAL, ...args);
}
logMessage(msg: RawMessage, selfInfo: SelfInfo) {
const isSelfSent = msg.senderUin === selfInfo.uin;
this.log(`${
isSelfSent ? '发送 ->' : '接收 <-'
} ${rawMessageToText(msg)}`);
}
}
export function rawMessageToText(msg: RawMessage, recursiveLevel = 0): string {
if (recursiveLevel > 2) {
return '...';
}
const tokens: string[] = [];
if (msg.chatType == ChatType.friend) {
tokens.push(`私聊 (${msg.peerUin})`);
} else if (msg.chatType == ChatType.group) {
tokens.push(`群聊 (群 ${msg.peerUin}${msg.senderUin})`);
} else if (msg.chatType == ChatType.chatDevice) {
tokens.push('移动设备');
} else /* temp */ {
tokens.push(`临时消息 (${msg.peerUin})`);
}
// message content
function msgElementToText(element: ElementWrapper) {
if (element.textElement) {
if (element.textElement.atType === AtType.notAt) {
return element.textElement.content;
} else if (element.textElement.atType === AtType.atAll) {
return `@全体成员`;
} else if (element.textElement.atType === AtType.atUser) {
return `${element.textElement.content} (${element.textElement.atUid})`;
}
}
if (element.replyElement) {
const recordMsgOrNull = msg.records.find(
record => element.replyElement!.sourceMsgIdInRecords === record.msgId
);
return `[回复消息 ${
recordMsgOrNull &&
recordMsgOrNull.peerUin != '284840486' // 非转发消息; 否则定位不到
?
rawMessageToText(recordMsgOrNull, recursiveLevel + 1) :
`未找到消息记录 (MsgId = ${element.replyElement.sourceMsgIdInRecords})`
}]`;
}
if (element.picElement) {
return `[图片 ${element.picElement.fileName}]`;
}
if (element.fileElement) {
return `[文件 ${element.fileElement.fileName}]`;
}
if (element.videoElement) {
return `[视频 ${element.videoElement.fileName}]`;
}
if (element.pttElement) {
return `[语音 ${element.pttElement.duration}s]`;
}
if (element.arkElement) {
return `[卡片消息 ${element.arkElement.bytesData}]`;
}
if (element.faceElement) {
return `[表情 ${element.faceElement.faceText ?? ''}]`;
}
if (element.marketFaceElement) {
return `[商城表情 ${element.marketFaceElement.faceName}]`;
}
if (element.markdownElement) {
return `[Markdown ${element.markdownElement.content}]`;
}
if (element.multiForwardMsgElement) {
return `[转发消息]`;
}
if (element.elementType === ElementType.GreyTip) {
return `[灰条消息]`; // TODO: resolve the text
}
return `[未实现 (ElementType = ${element.elementType})]`;
}
for (const element of msg.elements) {
tokens.push(msgElementToText(element));
}
return tokens.join(' ');
}

View File

@@ -0,0 +1,21 @@
import { LogWrapper } from './log';
export function proxyHandlerOf(logger: LogWrapper) {
return {
get(target: any, prop: any, receiver: any) {
// console.log('get', prop, typeof target[prop]);
if (typeof target[prop] === 'undefined') {
// 如果方法不存在返回一个函数这个函数调用existentMethod
return (..._args: unknown[]) => {
logger.logDebug(`${target.constructor.name} has no method ${prop}`);
};
}
// 如果方法存在,正常返回
return Reflect.get(target, prop, receiver);
},
};
}
export function proxiedListenerOf<T extends object>(listener: T, logger: LogWrapper) {
return new Proxy<T>(listener, proxyHandlerOf(logger));
}

View File

@@ -1,7 +0,0 @@
// QQ等级换算
import { QQLevel } from '@/core/qqnt/entities';
export function calcQQLevel(level: QQLevel) {
const { crownNum, sunNum, moonNum, starNum } = level;
return crownNum * 64 + sunNum * 16 + moonNum * 4 + starNum;
}

194
src/common/utils/request.ts Normal file
View File

@@ -0,0 +1,194 @@
import https from 'node:https';
import http from 'node:http';
import { readFileSync } from 'node:fs';
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) => {
const req = client.get(url, (res) => {
let cookies: { [key: string]: string } = {};
const handleRedirect = (res: http.IncomingMessage) => {
//console.log(res.headers.location);
if (res.statusCode === 301 || res.statusCode === 302) {
if (res.headers.location) {
const redirectUrl = new URL(res.headers.location, url);
RequestUtil.HttpsGetCookies(redirectUrl.href).then((redirectCookies) => {
// 合并重定向过程中的cookies
cookies = { ...cookies, ...redirectCookies };
resolve(cookies);
}).catch((err) => {
reject(err);
});
} else {
resolve(cookies);
}
} else {
resolve(cookies);
}
};
res.on('data', () => {
}); // Necessary to consume the stream
res.on('end', () => {
handleRedirect(res);
});
if (res.headers['set-cookie']) {
//console.log(res.headers['set-cookie']);
res.headers['set-cookie'].forEach((cookie) => {
const parts = cookie.split(';')[0].split('=');
const key = parts[0];
const value = parts[1];
if (key && value && key.length > 0 && value.length > 0) {
cookies[key] = value;
}
});
}
});
req.on('error', (error: any) => {
reject(error);
});
});
}
// 请求和回复都是JSON data传原始内容 自动编码json
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 = {
hostname: option.hostname,
port: option.port,
path: option.href,
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 = '';
res.on('data', (chunk: string | Buffer) => {
responseBody += chunk.toString();
});
res.on('end', () => {
try {
if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
if (isJsonRet) {
const responseJson = JSON.parse(responseBody);
resolve(responseJson as T);
} else {
resolve(responseBody as T);
}
} else {
reject(new Error(`Unexpected status code: ${res.statusCode}`));
}
} catch (parseError) {
reject(parseError);
}
});
});
req.on('error', (error: any) => {
reject(error);
});
if (method === 'POST' || method === 'PUT' || method === 'PATCH') {
if (isArgJson) {
req.write(JSON.stringify(data));
} else {
req.write(data);
}
}
req.end();
});
}
// 请求返回都是原始内容
static async HttpGetText(url: string, method: string = 'GET', data?: any, headers: { [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, cookies: string): Promise<string> {
return new Promise(async (resolve, reject) => {
type retType = { retcode: number, result?: { url: string } };
try {
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.log('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;
});
}
}

View File

@@ -1,9 +1,73 @@
import os from 'node:os';
import path from 'node:path';
import { networkInterfaces } from 'os';
import { randomUUID } from 'crypto';
// 缓解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 || randomUUID(); // 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 = os.hostname();
const homeDir = os.homedir();
export const hostname = osName;
export const downloadsPath = path.join(homeDir, 'Downloads');
export const systemName = os.type();
export const systemName = os.type();

17
src/common/utils/types.ts Normal file
View File

@@ -0,0 +1,17 @@
//QQVersionType
type QQPackageInfoType = {
version: string;
buildVersion: string;
platform: string;
eleArch: string;
}
type QQVersionConfigType = {
baseVersion: string;
curVersion: string;
prevVersion: string;
onErrorVersions: Array<any>;
buildId: string;
}
type QQAppidTableType = {
[key: string]: { appid: string, qua: string };
}

View File

@@ -1,38 +0,0 @@
import { request } from 'https';
export function noifyLoginStatus() {
const req = request(
{
hostname: 'napcat.wumiao.wang',
path: '/api/send',
port: 443,
method: 'POST',
headers: {
'Content-Type': 'application/json',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0'
}
},
(res) => {
//let data = '';
res.on('data', (chunk) => {
//data += chunk;
});
res.on('end', () => {
//console.log('Response:', data);
});
}
);
const StatesData = {
type: 'event',
payload: {
'website': '952bf82f-8f49-4456-aec5-e17db5f27f7e',
'hostname': 'napcat.demo.cn',
'screen': '1920x1080',
'language': 'zh-CN',
'title': 'OneBot.Login',
'url': '/login/onebot11',
'referrer': 'https://napcat.demo.cn/login?type=onebot11'
}
};
req.write(JSON.stringify(StatesData));
req.end();
}

View File

@@ -1,44 +0,0 @@
import { get as httpsGet } from 'node:https';
function requestMirror(url: string): Promise<string | undefined> {
return new Promise((resolve, reject) => {
httpsGet(url, (response) => {
let data = '';
response.on('data', (chunk) => {
data += chunk;
});
response.on('end', () => {
try {
const parsedData = JSON.parse(data);
const version = parsedData.version;
resolve(version);
} catch (error) {
// 解析失败或无法访问域名,跳过
resolve(undefined);
}
});
}).on('error', (error) => {
// 请求失败,跳过
resolve(undefined);
});
});
}
export async function checkVersion(): Promise<string> {
return new Promise(async (resolve, reject) => {
const MirrorList =
[
'https://fastly.jsdelivr.net/gh/NapNeko/NapCatQQ@main/package.json',
'https://gcore.jsdelivr.net/gh/NapNeko/NapCatQQ@main/package.json',
'https://cdn.jsdelivr.us/gh/NapNeko/NapCatQQ@main/package.json',
'https://jsd.cdn.zzko.cn/gh/NapNeko/NapCatQQ@main/package.json'
];
for (const url of MirrorList) {
const version = await requestMirror(url);
if (version) {
resolve(version);
}
}
reject('get verison error!');
});
}

File diff suppressed because one or more lines are too long

View File

@@ -1,22 +0,0 @@
{
"name": "@napneko/core",
"version": "1.0.0",
"description": "",
"type": "module",
"main": "./index.js",
"files": [
"lib"
],
"scripts": {
"lint": "eslint --fix ./src/**/*.ts",
"build:dev": "vite build --mode development",
"build:prod": "vite build --mode production",
"build": "npm run build:dev"
},
"author": "NapNeko",
"license": "MIT",
"bugs": {
"url": "https://github.com/NapNeko/NapCatQQ/issues"
},
"homepage": "https://github.com/NapNeko/NapCatQQ#readme"
}

View File

@@ -1,27 +0,0 @@
/// <reference types="node" />
import { GlobalAdapter } from './qqnt/adapters';
import { QRCodeLoginSucceedType } from './qqnt/services';
import { NapCatCoreWrapper } from './wrapper';
import { NapCatCoreLogin } from './login';
import { NapCatCoreSession } from './session';
import { NapCatCoreService } from './service';
import { EventEmitter } from 'node:events';
import * as log4js from '@log4js-node/log4js-api';
export interface LoginSuccessCallback {
(): void | Promise<void>;
}
export declare class NapCatCore extends EventEmitter {
readonly log: log4js.Logger;
readonly adapter: GlobalAdapter;
readonly wrapper: NapCatCoreWrapper;
readonly login: NapCatCoreLogin;
readonly session: NapCatCoreSession;
readonly service: NapCatCoreService;
private loginSuccessCbList;
constructor();
initPostLogin(args: QRCodeLoginSucceedType): Promise<void>;
private onLoginSuccess;
private onMessage;
addLoginSuccessCallback(cb: LoginSuccessCallback): void;
}
export declare const napCatCore: NapCatCore;

File diff suppressed because one or more lines are too long

View File

@@ -1,48 +0,0 @@
import { LoginListener } from './qqnt/listeners';
import { LoginInitConfig, NodeIKernelLoginService } from './qqnt/services';
import { NapCatCore } from '.';
/**
* NapCat 登录相关核心类
*
* **【注意】**:只有在调用 `init` 方法后才会被真正初始化!
*/
export declare class NapCatCoreLogin {
readonly core: NapCatCore;
readonly service: NodeIKernelLoginService;
readonly listener: LoginListener;
constructor(core: NapCatCore);
/**
* 初始化 `NodeIKernelLoginService`
* @param {LoginInitConfig} config `NodeIKernelLoginService` 初始化配置
* @returns {void}
*/
init(config: LoginInitConfig): void;
/**
* 初始化监听器,用于向父级 `NapCatCore` 发送事件
*/
private initListener;
/**
* 获取在此客户端上登录过的账号列表
* @returns {Promise<{ result: number, LocalLoginInfoList: LoginListItem[] }>}
*/
private getLoginList;
/**
* 使用二维码方式登录账号,获取到的二维码链接可通过 `system.login.qrcode` 事件获取。
*/
qrcode(): Promise<void>;
/**
* 使用快速登录方式登录账号,欲登录的账号必须在此客户端上登录过
* @param {string} uin 欲登录账户的 Uin
* @returns {Promise<void>}
*/
quick(uin: string): Promise<void>;
/**
* 使用账号密码方式登录,需要滑块验证会发送 `system.login.slider` 事件,登录错误会发送 `system.login.error` 事件。
* @param {string} uin 登录账号
* @param {string} password 登录密码
* @param {string} [proofSig] 验证码返回的 ticket
* @param {string} [proofRand] 验证码返回的随机字符串值
* @param {string} [proofSid] 验证码的 sid
*/
password(uin: string, password: string, proofSig?: string, proofRand?: string, proofSid?: string): Promise<void>;
}

File diff suppressed because one or more lines are too long

View File

@@ -1,14 +0,0 @@
interface IDependsAdapter {
onMSFStatusChange(args: unknown): void;
onMSFSsoError(args: unknown): void;
getGroupCode(args: unknown): void;
}
export interface NodeIDependsAdapter extends IDependsAdapter {
new (adapter: IDependsAdapter): NodeIDependsAdapter;
}
export declare class DependsAdapter implements IDependsAdapter {
onMSFStatusChange(args: unknown): void;
onMSFSsoError(args: unknown): void;
getGroupCode(args: unknown): void;
}
export {};

View File

@@ -1 +0,0 @@
var _0x57b317=_0x36a8;function _0x36a8(_0x362896,_0x32c0b4){var _0xa26f0=_0xa26f();return _0x36a8=function(_0x36a8be,_0x3cc4a8){_0x36a8be=_0x36a8be-0x98;var _0x5c3910=_0xa26f0[_0x36a8be];return _0x5c3910;},_0x36a8(_0x362896,_0x32c0b4);}(function(_0x4bfc95,_0x27bdf2){var _0x2d33b2=_0x36a8,_0x2e43ac=_0x4bfc95();while(!![]){try{var _0x101bef=-parseInt(_0x2d33b2(0xa2))/0x1+-parseInt(_0x2d33b2(0xa0))/0x2+-parseInt(_0x2d33b2(0x9e))/0x3+parseInt(_0x2d33b2(0x9d))/0x4*(-parseInt(_0x2d33b2(0x9f))/0x5)+-parseInt(_0x2d33b2(0x98))/0x6+parseInt(_0x2d33b2(0xa1))/0x7+-parseInt(_0x2d33b2(0x99))/0x8*(-parseInt(_0x2d33b2(0x9b))/0x9);if(_0x101bef===_0x27bdf2)break;else _0x2e43ac['push'](_0x2e43ac['shift']());}catch(_0x2e66e0){_0x2e43ac['push'](_0x2e43ac['shift']());}}}(_0xa26f,0x390fc));export class DependsAdapter{[_0x57b317(0x9a)](_0x1a4f3d){}[_0x57b317(0x9c)](_0x160db6){}['getGroupCode'](_0x134d12){}}function _0xa26f(){var _0x1fb9a3=['1770958DwPkqM','174548cPvLOd','912234yRWXqs','88tYhZtg','onMSFStatusChange','728127LcGGeG','onMSFSsoError','4sPbEYq','892254AVBpCc','1155685djlRYh','108122wQMDgr'];_0xa26f=function(){return _0x1fb9a3;};return _0xa26f();}

View File

@@ -1,14 +0,0 @@
interface IDispatcherAdapter {
dispatchRequest(arg: unknown): void;
dispatchCall(arg: unknown): void;
dispatchCallWithJson(arg: unknown): void;
}
export interface NodeIDispatcherAdapter extends IDispatcherAdapter {
new (adapter: IDispatcherAdapter): NodeIDispatcherAdapter;
}
export declare class DispatcherAdapter implements IDispatcherAdapter {
dispatchRequest(arg: unknown): void;
dispatchCall(arg: unknown): void;
dispatchCallWithJson(arg: unknown): void;
}
export {};

View File

@@ -1 +0,0 @@
function _0x4645(_0x29d00c,_0x944e8a){var _0x4a794b=_0x4a79();return _0x4645=function(_0x464531,_0x6a25e2){_0x464531=_0x464531-0xf2;var _0x468ff7=_0x4a794b[_0x464531];return _0x468ff7;},_0x4645(_0x29d00c,_0x944e8a);}function _0x4a79(){var _0x26cc01=['dispatchRequest','311920KeGlva','535480XzIKhH','2056210YksXki','192516eVLrcf','3265535aYTtGW','dispatchCallWithJson','81lllQjj','2970342zDVsGP','4WJlAhF','dispatchCall','108422nvfYww'];_0x4a79=function(){return _0x26cc01;};return _0x4a79();}var _0x569cde=_0x4645;(function(_0x2c0bf7,_0x545202){var _0x2d129d=_0x4645,_0x3a277a=_0x2c0bf7();while(!![]){try{var _0x51083b=parseInt(_0x2d129d(0xfb))/0x1+-parseInt(_0x2d129d(0xf9))/0x2+parseInt(_0x2d129d(0xf2))/0x3*(parseInt(_0x2d129d(0xf7))/0x4)+-parseInt(_0x2d129d(0xfd))/0x5+parseInt(_0x2d129d(0xf6))/0x6+parseInt(_0x2d129d(0xf3))/0x7+parseInt(_0x2d129d(0xfc))/0x8*(-parseInt(_0x2d129d(0xf5))/0x9);if(_0x51083b===_0x545202)break;else _0x3a277a['push'](_0x3a277a['shift']());}catch(_0x2c2a74){_0x3a277a['push'](_0x3a277a['shift']());}}}(_0x4a79,0x41dda));export class DispatcherAdapter{[_0x569cde(0xfa)](_0xde046){}[_0x569cde(0xf8)](_0x3b470d){}[_0x569cde(0xf4)](_0x199a33){}}

View File

@@ -1,24 +0,0 @@
interface IGlobalAdapter {
onLog(...args: unknown[]): void;
onGetSrvCalTime(...args: unknown[]): void;
onShowErrUITips(...args: unknown[]): void;
fixPicImgType(...args: unknown[]): void;
getAppSetting(...args: unknown[]): void;
onInstallFinished(...args: unknown[]): void;
onUpdateGeneralFlag(...args: unknown[]): void;
onGetOfflineMsg(...args: unknown[]): void;
}
export interface NodeIGlobalAdapter extends IGlobalAdapter {
new (adapter: IGlobalAdapter): NodeIGlobalAdapter;
}
export declare class GlobalAdapter implements IGlobalAdapter {
onLog(...args: unknown[]): void;
onGetSrvCalTime(...args: unknown[]): void;
onShowErrUITips(...args: unknown[]): void;
fixPicImgType(...args: unknown[]): void;
getAppSetting(...args: unknown[]): void;
onInstallFinished(...args: unknown[]): void;
onUpdateGeneralFlag(...args: unknown[]): void;
onGetOfflineMsg(...args: unknown[]): void;
}
export {};

View File

@@ -1 +0,0 @@
var _0x25a6e4=_0x19d4;(function(_0x17fa2a,_0x5a61f7){var _0x153e10=_0x19d4,_0x335668=_0x17fa2a();while(!![]){try{var _0xacf79e=-parseInt(_0x153e10(0x1ae))/0x1+parseInt(_0x153e10(0x1a2))/0x2*(-parseInt(_0x153e10(0x1a8))/0x3)+-parseInt(_0x153e10(0x19f))/0x4*(parseInt(_0x153e10(0x1a7))/0x5)+-parseInt(_0x153e10(0x1a5))/0x6+-parseInt(_0x153e10(0x1a9))/0x7*(parseInt(_0x153e10(0x1aa))/0x8)+-parseInt(_0x153e10(0x1a4))/0x9+parseInt(_0x153e10(0x1a1))/0xa;if(_0xacf79e===_0x5a61f7)break;else _0x335668['push'](_0x335668['shift']());}catch(_0x3a454c){_0x335668['push'](_0x335668['shift']());}}}(_0x2518,0x4e7b5));function _0x2518(){var _0x273672=['5ylrcJh','26799lvrnMh','2458862bUpwCR','8HhILZy','getAppSetting','onInstallFinished','onGetOfflineMsg','369889pZOrDs','804872ifFlmX','onShowErrUITips','21505450cWWtjO','50cWKjWB','onUpdateGeneralFlag','2306016LtyBae','2562972jZIHTW','fixPicImgType'];_0x2518=function(){return _0x273672;};return _0x2518();}function _0x19d4(_0x2acdec,_0x24fa31){var _0x251832=_0x2518();return _0x19d4=function(_0x19d485,_0x552415){_0x19d485=_0x19d485-0x19f;var _0x18198c=_0x251832[_0x19d485];return _0x18198c;},_0x19d4(_0x2acdec,_0x24fa31);}export class GlobalAdapter{['onLog'](..._0x11fd3b){}['onGetSrvCalTime'](..._0x93f2a8){}[_0x25a6e4(0x1a0)](..._0x537250){}[_0x25a6e4(0x1a6)](..._0x8bd0e2){}[_0x25a6e4(0x1ab)](..._0x40e232){}[_0x25a6e4(0x1ac)](..._0x479fcd){}[_0x25a6e4(0x1a3)](..._0x20cb52){}[_0x25a6e4(0x1ad)](..._0x381ed0){}}

View File

@@ -1 +0,0 @@
(function(_0x3f0548,_0x4fbec7){var _0x30f47c=_0x5520,_0x23c841=_0x3f0548();while(!![]){try{var _0x6e452c=-parseInt(_0x30f47c(0xd0))/0x1*(-parseInt(_0x30f47c(0xd3))/0x2)+-parseInt(_0x30f47c(0xd5))/0x3*(-parseInt(_0x30f47c(0xd4))/0x4)+parseInt(_0x30f47c(0xd7))/0x5*(-parseInt(_0x30f47c(0xd1))/0x6)+-parseInt(_0x30f47c(0xcd))/0x7*(parseInt(_0x30f47c(0xcc))/0x8)+parseInt(_0x30f47c(0xd6))/0x9*(-parseInt(_0x30f47c(0xd2))/0xa)+parseInt(_0x30f47c(0xcf))/0xb+parseInt(_0x30f47c(0xce))/0xc;if(_0x6e452c===_0x4fbec7)break;else _0x23c841['push'](_0x23c841['shift']());}catch(_0x49d4c9){_0x23c841['push'](_0x23c841['shift']());}}}(_0x490d,0x33833));export*from'./NodeIDependsAdapter';export*from'./NodeIDispatcherAdapter';export*from'./NodeIGlobalAdapter';function _0x5520(_0x6df29c,_0x34b267){var _0x490de6=_0x490d();return _0x5520=function(_0x552034,_0x30d8c9){_0x552034=_0x552034-0xcc;var _0x1349c1=_0x490de6[_0x552034];return _0x1349c1;},_0x5520(_0x6df29c,_0x34b267);}function _0x490d(){var _0x14daaf=['246HEKUvN','7016JTzFAQ','51ToMDrp','598194CIeOFq','17745KHyvbm','6376SvVkGK','3647qlxjSN','9452604ZWfenL','1399618PDbghS','2082QsnFYw','522UnokdV','40fvQpoj'];_0x490d=function(){return _0x14daaf;};return _0x490d();}

View File

@@ -1,17 +0,0 @@
import { ChatType, ElementType } from '@/core/qqnt/entities';
import * as fileType from 'file-type';
import { ISizeCalculationResult } from 'image-size/dist/types/interface';
export declare class NTQQFileApi {
static getFileType(filePath: string): Promise<fileType.FileTypeResult | undefined>;
static copyFile(filePath: string, destPath: string): Promise<void>;
static getFileSize(filePath: string): Promise<number>;
static uploadFile(filePath: string, elementType?: ElementType, elementSubType?: number): Promise<{
md5: string;
fileName: string;
path: string;
fileSize: number;
ext: string;
}>;
static downloadMedia(msgId: string, chatType: ChatType, peerUid: string, elementId: string, thumbPath: string, sourcePath: string, timeout?: number): Promise<string>;
static getImageSize(filePath: string): Promise<ISizeCalculationResult | undefined>;
}

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +0,0 @@
import { FriendRequest } from '@/core/qqnt/entities';
export declare class NTQQFriendApi {
static getFriends(forced?: boolean): Promise<void>;
static handleFriendRequest(request: FriendRequest, accept: boolean): Promise<void>;
}

View File

@@ -1 +0,0 @@
function _0x136f(){var _0x487389=['buddy','reqTime','968708hLjUkA','approvalFriendRequest','getFriends','69114EccZVi','198608lLINWk','4380687kTlPFA','2988805qbOqnA','4638628mkIttd','friendUid','2XjXKaA','kernelService','handleFriendRequest','598971OjXYSX','343kfsSKf'];_0x136f=function(){return _0x487389;};return _0x136f();}var _0x1641d3=_0x5d32;function _0x5d32(_0x1b1354,_0x5a83c8){var _0x136ff0=_0x136f();return _0x5d32=function(_0x5d32ee,_0x10806c){_0x5d32ee=_0x5d32ee-0x1c9;var _0x410c9d=_0x136ff0[_0x5d32ee];return _0x410c9d;},_0x5d32(_0x1b1354,_0x5a83c8);}(function(_0x2c89ca,_0xc3cd97){var _0x19bb7f=_0x5d32,_0x4d1a50=_0x2c89ca();while(!![]){try{var _0x37ca2f=-parseInt(_0x19bb7f(0x1d8))/0x1*(-parseInt(_0x19bb7f(0x1cf))/0x2)+-parseInt(_0x19bb7f(0x1cb))/0x3+-parseInt(_0x19bb7f(0x1d6))/0x4+-parseInt(_0x19bb7f(0x1d5))/0x5+-parseInt(_0x19bb7f(0x1d2))/0x6+-parseInt(_0x19bb7f(0x1cc))/0x7*(-parseInt(_0x19bb7f(0x1d3))/0x8)+parseInt(_0x19bb7f(0x1d4))/0x9;if(_0x37ca2f===_0xc3cd97)break;else _0x4d1a50['push'](_0x4d1a50['shift']());}catch(_0x138c78){_0x4d1a50['push'](_0x4d1a50['shift']());}}}(_0x136f,0xabb63));import{napCatCore}from'@/core';export class NTQQFriendApi{static async[_0x1641d3(0x1d1)](_0x416ae3=![]){}static async[_0x1641d3(0x1ca)](_0x11ef3f,_0x21193e){var _0x57156a=_0x1641d3;napCatCore['service'][_0x57156a(0x1cd)][_0x57156a(0x1c9)]?.[_0x57156a(0x1d0)]({'friendUid':_0x11ef3f[_0x57156a(0x1d7)],'reqTime':_0x11ef3f[_0x57156a(0x1ce)],'accept':_0x21193e});}}

View File

@@ -1,20 +0,0 @@
import { GroupMember, GroupRequestOperateTypes, GroupMemberRole, GroupNotify } from '../entities';
export declare class NTQQGroupApi {
static getGroups(forced?: boolean): Promise<void>;
static getGroupMembers(groupQQ: string, num?: number): Promise<void | GroupMember[]>;
static getGroupNotifies(): Promise<void>;
static getGroupIgnoreNotifies(): Promise<void>;
static handleGroupRequest(notify: GroupNotify, operateType: GroupRequestOperateTypes, reason?: string): Promise<void | undefined>;
static quitGroup(groupQQ: string): Promise<void | undefined>;
static kickMember(groupQQ: string, kickUids: string[], refuseForever?: boolean, kickReason?: string): Promise<void | undefined>;
static banMember(groupQQ: string, memList: Array<{
uid: string;
timeStamp: number;
}>): Promise<void | undefined>;
static banGroup(groupQQ: string, shutUp: boolean): Promise<void | undefined>;
static setMemberCard(groupQQ: string, memberUid: string, cardName: string): Promise<void | undefined>;
static setMemberRole(groupQQ: string, memberUid: string, role: GroupMemberRole): Promise<void | undefined>;
static setGroupName(groupQQ: string, groupName: string): Promise<void | undefined>;
static setGroupTitle(groupQQ: string, uid: string, title: string): Promise<void>;
static publishGroupBulletin(groupQQ: string, title: string, content: string): void;
}

View File

@@ -1 +0,0 @@
function _0x2e16(_0x1fe738,_0x24e634){var _0x176ed5=_0x176e();return _0x2e16=function(_0x2e16b5,_0x1efc2a){_0x2e16b5=_0x2e16b5-0xd8;var _0x966900=_0x176ed5[_0x2e16b5];return _0x966900;},_0x2e16(_0x1fe738,_0x24e634);}function _0x176e(){var _0x3c3558=['110BRfNSO','publishGroupBulletin','setMemberRole','setGroupShutUp','setGroupName','setMemberCard','getGroupMembers','24XrbdEg','8MALKOK','groupCode','79758ZtgTwZ','6rFdEQw','3625821rZFgFC','783936QZfBKE','getGroupNotifies','kickMember','kernelService','387321sYhpce','banGroup','2804400pQTOdP','quitGroup','303455eSqRtV','modifyMemberRole','group','service','type','getGroupIgnoreNotifies','handleGroupRequest','getGroups','95346qOipUk','setGroupTitle'];_0x176e=function(){return _0x3c3558;};return _0x176e();}var _0x49231b=_0x2e16;(function(_0x38b36f,_0x2862d4){var _0x806a51=_0x2e16,_0x478a07=_0x38b36f();while(!![]){try{var _0x539c5b=-parseInt(_0x806a51(0xe3))/0x1*(-parseInt(_0x806a51(0xf0))/0x2)+parseInt(_0x806a51(0xf2))/0x3+parseInt(_0x806a51(0xed))/0x4*(parseInt(_0x806a51(0xdb))/0x5)+-parseInt(_0x806a51(0xd9))/0x6+parseInt(_0x806a51(0xef))/0x7*(parseInt(_0x806a51(0xec))/0x8)+parseInt(_0x806a51(0xf1))/0x9+-parseInt(_0x806a51(0xe5))/0xa*(parseInt(_0x806a51(0xf6))/0xb);if(_0x539c5b===_0x2862d4)break;else _0x478a07['push'](_0x478a07['shift']());}catch(_0x9a9237){_0x478a07['push'](_0x478a07['shift']());}}}(_0x176e,0x3d4b6));import{napCatCore}from'@/core';export class NTQQGroupApi{static async[_0x49231b(0xe2)](_0xc23cc8=![]){}static async[_0x49231b(0xeb)](_0x517356,_0x581b3a=0xbb8){}static async[_0x49231b(0xf3)](){}static async[_0x49231b(0xe0)](){}static async[_0x49231b(0xe1)](_0x59e3a1,_0x2b8a38,_0x2426b9){var _0x48ad61=_0x49231b,_0x1e46a9={'ilRex':function(_0x364404,_0x3301a1){return _0x364404||_0x3301a1;}};return napCatCore['service'][_0x48ad61(0xdd)][_0x48ad61(0xf5)]?.['operateSysNotify'](![],{'operateType':_0x2b8a38,'targetMsg':{'seq':_0x59e3a1['seq'],'type':_0x59e3a1[_0x48ad61(0xdf)],'groupCode':_0x59e3a1[_0x48ad61(0xdd)][_0x48ad61(0xee)],'postscript':_0x1e46a9['ilRex'](_0x2426b9,'')}});}static async[_0x49231b(0xda)](_0x4c7963){var _0xd951c6=_0x49231b;return napCatCore[_0xd951c6(0xde)][_0xd951c6(0xdd)][_0xd951c6(0xf5)]?.[_0xd951c6(0xda)](_0x4c7963);}static async['kickMember'](_0x2ad7f0,_0x40077a,_0x27b012=![],_0x18bff2=''){var _0x29848f=_0x49231b;return napCatCore[_0x29848f(0xde)]['group'][_0x29848f(0xf5)]?.[_0x29848f(0xf4)](_0x2ad7f0,_0x40077a,_0x27b012,_0x18bff2);}static async['banMember'](_0x3199e0,_0x353d73){var _0x332877=_0x49231b;return napCatCore[_0x332877(0xde)][_0x332877(0xdd)][_0x332877(0xf5)]?.['setMemberShutUp'](_0x3199e0,_0x353d73);}static async[_0x49231b(0xd8)](_0x4f3b07,_0xb8aea4){var _0x3cd20c=_0x49231b;return napCatCore[_0x3cd20c(0xde)][_0x3cd20c(0xdd)][_0x3cd20c(0xf5)]?.[_0x3cd20c(0xe8)](_0x4f3b07,_0xb8aea4);}static async[_0x49231b(0xea)](_0x59c404,_0x3164c1,_0x3641bd){var _0x3d1f4b=_0x49231b;return napCatCore['service'][_0x3d1f4b(0xdd)][_0x3d1f4b(0xf5)]?.['modifyMemberCardName'](_0x59c404,_0x3164c1,_0x3641bd);}static async[_0x49231b(0xe7)](_0x222e29,_0x379e55,_0x431acd){var _0x4babe7=_0x49231b;return napCatCore[_0x4babe7(0xde)][_0x4babe7(0xdd)]['kernelService']?.[_0x4babe7(0xdc)](_0x222e29,_0x379e55,_0x431acd);}static async[_0x49231b(0xe9)](_0x2f1dc9,_0x29d198){var _0xe8c9a1=_0x49231b;return napCatCore[_0xe8c9a1(0xde)]['group'][_0xe8c9a1(0xf5)]?.['modifyGroupName'](_0x2f1dc9,_0x29d198,![]);}static async[_0x49231b(0xe4)](_0x15f265,_0x26d3f9,_0x146c6d){}static[_0x49231b(0xe6)](_0x5da3aa,_0x11eaab,_0x2124ec){}}

View File

@@ -1 +0,0 @@
function _0x55af(_0x3322b9,_0x4251af){var _0x4f1440=_0x4f14();return _0x55af=function(_0x55af60,_0xf92f9e){_0x55af60=_0x55af60-0x1a4;var _0x24d4ba=_0x4f1440[_0x55af60];return _0x24d4ba;},_0x55af(_0x3322b9,_0x4251af);}(function(_0x4482eb,_0x8e60a){var _0x194bce=_0x55af,_0x252dd6=_0x4482eb();while(!![]){try{var _0x4eb392=parseInt(_0x194bce(0x1ad))/0x1+parseInt(_0x194bce(0x1ac))/0x2*(parseInt(_0x194bce(0x1a8))/0x3)+-parseInt(_0x194bce(0x1a7))/0x4+-parseInt(_0x194bce(0x1a4))/0x5*(parseInt(_0x194bce(0x1aa))/0x6)+-parseInt(_0x194bce(0x1a6))/0x7+-parseInt(_0x194bce(0x1a5))/0x8*(-parseInt(_0x194bce(0x1ab))/0x9)+parseInt(_0x194bce(0x1a9))/0xa;if(_0x4eb392===_0x8e60a)break;else _0x252dd6['push'](_0x252dd6['shift']());}catch(_0x4ba48e){_0x252dd6['push'](_0x252dd6['shift']());}}}(_0x4f14,0xc57d0));export*from'./file';export*from'./friend';function _0x4f14(){var _0x340e14=['5482564mnDlZV','33JSzSaI','8898180tkZBEn','78aZQHzF','117DdOuYC','215362jwkVMI','1180535QjSBVq','404065odSirS','763304xkSfNs','8855637vsSKnT'];_0x4f14=function(){return _0x340e14;};return _0x4f14();}export*from'./group';export*from'./msg';export*from'./user';export*from'./webapi';export*from'./window';

View File

@@ -1,19 +0,0 @@
import { Peer, RawMessage, SendMessageElement } from '@/core/qqnt/entities';
import { NapCatCore } from '@/core';
import { GeneralCallResult } from '@/core/qqnt/services/common';
export declare class NTQQMsgApi {
static napCatCore: NapCatCore | null;
static getMultiMsg(peer: Peer, rootMsgId: string, parentMsgId: string): Promise<GeneralCallResult & {
msgList: RawMessage[];
} | undefined>;
static activateChat(peer: Peer): Promise<void>;
static activateChatAndGetHistory(peer: Peer): Promise<void>;
static getMsgHistory(peer: Peer, msgId: string, count: number): Promise<GeneralCallResult & {
msgList: RawMessage[];
}>;
static fetchRecentContact(): Promise<void>;
static recallMsg(peer: Peer, msgIds: string[]): Promise<void>;
static sendMsg(peer: Peer, msgElements: SendMessageElement[], waitComplete?: boolean, timeout?: number): Promise<RawMessage>;
static forwardMsg(srcPeer: Peer, destPeer: Peer, msgIds: string[]): Promise<void>;
static multiForwardMsg(srcPeer: Peer, destPeer: Peer, msgIds: string[]): Promise<RawMessage>;
}

File diff suppressed because one or more lines are too long

View File

@@ -1,19 +0,0 @@
import { User } from '@/core/qqnt/entities';
export declare class NTQQUserApi {
static like(uid: string, count?: number): Promise<{
result: number;
errMsg: string;
succCounts: number;
}>;
static setQQAvatar(filePath: string): Promise<{
result: number;
errMsg: string;
}>;
static getSelfInfo(): Promise<void>;
static getUserInfo(uid: string): Promise<void>;
static getUserDetailInfo(uid: string): Promise<User>;
static getPSkey(): Promise<void>;
static getSkey(groupName: string, groupCode: string): Promise<void | {
data: string;
}>;
}

View File

@@ -1 +0,0 @@
const _0x2fcf14=_0x51c8;(function(_0x4b2074,_0x262595){const _0x5f10c8=_0x51c8,_0x241f2a=_0x4b2074();while(!![]){try{const _0xcee58d=-parseInt(_0x5f10c8(0x1e2))/0x1+parseInt(_0x5f10c8(0x1ed))/0x2*(-parseInt(_0x5f10c8(0x1f6))/0x3)+parseInt(_0x5f10c8(0x1dd))/0x4*(-parseInt(_0x5f10c8(0x1da))/0x5)+-parseInt(_0x5f10c8(0x1f3))/0x6*(parseInt(_0x5f10c8(0x1e4))/0x7)+parseInt(_0x5f10c8(0x1e6))/0x8+parseInt(_0x5f10c8(0x1f2))/0x9*(-parseInt(_0x5f10c8(0x1de))/0xa)+parseInt(_0x5f10c8(0x1e9))/0xb*(parseInt(_0x5f10c8(0x1f8))/0xc);if(_0xcee58d===_0x262595)break;else _0x241f2a['push'](_0x241f2a['shift']());}catch(_0x365546){_0x241f2a['push'](_0x241f2a['shift']());}}}(_0x360d,0xcc3b8));function _0x51c8(_0x5155d8,_0x18859a){const _0x360d3f=_0x360d();return _0x51c8=function(_0x51c87e,_0x3b9dd2){_0x51c87e=_0x51c87e-0x1d6;let _0x2df455=_0x360d3f[_0x51c87e];return _0x2df455;},_0x51c8(_0x5155d8,_0x18859a);}import{napCatCore}from'@/core';import{ProfileListener}from'@/core/qqnt/listeners';import{randomUUID}from'crypto';const userInfoCache={},profileListener=new ProfileListener(),userDetailHandlers=new Map();function _0x360d(){const _0x1414b4=['service','getUserInfo','setHeader','1717745WdLtmA','then','forEach','4ZCzEjf','2105260tMnSQF','addProfileListener','uid','setBuddyProfileLike','631300wTXgrZ','set','126cFpJhN','numBP','1581472kNEuDG','profileLike','profile','461087WoGnak','sGOSk','onProfileDetailInfoChanged','result','2122txYGyQ','getUserDetailInfoWithBizInfo','sSbeu','setQQAvatar','getPSkey','54vjcoXS','196338fFqHqx','addLoginSuccessCallback','getSkey','393GwEKLv','getUserDetailInfo\x20timeout','1032hpzqUQ','kernelService'];_0x360d=function(){return _0x1414b4;};return _0x360d();}profileListener[_0x2fcf14(0x1eb)]=_0x4f43df=>{const _0x131fd3=_0x2fcf14;userInfoCache[_0x4f43df[_0x131fd3(0x1e0)]]=_0x4f43df,userDetailHandlers[_0x131fd3(0x1dc)](_0xc9895d=>_0xc9895d(_0x4f43df));},setTimeout(()=>{const _0x4993c6=_0x2fcf14;napCatCore[_0x4993c6(0x1f4)](()=>{const _0x1059b2=_0x4993c6;napCatCore[_0x1059b2(0x1d7)][_0x1059b2(0x1e8)][_0x1059b2(0x1df)](profileListener);});},0x64);export class NTQQUserApi{static async['like'](_0x3883a5,_0x4ac913=0x1){const _0x36aee2=_0x2fcf14;return napCatCore[_0x36aee2(0x1d7)][_0x36aee2(0x1e7)]['kernelService'][_0x36aee2(0x1e1)]({'friendUid':_0x3883a5,'sourceId':0x47,'doLikeCount':_0x4ac913,'doLikeTollCount':0x0});}static async[_0x2fcf14(0x1f0)](_0x59a957){const _0x336e7a=_0x2fcf14,_0x42da54=napCatCore[_0x336e7a(0x1d7)][_0x336e7a(0x1e8)][_0x336e7a(0x1d6)]?.[_0x336e7a(0x1d9)](_0x59a957);return{'result':_0x42da54?.[_0x336e7a(0x1ec)],'errMsg':_0x42da54?.['errMsg']};}static async['getSelfInfo'](){}static async[_0x2fcf14(0x1d8)](_0x37b088){}static async['getUserDetailInfo'](_0x5706fe){const _0x3646bb=_0x2fcf14,_0x31742b={'sGOSk':function(_0x300d49,_0x290712){return _0x300d49(_0x290712);},'OaVYQ':_0x3646bb(0x1f7),'sSbeu':function(_0x1be533,_0x2a30c2){return _0x1be533===_0x2a30c2;},'WLFVD':function(_0x55c6fe){return _0x55c6fe();},'numBP':function(_0x5e29f7,_0x47a6eb,_0x570b10){return _0x5e29f7(_0x47a6eb,_0x570b10);}},_0x579a72=napCatCore[_0x3646bb(0x1d7)]['profile'][_0x3646bb(0x1d6)];return new Promise((_0x1fb245,_0x2b7600)=>{const _0x15c507=_0x3646bb,_0x4bc433=_0x31742b['WLFVD'](randomUUID);let _0x1196ff=![];_0x31742b[_0x15c507(0x1e5)](setTimeout,()=>{const _0x32d6a2=_0x15c507;!_0x1196ff&&_0x31742b[_0x32d6a2(0x1ea)](_0x2b7600,_0x31742b['OaVYQ']);},0x1388),userDetailHandlers[_0x15c507(0x1e3)](_0x4bc433,_0x11b418=>{const _0x57c2a7=_0x15c507;_0x31742b[_0x57c2a7(0x1ef)](_0x11b418['uid'],_0x5706fe)&&(_0x1196ff=!![],userDetailHandlers['delete'](_0x4bc433),_0x1fb245(_0x11b418));}),_0x579a72[_0x15c507(0x1ee)](_0x5706fe,[0x0])[_0x15c507(0x1db)](_0x29bd1e=>{});});}static async[_0x2fcf14(0x1f1)](){}static async[_0x2fcf14(0x1f5)](_0x51814e,_0x1eb586){}}

View File

@@ -1,13 +0,0 @@
export declare class WebApi {
private static bkn;
private static skey;
private static pskey;
private static cookie;
private defaultHeaders;
constructor();
addGroupDigest(groupCode: string, msgSeq: string): Promise<any>;
getGroupDigest(groupCode: string): Promise<any>;
private genBkn;
private init;
private request;
}

View File

@@ -1 +0,0 @@
function _0x259a(_0x1b9711,_0x27a337){const _0x5d7d26=_0x5d7d();return _0x259a=function(_0x259aed,_0x51a275){_0x259aed=_0x259aed-0x1a6;let _0x49c585=_0x5d7d26[_0x259aed];return _0x49c585;},_0x259a(_0x1b9711,_0x27a337);}const _0x1d44f9=_0x259a;function _0x5d7d(){const _0x39f97c=['qrGuG','&msg_seq=','https://qun.qq.com/cgi-bin/group_digest/digest_list?random=665&X-CROSS-ORIGIN=fetch&group_code=','HRZJE','28nprdIM','16737147XokBSw','3162156lIVlJc','&msg_random=444021292','218354wIQpum','getGroupDigest','genBkn','pskey','RAglJ','nAOaX','json','headers','request','addGroupDigest','init','charCodeAt','2566616EeBMzW','SUnoY','include','GET','cookie','toString','Htqvv','bkn','defaultHeaders','4EdNICD','2641620XwewlF','4633585gGPEBp','lOhDm','615640HQEWdu','&bkn='];_0x5d7d=function(){return _0x39f97c;};return _0x5d7d();}(function(_0x29dbc2,_0x1f61fd){const _0x45bbf4=_0x259a,_0x58236a=_0x29dbc2();while(!![]){try{const _0x5d557f=parseInt(_0x45bbf4(0x1b7))/0x1+-parseInt(_0x45bbf4(0x1c3))/0x2+parseInt(_0x45bbf4(0x1b5))/0x3*(-parseInt(_0x45bbf4(0x1a9))/0x4)+parseInt(_0x45bbf4(0x1ab))/0x5+parseInt(_0x45bbf4(0x1aa))/0x6+-parseInt(_0x45bbf4(0x1b3))/0x7*(parseInt(_0x45bbf4(0x1ad))/0x8)+parseInt(_0x45bbf4(0x1b4))/0x9;if(_0x5d557f===_0x1f61fd)break;else _0x58236a['push'](_0x58236a['shift']());}catch(_0x4f27f8){_0x58236a['push'](_0x58236a['shift']());}}}(_0x5d7d,0xc3464));import{log}from'@/common/utils/log';export class WebApi{static [_0x1d44f9(0x1a7)];static ['skey'];static [_0x1d44f9(0x1ba)];static [_0x1d44f9(0x1c7)];[_0x1d44f9(0x1a8)]={'User-Agent':'QQ/8.9.28.635\x20CFNetwork/1312\x20Darwin/21.0.0'};constructor(){}async[_0x1d44f9(0x1c0)](_0x19bac9,_0x34b30e){const _0x5458ef=_0x1d44f9,_0x40814e='https://qun.qq.com/cgi-bin/group_digest/cancel_digest?random=665&X-CROSS-ORIGIN=fetch&group_code='+_0x19bac9+_0x5458ef(0x1b0)+_0x34b30e+_0x5458ef(0x1b6),_0x285b21=await this['request'](_0x40814e);return await _0x285b21[_0x5458ef(0x1bd)]();}async[_0x1d44f9(0x1b8)](_0x5f6465){const _0x2330c7=_0x1d44f9,_0x3e440a={'Htqvv':function(_0x1dee82,_0x3d4f6d){return _0x1dee82(_0x3d4f6d);}},_0x3af767=_0x2330c7(0x1b1)+_0x5f6465+'&page_start=0&page_limit=20',_0x5f000b=await this[_0x2330c7(0x1bf)](_0x3af767);return _0x3e440a[_0x2330c7(0x1a6)](log,_0x5f000b[_0x2330c7(0x1be)]),await _0x5f000b[_0x2330c7(0x1bd)]();}[_0x1d44f9(0x1b9)](_0x1d0bf6){const _0x59e03c=_0x1d44f9,_0x2cf436={'SUTmQ':function(_0x177bec,_0xdcbe98){return _0x177bec<_0xdcbe98;},'RAglJ':function(_0x4c0694,_0x4b9e5d){return _0x4c0694+_0x4b9e5d;},'SUnoY':function(_0x370d8c,_0x3d141c){return _0x370d8c<<_0x3d141c;},'qrGuG':function(_0x31baff,_0x5bddcc){return _0x31baff&_0x5bddcc;}};_0x1d0bf6=_0x1d0bf6||'';let _0x2c07e3=0x1505;for(let _0x21d4d1=0x0;_0x2cf436['SUTmQ'](_0x21d4d1,_0x1d0bf6['length']);_0x21d4d1++){const _0xd49f72=_0x1d0bf6[_0x59e03c(0x1c2)](_0x21d4d1);_0x2c07e3=_0x2cf436[_0x59e03c(0x1bb)](_0x2c07e3+_0x2cf436[_0x59e03c(0x1c4)](_0x2c07e3,0x5),_0xd49f72);}return _0x2cf436[_0x59e03c(0x1af)](_0x2c07e3,0x7fffffff)[_0x59e03c(0x1c8)]();}async[_0x1d44f9(0x1c1)](){if(!WebApi['bkn']){}}async['request'](_0x50aa56,_0x5b0a36=_0x1d44f9(0x1c6),_0x62f02a={}){const _0x4194c5=_0x1d44f9,_0x5c7129={'wOKDy':_0x4194c5(0x1ae),'nAOaX':_0x4194c5(0x1c5),'HRZJE':function(_0x364283,_0x5786da,_0xfdddda,_0x192eb4){return _0x364283(_0x5786da,_0xfdddda,_0x192eb4);},'lOhDm':function(_0x16e2f3,_0x1a8c32,_0x35dda0){return _0x16e2f3(_0x1a8c32,_0x35dda0);}};await this['init'](),_0x50aa56+=_0x5c7129['wOKDy']+WebApi['bkn'];const _0x4dc4c2={...this['defaultHeaders'],..._0x62f02a,'Cookie':WebApi[_0x4194c5(0x1c7)],'credentials':_0x5c7129[_0x4194c5(0x1bc)]};_0x5c7129[_0x4194c5(0x1b2)](log,'request',_0x50aa56,_0x4dc4c2);const _0x138d74={'method':_0x5b0a36,'headers':_0x4dc4c2};return _0x5c7129[_0x4194c5(0x1ac)](fetch,_0x50aa56,_0x138d74);}}

View File

@@ -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 {
}

View File

@@ -1 +0,0 @@
var _0x5811b1=_0x1b27;(function(_0x2c452c,_0x325f2e){var _0x571cbe=_0x1b27,_0x41c785=_0x2c452c();while(!![]){try{var _0x27a39f=-parseInt(_0x571cbe(0x10a))/0x1*(parseInt(_0x571cbe(0xff))/0x2)+parseInt(_0x571cbe(0x109))/0x3+-parseInt(_0x571cbe(0x104))/0x4*(parseInt(_0x571cbe(0xfd))/0x5)+-parseInt(_0x571cbe(0xfe))/0x6+parseInt(_0x571cbe(0xfb))/0x7*(-parseInt(_0x571cbe(0x103))/0x8)+-parseInt(_0x571cbe(0xfc))/0x9+-parseInt(_0x571cbe(0x100))/0xa*(-parseInt(_0x571cbe(0x106))/0xb);if(_0x27a39f===_0x325f2e)break;else _0x41c785['push'](_0x41c785['shift']());}catch(_0x23c487){_0x41c785['push'](_0x41c785['shift']());}}}(_0x5c44,0xae894));function _0x1b27(_0x1557f4,_0x3d2e9e){var _0x5c44cb=_0x5c44();return _0x1b27=function(_0x1b2736,_0x54d018){_0x1b2736=_0x1b2736-0xfb;var _0x47d46d=_0x5c44cb[_0x1b2736];return _0x47d46d;},_0x1b27(_0x1557f4,_0x3d2e9e);}export class NTQQWindows{static ['GroupHomeWorkWindow']={'windowName':_0x5811b1(0x101),'windowUrlHash':_0x5811b1(0x107)};static [_0x5811b1(0x105)]={'windowName':_0x5811b1(0x105),'windowUrlHash':'#/group-notify-filter'};static [_0x5811b1(0x102)]={'windowName':_0x5811b1(0x102),'windowUrlHash':_0x5811b1(0x108)};}export class NTQQWindowApi{}function _0x5c44(){var _0x48df20=['58840qvqEfd','GroupHomeWorkWindow','GroupEssenceWindow','518944YSwNAE','128xftkxA','GroupNotifyFilterWindow','4279Agnxeo','#/group-home-work','#/group-essence','1891380ABbPkG','1367oewWPE','84fzDtKk','7141716XHlRNS','30315VziGyZ','2466840rrUofs','40XWkrdP'];_0x5c44=function(){return _0x48df20;};return _0x5c44();}

View File

@@ -1 +0,0 @@
(function(_0x4f558f,_0x3d5d0a){var _0x53741d=_0x4e77,_0x1e567c=_0x4f558f();while(!![]){try{var _0x24be65=parseInt(_0x53741d(0x1c9))/0x1+-parseInt(_0x53741d(0x1c8))/0x2+-parseInt(_0x53741d(0x1cb))/0x3*(parseInt(_0x53741d(0x1c2))/0x4)+parseInt(_0x53741d(0x1d0))/0x5+parseInt(_0x53741d(0x1c1))/0x6+-parseInt(_0x53741d(0x1c4))/0x7*(parseInt(_0x53741d(0x1cf))/0x8)+-parseInt(_0x53741d(0x1c0))/0x9;if(_0x24be65===_0x3d5d0a)break;else _0x1e567c['push'](_0x1e567c['shift']());}catch(_0x47dbc8){_0x1e567c['push'](_0x1e567c['shift']());}}}(_0x4471,0xc801e));export var CacheFileType;function _0x4e77(_0xc9c32d,_0x11bf9c){var _0x44713f=_0x4471();return _0x4e77=function(_0x4e772f,_0x10fabe){_0x4e772f=_0x4e772f-0x1bf;var _0x2b02e5=_0x44713f[_0x4e772f];return _0x2b02e5;},_0x4e77(_0xc9c32d,_0x11bf9c);}function _0x4471(){var _0x5ada04=['1537921rkwNyv','3|1|4|2|0','12hWfcjq','pSJjv','cBhUo','split','4562672iQfBMK','1628855djlRgU','DOCUMENT','uDtes','KgoRy','1197702ZPFDWj','1046046YXSIfz','251824jeIdER','OTHER','7wcFfgX','osuEc','VIDEO','IMAGE','527134AHvlPR'];_0x4471=function(){return _0x5ada04;};return _0x4471();}(function(_0xd3ea3a){var _0x1afd11=_0x4e77,_0x977432={'YGtuD':_0x1afd11(0x1ca),'cBhUo':_0x1afd11(0x1c3),'KgoRy':_0x1afd11(0x1c6),'uDtes':_0x1afd11(0x1d1),'osuEc':_0x1afd11(0x1c7),'pSJjv':'AUDIO'},_0x46fd8e=_0x977432['YGtuD'][_0x1afd11(0x1ce)]('|'),_0x1ff8cd=0x0;while(!![]){switch(_0x46fd8e[_0x1ff8cd++]){case'0':_0xd3ea3a[_0xd3ea3a[_0x977432['cBhUo']]=0x4]=_0x977432[_0x1afd11(0x1cd)];continue;case'1':_0xd3ea3a[_0xd3ea3a[_0x977432['KgoRy']]=0x1]=_0x977432[_0x1afd11(0x1bf)];continue;case'2':_0xd3ea3a[_0xd3ea3a[_0x977432[_0x1afd11(0x1d2)]]=0x3]=_0x977432[_0x1afd11(0x1d2)];continue;case'3':_0xd3ea3a[_0xd3ea3a[_0x977432[_0x1afd11(0x1c5)]]=0x0]=_0x1afd11(0x1c7);continue;case'4':_0xd3ea3a[_0xd3ea3a[_0x977432[_0x1afd11(0x1cc)]]=0x2]=_0x977432[_0x1afd11(0x1cc)];continue;}break;}}(CacheFileType||(CacheFileType={})));

View File

@@ -1,12 +0,0 @@
import { AtType, SendArkElement, SendFaceElement, SendFileElement, SendPicElement, SendPttElement, SendReplyElement, SendTextElement, SendVideoElement } from '../entities';
export declare class SendMsgElementConstructor {
static text(content: string): SendTextElement;
static at(atUid: string, atNtUid: string, atType: AtType, atName: string): SendTextElement;
static reply(msgSeq: string, msgId: string, senderUin: string, senderUinStr: string): SendReplyElement;
static pic(picPath: string, summary?: string, subType?: 0 | 1): Promise<SendPicElement>;
static file(filePath: string, fileName?: string): Promise<SendFileElement>;
static video(filePath: string, fileName?: string, diyThumbPath?: string): Promise<SendVideoElement>;
static ptt(pttPath: string): Promise<SendPttElement>;
static face(faceId: number): SendFaceElement;
static ark(data: any): SendArkElement;
}

File diff suppressed because one or more lines are too long

View File

@@ -1,52 +0,0 @@
import { QQLevel, Sex } from './user';
export interface Group {
groupCode: string;
maxMember: number;
memberCount: number;
groupName: string;
groupStatus: 0;
memberRole: 2;
isTop: boolean;
toppedTimestamp: '0';
privilegeFlag: number;
isConf: boolean;
hasModifyConfGroupFace: boolean;
hasModifyConfGroupName: boolean;
remarkName: string;
hasMemo: boolean;
groupShutupExpireTime: string;
personShutupExpireTime: string;
discussToGroupUin: string;
discussToGroupMaxMsgSeq: number;
discussToGroupTime: number;
groupFlagExt: number;
authGroupType: number;
groupCreditLevel: number;
groupFlagExt3: number;
groupOwnerId: {
'memberUin': string;
'memberUid': string;
};
}
export declare enum GroupMemberRole {
normal = 2,
admin = 3,
owner = 4
}
export interface GroupMember {
memberSpecialTitle?: string;
avatarPath: string;
cardName: string;
cardType: number;
isDelete: boolean;
nick: string;
qid: string;
remark: string;
role: GroupMemberRole;
shutUpTime: number;
uid: string;
uin: string;
isRobot: boolean;
sex?: Sex;
qqLevel?: QQLevel;
}

View File

@@ -1 +0,0 @@
(function(_0x3b809c,_0x12e711){var _0x4cfe1e=_0x3df0,_0x55527b=_0x3b809c();while(!![]){try{var _0x3fcec8=-parseInt(_0x4cfe1e(0x197))/0x1+parseInt(_0x4cfe1e(0x19c))/0x2*(parseInt(_0x4cfe1e(0x19b))/0x3)+-parseInt(_0x4cfe1e(0x190))/0x4*(parseInt(_0x4cfe1e(0x195))/0x5)+parseInt(_0x4cfe1e(0x192))/0x6+parseInt(_0x4cfe1e(0x193))/0x7+-parseInt(_0x4cfe1e(0x194))/0x8+parseInt(_0x4cfe1e(0x18f))/0x9;if(_0x3fcec8===_0x12e711)break;else _0x55527b['push'](_0x55527b['shift']());}catch(_0x2144bb){_0x55527b['push'](_0x55527b['shift']());}}}(_0x58b6,0x95498));function _0x3df0(_0x2c142e,_0xeb1da3){var _0x58b6a0=_0x58b6();return _0x3df0=function(_0x3df075,_0x57dcda){_0x3df075=_0x3df075-0x18e;var _0x5a154c=_0x58b6a0[_0x3df075];return _0x5a154c;},_0x3df0(_0x2c142e,_0xeb1da3);}function _0x58b6(){var _0x456557=['480149gxGskS','admin','iXpHz','JWprw','1011849FDTpgR','2wJNXBH','owner','6720813HBNPqr','84328PCWAki','normal','2989332Ymgxzx','1769110XWnlev','549912zvFFtB','160notdSQ','fLDzT'];_0x58b6=function(){return _0x456557;};return _0x58b6();}export var GroupMemberRole;(function(_0x5f0330){var _0x5944b4=_0x3df0,_0x6c7a25={'fLDzT':_0x5944b4(0x191),'JWprw':_0x5944b4(0x198),'iXpHz':_0x5944b4(0x18e)};_0x5f0330[_0x5f0330[_0x6c7a25[_0x5944b4(0x196)]]=0x2]=_0x6c7a25[_0x5944b4(0x196)],_0x5f0330[_0x5f0330[_0x6c7a25[_0x5944b4(0x19a)]]=0x3]=_0x6c7a25[_0x5944b4(0x19a)],_0x5f0330[_0x5f0330[_0x5944b4(0x18e)]=0x4]=_0x6c7a25[_0x5944b4(0x199)];}(GroupMemberRole||(GroupMemberRole={})));

View File

@@ -1 +0,0 @@
(function(_0x4aec37,_0x5727e8){var _0x2bf161=_0x156b,_0x2e030b=_0x4aec37();while(!![]){try{var _0x37e072=-parseInt(_0x2bf161(0x1c3))/0x1*(parseInt(_0x2bf161(0x1ca))/0x2)+parseInt(_0x2bf161(0x1cc))/0x3+-parseInt(_0x2bf161(0x1c8))/0x4*(-parseInt(_0x2bf161(0x1cb))/0x5)+parseInt(_0x2bf161(0x1c4))/0x6+parseInt(_0x2bf161(0x1c7))/0x7+parseInt(_0x2bf161(0x1c5))/0x8*(-parseInt(_0x2bf161(0x1c6))/0x9)+-parseInt(_0x2bf161(0x1c9))/0xa;if(_0x37e072===_0x5727e8)break;else _0x2e030b['push'](_0x2e030b['shift']());}catch(_0x52560f){_0x2e030b['push'](_0x2e030b['shift']());}}}(_0x1597,0x518f4));export*from'./user';export*from'./group';export*from'./msg';function _0x156b(_0x307b38,_0x498ea9){var _0x1597a5=_0x1597();return _0x156b=function(_0x156b28,_0x241555){_0x156b28=_0x156b28-0x1c3;var _0x44f011=_0x1597a5[_0x156b28];return _0x44f011;},_0x156b(_0x307b38,_0x498ea9);}export*from'./notify';export*from'./cache';export*from'./constructor';function _0x1597(){var _0x5a94e3=['27HSZtIO','1690010IevKNb','16Dxmetv','4445660SDEyGC','6njCwBw','403825VOnQHg','1234608xWmbtB','175774RztaFW','2347662fUZhOR','163592kIZpDR'];_0x1597=function(){return _0x5a94e3;};return _0x1597();}

View File

@@ -1,383 +0,0 @@
import { GroupMemberRole } from './group';
export interface Peer {
chatType: ChatType;
peerUid: string;
guildId?: '';
}
export declare enum ElementType {
TEXT = 1,
PIC = 2,
FILE = 3,
PTT = 4,
VIDEO = 5,
FACE = 6,
REPLY = 7,
ARK = 10
}
export interface SendTextElement {
elementType: ElementType.TEXT;
elementId: '';
textElement: {
content: string;
atType: number;
atUid: string;
atTinyId: string;
atNtUid: string;
};
}
export interface SendPttElement {
elementType: ElementType.PTT;
elementId: '';
pttElement: {
fileName: string;
filePath: string;
md5HexStr: string;
fileSize: number;
duration: number;
formatType: number;
voiceType: number;
voiceChangeType: number;
canConvert2Text: boolean;
waveAmplitudes: number[];
fileSubId: '';
playState: number;
autoConvertText: number;
};
}
export declare enum PicType {
gif = 2000,
jpg = 1000
}
export declare enum PicSubType {
normal = 0,// 普通图片,大图
face = 1
}
export interface SendPicElement {
elementType: ElementType.PIC;
elementId: '';
picElement: {
md5HexStr: string;
fileSize: number | string;
picWidth: number;
picHeight: number;
fileName: string;
sourcePath: string;
original: boolean;
picType: PicType;
picSubType: PicSubType;
fileUuid: string;
fileSubId: string;
thumbFileSize: number;
summary: string;
};
}
export interface SendReplyElement {
elementType: ElementType.REPLY;
elementId: '';
replyElement: {
replayMsgSeq: string;
replayMsgId: string;
senderUin: string;
senderUinStr: string;
};
}
export interface SendFaceElement {
elementType: ElementType.FACE;
elementId: '';
faceElement: FaceElement;
}
export interface FileElement {
'fileMd5'?: '';
'fileName': string;
'filePath': string;
fileSize: string;
'picHeight'?: number;
'picWidth'?: number;
'picThumbPath'?: Map<number, string>;
'file10MMd5'?: '';
'fileSha'?: '';
'fileSha3'?: '';
'fileUuid'?: '';
'fileSubId'?: '';
'thumbFileSize'?: number;
fileBizId?: number;
}
export interface SendFileElement {
elementType: ElementType.FILE;
elementId: '';
fileElement: FileElement;
}
export interface SendVideoElement {
elementType: ElementType.VIDEO;
elementId: '';
videoElement: VideoElement;
}
export interface SendArkElement {
elementType: ElementType.ARK;
elementId: '';
arkElement: ArkElement;
}
export type SendMessageElement = SendTextElement | SendPttElement | SendPicElement | SendReplyElement | SendFaceElement | SendFileElement | SendVideoElement | SendArkElement;
export declare enum AtType {
notAt = 0,
atAll = 1,
atUser = 2
}
export declare enum ChatType {
friend = 1,
group = 2,
temp = 100
}
export interface PttElement {
canConvert2Text: boolean;
duration: number;
fileBizId: null;
fileId: number;
fileName: string;
filePath: string;
fileSize: string;
fileSubId: string;
fileUuid: string;
formatType: string;
invalidState: number;
md5HexStr: string;
playState: number;
progress: number;
text: string;
transferStatus: number;
translateStatus: number;
voiceChangeType: number;
voiceType: number;
waveAmplitudes: number[];
}
export interface ArkElement {
bytesData: string;
linkInfo: null;
subElementType: null;
}
export declare const IMAGE_HTTP_HOST = "https://gchat.qpic.cn";
export declare const IMAGE_HTTP_HOST_NT = "https://multimedia.nt.qq.com.cn";
export interface PicElement {
originImageUrl: string;
originImageMd5?: string;
sourcePath: string;
thumbPath: Map<number, string>;
picWidth: number;
picHeight: number;
fileSize: number;
fileName: string;
fileUuid: string;
md5HexStr?: string;
}
export declare enum GrayTipElementSubType {
INVITE_NEW_MEMBER = 12,
MEMBER_NEW_TITLE = 17
}
export interface GrayTipElement {
subElementType: GrayTipElementSubType;
revokeElement: {
operatorRole: string;
operatorUid: string;
operatorNick: string;
operatorRemark: string;
operatorMemRemark?: string;
wording: string;
};
aioOpGrayTipElement: TipAioOpGrayTipElement;
groupElement: TipGroupElement;
xmlElement: {
content: string;
};
jsonGrayTipElement: {
jsonStr: string;
};
}
export interface FaceElement {
faceIndex: number;
faceType: 1;
}
export interface MarketFaceElement {
'itemType': 6;
'faceInfo': 1;
'emojiPackageId': 203875;
'subType': 3;
'mediaType': 0;
'imageWidth': 200;
'imageHeight': 200;
'faceName': string;
'emojiId': '094d53bd1c9ac5d35d04b08e8a6c992c';
'key': 'a8b1dd0aebc8d910';
'param': null;
'mobileParam': null;
'sourceType': null;
'startTime': null;
'endTime': null;
'emojiType': 1;
'hasIpProduct': null;
'voiceItemHeightArr': null;
'sourceName': null;
'sourceJumpUrl': null;
'sourceTypeName': null;
'backColor': null;
'volumeColor': null;
'staticFacePath': 'E:\\SystemDocuments\\QQ\\721011692\\nt_qq\\nt_data\\Emoji\\marketface\\203875\\094d53bd1c9ac5d35d04b08e8a6c992c_aio.png';
'dynamicFacePath': 'E:\\SystemDocuments\\QQ\\721011692\\nt_qq\\nt_data\\Emoji\\marketface\\203875\\094d53bd1c9ac5d35d04b08e8a6c992c';
'supportSize': [
{
'width': 300;
'height': 300;
},
{
'width': 200;
'height': 200;
}
];
'apngSupportSize': null;
}
export interface VideoElement {
'filePath': string;
'fileName': string;
'videoMd5'?: string;
'thumbMd5'?: string;
'fileTime'?: number;
'thumbSize'?: number;
'fileFormat'?: number;
'fileSize'?: string;
'thumbWidth'?: number;
'thumbHeight'?: number;
'busiType'?: 0;
'subBusiType'?: 0;
'thumbPath'?: Map<number, any>;
'transferStatus'?: 0;
'progress'?: 0;
'invalidState'?: 0;
'fileUuid'?: string;
'fileSubId'?: '';
'fileBizId'?: null;
'originVideoMd5'?: '';
'import_rich_media_context'?: null;
'sourceVideoCodecFormat'?: number;
}
export interface MarkdownElement {
content: string;
}
export interface InlineKeyboardElementRowButton {
'id': '';
'label': string;
'visitedLabel': string;
'style': 1;
'type': 2;
'clickLimit': 0;
'unsupportTips': '请升级新版手机QQ';
'data': string;
'atBotShowChannelList': false;
'permissionType': 2;
'specifyRoleIds': [];
'specifyTinyids': [];
'isReply': false;
'anchor': 0;
'enter': false;
'subscribeDataTemplateIds': [];
}
export interface InlineKeyboardElement {
rows: [
{
buttons: InlineKeyboardElementRowButton[];
}
];
}
export interface TipAioOpGrayTipElement {
operateType: number;
peerUid: string;
fromGrpCodeOfTmpChat: string;
}
export declare enum TipGroupElementType {
memberIncrease = 1,
kicked = 3,// 被移出群
ban = 8
}
export interface TipGroupElement {
'type': TipGroupElementType;
'role': 0;
'groupName': string;
'memberUid': string;
'memberNick': string;
'memberRemark': string;
'adminUid': string;
'adminNick': string;
'adminRemark': string;
'createGroup': null;
'memberAdd'?: {
'showType': 1;
'otherAdd': null;
'otherAddByOtherQRCode': null;
'otherAddByYourQRCode': null;
'youAddByOtherQRCode': null;
'otherInviteOther': null;
'otherInviteYou': null;
'youInviteOther': null;
};
'shutUp'?: {
'curTime': string;
'duration': string;
'admin': {
'uid': string;
'card': string;
'name': string;
'role': GroupMemberRole;
};
'member': {
'uid': string;
'card': string;
'name': string;
'role': GroupMemberRole;
};
};
}
export interface MultiForwardMsgElement {
xmlContent: string;
resId: string;
fileName: string;
}
export interface RawMessage {
id?: number;
msgId: string;
msgTime: string;
msgSeq: string;
senderUid: string;
senderUin: string;
peerUid: string;
peerUin: string;
sendNickName: string;
sendMemberName?: string;
chatType: ChatType;
sendStatus?: number;
recallTime: string;
elements: {
elementId: string;
elementType: ElementType;
replyElement: {
senderUid: string;
sourceMsgIsIncPic: boolean;
sourceMsgText: string;
replayMsgSeq: string;
};
textElement: {
atType: AtType;
atUid: string;
content: string;
atNtUid: string;
};
picElement: PicElement;
pttElement: PttElement;
arkElement: ArkElement;
grayTipElement: GrayTipElement;
faceElement: FaceElement;
videoElement: VideoElement;
fileElement: FileElement;
marketFaceElement: MarketFaceElement;
inlineKeyboardElement: InlineKeyboardElement;
markdownElement: MarkdownElement;
multiForwardMsgElement: MultiForwardMsgElement;
}[];
}

View File

@@ -1 +0,0 @@
var _0x380a5d=_0x93f1;(function(_0x583bb8,_0x2a3307){var _0x2228db=_0x93f1,_0xe558cc=_0x583bb8();while(!![]){try{var _0x2de15e=parseInt(_0x2228db(0x91))/0x1+-parseInt(_0x2228db(0xa4))/0x2*(parseInt(_0x2228db(0x7f))/0x3)+-parseInt(_0x2228db(0x98))/0x4*(parseInt(_0x2228db(0x81))/0x5)+parseInt(_0x2228db(0xa2))/0x6*(parseInt(_0x2228db(0xac))/0x7)+parseInt(_0x2228db(0x99))/0x8+-parseInt(_0x2228db(0xaa))/0x9*(parseInt(_0x2228db(0x94))/0xa)+-parseInt(_0x2228db(0x8c))/0xb;if(_0x2de15e===_0x2a3307)break;else _0xe558cc['push'](_0xe558cc['shift']());}catch(_0x5bef68){_0xe558cc['push'](_0xe558cc['shift']());}}}(_0x3c91,0xd224c));export var ElementType;(function(_0x3ba10c){var _0x5874fe=_0x93f1,_0x48b110={'KdIkA':'2|3|1|0|6|7|4|5','xylON':'PTT','DHCPs':_0x5874fe(0x7a),'JvYWJ':_0x5874fe(0x83),'OiOJU':'ARK','AthuZ':_0x5874fe(0xa1),'aLVAo':_0x5874fe(0xa5)},_0x4759c1=_0x48b110['KdIkA'][_0x5874fe(0x97)]('|'),_0x170c07=0x0;while(!![]){switch(_0x4759c1[_0x170c07++]){case'0':_0x3ba10c[_0x3ba10c[_0x48b110[_0x5874fe(0x9a)]]=0x4]=_0x48b110['xylON'];continue;case'1':_0x3ba10c[_0x3ba10c[_0x5874fe(0x86)]=0x3]='FILE';continue;case'2':_0x3ba10c[_0x3ba10c[_0x48b110[_0x5874fe(0xa3)]]=0x1]=_0x48b110[_0x5874fe(0xa3)];continue;case'3':_0x3ba10c[_0x3ba10c[_0x48b110[_0x5874fe(0x88)]]=0x2]=_0x5874fe(0x83);continue;case'4':_0x3ba10c[_0x3ba10c[_0x5874fe(0x8a)]=0x7]=_0x5874fe(0x8a);continue;case'5':_0x3ba10c[_0x3ba10c[_0x5874fe(0x89)]=0xa]=_0x48b110[_0x5874fe(0x9e)];continue;case'6':_0x3ba10c[_0x3ba10c[_0x5874fe(0xa1)]=0x5]=_0x48b110[_0x5874fe(0x90)];continue;case'7':_0x3ba10c[_0x3ba10c[_0x48b110[_0x5874fe(0x8b)]]=0x6]=_0x48b110[_0x5874fe(0x8b)];continue;}break;}}(ElementType||(ElementType={})));export var PicType;(function(_0x5d58b6){var _0x4d64a6=_0x93f1,_0x95eff1={'EERpa':'gif','eaMSH':_0x4d64a6(0x7e)};_0x5d58b6[_0x5d58b6[_0x95eff1['EERpa']]=0x7d0]=_0x95eff1[_0x4d64a6(0x9d)],_0x5d58b6[_0x5d58b6[_0x95eff1['eaMSH']]=0x3e8]=_0x4d64a6(0x7e);}(PicType||(PicType={})));export var PicSubType;(function(_0x1d8184){var _0x5c9ccf=_0x93f1,_0x1d04b8={'ggouO':_0x5c9ccf(0x8f),'mkcOS':_0x5c9ccf(0x84)};_0x1d8184[_0x1d8184[_0x1d04b8[_0x5c9ccf(0x7d)]]=0x0]=_0x5c9ccf(0x8f),_0x1d8184[_0x1d8184[_0x1d04b8['mkcOS']]=0x1]=_0x1d04b8[_0x5c9ccf(0xab)];}(PicSubType||(PicSubType={})));export var AtType;(function(_0x27d290){var _0x13b14d=_0x93f1,_0x26a76b={'Xdmya':_0x13b14d(0x87),'IbfBx':'atAll','mfxcn':_0x13b14d(0x9c)};_0x27d290[_0x27d290[_0x13b14d(0x87)]=0x0]=_0x26a76b[_0x13b14d(0x8e)],_0x27d290[_0x27d290[_0x26a76b[_0x13b14d(0xa6)]]=0x1]=_0x26a76b[_0x13b14d(0xa6)],_0x27d290[_0x27d290[_0x26a76b[_0x13b14d(0x85)]]=0x2]='atUser';}(AtType||(AtType={})));function _0x93f1(_0x3bf496,_0x2fca5a){var _0x3c9149=_0x3c91();return _0x93f1=function(_0x93f1ed,_0x2d5a2d){_0x93f1ed=_0x93f1ed-0x79;var _0x3cae91=_0x3c9149[_0x93f1ed];return _0x3cae91;},_0x93f1(_0x3bf496,_0x2fca5a);}export var ChatType;(function(_0x126265){var _0x3f7311=_0x93f1,_0x335da8={'FzQcX':_0x3f7311(0x95),'YxHnj':_0x3f7311(0x80),'IdwfN':_0x3f7311(0x7b)};_0x126265[_0x126265[_0x335da8[_0x3f7311(0xa7)]]=0x1]=_0x335da8[_0x3f7311(0xa7)],_0x126265[_0x126265[_0x335da8[_0x3f7311(0xa0)]]=0x2]=_0x335da8[_0x3f7311(0xa0)],_0x126265[_0x126265[_0x335da8[_0x3f7311(0xa9)]]=0x64]=_0x335da8['IdwfN'];}(ChatType||(ChatType={})));export const IMAGE_HTTP_HOST='https://gchat.qpic.cn';export const IMAGE_HTTP_HOST_NT=_0x380a5d(0x9b);export var GrayTipElementSubType;function _0x3c91(){var _0x4ea8a4=['AthuZ','1402566wFyNKz','ban','kicked','5356090oZphpv','friend','zZHnf','split','4zGBcQl','10918240rEkfzF','xylON','https://multimedia.nt.qq.com.cn','atUser','EERpa','OiOJU','MEMBER_NEW_TITLE','YxHnj','VIDEO','146766mETWuf','DHCPs','2562214MbtQsu','FACE','IbfBx','FzQcX','dRcSI','IdwfN','9seQAGF','mkcOS','490hvsLYe','QEFau','TEXT','temp','WbbAO','ggouO','jpg','3mVCOsj','group','5690145dJFXHJ','Avzfl','PIC','face','mfxcn','FILE','notAt','JvYWJ','ARK','REPLY','aLVAo','7305353ImqxAs','INVITE_NEW_MEMBER','Xdmya','normal'];_0x3c91=function(){return _0x4ea8a4;};return _0x3c91();}(function(_0x33dac3){var _0xa7fdfa=_0x380a5d,_0x78b66d={'zZHnf':_0xa7fdfa(0x8d),'Avzfl':_0xa7fdfa(0x9f)};_0x33dac3[_0x33dac3[_0x78b66d[_0xa7fdfa(0x96)]]=0xc]=_0x78b66d[_0xa7fdfa(0x96)],_0x33dac3[_0x33dac3[_0x78b66d[_0xa7fdfa(0x82)]]=0x11]=_0x78b66d['Avzfl'];}(GrayTipElementSubType||(GrayTipElementSubType={})));export var TipGroupElementType;(function(_0x4d4c90){var _0x4523ef=_0x380a5d,_0x25ba23={'QEFau':'memberIncrease','WbbAO':_0x4523ef(0x93),'dRcSI':_0x4523ef(0x92)};_0x4d4c90[_0x4d4c90[_0x25ba23[_0x4523ef(0x79)]]=0x1]=_0x25ba23[_0x4523ef(0x79)],_0x4d4c90[_0x4d4c90[_0x25ba23[_0x4523ef(0x7c)]]=0x3]=_0x25ba23[_0x4523ef(0x7c)],_0x4d4c90[_0x4d4c90[_0x25ba23[_0x4523ef(0xa8)]]=0x8]=_0x25ba23['dRcSI'];}(TipGroupElementType||(TipGroupElementType={})));

View File

@@ -1,68 +0,0 @@
export declare enum GroupNotifyTypes {
INVITE_ME = 1,
INVITED_JOIN = 4,// 有人接受了邀请入群
JOIN_REQUEST = 7,
ADMIN_SET = 8,
KICK_MEMBER = 9,
MEMBER_EXIT = 11,// 主动退出
ADMIN_UNSET = 12
}
export interface GroupNotifies {
doubt: boolean;
nextStartSeq: string;
notifies: GroupNotify[];
}
export declare enum GroupNotifyStatus {
IGNORE = 0,
WAIT_HANDLE = 1,
APPROVE = 2,
REJECT = 3
}
export interface GroupNotify {
time: number;
seq: string;
type: GroupNotifyTypes;
status: GroupNotifyStatus;
group: {
groupCode: string;
groupName: string;
};
user1: {
uid: string;
nickName: string;
};
user2: {
uid: string;
nickName: string;
};
actionUser: {
uid: string;
nickName: string;
};
actionTime: string;
invitationExt: {
srcType: number;
groupCode: string;
waitStatus: number;
};
postscript: string;
repeatSeqs: [];
warningTips: string;
}
export declare enum GroupRequestOperateTypes {
approve = 1,
reject = 2
}
export interface FriendRequest {
friendUid: string;
reqTime: string;
extWords: string;
isUnread: boolean;
friendNick: string;
sourceId: number;
groupCode: string;
}
export interface FriendRequestNotify {
unreadNums: number;
buddyReqs: FriendRequest[];
}

View File

@@ -1 +0,0 @@
(function(_0xfba3ea,_0x3005d6){var _0x34cd71=_0xf995,_0x209e47=_0xfba3ea();while(!![]){try{var _0x37f36e=parseInt(_0x34cd71(0x10d))/0x1*(parseInt(_0x34cd71(0x127))/0x2)+parseInt(_0x34cd71(0x125))/0x3*(-parseInt(_0x34cd71(0x114))/0x4)+-parseInt(_0x34cd71(0x124))/0x5*(parseInt(_0x34cd71(0x12b))/0x6)+-parseInt(_0x34cd71(0x11f))/0x7*(parseInt(_0x34cd71(0x123))/0x8)+parseInt(_0x34cd71(0x115))/0x9*(-parseInt(_0x34cd71(0x11c))/0xa)+-parseInt(_0x34cd71(0x11a))/0xb+parseInt(_0x34cd71(0x10f))/0xc;if(_0x37f36e===_0x3005d6)break;else _0x209e47['push'](_0x209e47['shift']());}catch(_0xe614b5){_0x209e47['push'](_0x209e47['shift']());}}}(_0x5908,0x68857));function _0x5908(){var _0x2d25ae=['LVZNp','708940qOsFEx','Txmbm','ADMIN_SET','210TmwDII','INVITED_JOIN','dTIua','DfExN','18528IJenLb','5gsxwvi','3153GBTMxd','INVITE_ME','1550018vOnKUC','XZIQI','NjSEW','reject','2522874ptSBdD','AfVMv','ZCniQ','APPROVE','1ZalulH','1|3|2|0|4|5|6','7715496ffOpLu','ADMIN_UNSET','rtxjX','WAIT_HANDLE','mZNFW','1492OCxZFl','9PxbYWt','REJECT','JElGX','nSuXK','KICK_MEMBER','406692DFqKAs'];_0x5908=function(){return _0x2d25ae;};return _0x5908();}export var GroupNotifyTypes;function _0xf995(_0x2b8da9,_0x26b78a){var _0x590808=_0x5908();return _0xf995=function(_0xf99568,_0xd1f054){_0xf99568=_0xf99568-0x10b;var _0x4b5189=_0x590808[_0xf99568];return _0x4b5189;},_0xf995(_0x2b8da9,_0x26b78a);}(function(_0x4b6b97){var _0x4ccf9a=_0xf995,_0x49ce57={'mZNFW':_0x4ccf9a(0x10e),'LVZNp':_0x4ccf9a(0x11e),'RjpPo':_0x4ccf9a(0x126),'rtxjX':'JOIN_REQUEST','ZCniQ':_0x4ccf9a(0x120),'Txmbm':_0x4ccf9a(0x119),'XZIQI':'MEMBER_EXIT','JElGX':_0x4ccf9a(0x110)},_0x331fa9=_0x49ce57[_0x4ccf9a(0x113)]['split']('|'),_0x471abb=0x0;while(!![]){switch(_0x331fa9[_0x471abb++]){case'0':_0x4b6b97[_0x4b6b97[_0x49ce57[_0x4ccf9a(0x11b)]]=0x8]=_0x49ce57[_0x4ccf9a(0x11b)];continue;case'1':_0x4b6b97[_0x4b6b97[_0x49ce57['RjpPo']]=0x1]=_0x49ce57['RjpPo'];continue;case'2':_0x4b6b97[_0x4b6b97[_0x49ce57[_0x4ccf9a(0x111)]]=0x7]=_0x49ce57['rtxjX'];continue;case'3':_0x4b6b97[_0x4b6b97[_0x49ce57[_0x4ccf9a(0x10b)]]=0x4]=_0x49ce57[_0x4ccf9a(0x10b)];continue;case'4':_0x4b6b97[_0x4b6b97[_0x49ce57['Txmbm']]=0x9]=_0x49ce57[_0x4ccf9a(0x11d)];continue;case'5':_0x4b6b97[_0x4b6b97[_0x49ce57[_0x4ccf9a(0x128)]]=0xb]=_0x49ce57[_0x4ccf9a(0x128)];continue;case'6':_0x4b6b97[_0x4b6b97[_0x49ce57[_0x4ccf9a(0x117)]]=0xc]=_0x49ce57[_0x4ccf9a(0x117)];continue;}break;}}(GroupNotifyTypes||(GroupNotifyTypes={})));export var GroupNotifyStatus;(function(_0x181676){var _0x32802f=_0xf995,_0x6f0bc1={'AfVMv':'IGNORE','nSuXK':_0x32802f(0x112),'NjSEW':_0x32802f(0x10c)};_0x181676[_0x181676[_0x6f0bc1[_0x32802f(0x12c)]]=0x0]=_0x6f0bc1[_0x32802f(0x12c)],_0x181676[_0x181676[_0x6f0bc1[_0x32802f(0x118)]]=0x1]=_0x32802f(0x112),_0x181676[_0x181676['APPROVE']=0x2]=_0x6f0bc1[_0x32802f(0x129)],_0x181676[_0x181676[_0x32802f(0x116)]=0x3]=_0x32802f(0x116);}(GroupNotifyStatus||(GroupNotifyStatus={})));export var GroupRequestOperateTypes;(function(_0x326188){var _0x49eadb=_0xf995,_0x20dbca={'DfExN':'approve','dTIua':_0x49eadb(0x12a)};_0x326188[_0x326188[_0x20dbca[_0x49eadb(0x122)]]=0x1]=_0x20dbca['DfExN'],_0x326188[_0x326188[_0x49eadb(0x12a)]=0x2]=_0x20dbca[_0x49eadb(0x121)];}(GroupRequestOperateTypes||(GroupRequestOperateTypes={})));

View File

@@ -1,73 +0,0 @@
export declare enum Sex {
male = 1,
female = 2,
unknown = 255
}
export interface QQLevel {
'crownNum': number;
'sunNum': number;
'moonNum': number;
'starNum': number;
}
export interface User {
uid: string;
uin: string;
nick: string;
avatarUrl?: string;
longNick?: string;
remark?: string;
sex?: Sex;
qqLevel?: QQLevel;
qid?: string;
'birthday_year'?: number;
'birthday_month'?: number;
'birthday_day'?: number;
'topTime'?: string;
'constellation'?: number;
'shengXiao'?: number;
'kBloodType'?: number;
'homeTown'?: string;
'makeFriendCareer'?: number;
'pos'?: string;
'eMail'?: string;
'phoneNum'?: string;
'college'?: string;
'country'?: string;
'province'?: string;
'city'?: string;
'postCode'?: string;
'address'?: string;
'isBlock'?: boolean;
'isSpecialCareOpen'?: boolean;
'isSpecialCareZone'?: boolean;
'ringId'?: string;
'regTime'?: number;
interest?: string;
'labels'?: string[];
'isHideQQLevel'?: number;
'privilegeIcon'?: {
'jumpUrl': string;
'openIconList': unknown[];
'closeIconList': unknown[];
};
'photoWall'?: {
'picList': unknown[];
};
'vipFlag'?: boolean;
'yearVipFlag'?: boolean;
'svipFlag'?: boolean;
'vipLevel'?: number;
'status'?: number;
'qidianMasterFlag'?: number;
'qidianCrewFlag'?: number;
'qidianCrewFlag2'?: number;
'extStatus'?: number;
'recommendImgFlag'?: number;
'disableEmojiShortCuts'?: number;
'pendantId'?: string;
}
export interface SelfInfo extends User {
online?: boolean;
}
export interface Friend extends User {
}

View File

@@ -1 +0,0 @@
(function(_0x1cb01e,_0x24c2f9){var _0x22efc7=_0x5234,_0x4bd7c9=_0x1cb01e();while(!![]){try{var _0x4af665=-parseInt(_0x22efc7(0xfe))/0x1+-parseInt(_0x22efc7(0x107))/0x2+parseInt(_0x22efc7(0x10d))/0x3*(parseInt(_0x22efc7(0x10e))/0x4)+-parseInt(_0x22efc7(0x101))/0x5*(-parseInt(_0x22efc7(0x109))/0x6)+parseInt(_0x22efc7(0x10b))/0x7*(parseInt(_0x22efc7(0x10c))/0x8)+parseInt(_0x22efc7(0x106))/0x9*(-parseInt(_0x22efc7(0xfd))/0xa)+-parseInt(_0x22efc7(0x105))/0xb*(-parseInt(_0x22efc7(0x108))/0xc);if(_0x4af665===_0x24c2f9)break;else _0x4bd7c9['push'](_0x4bd7c9['shift']());}catch(_0x55662d){_0x4bd7c9['push'](_0x4bd7c9['shift']());}}}(_0x1350,0x4f70d));function _0x5234(_0xb81e9e,_0x281f01){var _0x135023=_0x1350();return _0x5234=function(_0x5234bc,_0x2ab278){_0x5234bc=_0x5234bc-0xfd;var _0x2a373c=_0x135023[_0x5234bc];return _0x2a373c;},_0x5234(_0xb81e9e,_0x281f01);}export var Sex;(function(_0x227958){var _0x28b227=_0x5234,_0x2fcc57={'YtWJu':'male','nFAkU':_0x28b227(0x10a),'YRtmk':'unknown'};_0x227958[_0x227958[_0x28b227(0x102)]=0x1]=_0x2fcc57[_0x28b227(0xff)],_0x227958[_0x227958[_0x28b227(0x10a)]=0x2]=_0x2fcc57[_0x28b227(0x103)],_0x227958[_0x227958[_0x28b227(0x104)]=0xff]=_0x2fcc57[_0x28b227(0x100)];}(Sex||(Sex={})));function _0x1350(){var _0x21b635=['nFAkU','unknown','55LKLuMO','22716MQAuKn','818928lnloUS','79164mHVaNn','835182OVMrXu','female','2660XSOfsv','2536iWvhUs','1419051MoBZsf','4OJeLhO','100HFdYaX','283960tXxFLD','YtWJu','YRtmk','15yPxMSg','male'];_0x1350=function(){return _0x21b635;};return _0x1350();}

View File

@@ -1,14 +0,0 @@
import QQWrapper from './wrapper';
export * from './adapters';
export * from './apis';
export * from './entities';
export * from './listeners';
export * from './services';
export * as Adapters from './adapters';
export * as APIs from './apis';
export * as Entities from './entities';
export * as Listeners from './listeners';
export * as Services from './services';
export { QQWrapper as Wrapper };
export * as WrapperInterface from './wrapper';
export * as SessionConfig from './sessionConfig';

View File

@@ -1 +0,0 @@
(function(_0xebef34,_0x254841){var _0x38ff39=_0x15a4,_0x4c7314=_0xebef34();while(!![]){try{var _0x9578a4=parseInt(_0x38ff39(0x11b))/0x1+parseInt(_0x38ff39(0x11c))/0x2*(-parseInt(_0x38ff39(0x11e))/0x3)+parseInt(_0x38ff39(0x117))/0x4*(parseInt(_0x38ff39(0x116))/0x5)+-parseInt(_0x38ff39(0x114))/0x6*(parseInt(_0x38ff39(0x118))/0x7)+parseInt(_0x38ff39(0x11d))/0x8*(-parseInt(_0x38ff39(0x11a))/0x9)+-parseInt(_0x38ff39(0x119))/0xa+parseInt(_0x38ff39(0x113))/0xb*(parseInt(_0x38ff39(0x115))/0xc);if(_0x9578a4===_0x254841)break;else _0x4c7314['push'](_0x4c7314['shift']());}catch(_0x51ddb6){_0x4c7314['push'](_0x4c7314['shift']());}}}(_0xf0b3,0xe449c));import _0xd9021b from'./wrapper';export*from'./adapters';export*from'./apis';export*from'./entities';export*from'./listeners';function _0x15a4(_0xe19ac3,_0x45d82c){var _0xf0b3d4=_0xf0b3();return _0x15a4=function(_0x15a4a9,_0x94b41){_0x15a4a9=_0x15a4a9-0x113;var _0x210003=_0xf0b3d4[_0x15a4a9];return _0x210003;},_0x15a4(_0xe19ac3,_0x45d82c);}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';function _0xf0b3(){var _0x4be83c=['574505jhpCvc','28ZzoWcP','43799kHvXCj','1257780kBmnMR','1617417DXbmNm','708489muGwYc','2IIBYtF','8RpGivl','1020546kMXeUx','3431648yIhxIS','234ODWcFe','12ABbLvz'];_0xf0b3=function(){return _0x4be83c;};return _0xf0b3();}export{_0xd9021b as Wrapper};export*as WrapperInterface from'./wrapper';export*as SessionConfig from'./sessionConfig';

View File

@@ -1,53 +0,0 @@
import { FriendRequestNotify, User } from '@/core/qqnt/entities';
interface IBuddyListener {
onBuddyListChange(arg: {
categoryId: number;
categroyName: string;
categroyMbCount: number;
buddyList: User[];
}[]): void;
onBuddyInfoChange(arg: unknown): void;
onBuddyDetailInfoChange(arg: unknown): void;
onNickUpdated(arg: unknown): void;
onBuddyRemarkUpdated(arg: unknown): void;
onAvatarUrlUpdated(arg: unknown): void;
onBuddyReqChange(arg: FriendRequestNotify): void;
onBuddyReqUnreadCntChange(arg: unknown): void;
onCheckBuddySettingResult(arg: unknown): void;
onAddBuddyNeedVerify(arg: unknown): void;
onSmartInfos(arg: unknown): void;
onSpacePermissionInfos(arg: unknown): void;
onDoubtBuddyReqChange(arg: unknown): void;
onDoubtBuddyReqUnreadNumChange(arg: unknown): void;
onBlockChanged(arg: unknown): void;
onAddMeSettingChanged(arg: unknown): void;
onDelBatchBuddyInfos(arg: unknown): void;
}
export interface NodeIKernelBuddyListener extends IBuddyListener {
new (listener: IBuddyListener): NodeIKernelBuddyListener;
}
export declare class BuddyListener implements IBuddyListener {
onAddBuddyNeedVerify(arg: unknown): void;
onAddMeSettingChanged(arg: unknown): void;
onAvatarUrlUpdated(arg: unknown): void;
onBlockChanged(arg: unknown): void;
onBuddyDetailInfoChange(arg: unknown): void;
onBuddyInfoChange(arg: unknown): void;
onBuddyListChange(arg: {
categoryId: number;
categroyName: string;
categroyMbCount: number;
buddyList: User[];
}[]): void;
onBuddyRemarkUpdated(arg: unknown): void;
onBuddyReqChange(arg: FriendRequestNotify): void;
onBuddyReqUnreadCntChange(arg: unknown): void;
onCheckBuddySettingResult(arg: unknown): void;
onDelBatchBuddyInfos(arg: unknown): void;
onDoubtBuddyReqChange(arg: unknown): void;
onDoubtBuddyReqUnreadNumChange(arg: unknown): void;
onNickUpdated(arg: unknown): void;
onSmartInfos(arg: unknown): void;
onSpacePermissionInfos(arg: unknown): void;
}
export {};

View File

@@ -1 +0,0 @@
var _0xbb1d9d=_0x4597;(function(_0x1dd1ea,_0x5cc944){var _0x3f56ef=_0x4597,_0x3b36aa=_0x1dd1ea();while(!![]){try{var _0x4ee6c3=parseInt(_0x3f56ef(0x73))/0x1*(-parseInt(_0x3f56ef(0x71))/0x2)+parseInt(_0x3f56ef(0x79))/0x3+-parseInt(_0x3f56ef(0x7c))/0x4*(-parseInt(_0x3f56ef(0x77))/0x5)+-parseInt(_0x3f56ef(0x6d))/0x6+parseInt(_0x3f56ef(0x78))/0x7+parseInt(_0x3f56ef(0x7b))/0x8+-parseInt(_0x3f56ef(0x76))/0x9;if(_0x4ee6c3===_0x5cc944)break;else _0x3b36aa['push'](_0x3b36aa['shift']());}catch(_0xd8b35c){_0x3b36aa['push'](_0x3b36aa['shift']());}}}(_0x47a1,0x5813b));function _0x4597(_0xaefad,_0x3d1025){var _0x47a1a6=_0x47a1();return _0x4597=function(_0x45977a,_0x413f5f){_0x45977a=_0x45977a-0x6a;var _0x722e0d=_0x47a1a6[_0x45977a];return _0x722e0d;},_0x4597(_0xaefad,_0x3d1025);}function _0x47a1(){var _0x2dc8c4=['onDelBatchBuddyInfos','onBlockChanged','onBuddyInfoChange','1330566fScOiU','onCheckBuddySettingResult','onNickUpdated','onBuddyReqChange','22OLUDxo','onSpacePermissionInfos','2188YjThlq','onBuddyReqUnreadCntChange','onAvatarUrlUpdated','4340511JRhcjK','4265GERrEv','4156334xwsWFJ','1216440Arkfrg','onDoubtBuddyReqChange','437248IRgeeC','164slcfoY','onAddMeSettingChanged'];_0x47a1=function(){return _0x2dc8c4;};return _0x47a1();}export class BuddyListener{['onAddBuddyNeedVerify'](_0x501389){}[_0xbb1d9d(0x7d)](_0x301673){}[_0xbb1d9d(0x75)](_0x5c3bbe){}[_0xbb1d9d(0x6b)](_0x48de7a){}['onBuddyDetailInfoChange'](_0x1ebb31){}[_0xbb1d9d(0x6c)](_0x21c4f5){}['onBuddyListChange'](_0x3e4956){}['onBuddyRemarkUpdated'](_0x22b52e){}[_0xbb1d9d(0x70)](_0x603ed2){}[_0xbb1d9d(0x74)](_0x48f78e){}[_0xbb1d9d(0x6e)](_0x3666c7){}[_0xbb1d9d(0x6a)](_0x2ff492){}[_0xbb1d9d(0x7a)](_0x2906d1){}['onDoubtBuddyReqUnreadNumChange'](_0x3812d2){}[_0xbb1d9d(0x6f)](_0x3db0dc){}['onSmartInfos'](_0x3c31c0){}[_0xbb1d9d(0x72)](_0x38c47c){}}

Some files were not shown because too many files have changed in this diff Show More