Skip to content

Commit 938074c

Browse files
committed
Support selecting account for join key
Add account selection to About page so users can generate the group-join password for different QQ accounts. about.tsx: fetch quick-login list (QQManager.getQQQuickLoginListNew), track selectedUin with useState/useEffect, build account list (including current login as fallback), compute password per selected account (SHA512(hash + uin).substring(0,7)), and render a Select control and updated Snippet/Tooltip UI; also add a binding notice. README and translated docs: add note that the join key is only valid for the latest 100 versions and prompt users to update if it fails.
1 parent d16f493 commit 938074c

File tree

7 files changed

+125
-42
lines changed

7 files changed

+125
-42
lines changed

README.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@ NapCat is currently looking for a new primary maintainer. Please email nanaeonn@
2020

2121
You can get the join password directly from the **About** page of the WebUI.
2222

23-
- [[NapCat Family] Happy Family] 1090875633: https://qm.qq.com/q/VwpnklcXqo
24-
- [[NapCat Family] Royal Relatives] 1059714215: https://qm.qq.com/q/gq18RH7o7S
25-
- [[NapCat Family] Loving Family] 1085662710: https://qm.qq.com/q/XyiyGPqa42
26-
- [[NapCat Family] Joyful Family] 1085359803: https://qm.qq.com/q/E4nfkGD6oK
23+
- [NapCat Family Group 1](https://qm.qq.com/q/VwpnklcXqo) Group ID(1090875633)
24+
- [NapCat Family Group 2](https://qm.qq.com/q/gq18RH7o7S) Group ID(1059714215)
25+
- [NapCat Family Group 3](https://qm.qq.com/q/XyiyGPqa42) Group ID(1085662710)
26+
- [NapCat Family Group 4](https://qm.qq.com/q/E4nfkGD6oK) Group ID(1085359803)
27+
28+
> Note: The join key is only valid for the latest 100 versions, and requires NapCat version >= 4.17.31. If it fails, please update.
2729
2830
## Welcome
2931

docs/README_ja.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@ NapCat は現在、新しいメインメンテナーを募集しています。n
2020

2121
**WebUI の「について」ページ** から参加パスワードを直接取得できます:
2222

23-
- [NapCat Family] Happy Family 1090875633:https://qm.qq.com/q/VwpnklcXqo
24-
- [NapCat Family] Royal Relatives 1059714215:https://qm.qq.com/q/gq18RH7o7S
25-
- [NapCat Family] Loving Family 1085662710:https://qm.qq.com/q/XyiyGPqa42
26-
- [NapCat Family] Joyful Family 1085359803:https://qm.qq.com/q/E4nfkGD6oK
23+
- [NapCat Family Group 1](https://qm.qq.com/q/VwpnklcXqo) Group ID(1090875633)
24+
- [NapCat Family Group 2](https://qm.qq.com/q/gq18RH7o7S) Group ID(1059714215)
25+
- [NapCat Family Group 3](https://qm.qq.com/q/XyiyGPqa42) Group ID(1085662710)
26+
- [NapCat Family Group 4](https://qm.qq.com/q/E4nfkGD6oK) Group ID(1085359803)
27+
28+
> 注意:入会キーは最新の100バージョンにのみ有効で、NapCatバージョン >= 4.17.31 が必要です。エラーが発生した場合は更新してください。
2729
2830
## ようこそ
2931

docs/README_ko.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@ NapCat은 현재 새로운 주요 메인테이너를 찾고 있습니다. nanaeo
1919

2020
**WebUI 의 「정보」페이지** 에서 입장 비밀번호를 바로 확인할 수 있습니다:
2121

22-
- [NapCat Family] Happy Family 1090875633:https://qm.qq.com/q/VwpnklcXqo
23-
- [NapCat Family] Royal Relatives 1059714215:https://qm.qq.com/q/gq18RH7o7S
24-
- [NapCat Family] Loving Family 1085662710:https://qm.qq.com/q/XyiyGPqa42
25-
- [NapCat Family] Joyful Family 1085359803:https://qm.qq.com/q/E4nfkGD6oK
22+
- [NapCat Family Group 1](https://qm.qq.com/q/VwpnklcXqo) Group ID(1090875633)
23+
- [NapCat Family Group 2](https://qm.qq.com/q/gq18RH7o7S) Group ID(1059714215)
24+
- [NapCat Family Group 3](https://qm.qq.com/q/XyiyGPqa42) Group ID(1085662710)
25+
- [NapCat Family Group 4](https://qm.qq.com/q/E4nfkGD6oK) Group ID(1085359803)
26+
27+
> 참고: 가입 키는 최신 100개 버전에서만 유효하며, NapCat 버전 >= 4.17.31이 필요합니다. 오류가 발생하면 업데이트하세요.
2628
## 환영합니다
2729

2830
- NapCatQQ는 NTQQ를 기반으로 한 최신 Bot 프로토콜 구현체입니다

docs/README_ru.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@ NapCat в настоящее время ищет нового основного
2020

2121
Пароль для вступления можно получить прямо на **странице «О программе» в WebUI**
2222

23-
- [NapCat Family] Happy Family 1090875633:https://qm.qq.com/q/VwpnklcXqo
24-
- [NapCat Family] Royal Relatives 1059714215:https://qm.qq.com/q/gq18RH7o7S
25-
- [NapCat Family] Loving Family 1085662710:https://qm.qq.com/q/XyiyGPqa42
26-
- [NapCat Family] Joyful Family 1085359803:https://qm.qq.com/q/E4nfkGD6oK
23+
- [NapCat Family Group 1](https://qm.qq.com/q/VwpnklcXqo) Group ID(1090875633)
24+
- [NapCat Family Group 2](https://qm.qq.com/q/gq18RH7o7S) Group ID(1059714215)
25+
- [NapCat Family Group 3](https://qm.qq.com/q/XyiyGPqa42) Group ID(1085662710)
26+
- [NapCat Family Group 4](https://qm.qq.com/q/E4nfkGD6oK) Group ID(1085359803)
27+
28+
> Примечание: Ключ для входа действителен только для последних 100 версий и требует версию NapCat >= 4.17.31. Если возникает ошибка, пожалуйста, обновитесь.
2729
2830
## Добро пожаловать
2931

docs/README_zh-CN.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@ NapCat 当前正在寻找新的主要维护者,欢迎email到 nanaeonn@outlook
2020

2121
可直接在 **WebUI 关于页面** 获取入群密码:
2222

23-
- 点击链接加入群聊【[NapCat家族群] 欢乐一家亲】1090875633:https://qm.qq.com/q/VwpnklcXqo
24-
- 点击链接加入群聊【[NapCat家族群] 皇亲国戚】1059714215:https://qm.qq.com/q/gq18RH7o7S
25-
- 点击链接加入群聊【[NapCat家族群] 相亲相爱一家人】1085662710:https://qm.qq.com/q/XyiyGPqa42
26-
- 点击链接加入群聊【[NapCat家族群] 开心家族】1085359803 :https://qm.qq.com/q/E4nfkGD6oK
23+
- [NapCat家族一群](https://qm.qq.com/q/VwpnklcXqo) 群号(1090875633)
24+
- [NapCat家族二群](https://qm.qq.com/q/gq18RH7o7S) 群号(1059714215)
25+
- [NapCat家族三群](https://qm.qq.com/q/XyiyGPqa42) 群号(1085662710)
26+
- [NapCat家族四群](https://qm.qq.com/q/E4nfkGD6oK) 群号(1085359803)
27+
28+
> 注意:入群密钥只适合最新的100个版本,且 NapCat 版本需 >= 4.17.31,如果不符合请更新。
2729
2830
## 欢迎
2931

docs/README_zh-TW.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@ NapCat 目前正在尋找新的主要維護者,歡迎透過 email 聯繫 nanae
2020

2121
可直接在 **WebUI 關於頁面** 取得入群密碼:
2222

23-
- 點擊連結加入群聊【[NapCat家族群] 歡樂一家親】1090875633:https://qm.qq.com/q/VwpnklcXqo
24-
- 點擊連結加入群聊【[NapCat家族群] 皇親國戚】1059714215:https://qm.qq.com/q/gq18RH7o7S
25-
- 點擊連結加入群聊【[NapCat家族群] 相親相愛一家人】1085662710:https://qm.qq.com/q/XyiyGPqa42
26-
- 點擊連結加入群聊【[NapCat家族群] 開心家族】1085359803:https://qm.qq.com/q/E4nfkGD6oK
23+
- [NapCat家族一群](https://qm.qq.com/q/VwpnklcXqo) 群號(1090875633)
24+
- [NapCat家族二群](https://qm.qq.com/q/gq18RH7o7S) 群號(1059714215)
25+
- [NapCat家族三群](https://qm.qq.com/q/XyiyGPqa42) 群號(1085662710)
26+
- [NapCat家族四群](https://qm.qq.com/q/E4nfkGD6oK) 群號(1085359803)
27+
28+
> 注意:入群密鑰只適用於最新的100個版本,且 NapCat 版本需 >= 4.17.31,如果錯誤請更新。
2729
2830
## 歡迎
2931

packages/napcat-webui-frontend/src/pages/dashboard/about.tsx

Lines changed: 89 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ import { Chip } from '@heroui/chip';
33
import { Divider } from '@heroui/divider';
44
import { Image } from '@heroui/image';
55
import { Link } from '@heroui/link';
6+
import { Select, SelectItem } from '@heroui/select';
67
import { Snippet } from '@heroui/snippet';
78
import { Spinner } from '@heroui/spinner';
89
import { Tooltip } from '@heroui/tooltip';
910
import { useRequest } from 'ahooks';
11+
import { useEffect, useState } from 'react';
1012
import {
1113
BsCodeSlash,
1214
BsCpu,
@@ -45,13 +47,57 @@ function VersionInfo () {
4547

4648
function NapCatFileHash () {
4749
const { data: hashData, loading: hashLoading, error: hashError } = useRequest(WebUIManager.GetNapCatFileHash);
50+
const { data: loginList, loading: listLoading, error: listError } = useRequest(QQManager.getQQQuickLoginListNew);
4851
const { data: loginData, loading: loginLoading, error: loginError } = useRequest(QQManager.getQQLoginInfo);
4952

50-
const loading = hashLoading || loginLoading;
51-
const error = hashError || loginError;
53+
const [selectedUin, setSelectedUin] = useState<string | null>(null);
5254

53-
const password = hashData && loginData?.uin
54-
? CryptoJS.SHA512(hashData.hash + loginData.uin).toString()
55+
const loading = hashLoading || listLoading || loginLoading;
56+
const error = hashError || listError || loginError;
57+
58+
// 优先使用 getLoginList 返回的账号列表,回退到当前登录账号
59+
const accounts: { uin: string; label: string; }[] = [];
60+
61+
// 添加 LoginList 账号
62+
if (loginList && loginList.length > 0) {
63+
loginList.forEach(item => {
64+
accounts.push({
65+
uin: item.uin,
66+
label: item.nickName ? `${item.nickName}${item.uin})` : item.uin,
67+
});
68+
});
69+
}
70+
71+
// 确保当前登录账号也在列表中
72+
// 注意:API 返回的 uin 类型可能不一致(string/number),做一次转换比较
73+
if (loginData?.uin) {
74+
const isLoginAccountInList = accounts.some(acc => String(acc.uin) === String(loginData.uin));
75+
if (!isLoginAccountInList) {
76+
accounts.push({
77+
uin: String(loginData.uin),
78+
label: loginData.nick ? `${loginData.nick}${loginData.uin})` : String(loginData.uin)
79+
});
80+
}
81+
}
82+
83+
// 自动选择第一个账号
84+
useEffect(() => {
85+
if (accounts.length > 0) {
86+
const isSelectedValid = selectedUin && accounts.some(acc => acc.uin === selectedUin);
87+
88+
if (!isSelectedValid) {
89+
if (loginData?.uin && accounts.some((acc) => acc.uin == loginData.uin)) {
90+
setSelectedUin(loginData.uin);
91+
} else {
92+
setSelectedUin(accounts[0].uin);
93+
}
94+
}
95+
}
96+
}, [accounts, selectedUin, loginData]);
97+
98+
const currentAccount = accounts.find((acc) => acc.uin === selectedUin) || accounts[0];
99+
const password = (hashData && currentAccount)
100+
? CryptoJS.SHA512(hashData.hash + currentAccount.uin).toString().substring(0, 7)
55101
: null;
56102

57103
return (
@@ -62,17 +108,45 @@ function NapCatFileHash () {
62108
</div>
63109
{error ? (
64110
<Chip color="warning" variant="flat" size="sm">无法计算:{(error as Error).message}</Chip>
65-
) : loading ? null : password ? (
66-
<Tooltip content="复制此值作为入群密码" placement="top">
67-
<Snippet
68-
size="sm"
69-
variant="flat"
70-
className="w-full text-xs"
71-
symbol=""
72-
>
73-
{password}
74-
</Snippet>
75-
</Tooltip>
111+
) : loading ? null : accounts.length > 0 ? (
112+
<div className="space-y-3">
113+
{accounts.length > 1 && (
114+
<Select
115+
label="选择账号"
116+
size="sm"
117+
selectedKeys={selectedUin ? [selectedUin] : []}
118+
onChange={(e) => setSelectedUin(e.target.value)}
119+
className="max-w-full"
120+
>
121+
{accounts.map((acc) => (
122+
<SelectItem key={acc.uin} textValue={acc.label}>
123+
{acc.label}
124+
</SelectItem>
125+
))}
126+
</Select>
127+
)}
128+
129+
{password && (
130+
<div className="space-y-1">
131+
{accounts.length === 1 && <p className="text-xs text-default-500">{currentAccount.label}</p>}
132+
<Tooltip content={`使用 ${currentAccount.label} 申请入群,以此值作为入群密码`} placement="top">
133+
<Snippet
134+
size="sm"
135+
variant="flat"
136+
symbol=""
137+
codeString={password}
138+
className="w-full"
139+
classNames={{
140+
pre: 'text-xs break-all whitespace-pre-wrap font-mono',
141+
}}
142+
>
143+
{password}
144+
</Snippet>
145+
</Tooltip>
146+
</div>
147+
)}
148+
<p className="text-xs text-warning-500">入群密钥绑定QQ,使用对应QQ申请入群即可。</p>
149+
</div>
76150
) : null}
77151
</div>
78152
);
@@ -183,9 +257,6 @@ export default function AboutPage () {
183257
</CardHeader>
184258
<CardBody className="py-4 space-y-4">
185259
<NapCatFileHash />
186-
<p className="text-xs text-default-400 px-1">
187-
复制上方密码,作为加入 QQ 群的入群密码。
188-
</p>
189260
<div className="flex flex-col gap-2">
190261
{links.map((link, idx) => (
191262
<Link

0 commit comments

Comments
 (0)