fix:修复qq号为int的问题,修复部分多行配置问题,修复多语言prompt问题

This commit is contained in:
SengokuCola
2026-05-05 00:32:49 +08:00
parent 94a0cb3a62
commit 4641fa1a15
17 changed files with 164 additions and 55 deletions

View File

@@ -490,10 +490,20 @@ function BotConfigPageContent() {
const saveSourceCode = async () => {
try {
setSaving(true)
// 编辑器展示时会把 basic string 内的 \n 展开成真实换行;保存前先转回 TOML 转义序列。
const escapedSourceCode = sourceCode.replace(/"([^"]*)"/g, (_match, content) => {
const encoded = content
.replace(/\\/g, '\\\\') // 反斜杠必须先转义,避免 \s 等序列被 TOML 当作非法转义
.replace(/"/g, '\\"')
.replace(/\n/g, '\\n')
.replace(/\t/g, '\\t')
.replace(/\r/g, '\\r')
return `"${encoded}"`
})
// 前端验证 TOML 格式
try {
parseToml(sourceCode)
parseToml(escapedSourceCode)
} catch (error) {
const errorMsg = error instanceof Error ? error.message : 'TOML 格式错误'
const translatedMsg = translateTomlError(errorMsg)
@@ -508,18 +518,7 @@ function BotConfigPageContent() {
return
}
// 将双引号字符串中的实际字符转换回 TOML 转义序列
// 使用正则表达式只处理双引号字符串内的内容,不影响单引号字符串
const escaped = sourceCode.replace(/"([^"]*)"/g, (_match, content) => {
const encoded = content
.replace(/\\/g, '\\\\') // 反斜杠(必须放在最前)
.replace(/"/g, '\\"') // 双引号
.replace(/\n/g, '\\n') // 换行符
.replace(/\t/g, '\\t') // 制表符
.replace(/\r/g, '\\r') // 回车符
return `"${encoded}"`
})
const result = await updateBotConfigRaw(escaped)
const result = await updateBotConfigRaw(escapedSourceCode)
if (!result.success) {
setHasTomlError(true)
const errorMsg = result.error

View File

@@ -889,7 +889,7 @@ function ModelConfigPageContent() {
</Button>
<Button type="button" variant="ghost" size="sm" onClick={dismissTourEntry}>
</Button>
</div>
</AlertDescription>

View File

@@ -63,7 +63,7 @@ export function EmojiManagementPage() {
const [page, setPage] = useState(1)
const [total, setTotal] = useState(0)
const [pageSize, setPageSize] = useState(20)
const [registeredFilter, setRegisteredFilter] = useState<string>('all')
const [registeredFilter, setRegisteredFilter] = useState<string>('registered')
const [bannedFilter, setBannedFilter] = useState<string>('all')
const [formatFilter, setFormatFilter] = useState<string>('all')
const [sortBy, setSortBy] = useState<string>('usage_count')

View File

@@ -44,7 +44,7 @@ function normalizePlatform(raw: string): string {
function deriveSelectedPlatform(config: BotBasicConfig): { selected: string; customName: string } {
const platform = config.platform
// Legacy: no platform set but has QQ account
if (!platform && config.qq_account > 0) {
if (!platform && config.qq_account.trim()) {
return { selected: 'qq', customName: '' }
}
if (!platform) {
@@ -96,9 +96,7 @@ export function BotBasicForm({ config, onChange }: BotBasicFormProps) {
const customPlatformName = customPlatformNameOverride ?? derived.customName
const primaryAccount =
selectedPlatform === 'qq'
? config.qq_account > 0
? String(config.qq_account)
: ''
? config.qq_account.trim()
: config.platform
? getPrimaryAccount(config.platforms, config.platform)
: ''
@@ -141,7 +139,7 @@ export function BotBasicForm({ config, onChange }: BotBasicFormProps) {
if (normalized === 'qq') {
onChange({
...config,
qq_account: Number(accountId) || 0,
qq_account: accountId.trim(),
platform: 'qq',
})
} else {

View File

@@ -61,10 +61,11 @@ export async function loadBotBasicConfig(): Promise<BotBasicConfig> {
)
const data = throwIfError(result)
const botConfig = (data.config.bot || {}) as Partial<BotBasicConfig>
const qqAccount = String(botConfig.qq_account ?? '').trim()
return {
platform: botConfig.platform || (botConfig.qq_account ? 'qq' : ''),
qq_account: botConfig.qq_account || 0,
platform: botConfig.platform || (qqAccount ? 'qq' : ''),
qq_account: qqAccount,
platforms: botConfig.platforms || [],
nickname: botConfig.nickname || '',
alias_names: botConfig.alias_names || [],

View File

@@ -106,7 +106,7 @@ function SetupPageContent() {
// 步骤1Bot基础信息
const [botBasic, setBotBasic] = useState<BotBasicConfig>({
platform: '',
qq_account: 0,
qq_account: '',
platforms: [],
nickname: '',
alias_names: [],
@@ -239,7 +239,7 @@ function SetupPageContent() {
if (!config.platform) return t('setupPage.validation.selectPlatform')
if (!config.nickname.trim()) return t('setupPage.validation.enterNickname')
if (config.platform === 'qq') {
if (!config.qq_account || config.qq_account <= 0) {
if (!config.qq_account.trim()) {
return t('setupPage.validation.enterQqAccount')
}
} else {

View File

@@ -10,7 +10,7 @@ export interface SetupStep {
// 步骤1Bot基础信息
export interface BotBasicConfig {
platform: string // Primary platform name (normalized, lowercase)
qq_account: number // QQ account (preserved always for webui compat)
qq_account: string // QQ account (preserved always for webui compat)
platforms: string[] // Other platform accounts "platform:account"
nickname: string
alias_names: string[]