mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2026-02-11 15:30:25 +00:00
Compare commits
9 Commits
copilot/im
...
v4.9.29
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
93c140ed4e | ||
|
|
457b072f0e | ||
|
|
1869493473 | ||
|
|
f33c66ce15 | ||
|
|
e8d6f86458 | ||
|
|
a000ffdf0d | ||
|
|
202338a160 | ||
|
|
e3eb129a52 | ||
|
|
7654e9f2bb |
25
.github/release-template/release-info.md
vendored
25
.github/release-template/release-info.md
vendored
@@ -1,25 +0,0 @@
|
||||
[使用文档](https://napneko.github.io/)
|
||||
|
||||
## Windows 一键包
|
||||
我们提供了轻量化一键部署方案
|
||||
相对于普通需要安装QQ的方案,下面已内置QQ和Napcat 阅读使用文档参考
|
||||
|
||||
你可以下载
|
||||
|
||||
NapCat.Shell.Windows.OneKey.zip (无头)
|
||||
NapCat.Framework.Windows.OneKey.zip (有头)
|
||||
|
||||
启动后可自动化部署一键包,教程参考使用文档安装部分
|
||||
|
||||
## 警告
|
||||
**注意QQ版本推荐使用 40768+ 版本 最低可以使用40768版本**
|
||||
**默认WebUi密钥为随机密码 控制台查看**
|
||||
|
||||
**[9.9.22-40990 X64 Win](https://dldir1v6.qq.com/qqfile/qq/QQNT/2c9d3f6c/QQ9.9.22.40990_x64.exe)**
|
||||
[LinuxX64 DEB 40990 ](https://dldir1.qq.com/qqfile/qq/QQNT/ec800879/linuxqq_3.2.20-40990_amd64.deb)
|
||||
[LinuxX64 RPM 40990 ](https://dldir1.qq.com/qqfile/qq/QQNT/ec800879/linuxqq_3.2.20-40990_x86_64.rpm)
|
||||
[LinuxArm64 DEB 40990 ](https://dldir1.qq.com/qqfile/qq/QQNT/ec800879/linuxqq_3.2.20-40990_arm64.deb)
|
||||
[LinuxArm64 RPM 40990 ](https://dldir1.qq.com/qqfile/qq/QQNT/ec800879/linuxqq_3.2.20-40990_aarch64.rpm)
|
||||
[MAC DMG 40990 ](https://dldir1v6.qq.com/qqfile/qq/QQNT/c6cb0f5d/QQ_v6.9.82.40990.dmg)
|
||||
## 如果WinX64缺少运行库或者xxx.dll?
|
||||
[安装运行库](https://aka.ms/vs/17/release/vc_redist.x64.exe)
|
||||
28
.github/workflows/release.yml
vendored
28
.github/workflows/release.yml
vendored
@@ -136,41 +136,19 @@ jobs:
|
||||
- name: Extract version from tag
|
||||
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
|
||||
|
||||
- name: Download Windows OneKey Packages
|
||||
run: |
|
||||
# Get latest release tag using jq for reliable JSON parsing
|
||||
LATEST_RELEASE=$(curl -s https://api.github.com/repos/NapNeko/NapCatQQ/releases/latest | jq -r '.tag_name')
|
||||
echo "Latest release: $LATEST_RELEASE"
|
||||
|
||||
# Download OneKey packages if they exist (non-zero exit code won't fail the step)
|
||||
curl -f -L -o NapCat.Shell.Windows.OneKey.zip "https://github.com/NapNeko/NapCatQQ/releases/download/$LATEST_RELEASE/NapCat.Shell.Windows.OneKey.zip" || echo "Warning: NapCat.Shell.Windows.OneKey.zip not found in latest release"
|
||||
curl -f -L -o NapCat.Framework.Windows.OneKey.zip "https://github.com/NapNeko/NapCatQQ/releases/download/$LATEST_RELEASE/NapCat.Framework.Windows.OneKey.zip" || echo "Warning: NapCat.Framework.Windows.OneKey.zip not found in latest release"
|
||||
|
||||
- name: Generate Release Notes
|
||||
run: |
|
||||
# Create header with version
|
||||
echo "# V${{ env.VERSION }} Refactor" > RELEASE_NOTES.md
|
||||
|
||||
# Add fixed release information
|
||||
cat .github/release-template/release-info.md >> RELEASE_NOTES.md
|
||||
|
||||
# Add changelog section
|
||||
echo "" >> RELEASE_NOTES.md
|
||||
chmod +x ./script/generate-changelog.sh
|
||||
./script/generate-changelog.sh >> RELEASE_NOTES.md
|
||||
- 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 V${{ env.VERSION }}
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
body_path: RELEASE_NOTES.md
|
||||
body_path: CHANGELOG.md
|
||||
files: |
|
||||
NapCat.Framework.zip
|
||||
NapCat.Shell.zip
|
||||
NapCat.Framework.Windows.Once.zip
|
||||
NapCat.Shell.Windows.OneKey.zip
|
||||
NapCat.Framework.Windows.OneKey.zip
|
||||
draft: true
|
||||
|
||||
build-docker:
|
||||
|
||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -14,4 +14,6 @@ devconfig/*
|
||||
*.db
|
||||
checkVersion.sh
|
||||
bun.lockb
|
||||
tests/run/
|
||||
tests/run/
|
||||
guild1.db-wal
|
||||
guild1.db-shm
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"name": "NapCatQQ",
|
||||
"slug": "NapCat.Framework",
|
||||
"description": "高性能的 OneBot 11 协议实现",
|
||||
"version": "4.9.26",
|
||||
"version": "4.9.28",
|
||||
"icon": "./logo.png",
|
||||
"authors": [
|
||||
{
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"name": "napcat",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"version": "4.9.26",
|
||||
"version": "4.9.28",
|
||||
"scripts": {
|
||||
"build:universal": "npm run build:webui && npm run dev:universal || exit 1",
|
||||
"build:framework": "npm run build:webui && npm run dev:framework || exit 1",
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Get the latest 10 commits excluding those starting with "release:"
|
||||
echo "## 更新"
|
||||
echo ""
|
||||
git log --oneline -20 --pretty=format:"%s" | grep -v "^release:" | head -10 | while read -r line; do
|
||||
echo "- $line"
|
||||
done
|
||||
@@ -1 +1 @@
|
||||
export const napCatVersion = '4.9.26';
|
||||
export const napCatVersion = '4.9.28';
|
||||
|
||||
@@ -17,8 +17,14 @@ export class NTQQFriendApi {
|
||||
|
||||
async getBuddyV2SimpleInfoMap () {
|
||||
const buddyService = this.context.session.getBuddyService();
|
||||
const buddyListV2 = await buddyService.getBuddyListV2('0', BuddyListReqType.KNOMAL);
|
||||
const uids = buddyListV2.data.flatMap(item => item.buddyUids);
|
||||
let uids: string[] = [];
|
||||
if (this.core.context.basicInfoWrapper.requireMinNTQQBuild('41679')) {
|
||||
const buddyListV2NT = await buddyService.getBuddyListV2('0', true, BuddyListReqType.KNOMAL);
|
||||
uids = buddyListV2NT.data.flatMap(item => item.buddyUids);
|
||||
} else {
|
||||
const buddyListV2 = await buddyService.getBuddyListV2('0', BuddyListReqType.KNOMAL);
|
||||
uids = buddyListV2.data.flatMap(item => item.buddyUids);
|
||||
}
|
||||
return await this.core.eventWrapper.callNoListenerEvent(
|
||||
'NodeIKernelProfileService/getCoreAndBaseInfo',
|
||||
'nodeStore',
|
||||
@@ -47,10 +53,15 @@ export class NTQQFriendApi {
|
||||
|
||||
async getBuddyV2ExWithCate () {
|
||||
const buddyService = this.context.session.getBuddyService();
|
||||
const buddyListV2 = (await buddyService.getBuddyListV2('0', BuddyListReqType.KNOMAL)).data;
|
||||
const uids = buddyListV2.flatMap(item => {
|
||||
return item.buddyUids;
|
||||
});
|
||||
let uids: string[] = [];
|
||||
let buddyListV2: Awaited<ReturnType<typeof buddyService.getBuddyListV2>>['data'];
|
||||
if (this.core.context.basicInfoWrapper.requireMinNTQQBuild('41679')) {
|
||||
buddyListV2 = (await buddyService.getBuddyListV2('0', true, BuddyListReqType.KNOMAL)).data;
|
||||
uids = buddyListV2.flatMap(item => item.buddyUids);
|
||||
} else {
|
||||
buddyListV2 = (await buddyService.getBuddyListV2('0', BuddyListReqType.KNOMAL)).data;
|
||||
uids = buddyListV2.flatMap(item => item.buddyUids);
|
||||
}
|
||||
const data = await this.core.eventWrapper.callNoListenerEvent(
|
||||
'NodeIKernelProfileService/getCoreAndBaseInfo',
|
||||
'nodeStore',
|
||||
|
||||
@@ -3,122 +3,133 @@ import { NodeIKernelBuddyListener } from '@/core/listeners';
|
||||
import { BuddyListReqType } from '@/core/types/user';
|
||||
|
||||
export interface NodeIKernelBuddyService {
|
||||
getBuddyListV2(callFrom: string, reqType: BuddyListReqType): Promise<GeneralCallResult & {
|
||||
getBuddyListV2 (callFrom: string, reqType: BuddyListReqType): Promise<GeneralCallResult & {
|
||||
data: Array<{
|
||||
categoryId: number,
|
||||
categorySortId: number,
|
||||
categroyName: string,
|
||||
categroyMbCount: number,
|
||||
onlineCount: number,
|
||||
buddyUids: Array<string>
|
||||
}>
|
||||
buddyUids: Array<string>;
|
||||
}>;
|
||||
}>;
|
||||
getBuddyListV2 (callFrom: string, isPullRefresh: boolean, reqType: BuddyListReqType): Promise<GeneralCallResult & {
|
||||
data: Array<{
|
||||
categoryId: number,
|
||||
categorySortId: number,
|
||||
categroyName: string,
|
||||
categroyMbCount: number,
|
||||
onlineCount: number,
|
||||
buddyUids: Array<string>;
|
||||
}>;
|
||||
}>;
|
||||
|
||||
getBuddyListFromCache(reqType: BuddyListReqType): Promise<Array<
|
||||
{
|
||||
categoryId: number, // 9999为特别关心
|
||||
categorySortId: number, // 排序方式
|
||||
categroyName: string, // 分类名
|
||||
categroyMbCount: number, // 不懂
|
||||
onlineCount: number, // 在线数目
|
||||
buddyUids: Array<string>// Uids
|
||||
}>>;
|
||||
|
||||
addKernelBuddyListener(listener: NodeIKernelBuddyListener): number;
|
||||
getBuddyListFromCache (reqType: BuddyListReqType): Promise<Array<
|
||||
{
|
||||
categoryId: number, // 9999为特别关心
|
||||
categorySortId: number, // 排序方式
|
||||
categroyName: string, // 分类名
|
||||
categroyMbCount: number, // 不懂
|
||||
onlineCount: number, // 在线数目
|
||||
buddyUids: Array<string>;// Uids
|
||||
}>>;
|
||||
|
||||
getAllBuddyCount(): number;
|
||||
addKernelBuddyListener (listener: NodeIKernelBuddyListener): number;
|
||||
|
||||
removeKernelBuddyListener(listenerId: number): void;
|
||||
getAllBuddyCount (): number;
|
||||
|
||||
removeKernelBuddyListener (listenerId: number): void;
|
||||
|
||||
// getBuddyList(nocache: boolean): Promise<GeneralCallResult>;
|
||||
|
||||
getBuddyNick(uid: number): string;
|
||||
getBuddyNick (uid: number): string;
|
||||
|
||||
getBuddyRemark(uid: number): string;
|
||||
getBuddyRemark (uid: number): string;
|
||||
|
||||
setBuddyRemark(param: { uid: string, remark: string, signInfo?: unknown }): void;
|
||||
setBuddyRemark (param: { uid: string, remark: string, signInfo?: unknown; }): void;
|
||||
|
||||
getAvatarUrl(uid: number): string;
|
||||
getAvatarUrl (uid: number): string;
|
||||
|
||||
isBuddy(uid: string): boolean;
|
||||
isBuddy (uid: string): boolean;
|
||||
|
||||
getCategoryNameWithUid(uid: number): string;
|
||||
getCategoryNameWithUid (uid: number): string;
|
||||
|
||||
getTargetBuddySetting(uid: number): unknown;
|
||||
getTargetBuddySetting (uid: number): unknown;
|
||||
|
||||
getTargetBuddySettingByType(uid: number, type: number): unknown;
|
||||
getTargetBuddySettingByType (uid: number, type: number): unknown;
|
||||
|
||||
getBuddyReqUnreadCnt(): number;
|
||||
getBuddyReqUnreadCnt (): number;
|
||||
|
||||
getBuddyReq(): Promise<GeneralCallResult>;
|
||||
getBuddyReq (): Promise<GeneralCallResult>;
|
||||
|
||||
delBuddyReq(uid: number): void;
|
||||
delBuddyReq (uid: number): void;
|
||||
|
||||
clearBuddyReqUnreadCnt(): Promise<GeneralCallResult>;
|
||||
clearBuddyReqUnreadCnt (): Promise<GeneralCallResult>;
|
||||
|
||||
reqToAddFriends(uid: number, msg: string): void;
|
||||
reqToAddFriends (uid: number, msg: string): void;
|
||||
|
||||
setSpacePermission(uid: number, permission: number): void;
|
||||
setSpacePermission (uid: number, permission: number): void;
|
||||
|
||||
approvalFriendRequest(arg: {
|
||||
approvalFriendRequest (arg: {
|
||||
friendUid: string;
|
||||
reqTime: string;
|
||||
accept: boolean;
|
||||
}): Promise<void>;
|
||||
|
||||
delBuddy(param: {
|
||||
delBuddy (param: {
|
||||
friendUid: string;
|
||||
tempBlock: boolean;
|
||||
tempBothDel: boolean;
|
||||
}): Promise<unknown>;
|
||||
|
||||
delBatchBuddy(uids: number[]): void;
|
||||
delBatchBuddy (uids: number[]): void;
|
||||
|
||||
getSmartInfos(uid: number): unknown;
|
||||
getSmartInfos (uid: number): unknown;
|
||||
|
||||
setBuddyCategory(uid: number, category: number): void;
|
||||
setBuddyCategory (uid: number, category: number): void;
|
||||
|
||||
setBatchBuddyCategory(uids: number[], category: number): void;
|
||||
setBatchBuddyCategory (uids: number[], category: number): void;
|
||||
|
||||
addCategory(category: string): void;
|
||||
addCategory (category: string): void;
|
||||
|
||||
delCategory(category: string): void;
|
||||
delCategory (category: string): void;
|
||||
|
||||
renameCategory(oldCategory: string, newCategory: string): void;
|
||||
renameCategory (oldCategory: string, newCategory: string): void;
|
||||
|
||||
resortCategory(categorys: string[]): void;
|
||||
resortCategory (categorys: string[]): void;
|
||||
|
||||
pullCategory(uid: number, category: string): void;
|
||||
pullCategory (uid: number, category: string): void;
|
||||
|
||||
setTop(uid: number, isTop: boolean): void;
|
||||
setTop (uid: number, isTop: boolean): void;
|
||||
|
||||
SetSpecialCare(uid: number, isSpecialCare: boolean): void;
|
||||
SetSpecialCare (uid: number, isSpecialCare: boolean): void;
|
||||
|
||||
setMsgNotify(uid: number, isNotify: boolean): void;
|
||||
setMsgNotify (uid: number, isNotify: boolean): void;
|
||||
|
||||
hasBuddyList(): boolean;
|
||||
hasBuddyList (): boolean;
|
||||
|
||||
setBlock(uid: number, isBlock: boolean): void;
|
||||
setBlock (uid: number, isBlock: boolean): void;
|
||||
|
||||
isBlocked(uid: number): boolean;
|
||||
isBlocked (uid: number): boolean;
|
||||
|
||||
modifyAddMeSetting(setting: unknown): void;
|
||||
modifyAddMeSetting (setting: unknown): void;
|
||||
|
||||
getAddMeSetting(): unknown;
|
||||
getAddMeSetting (): unknown;
|
||||
|
||||
getDoubtBuddyReq(reqId: string, num: number, uk:string): Promise<GeneralCallResult>;
|
||||
getDoubtBuddyReq (reqId: string, num: number, uk: string): Promise<GeneralCallResult>;
|
||||
|
||||
getDoubtBuddyUnreadNum(): number;
|
||||
getDoubtBuddyUnreadNum (): number;
|
||||
|
||||
approvalDoubtBuddyReq(uid: string, str1: string, str2: string): void;
|
||||
approvalDoubtBuddyReq (uid: string, str1: string, str2: string): void;
|
||||
|
||||
delDoubtBuddyReq(uid: number): void;
|
||||
delDoubtBuddyReq (uid: number): void;
|
||||
|
||||
delAllDoubtBuddyReq(): Promise<GeneralCallResult>;
|
||||
delAllDoubtBuddyReq (): Promise<GeneralCallResult>;
|
||||
|
||||
reportDoubtBuddyReqUnread(): void;
|
||||
reportDoubtBuddyReqUnread (): void;
|
||||
|
||||
getBuddyRecommendContactArkJson(uid: string, phoneNumber: string): Promise<GeneralCallResult & { arkMsg: string }>;
|
||||
getBuddyRecommendContactArkJson (uid: string, phoneNumber: string): Promise<GeneralCallResult & { arkMsg: string; }>;
|
||||
|
||||
isNull(): boolean;
|
||||
isNull (): boolean;
|
||||
}
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -37,7 +37,7 @@ export class SendGroupNotice extends OneBotAction<Payload, null> {
|
||||
await checkFileExist(path, 5000);
|
||||
const ImageUploadResult = await this.core.apis.GroupApi.uploadGroupBulletinPic(payload.group_id.toString(), path);
|
||||
if (ImageUploadResult.errCode !== 0) {
|
||||
throw new Error(`群公告${payload.image}设置失败,图片上传失败`);
|
||||
throw new Error(`群公告${payload.image}设置失败,图片上传失败 , 错误信息:${ImageUploadResult.errMsg}`);
|
||||
}
|
||||
|
||||
unlink(path).catch(() => { });
|
||||
|
||||
BIN
tests/QQNT.dll
BIN
tests/QQNT.dll
Binary file not shown.
Reference in New Issue
Block a user