mirror of
https://github.com/pompurin404/mihomo-party.git
synced 2024-11-16 03:32:17 +08:00
support custom webdav directory
This commit is contained in:
parent
e7ba8e7739
commit
2f1eabcdc9
|
@ -1,4 +1,9 @@
|
|||
### New Features
|
||||
|
||||
- 支持自定义 WebDAV 备份目录名称
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
- 修复 macOS 自动更新失败的问题
|
||||
- 修复订阅点击无法切换的问题
|
||||
- 修复某些 Windows 管理员权限依然无法启动的问题
|
||||
|
|
|
@ -15,7 +15,12 @@ import {
|
|||
|
||||
export async function webdavBackup(): Promise<boolean> {
|
||||
const { createClient } = await import('webdav/dist/node/index.js')
|
||||
const { webdavUrl = '', webdavUsername = '', webdavPassword = '' } = await getAppConfig()
|
||||
const {
|
||||
webdavUrl = '',
|
||||
webdavUsername = '',
|
||||
webdavPassword = '',
|
||||
webdavDir = 'mihomo-party'
|
||||
} = await getAppConfig()
|
||||
const zip = new AdmZip()
|
||||
|
||||
zip.addLocalFile(appConfigPath())
|
||||
|
@ -34,36 +39,46 @@ export async function webdavBackup(): Promise<boolean> {
|
|||
password: webdavPassword
|
||||
})
|
||||
try {
|
||||
await client.createDirectory('mihomo-party')
|
||||
await client.createDirectory(webdavDir)
|
||||
} catch {
|
||||
// ignore
|
||||
}
|
||||
|
||||
return await client.putFileContents(`mihomo-party/${zipFileName}`, zip.toBuffer())
|
||||
return await client.putFileContents(`${webdavDir}/${zipFileName}`, zip.toBuffer())
|
||||
}
|
||||
|
||||
export async function webdavRestore(filename: string): Promise<void> {
|
||||
const { createClient } = await import('webdav/dist/node/index.js')
|
||||
const { webdavUrl = '', webdavUsername = '', webdavPassword = '' } = await getAppConfig()
|
||||
const {
|
||||
webdavUrl = '',
|
||||
webdavUsername = '',
|
||||
webdavPassword = '',
|
||||
webdavDir = 'mihomo-party'
|
||||
} = await getAppConfig()
|
||||
|
||||
const client = createClient(webdavUrl, {
|
||||
username: webdavUsername,
|
||||
password: webdavPassword
|
||||
})
|
||||
const zipData = await client.getFileContents(`mihomo-party/${filename}`)
|
||||
const zipData = await client.getFileContents(`${webdavDir}/${filename}`)
|
||||
const zip = new AdmZip(zipData as Buffer)
|
||||
zip.extractAllTo(dataDir(), true)
|
||||
}
|
||||
|
||||
export async function listWebdavBackups(): Promise<string[]> {
|
||||
const { createClient } = await import('webdav/dist/node/index.js')
|
||||
const { webdavUrl = '', webdavUsername = '', webdavPassword = '' } = await getAppConfig()
|
||||
const {
|
||||
webdavUrl = '',
|
||||
webdavUsername = '',
|
||||
webdavPassword = '',
|
||||
webdavDir = 'mihomo-party'
|
||||
} = await getAppConfig()
|
||||
|
||||
const client = createClient(webdavUrl, {
|
||||
username: webdavUsername,
|
||||
password: webdavPassword
|
||||
})
|
||||
const files = await client.getDirectoryContents('mihomo-party', { glob: '*.zip' })
|
||||
const files = await client.getDirectoryContents(webdavDir, { glob: '*.zip' })
|
||||
if (Array.isArray(files)) {
|
||||
return files.map((file) => file.basename)
|
||||
} else {
|
||||
|
@ -73,11 +88,16 @@ export async function listWebdavBackups(): Promise<string[]> {
|
|||
|
||||
export async function webdavDelete(filename: string): Promise<void> {
|
||||
const { createClient } = await import('webdav/dist/node/index.js')
|
||||
const { webdavUrl = '', webdavUsername = '', webdavPassword = '' } = await getAppConfig()
|
||||
const {
|
||||
webdavUrl = '',
|
||||
webdavUsername = '',
|
||||
webdavPassword = '',
|
||||
webdavDir = 'mihomo-party'
|
||||
} = await getAppConfig()
|
||||
|
||||
const client = createClient(webdavUrl, {
|
||||
username: webdavUsername,
|
||||
password: webdavPassword
|
||||
})
|
||||
await client.deleteFile(`mihomo-party/${filename}`)
|
||||
await client.deleteFile(`${webdavDir}/${filename}`)
|
||||
}
|
||||
|
|
|
@ -9,15 +9,15 @@ import { useAppConfig } from '@renderer/hooks/use-app-config'
|
|||
|
||||
const WebdavConfig: React.FC = () => {
|
||||
const { appConfig, patchAppConfig } = useAppConfig()
|
||||
const { webdavUrl, webdavUsername, webdavPassword } = appConfig || {}
|
||||
const { webdavUrl, webdavUsername, webdavPassword, webdavDir = 'mihomo-party' } = appConfig || {}
|
||||
const [backuping, setBackuping] = useState(false)
|
||||
const [restoring, setRestoring] = useState(false)
|
||||
const [filenames, setFilenames] = useState<string[]>([])
|
||||
const [restoreOpen, setRestoreOpen] = useState(false)
|
||||
|
||||
const [webdav, setWebdav] = useState({ webdavUrl, webdavUsername, webdavPassword })
|
||||
const setWebdavDebounce = debounce(({ webdavUrl, webdavUsername, webdavPassword }) => {
|
||||
patchAppConfig({ webdavUrl, webdavUsername, webdavPassword })
|
||||
const [webdav, setWebdav] = useState({ webdavUrl, webdavUsername, webdavPassword, webdavDir })
|
||||
const setWebdavDebounce = debounce(({ webdavUrl, webdavUsername, webdavPassword, webdavDir }) => {
|
||||
patchAppConfig({ webdavUrl, webdavUsername, webdavPassword, webdavDir })
|
||||
}, 500)
|
||||
const handleBackup = async (): Promise<void> => {
|
||||
setBackuping(true)
|
||||
|
@ -60,6 +60,17 @@ const WebdavConfig: React.FC = () => {
|
|||
}}
|
||||
/>
|
||||
</SettingItem>
|
||||
<SettingItem title="WebDAV 备份目录" divider>
|
||||
<Input
|
||||
size="sm"
|
||||
className="w-[60%]"
|
||||
value={webdav.webdavDir}
|
||||
onValueChange={(v) => {
|
||||
setWebdav({ ...webdav, webdavDir: v })
|
||||
setWebdavDebounce({ ...webdav, webdavDir: v })
|
||||
}}
|
||||
/>
|
||||
</SettingItem>
|
||||
<SettingItem title="WebDAV 用户名" divider>
|
||||
<Input
|
||||
size="sm"
|
||||
|
|
1
src/shared/types.d.ts
vendored
1
src/shared/types.d.ts
vendored
|
@ -260,6 +260,7 @@ interface IAppConfig {
|
|||
useDockIcon?: boolean
|
||||
showTraffic?: boolean
|
||||
webdavUrl?: string
|
||||
webdavDir?: string
|
||||
webdavUsername?: string
|
||||
webdavPassword?: string
|
||||
useNameserverPolicy: boolean
|
||||
|
|
Loading…
Reference in New Issue
Block a user